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

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