2023-11-16 18:19:54 -05:00

132 lines
2.5 KiB
Plaintext

PAGE
SBTTL "--- WARMSTART ROUTINE ---"
; -------------
; ZIP WARMSTART
; -------------
WARM1: LDA #0 ; CLEAR ALL Z-PAGE VARIABLES
LDX #ZEROPG
ST0: STA 0,X
INX
; CPX #ZPGTOP ; NOT NEEDED FOR ATARI
BNE ST0
; INIT THE PAGING TABLE
TAX ; = 0
LDA #$FF
ST1: STA PTABL,X
STA PTABH,X
INX
BNE ST1
; CLEAR THE TIMESTAMP MAP
TXA ; = 0
ST2: STA LRUMAP,X
INX
BNE ST2
INC ZSP ; INIT Z-STACK POINTERS
INC OLDZSP ; TO "1"
INC STAMP ; INIT TIMESTAMP
; GRAB THE FIRST BLOCK OF PRELOAD
LDA #HIGH ZBEGIN ; MSB OF PRELOAD START ADDRESS
STA ZCODE ; FREEZE IT HERE
STA DBUFF+HI ; LSB IS ALWAYS ZERO
DEC ZPURE ; (ATARI ONLY) FORCE FETCH FROM PRELOAD
JSR GETDSK ; [DBLOCK] SET TO Z-BLOCK 0
; EXTRACT GAME DATA FROM Z-CODE HEADER
LDX ZBEGIN+ZENDLD ; MSB OF ENDLOAD POINTER
INX ; ADD 1 TO GET
STX ZPURE ; 1ST "PURE" PAGE OF Z-CODE
TXA ; ADD START PAGE OF PRELOAD
CLC ; TO CALC ABSOLUTE START ADDRESS
ADC ZCODE ; OF PAGING SPACE
STA PAGE0
JSR MEMTOP ; RETURNS TOP RAM PAGE IN [A]
SEC
SBC PAGE0 ; SUBTRACT ADDRESS OF PAGING SPACE
BEQ NORAM
BCS SETNP ; ERROR IF NOT ENOUGH RAM
; *** ERROR #0 -- INSUFFICIENT RAM ***
NORAM: LDA #0
JMP ZERROR
SETNP: STA PMAX ; SET # SWAPPING PAGES
LDA ZBEGIN+ZMODE
ORA #%00100000 ; ENABLE SPLIT-SCREEN
STA ZBEGIN+ZMODE
AND #%00000010 ; ISOLATE STATUS-FORMAT BIT
STA TIMEFL ; 0=SCORE, NZ=TIME
LDA ZBEGIN+ZGLOBA ; GET MSB OF GLOBAL TABLE ADDR
CLC ; CONVERT TO
ADC ZCODE ; ABSOLUTE ADDRESS
STA GLOBAL+HI
LDA ZBEGIN+ZGLOBA+1 ; LSB NEEDN'T CHANGE
STA GLOBAL+LO
LDA ZBEGIN+ZFWORD ; DO SAME FOR FWORDS TABLE
CLC
ADC ZCODE
STA FWORDS+HI
LDA ZBEGIN+ZFWORD+1 ; NO CHANGE FOR LSB
STA FWORDS+LO
LDA ZBEGIN+ZVOCAB ; NOW DO VOCABULARY TABLE
CLC
ADC ZCODE
STA VOCAB+HI
LDA ZBEGIN+ZVOCAB+1 ; LSB SAME
STA VOCAB+LO
LDA ZBEGIN+ZOBJEC ; NOT TO MENTION
CLC ; THE OBJECT TABLE
ADC ZCODE
STA OBJTAB+HI
LDA ZBEGIN+ZOBJEC+1 ; LSB SAME
STA OBJTAB+LO
; FETCH THE REST OF THE PRELOAD
LDPRE: LDA DBLOCK+LO ; CHECK CURRENT BLOCK #
CMP ZPURE ; LOADED LAST PRELOAD PAGE YET?
BCS WARMEX ; YES, TIME TO PLAY!
JSR GETDSK ; ELSE GRAB NEXT Z-BLOCK
JMP LDPRE
WARMEX: LDA ZBEGIN+ZGO ; GET START ADDRESS OF Z-CODE
STA ZPCM ; MSB
LDA ZBEGIN+ZGO+1 ; AND LSB
STA ZPCL ; HIGH BIT ALREADY ZEROED
LDA #21
STA LMAX ; PREVENT WEIRDNESS
JSR SIDE2 ; REQUEST SIDE 2 OF DISK
JSR CLS ; CLEAR SCREEN
LDA #$FF
STA SCRIPT ; ENABLE SCRIPTING
LDA ZBEGIN+ZSCRIP+1 ; SET SCRIPT FLAG
ORA SFLAG ; TO PREVIOUS SETTING
STA ZBEGIN+ZSCRIP+1 ; (BM 5/14/85)
; ... AND FALL INTO MAIN LOOP
END