PAGE SBTTL "--- WARMSTART ROUTINE ---" ; ------------- ; ZIP WARMSTART ; ------------- WARM1: LDA #10 ;CENTER DISPLAY STA CV LDA COL80 BNE W1 ;80 COL LDA #8 ;40 COL STA CH BNE W2 ;JMP W1: LDA #27 STA CH STA EH W2: JSR BASCAL LDA #HIGH STRYM ;DISP. "THE STORY IS LOADING..." LDX #LOW STRYM LDY #STRYML JSR DLINE LDA #0 ; CLEAR ALL Z-PAGE VARIABLES LDX #ZEROPG ST0: STA 0,X INX BNE ST0 LDX #PG2SIZ ST3: STA LRU,X ; CLEAR ALL VARIABLES IN PG 2 DEX BPL ST3 ; LDA #0 ; INIT THE PAGING TABLE ; TAX ; = 0 LDX #4 ; 4 TIMES THRU = 1K LDY #0 LDA #HIGH PTABL STA I+HI LDA #LOW PTABL STA I+LO LDA #$FF ; INIT THE PAGING TBL ST1: STA (I),Y INY BNE ST1 INC I+HI ; NEXT PAGE IN BLOCK DEX BNE ST1 ; CLEAR THE TIMESTAMP MAP LDA #HIGH LRUMAP STA I+HI LDA #LOW LRUMAP STA I+LO LDX #4 ; = 1K LDY #0 TYA ; = 0 ST2: STA (I),Y INY BNE ST2 INC I+HI DEX BNE ST2 INC ZSP ; INIT Z-STACK POINTERS INC OLDZSP ; TO "1" INC SCRIPT ; ENABLE SCRIPTING INC STAMP+LO ; 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 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+LO ; 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+LO ; 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 ; JSR MEMTOP ; RETURN TOP RAM PG IN [A/Y] PHA TYA SEC SBC PAGE0+LO STA PMAX+LO BEQ CKHIGH ; LESS OR =, CHECK HIGH BYTE BCC CKHIGH PLA SBC PAGE0+HI BCC NORAM ; IF HIGH BYTE IS LESS, NOT ENOUGH MEMORY BCS SETNP ; A-OK CKHIGH: PLA SBC PAGE0+HI BEQ NORAM ; LO BYTE NOT ENOUGH, IF NOTHING HERE... BCS SETNP ; OK ; *** ERROR #0 -- INSUFFICIENT RAM *** NORAM: LDA #0 JMP ZERROR SETNP: STA PMAX+HI ; FINISH SETTING # SWAPPING PAGES ASL PMAX+LO ; WORD ALIGN VALUE, ROL PMAX+HI ; ALWAYS USED THAT WAY IN PAGING 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 #1 ; EXCLUDE STATUS LINE FROM REGULAR DISPLAY STA WTOP STA LINCNT ; FIX FOR 1ST SCREEN LDX WWIDTH ; SET XSIZE TO 1 LESS DEX STX XSIZE LDA PSTAT ; CHECK IF RESTART & WAS PRINTING BPL EX2 ; NOPE LDA ZBEGIN+ZSCRIP+1 ; MAKE IT KEEP PRINTING ORA #%00000001 STA ZBEGIN+ZSCRIP+1 LDA #2 ; RESET PSTAT FOR NEXT TIME STA PSTAT EX2: JSR CLS ; CLEAR SCREEN ... ; ... AND FALL INTO MAIN LOOP END