mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-20 09:45:23 +00:00
346 lines
5.7 KiB
Plaintext
346 lines
5.7 KiB
Plaintext
PAGE
|
|
SBTTL "--- SAVE/RESTORE ---"
|
|
|
|
; --------
|
|
; GRESTORE
|
|
; --------
|
|
|
|
GREST: JSR SRINIT ; INIT SCREEN, GET CR
|
|
|
|
LDA #0
|
|
STA GPCFLG ; INVALIDATE [GPC]
|
|
STA VPCFLG ; AND [VPC]
|
|
|
|
LDA #54
|
|
STA CURSOR ; CENTER TEXT
|
|
LDX #LOW RSTG
|
|
LDA #HIGH RSTG
|
|
LDY #RSTGL
|
|
JSR PRINT ; "RESTORING ..."
|
|
|
|
JSR READ ; READ 1ST BLOCK INTO [BUFFER]
|
|
BCS BADRD ; SCRAM IF ERROR
|
|
|
|
LDA BUFFER ; CHECK MSB
|
|
CMP GBEGIN+GID ; OF GAME ID
|
|
BNE BADRD ; SCRAM IF NO MATCH
|
|
LDA BUFFER+1 ; SAME FOR LSB
|
|
CMP GBEGIN+GID+1
|
|
BNE BADRD
|
|
|
|
LDA BUFFER+7 ; ALSO COMPARE SIZE SAVED
|
|
CMP PAGE0 ; TO CURRENT SIZE
|
|
BNE BADRD ; EXIT IF BAD
|
|
|
|
RST0: LDA BUFFER+2
|
|
STA GSP ; RESTORE [GSP]
|
|
LDA BUFFER+3
|
|
STA OLDGSP ; [OLDGSP]
|
|
LDA BUFFER+4
|
|
STA GPCL ; [GPCL]
|
|
LDA BUFFER+5
|
|
STA GPCH ; [GPCH]
|
|
LDA BUFFER+5
|
|
STA GPCH ; [GPCH]
|
|
LDA BUFFER+6
|
|
STA GPC0 ; [GPC0]
|
|
|
|
LDX #0
|
|
STX GPCFLG ; INVALIDATE [GPC]
|
|
STX VPCFLG ; AND [VPC]
|
|
INX ; = 1
|
|
STX STAMP ; RESET TIMESTAMP (?)
|
|
|
|
LDX #79 ; RESTORE [LOCALS], [CARGS], [CTYPES]
|
|
RST1: LDA BUFFER+8,X
|
|
STA LOCALS,X
|
|
DEX
|
|
BPL RST1
|
|
|
|
JSR READ ; RESTORE [GSTAKL]
|
|
BCS BADRD
|
|
JSR READ ; AND [GSTAKH]
|
|
BCS BADRD
|
|
|
|
LDA #LOW GBEGIN ; POINT [DBUFLO/HI]
|
|
STA DBUFLO ; TO PRELOAD
|
|
LDA #HIGH GBEGIN
|
|
STA DBUFHI
|
|
|
|
RST2: JSR READ ; READ A BLOCK
|
|
BCS BADRD ; EXIT IF ERROR
|
|
LDA DBUFHI ; END OF PRELOAD YET?
|
|
CMP PAGE0
|
|
BNE RST2 ; NO, KEEP READING
|
|
|
|
JSR NEWLIN ; CLEAR STATUS LINE
|
|
LDA #14
|
|
STA CURSOR ; CENTER TEXT
|
|
LDX #LOW GRD
|
|
LDA #HIGH GRD
|
|
LDY #GRDL
|
|
JSR PRINT ; "GAME RESTORED"
|
|
|
|
JSR GETGD ; "INSERT GAME DISK, PRESS START"
|
|
JMP PREDS ; SUCCEEDS
|
|
|
|
BADRD: JMP SRERR ; ELSE FAILS
|
|
|
|
; -----
|
|
; GSAVE
|
|
; -----
|
|
|
|
GSAVE: JSR SRINIT ; INIT SCREEN, GET CR
|
|
|
|
LDA #53
|
|
STA CURSOR ; CENTER TEXT
|
|
LDX #LOW SVG
|
|
LDA #HIGH SVG
|
|
LDY #SVGL
|
|
JSR PRINT ; "SAVING GAME ..."
|
|
|
|
LDA GBEGIN+GID ; SAVE 1ST
|
|
STA BUFFER ; AND
|
|
LDA GBEGIN+GID+1 ; 2ND BYTES OF
|
|
STA BUFFER+1 ; GAME ID WORD
|
|
|
|
LDA GSP
|
|
STA BUFFER+2 ; SAVE [GSP]
|
|
LDA OLDGSP
|
|
STA BUFFER+3 ; SAVE [OLDGSP]
|
|
|
|
LDA GPCL ; SAVE [GPC]
|
|
STA BUFFER+4
|
|
LDA GPCH
|
|
STA BUFFER+5
|
|
LDA GPC0
|
|
STA BUFFER+6
|
|
|
|
LDA PAGE0 ; SAVE SIZE OF PRELOADS
|
|
STA BUFFER+7
|
|
|
|
LDX #79 ; SAVE [LOCALS], [CARGS] & [CTYPES]
|
|
SV0: LDA LOCALS,X
|
|
STA BUFFER+8,X
|
|
DEX
|
|
BPL SV0
|
|
|
|
JSR WRITE ; WRITE [BUFFER] BLOCK
|
|
BCS SRERR
|
|
JSR WRITE ; WRITE [GSTAKL]
|
|
BCS SRERR
|
|
JSR WRITE ; WRITE [GSTAKH]
|
|
BCS SRERR
|
|
|
|
LDA #LOW GBEGIN ; POINT TO START OF PRELOADS
|
|
STA DBUFLO
|
|
LDA #HIGH GBEGIN
|
|
STA DBUFHI
|
|
|
|
SV1: JSR WRITE ; WRITE BLOCK
|
|
BCS SRERR ; SCRAM IF ERROR
|
|
LDA DBUFHI ; WRITTEN ALL OF
|
|
CMP PAGE0 ; PRELOAD(S)?
|
|
BNE SV1 ; NO, WRITE SOME MORE
|
|
|
|
JSR NEWLIN ; CLEAR STATUS LINE
|
|
LDA #14
|
|
STA CURSOR ; CENTER TEXT
|
|
LDX #LOW SCOM
|
|
LDA #HIGH SCOM
|
|
LDY #SCOML
|
|
JSR PRINT ; "SAVE COMPLETE"
|
|
|
|
JSR GETGD ; "INSERT GAME DISK"
|
|
JMP PREDS ; PREDICATE SUCCEEDS
|
|
|
|
; ------------------
|
|
; SAVE/RESTORE ERROR
|
|
; ------------------
|
|
|
|
SRERR: JSR NEWLIN ; CLEAR STATUS LINE
|
|
|
|
LDA #15
|
|
STA CURSOR ; CENTER TEXT
|
|
|
|
LDX #LOW DXX
|
|
LDA #HIGH DXX
|
|
LDY #DXXL
|
|
JSR PRINT ; "DISK ERROR!"
|
|
|
|
JSR GETGD ; "INSERT GAME DISK, PRESS START"
|
|
JMP PREDF ; PREDICATE FAILED
|
|
|
|
; -------------------
|
|
; WRITE BLOCK TO DISK
|
|
; -------------------
|
|
|
|
WRITE: LDA #$57 ; SIO "WRITE" COMMAND
|
|
BNE DDISK
|
|
|
|
; --------------------
|
|
; READ BLOCK FROM DISK
|
|
; --------------------
|
|
|
|
READ: LDA #$52 ; SIO "READ" COMMAND
|
|
|
|
DDISK: STA DCOMND ; SET READ/WRITE MODE
|
|
|
|
LDA #1 ; ALWAYS USE
|
|
STA DUNIT ; DRIVE #1
|
|
|
|
JSR DSKINV ; ACCESS 1ST HALF
|
|
LDA DSTATS
|
|
BMI BADISK ; EXIT IF ERROR
|
|
|
|
JSR NEXTSC ; SET UP NEXT ACCESS
|
|
|
|
JSR DSKINV ; ACCESS 2ND HALF
|
|
LDA DSTATS
|
|
BMI BADISK ; EXIT IF ERROR
|
|
|
|
JSR NEXTSC ; SET UP NEXT ACCESS
|
|
CLC ; CARRY CLEAR = OKAY
|
|
RTS
|
|
|
|
BADISK: SEC ; CARRY SET = BAD I/O
|
|
RTS
|
|
|
|
; ---------------------------
|
|
; POINT TO NEXT SECTOR/BUFFER
|
|
; ---------------------------
|
|
|
|
NEXTSC: INC DAUX1 ; LSB OF SECTOR ID
|
|
BNE NXC
|
|
INC DAUX2 ; MSB
|
|
|
|
NXC: LDA DBUFLO ; POINT TO 2ND HALF
|
|
CLD ; OF BUFFER
|
|
CLC
|
|
ADC #$80
|
|
STA DBUFLO
|
|
LDA DBUFHI
|
|
ADC #0
|
|
STA DBUFHI
|
|
RTS
|
|
|
|
; --------------------
|
|
; SAVE & RESTORE TEXT
|
|
; IN ATARI SCREEN CODE
|
|
; --------------------
|
|
|
|
; INSERT SAVE DISK, PRESS START
|
|
|
|
SAVEM: DB 41,110,115,101,114,116,0
|
|
DB 51,33,54,37,0
|
|
DB 100,105,115,107,12,0
|
|
DB 112,114,101,115,115,0
|
|
DB 179,180,161,178,180,0
|
|
SAVEML EQU $-SAVEM
|
|
|
|
; INSERT GAME DISK, PRESS START
|
|
|
|
RESTM: DB 41,110,115,101,114,116,0
|
|
DB 39,33,45,37,0
|
|
DB 100,105,115,107,12,0
|
|
DB 112,114,101,115,115,0
|
|
DB 179,180,161,178,180,0
|
|
RESTML EQU $-RESTM
|
|
|
|
; SAVING GAME ...
|
|
|
|
SVG: DB 51,97,118,105,110,103,0
|
|
DB 103,97,109,101,0,14,14,14,0
|
|
SVGL EQU $-SVG
|
|
|
|
; RESTORING ...
|
|
|
|
RSTG: DB 50,101,115,116,111,114,105,110,103,0,14,14,14,0
|
|
RSTGL EQU $-RSTG
|
|
|
|
; DISK ERROR!
|
|
|
|
DXX: DB 36,41,51,43,0,37,50,50,47,50,1,0
|
|
DXXL EQU $-DXX
|
|
|
|
; SAVE COMPLETE
|
|
|
|
SCOM: DB 51,33,54,37,0,35,47,45,48,44,37,52,37,0
|
|
SCOML EQU $-SCOM
|
|
|
|
; GAME RESTORED
|
|
|
|
GRD: DB 39,33,45,37,0,50,37,51,52,47,50,37,36,0
|
|
GRDL EQU $-GRD
|
|
|
|
; ------------------------
|
|
; INIT SAVE/RESTORE SCREEN
|
|
; ------------------------
|
|
|
|
SRINIT: JSR STATUS ; SET UP STATUS LINE
|
|
|
|
LDA #3
|
|
STA SOUNDR ; ENABLE NOISY I/O
|
|
|
|
LDA #6
|
|
STA CURSOR ; CENTER TEXT
|
|
|
|
LDX #LOW SAVEM
|
|
LDA #HIGH SAVEM
|
|
LDY #SAVEML
|
|
JSR PRINT ; "INSERT SAVE DISK ..."
|
|
|
|
LDA #1 ; POINT [DAUX1/2] TO SECTOR 1
|
|
STA DAUX1
|
|
LDA #0
|
|
STA DAUX2
|
|
|
|
LDA #LOW BUFFER ; AND TO [BUFFER]
|
|
STA DBUFLO
|
|
LDA #HIGH BUFFER
|
|
STA DBUFHI
|
|
|
|
; FALL THROUGH ...
|
|
|
|
; -----------------
|
|
; WAIT FOR "START"
|
|
; -----------------
|
|
|
|
GETST: JSR SND3 ; "TING"
|
|
|
|
GST0: LDA CONSOL
|
|
CMP #6
|
|
BNE GST0
|
|
GST1: LDA CONSOL
|
|
CMP #7
|
|
BNE GST1
|
|
RTS
|
|
|
|
; --------------------
|
|
; PROMPT FOR GAME DISK
|
|
; --------------------
|
|
|
|
GETGD: LDA #46
|
|
STA CURSOR ; CENTER LINE
|
|
|
|
LDX #LOW RESTM
|
|
LDA #HIGH RESTM
|
|
LDY #RESTML
|
|
JSR PRINT ; "INSERT GAME DISK ..."
|
|
|
|
JSR GETST ; GET START KEY
|
|
|
|
LDX #LOW DL2 ; SWITCH BACK TO
|
|
LDA #HIGH DL2 ; FULL-SCREEN DLIST
|
|
STX DLTOP+LO
|
|
STA DLTOP+HI
|
|
STX SDLSTL+LO
|
|
STA SDLSTL+HI
|
|
|
|
LDA #0
|
|
STA SOUNDR ; DISABLE NOISY I/O
|
|
RTS
|
|
|
|
END
|
|
|