mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-11 23:43:24 +00:00
234 lines
5.8 KiB
Plaintext
234 lines
5.8 KiB
Plaintext
* FILE ZIP94-ASM
|
|
|
|
***************************************************
|
|
* I/O FOR SAVE/RESTORE *
|
|
***************************************************
|
|
|
|
RORG
|
|
DATA >EE94
|
|
|
|
DEF GTFLNM,SBKSET,PTSBKS,GTSBKS
|
|
DEF SBKO,SBKI
|
|
|
|
REF NEWLIN,INFORM,TTYIN,TTYOUT
|
|
REF FINDPG,PABPTR,DSRLNK
|
|
|
|
REF PAB3,PAB3N,PAB3X,PAB3Y,PAB3Z
|
|
REF VSBW,VSBR,VMBW,VMBR
|
|
REF JSR,FATAL
|
|
|
|
* NOTE: THESE ROUTINES DESTROY REGISTERS 1 AND 2, BUT THEY
|
|
* ARE CALLED ONLY FROM SAVE/RESTORE
|
|
|
|
*===========================================================
|
|
|
|
* GET A FILE NUMBER (0 TO 4) AND A DISK NUMBER (1 TO 3),
|
|
* STORE INFORMATION IN VDP "SAVE" PAB
|
|
* SKIP ONE WORD UPON RETURN (IF NO ABORT)
|
|
|
|
GTF0 BYTE 30 "0"
|
|
GTF4 BYTE 34 "4"
|
|
GTF1 BYTE 31 "1"
|
|
GTF3 BYTE 33 "3"
|
|
GTFB BYTE 8 BACKSPACE
|
|
GTFR BYTE 13 CARRIAGE RETURN
|
|
|
|
GTFLNM BL @JSR
|
|
DATA NEWLIN
|
|
|
|
BL @JSR
|
|
DATA INFORM PRINT HEADER
|
|
|
|
TEXT 'Type backspace to abort'
|
|
BYTE 0
|
|
EVEN
|
|
|
|
BL @JSR
|
|
DATA INFORM
|
|
|
|
TEXT 'Position (0-4): (Default=0) '
|
|
BYTE 80
|
|
EVEN
|
|
|
|
X850 BL @JSR
|
|
DATA TTYIN GET A RESPONSE
|
|
|
|
CB R0,@GTFB ABORT?
|
|
JEQ X858 YES
|
|
|
|
CB R0,@GTFR USE DEFAULT POSITION?
|
|
JEQ X851 YES
|
|
|
|
CB R0,@GTF0 ALLOWABLE POSITION NUMBER?
|
|
JLT X850 NO
|
|
CB R0,@GTF4
|
|
JGT X850 NO
|
|
|
|
MOV R0,R1 YES, SAVE IT IN R1 HIGH
|
|
BL @JSR
|
|
DATA TTYOUT ECHO TO SCREEN
|
|
|
|
JMP X852
|
|
X851 MOVB @GTF0,R1 DEFAULT POSITION 0
|
|
|
|
X852 LI R0,PAB3Z SAVE PAB, "POSITION #" SLOT
|
|
BLWP @VSBW FIX IT
|
|
|
|
BL @JSR
|
|
DATA NEWLIN
|
|
|
|
BL @JSR
|
|
DATA INFORM
|
|
|
|
TEXT 'Disk drive (1-3): (Default=1) '
|
|
BYTE 80
|
|
EVEN
|
|
|
|
X855 BL @JSR
|
|
DATA TTYIN GET A RESPONSE
|
|
|
|
CB R0,@GTFB ABORT?
|
|
JEQ X858 YES
|
|
|
|
CB R0,@GTFR USE DEFAULT DRIVE?
|
|
JEQ X856 YES
|
|
|
|
CB R0,@GTF1 ALLOWABLE DRIVE NUMBER?
|
|
JLT X855 NO
|
|
CB R0,@GTF3
|
|
JGT X855 NO
|
|
|
|
MOV R0,R1 YES, SAVE IT IN R1 HIGH
|
|
BL @JSR
|
|
DATA TTYOUT AND ECHO IT TO SCREEN
|
|
|
|
JMP X857
|
|
X856 MOVB @GTF1,R1 USE DEFAULT DRIVE 1
|
|
|
|
X857 LI R0,PAB3Y SAVE PAB, "DRIVE NUMBER" SLOT
|
|
BLWP @VSBW FIX IT
|
|
|
|
INCT *R6 SKIP ON RETURN (IF NO ABORT)
|
|
|
|
X858 BL @JSR
|
|
DATA NEWLIN FORMAT SCREEN
|
|
BL @JSR
|
|
DATA NEWLIN
|
|
|
|
MOV *R6+,R11
|
|
B *R11 RETURN
|
|
|
|
*===========================================================
|
|
|
|
PABBUF DATA 0 POINTER, FREED VDP SPACE
|
|
|
|
SBKO EQU >0200 FIX-DISP-OUTPUT-SEQ (0-0-01-0)
|
|
SBKI EQU >0400 FIX-DISP-INPUT-SEQ (0-0-10-0)
|
|
|
|
* SET-UP ROUTINE FOR SAVE AND RESTORE
|
|
* GET SOME BUFFER SPACE, LEAVE VDP POINTER IN PABBUF
|
|
* FIX SAVE PAB (BUFFER AND FLAG/STATUS SLOTS)
|
|
|
|
* GIVEN: R8 (HIGH BYTE) IS DESIRED STATUS BYTE (SEE ABOVE)
|
|
|
|
SBKSET BL @JSR
|
|
DATA FINDPG FIND SOME BUFFER SPACE
|
|
MOV R0,@PABBUF SAVE BUFFER POINTER HERE
|
|
|
|
LI R9,>FE00 "UNUSED PAGE"
|
|
MOV R9,*R1+ FIX PAGE TABLE ENTRY
|
|
CLR *R1 FIX REF COUNT
|
|
|
|
LI R0,PAB3X PAB FLAG/STATUS SLOT
|
|
MOV R8,R1 STATUS BYTE
|
|
BLWP @VSBW FIX THE SAVE PAB, CLEAR FLAGS
|
|
|
|
INC R0 PAB VDP BUFFER SLOT
|
|
LI R1,PABBUF BUFFER POINTER
|
|
LI R2,2
|
|
BLWP @VMBW FIX THE SAVE PAB
|
|
|
|
MOV *R6+,R11
|
|
B *R11 RETURN
|
|
|
|
|
|
* SAVE DATA FROM CORE TO DISK, VIA PABBUF, IN 255 BYTE UNITS
|
|
* SKIP ONE WORD UPON RETURN (IF NO ERROR)
|
|
|
|
* GIVEN: R3 IS FIRST ABSOLUTE ADDRESS, R4 IS LAST (+1)
|
|
* RETURN: SAME
|
|
|
|
PTSBKS LI R0,PAB3 PAB OP-CODE SLOT
|
|
LI R1,>0300 "WRITE"
|
|
BLWP @VSBW FIX THE SAVE PAB
|
|
|
|
LI R8,PAB3N PAB NAME LEN SLOT
|
|
|
|
MOV @PABBUF,R0 VDP BUFFER SPACE
|
|
MOV R3,R1 FIRST 255 BYTES TO SAVE
|
|
LI R2,255
|
|
X865 BLWP @VMBW MOVE BYTES TO VDP
|
|
|
|
MOV R8,@PABPTR
|
|
BLWP @DSRLNK SAVE BUFFER TO DISK
|
|
DATA 8
|
|
JEQ X866 ERROR TRAP
|
|
|
|
A R2,R1 NEXT 255 BYTES TO SAVE
|
|
C R1,R4 DONE YET?
|
|
JLT X865 NO
|
|
|
|
INCT *R6 SKIP ON RETURN FOR SUCCESS
|
|
JMP X867
|
|
|
|
* ERROR FLAGS ARE CLEARED UPON NEXT CALL TO SBKSET
|
|
|
|
X866 BL @JSR
|
|
DATA INFORM
|
|
|
|
TEXT 'Disk write error, or disk full'
|
|
BYTE 0
|
|
EVEN
|
|
|
|
X867 MOV *R6+,R11
|
|
B *R11 RETURN
|
|
|
|
|
|
* RESTORE DATA FROM DISK TO CORE, VIA PABBUF, 255 BYTE UNITS
|
|
* GIVEN: R3 IS FIRST ABSOLUTE ADDRESS, R4 IS LAST (+1)
|
|
* RETURN: SAME
|
|
|
|
GTSBKS LI R0,PAB3 PAB OP-CODE SLOT
|
|
LI R1,>0200 "READ"
|
|
BLWP @VSBW FIX THE SAVE PAB
|
|
|
|
LI R8,PAB3N SAVE PAB, NAME LEN SLOT
|
|
|
|
MOV @PABBUF,R0 VDP BUFFER SPACE
|
|
MOV R3,R1 TARGET, FIRST 255 BYTES
|
|
LI R2,255
|
|
|
|
X870 MOV R8,@PABPTR
|
|
BLWP @DSRLNK RESTORE BUFFER FROM DISK
|
|
DATA 8
|
|
JEQ X871 ERROR TRAP
|
|
|
|
BLWP @VMBR MOVE BYTES TO CORE
|
|
|
|
A R2,R1 TARGET, NEXT 255 BYTES
|
|
C R1,R4 DONE YET?
|
|
JLT X870 NO
|
|
|
|
MOV *R6+,R11 YES,
|
|
B *R11 RETURN
|
|
|
|
X871 BL @JSR
|
|
DATA FATAL
|
|
|
|
TEXT 'SAVE file read error'
|
|
BYTE 0
|
|
EVEN
|
|
|
|
|
|
END
|