mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-02 06:41:28 +00:00
Initial commit.
This commit is contained in:
490
atari/zdos.src
Normal file
490
atari/zdos.src
Normal file
@@ -0,0 +1,490 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user