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