PAGE STTL "--- WARMSTART ROUTINE ---" ; --------------- ; WARMSTART ENTRY ; --------------- WARM: LDA DCBPSL ;SAVE STORY DRIVE AND SLOT LDX DCBPDR ;IN CASE CHANGED BY "SAVE" STA STRYSL STX STRYDR JSR CLS ; ------------- ; ZIP WARMSTART ; ------------- WARM1: LDA #10 ;CENTER DISPLAY STA CVT LDA #27 STA CHZ STA EHZ JSR BASCAL LDA #>STRYM ;DISP. "THE STORY IS LOADING..." LDX #ZBEGIN ; MSB OF PRELOAD START ADDRESS STA ZCODE ; FREEZE IT HERE STA DBUFF+HI ; LSB IS ALWAYS ZERO LDA #MAIN STA DSKBNK ;SET TO MAIN BANK LDA #1 ; Set ZPURE to 100 to fake STA ZPURE+HI ; GETDSK out this first time through JSR GETDSK ; [DBLOCK] SET TO Z-BLOCK 0 ; EXTRACT GAME DATA FROM Z-CODE HEADER LDA ZBEGIN+ZVERS ; (EZIP) IS GAME AN EZIP? CMP #5 ; (X) BEQ YESEZ ; YES, CONTINUE ; *** ERROR #15 -- NOT AN EZIP GAME *** LDA #15 JMP ZERROR ; *** ERROR #0 -- INSUFFICIENT RAM *** NORAM: LDA #5 STA CVT JSR BASCAL LDA #0 JMP ZERROR YESEZ: LDA ZBEGIN+ZPURBT ; CHECK PURBOT POINTER CMP #$AD ; MAXIMUM IMPURE IS $AD00 (43K) BCC YZ3 ; OKAY, CONTINUE LDA #13 JMP ZERROR ; ELSE ERROR #13 (IMPURE TOO BIG) YZ3: LDA #3 ; ELSE USE ONLY 3 STA NUMSAV ; REMEMBER MAXIMUM # SAVES PER DISK CLC ADC #'0' ; CONVERT TO ASCII STA SAVASC ; SAVE IN STRING LDA ZBEGIN+ZENDLD ; MSB OF ENDLOAD POINTER STA ZPURE+HI ; GOT TO FIGURE OUT FIRST PAGE LDA ZBEGIN+ZENDLD+1 ; of data on side 2 STA ZPURE+LO ; ok? LSR ZPURE+HI ; SO WE NEED TO /64 TO GET IT ROR ZPURE+LO ; SO DO 6 SHITS LSR ZPURE+HI ROR ZPURE+LO LSR ZPURE+HI ROR ZPURE+LO LSR ZPURE+HI ROR ZPURE+LO LSR ZPURE+HI ROR ZPURE+LO LSR ZPURE+HI ; NOW IT CONTAINS FIRST PAGE ON ROR ZPURE+LO ; SIDE 2 OF THE DISK LDA ZBEGIN+ZMODE ; ENABLE SOUND & MONOSPACING (X) ORA #%00110000 ; (X) STA ZBEGIN+ZMODE LDA #XZIPID ; SET INTERPRETER ID LDX SIG ; SET WHETHER IIe OR IIc BNE SETID LDA #IIcID SETID: STA ZBEGIN+ZINTWD LDA #VERSID STA ZBEGIN+ZINTWD+1 LDA #0 ; CLEAR HIGH BYTE STA ZBEGIN+ZHWRD STA ZBEGIN+ZVWRD LDA #80 ; SET SCREEN PARAMETERS STA ZBEGIN+ZHWRD+1 LDA #$18 STA ZBEGIN+ZVWRD+1 LDA #1 ; EACH "PIXEL" IS 1X1 STA ZBEGIN+ZFWRD STA ZBEGIN+ZFWRD+1 LDA #$18 ; AND SCREEN PARAMETERS STA ZBEGIN+ZSCRWD LDA #80 STA ZBEGIN+ZSCRWD+1 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+ZOBJEC ; NOT TO MENTION CLC ; THE OBJECT TABLE ADC ZCODE STA OBJTAB+HI LDA ZBEGIN+ZOBJEC+1 ; LSB SAME STA OBJTAB+LO LDA ZBEGIN+ZTCHAR ; DO SAME FOR TCHARS TABLE ORA ZBEGIN+ZTCHAR+1 ; is it zero though? BEQ INICLL LDA ZBEGIN+ZTCHAR ; DO SAME FOR TCHARS TABLE CLC ADC ZCODE STA TCHARS+HI LDA ZBEGIN+ZTCHAR+1 ; NO CHANGE FOR LSB STA TCHARS+LO INICLL: JSR INITPAG ; ; after loading everything check tchars table! ; LDA TCHARS+HI ORA TCHARS+LO BEQ TCHj ; don't check of tchars==0 LDY #$FF ; CHECK IF $FF IS IN TCHARS TBL TCHLP: INY LDA (TCHARS),Y BEQ TCHj ; NULL TERMINATED STRING CMP #$FF BNE TCHLP LDA #1 STA ALLFLG ; YES, SET ALL FCN KEYS (>127) TO TERMINATORS TCHj: JSR CLS ; GET RID OF "LOADING" MSG LDA ZBEGIN+ZGO ; GET START ADDRESS OF Z-CODE STA ZPCM ; MSB LDA ZBEGIN+ZGO+1 ; AND LSB STA ZPCL ; >BIT ALREADY ZEROED JSR VLDZPC ; MACKE ZPC VALID LDX #80 ; SET XSIZE TO 1 LESS DEX STX XSIZE STX OLDWD ; JIC LDA PSTAT ; CHECK IF RESTART & WERE PRINTING BPL EX2 ; NO LDA #1 ; YES STA PSTAT ; RESET PSTAT FOR NEXT TIME STA SCRIPTF ; TURN SCRIPT FLAG ON ORA ZBEGIN+ZSCRIP+1 ; SET GAME FLAG ALSO STA ZBEGIN+ZSCRIP+1 EX2: JSR CLS ; CLEAR SCREEN ... ; ... AND FALL INTO MAIN LOOP END