mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-19 09:18:45 +00:00
491 lines
8.3 KiB
Plaintext
491 lines
8.3 KiB
Plaintext
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
|
|
|