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