PAGE SBTTL "--- Z-DOS: ATARI ---" ; ----------------------------- ; SET UP SAVE & RESTORE SCREENS ; ----------------------------- SAVRES: JSR ZCRLF ; CLEAR THE LINE BUFFER JSR CLS ; AND THE SCREEN LDA #0 STA SCRIPT ; DISABLE SCRIPTING STA COLCRS+LO ; HOME CURSOR STA ROWCRS RTS ; ----------------- ; DISPLAY A DEFAULT ; ----------------- ; ENTRY: DEFAULT (1-8) IN [A] DEFAL: DB " (Default is " DEFNUM: DB "*) >" DEFALL EQU $-DEFAL DODEF: CLC ADC #'1' ; CONVERT TO ASCII 1-9 STA DEFNUM ; INSERT IN STRING LDX #LOW DEFAL LDA #HIGH DEFAL LDY #DEFALL JMP DLINE ; PRINT THE STRING ; ----------------------------- ; GET SAVE & RESTORE PARAMETERS ; ----------------------------- POSIT: DB EOL DB "Position 1-5" POSITL EQU $-POSIT WDRIV: DB EOL DB "Drive 1 or 2" WDRIVL EQU $-WDRIV MIND: DB EOL DB EOL DB "Position " MPOS: DB "*; Drive #" MDRI: DB "*." DB EOL DB "Are you sure? (Y or N) >" MINDL EQU $-MIND INSM: DB EOL DB "Insert SAVE disk into Drive #" SAVDRI: DB "*." INSML EQU $-INSM YES: DB "YES" DB EOL YESL EQU $-YES NO: DB "NO" DB EOL NOL EQU $-NO PARAMS: LDX #LOW POSIT LDA #HIGH POSIT LDY #POSITL JSR DLINE ; "POSITION (1-5)" ; GET GAME SAVE POSITION LDA GPOSIT ; SHOW THE CURRENT JSR DODEF ; DEFAULT POSITION GETPOS: JSR GETKEY ; WAIT FOR A KEY CMP #EOL ; IF [RETURN], BEQ POSSET ; USE DEFAULT SEC SBC #'1' ; ELSE CONVERT ASCII TO BINARY CMP #5 ; IF BELOW "5" BCC SETPOS ; MAKE IT THE NEW DEFAULT JSR BOOP ; ELSE RAZZ JMP GETPOS ; AND TRY AGAIN POSSET: LDA GPOSIT ; USE DEFAULT SETPOS: STA TPOSIT ; USE KEYPRESS CLC ADC #'1' ; CONVERT TO ASCII "1"-"5" STA MPOS ; STORE IN TEMP STRING STA SVPOS STA RSPOS JSR CHAR ; AND DISPLAY IT ; GET DRIVE ID LDX #LOW WDRIV LDA #HIGH WDRIV LDY #WDRIVL JSR DLINE ; "DRIVE 1 OR 2" LDA GDRIVE ; SHOW DEFAULT JSR DODEF GETDRV: JSR GETKEY ; GET A KEYPRESS CMP #EOL ; IF [RETURN], BEQ DRVSET ; USE DEFAULT SEC SBC #'1' ; CONVERT TO BINARY 0 OR 1 CMP #2 ; IF WITHIN RANGE, BCC SETDRV ; SET NEW DEFAULT JSR BOOP JMP GETDRV ; ELSE TRY AGAIN DRVSET: LDA GDRIVE ; USE DEFAULT SETDRV: STA TDRIVE ; USE [A] CLC ADC #'1' ; CONVERT TO ASCII 1 OR 2 STA SAVDRI ; STORE IN DRIVE STRING STA MDRI ; AND IN TEMP STRING JSR CHAR ; AND SHOW NEW SETTING LDX #LOW MIND ; SHOW TEMPORARY SETTINGS LDA #HIGH MIND LDY #MINDL JSR DLINE ; VALIDATE RESPONSES LDA #$FF STA CH GETYES: JSR GETKEY CMP #'y' ; IF REPLY IS "Y" BEQ ALLSET ; ACCEPT RESPONSES CMP #'Y' BEQ ALLSET CMP #EOL ; EOL IS ALSO ACCEPTABLE BEQ ALLSET CMP #'n' ; IF REPLY IS "N" BEQ NOTSAT ; RESTATE PARAMETERS CMP #'N' BEQ NOTSAT JSR BOOP ; ELSE BOOP JMP GETYES ; INSIST ON Y OR N NOTSAT: LDX #LOW NO LDA #HIGH NO LDY #NOL JSR DLINE ; PRINT "NO"/EOL JMP PARAMS ; AND TRY AGAIN ALLSET: LDX #LOW YES LDA #HIGH YES LDY #YESL JSR DLINE ; PRINT "YES"/EOL LDA TDRIVE ; MAKE THE TEMPORARY DRIVE STA GDRIVE ; THE DEFAULT DRIVE STA DRIVE ; AND SET [DRIVE] ACCORDINGLY INC DRIVE ; 1-ALIGN THE DRIVE ID LDX TPOSIT ; MAKE THE TEMP POSITION STX GPOSIT ; THE DEFAULT POSITION ; CALC TRACK & SECTOR OF GAME POSITION LDA OFFLOS,X ; INDEX INTO THE OFFSET TABLES STA SECTOR+LO ; SET [SECTOR] = 1ST SECTOR LDA OFFHIS,X ; IN REQUESTED SAVE POSITION STA SECTOR+HI LDX #LOW INSM LDA #HIGH INSM LDY #INSML JSR DLINE ; "INSERT SAVE DISK IN DRIVE X." ; FALL THROUGH ... ; --------------------- ; "PRESS RETURN" PROMPT ; --------------------- RETURN: JSR ZCRLF LDX #LOW RTN LDA #HIGH RTN LDY #RTNL JSR DLINE ; SHOW PROMPT JSR ZCRLF LDA #'>' JSR CHAR ; ENTRY FOR QUIT/RESTART GETRET: LDA #$FF STA CH GTRT0: JSR GETKEY ; WAIT FOR [RETURN] CMP #EOL BEQ GTRT1 JSR BOOP ; ACCEPT NO JMP GTRT0 ; SUBSTITUTES! GTRT1: RTS RTN: DB "Press [RETURN] to continue." RTNL EQU $-RTN ; -------------------- ; PROMPT FOR GAME DISK ; -------------------- GAME: DB "Insert Side " DSIDE: DB "2 of the STORY disk into" GAMEL EQU $-GAME GAME2: DB "Drive #1." GAME2L EQU $-GAME2 SIDE1: LDA #'1' ; ASK FOR SIDE 1 BNE DOSIDE SIDE2: LDA #'2' ; ASK FOR SIDE 2 DOSIDE: STA DSIDE LDA #1 ; MAKE SURE WE'RE ON STA DRIVE ; THE BOOT DRIVE JSR ZCRLF LDX #LOW GAME LDA #HIGH GAME LDY #GAMEL JSR DLINE ; "INSERT STORY DISK" JSR ZCRLF LDX #LOW GAME2 LDA #HIGH GAME2 LDY #GAME2L JSR DLINE ; "DRIVE #1" JSR RETURN ; "PRESS [RETURN] TO CONTINUE:" LDA #$FF ; ENABLE STA SCRIPT ; SCRIPTING RTS ; ------------------------- ; SET UP PHONEY STATUS LINE ; ------------------------- ; ENTRY: TEXT SET UP FOR "DLINE" SROOM: JSR DLINE ; PRINT LINE IN [X/Y/A] LDX #39 ; INVERT & BLACKEN TOP LINE SRLP: LDA SCREEN,X ORA #%10000000 STA SCREEN,X DEX BPL SRLP RTS ; --------- ; SAVE GAME ; --------- SAV: DB "Save Position" DB EOL SAVL EQU $-SAV SVING: DB EOL DB EOL DB "Saving position " SVPOS: DB "* ..." DB EOL SVINGL EQU $-SVING ZSAVE: JSR SAVRES ; SET UP SCREEN LDX #LOW SAV LDA #HIGH SAV LDY #SAVL JSR SROOM ; "SAVE POSITION" JSR PARAMS ; GET PARAMETERS LDX #LOW SVING LDA #HIGH SVING LDY #SVINGL JSR DLINE ; "SAVING POSITION X ..." ; SAVE GAME PARAMETERS IN [BUFSAV] LDA ZBEGIN+ZID ; MOVE GAME ID STA BUFSAV+0 ; INTO 1ST 2 BYTES LDA ZBEGIN+ZID+1 ; OF THE AUX LINE BUFFER STA BUFSAV+1 LDA ZSP ; MOVE [ZSP] STA BUFSAV+2 ; TO 3RD BYTE LDA OLDZSP ; MOVE [OLDZSP] STA BUFSAV+3 ; TO 4TH LDX #2 ; MOVE CONTENTS OF [ZPC] ZPCSAV: LDA ZPC,X ; TO BYTES 5-7 STA BUFSAV+4,X ; OF [BUFSAV] DEX BPL ZPCSAV ; WRITE [LOCALS]/[BUFSAV] PAGE TO DISK LDA #HIGH LOCALS STA DBUFF+HI ; POINT TO THE PAGE JSR PUTDSK ; AND WRITE IT OUT BCC WSTACK ; IF SUCCEEDED, WRITE STACK BADSAV: JSR SIDE2 ; ELSE REQUEST STORY DISK JSR CLS JMP PREDF ; AND FAIL ; WRITE CONTENTS OF Z-STACK TO DISK WSTACK: LDA #HIGH ZSTAKL ; POINT TO 1ST PAGE STA DBUFF+HI JSR PUTDSK ; WRITE 1ST AND BCS BADSAV JSR PUTDSK ; 2ND PAGE OF Z-STACK BCS BADSAV ; WRITE ENTIRE GAME PRELOAD TO DISK LDA ZCODE ; POINT TO 1ST PAGE STA DBUFF+HI ; OF PRELOAD LDX ZBEGIN+ZPURBT ; GET # IMPURE PAGES INX ; USE FOR INDEXING STX I+LO LSAVE: JSR PUTDSK BCS BADSAV DEC I+LO BNE LSAVE JSR SIDE2 ; PROMPT FOR GAME DISK JSR CLS JMP PREDS ; ELSE PREDICATE SUCCEEDS ; ------------ ; RESTORE GAME ; ------------ RES: DB "Restore Position" DB EOL RESL EQU $-RES RSING: DB EOL DB EOL DB "Restoring position " RSPOS: DB "* ..." DB EOL RSINGL EQU $-RSING ZREST: JSR SAVRES LDX #LOW RES LDA #HIGH RES LDY #RESL JSR SROOM ; "RESTORE POSITION" JSR PARAMS ; GET PARAMETERS LDX #LOW RSING LDA #HIGH RSING LDY #RSINGL JSR DLINE ; "RESTORING POSITION X ..." ; SAVE LOCALS IN CASE OF ERROR LDX #31 LOCSAV: LDA LOCALS,X ; COPY ALL LOCALS STA $0100,X ; TO BOTTOM OF MACHINE STACK DEX BPL LOCSAV LDA #HIGH LOCALS STA DBUFF+HI JSR RDISK ; RETRIEVE 1ST BLOCK OF PRELOAD BCS WRONG ; BAD DISK READ IF CARRY CLEAR LDA BUFSAV+0 ; DOES 1ST BYTE OF SAVED GAME ID CMP ZBEGIN+ZID ; MATCH THE CURRENT ID? BNE WRONG ; WRONG DISK IF NOT LDA BUFSAV+1 ; WHAT ABOUT THE 2ND BYTE? CMP ZBEGIN+ZID+1 BEQ RIGHT ; CONTINUE IF BOTH BYTES MATCH ; HANDLE RESTORE ERROR WRONG: LDX #31 ; RESTORE ALL SAVED LOCALS WR0: LDA $0100,X STA LOCALS,X DEX BPL WR0 JSR SIDE2 ; PROMPT FOR GAME DISK JSR CLS JMP PREDF ; PREDICATE FAILS ; CONTINUE RESTORE RIGHT: LDA ZBEGIN+ZSCRIP ; SAVE BOTH FLAG BYTES STA I+LO LDA ZBEGIN+ZSCRIP+1 STA I+HI LDA #HIGH ZSTAKL ; RETRIEVE OLD CONTENTS OF STA DBUFF+HI ; Z-STACK JSR RDISK ; GET 1ST BLOCK OF Z-STACK BCS WRONG JSR RDISK ; AND 2ND BLOCK BCS WRONG LDA ZCODE STA DBUFF+HI JSR RDISK ; GET 1ST BLOCK OF PRELOAD BCS WRONG LDA I+LO ; RESTORE THE STATE STA ZBEGIN+ZSCRIP ; OF THE FLAG WORD LDA I+HI STA ZBEGIN+ZSCRIP+1 LDA ZBEGIN+ZPURBT ; GET # PAGES TO LOAD STA I+LO LREST: JSR RDISK ; FETCH THE REMAINDER BCS WRONG DEC I+LO ; OF THE PRELOAD BNE LREST ; RESTORE THE STATE OF THE SAVED GAME LDA BUFSAV+2 ; RESTORE THE [ZSP] STA ZSP LDA BUFSAV+3 ; AND THE [OLDZSP] STA OLDZSP LDX #2 ; RESTORE THE [ZPC] RESZPC: LDA BUFSAV+4,X STA ZPC,X DEX BPL RESZPC LDA #0 STA ZPCFLG ; INVALIDATE [ZPC] JSR SIDE2 ; PROMPT FOR GAME DISK JSR CLS JMP PREDS ; PREDICATE SUCCEEDS ; -------------------------- ; SAVE/RESTORE OFFSET TABLES ; -------------------------- ; 144 SECTORS (18K) PER SAVE POSITION OFFLOS: DB LOW 1 DB LOW 145 DB LOW 289 DB LOW 433 DB LOW 577 OFFHIS: DB HIGH 1 DB HIGH 145 DB HIGH 289 DB HIGH 433 DB HIGH 577 END