2023-11-16 18:19:54 -05:00

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