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