mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-13 15:18:18 +00:00
149 lines
2.9 KiB
Plaintext
149 lines
2.9 KiB
Plaintext
PAGE
|
|
SBTTL "--- GRIP OPERATING SYSTEM: ATARI ---"
|
|
|
|
GAME EQU 3*18+1 ; 1ST G-CODE BLOCK (55; TRACK 3, SECTOR 1)
|
|
IMAGE EQU 14*18+1 ; 1ST I-FILE BLOCK (253; TRACK 14, SECTOR 1)
|
|
BUFTOP EQU BUFFER+$80 ; TOP HALF OF [BUFFER]
|
|
|
|
;--------------------------------------------------
|
|
; FETCH VIRTUAL PAGE [DBLOCK] AND PUT AT RAM PAGES
|
|
; [DBUFF],[DBUFF]+1.
|
|
; ON EXIT POINT [DBLOCK] AT NEXT V-PAGE AND POINT
|
|
; [DBUFF] TO NEXT RAM PAGE
|
|
;--------------------------------------------------
|
|
|
|
; ----------------
|
|
; GET A DISK BLOCK
|
|
; ----------------
|
|
|
|
GETDSK: LDX #0
|
|
STX DBTOP ; CLEAR MSB OF BLOCK INDEX
|
|
INX ; = 1
|
|
STX DUNIT ; ALWAYS USE DRIVE #1
|
|
STX DCNT ; COUNTER FOR LOOP TO GET (2) 256 BYTE PAGES
|
|
|
|
|
|
LDA #$52 ; SIO "READ" COMMAND
|
|
STA DCOMND
|
|
|
|
; CALC WHICH DISK SECTORS TO GET
|
|
|
|
LDA DBLOCK ; GET THE VIRTUAL PAGE INDEX
|
|
CMP ISTART ; IT IS BELOW THE IMAGE FILE?
|
|
BCC GETGAM ; IF SO, IT'S IN THE GAME FILE
|
|
|
|
; GET BLOCK [A] FROM THE IMAGE FILE
|
|
|
|
SBC ISTART ; ZERO-ALIGN THE BLOCK INDEX
|
|
ASL A ; * 2 FOR ATARI 128-BYTE SECTORS
|
|
ROL DBTOP ; BUILD MSB
|
|
|
|
; ENTRY POINT FOR VERIFY
|
|
|
|
GETIMG: ASL A ; * 2 AGAIN FOR 512 BYTE PAGES
|
|
ROL DBTOP
|
|
CLC
|
|
ADC #LOW IMAGE ; ADD THE PHYSICAL I-FILE OFFSET
|
|
TAX ; SAVE LSB HERE
|
|
|
|
LDA DBTOP ; DO MSB
|
|
ADC #HIGH IMAGE
|
|
JMP DODSK
|
|
|
|
; GET BLOCK [A] FROM THE GAME FILE
|
|
|
|
GETGAM: ASL A ; * 2 FOR 128-BYTE SECTORS
|
|
ROL DBTOP
|
|
|
|
; ENTRY POINT FOR VERIFY
|
|
|
|
GETGME: ASL A ; * 2 AGAIN FOR 512 BYTE PAGES
|
|
CLC
|
|
ADC #LOW GAME ; ADD THE PHYSICAL G-FILE OFFSET
|
|
TAX ; SAVE LSB HERE
|
|
|
|
LDA DBTOP ; TAKE CARE OF MSB
|
|
ADC #HIGH GAME
|
|
|
|
; VALIDATE SECTOR ADDRESS IN [X/A] (LSB/MSB)
|
|
; MUST BE NO HIGHER THAN 717 ($02CD)
|
|
|
|
DODSK: CMP #$02 ; MSB OUT OF RANGE?
|
|
BCC ROK ; OK IF MSB < 2
|
|
BEQ T717 ; CHECK LSB IF MSB = 2
|
|
|
|
; *** ERROR #10: DISK ADDRESS RANGE ***
|
|
|
|
RANGE: LDA #10
|
|
JMP GERROR
|
|
|
|
T717: CPX #$CE ; MSB WAS 2; IS LSB > $CD?
|
|
BCS RANGE ; RANGE ERROR IF SO
|
|
|
|
ROK: STX SECTOR+LO
|
|
STA SECTOR+HI
|
|
|
|
DSKLP1: LDA SECTOR+LO
|
|
STA DAUX1 ; LSB OF SECTOR ADDRESS
|
|
LDA SECTOR+HI
|
|
STA DAUX2 ; MSB OF SECTOR ADDRESS
|
|
|
|
LDA #LOW BUFFER
|
|
STA DBUFLO
|
|
LDA #HIGH BUFFER
|
|
STA DBUFHI
|
|
|
|
; FETCH DISK BLOCK INTO [BUFFER]
|
|
|
|
JSR DSKINV ; GET 1ST HALF OF BLOCK
|
|
LDA DSTATS ; IF STATUS IS NEGATIVE,
|
|
BMI DERR ; SOMETHING WENT WRONG
|
|
|
|
LDA #LOW BUFTOP ; POINT TO
|
|
STA DBUFLO ; TOP HALF-PAGE
|
|
LDA #HIGH BUFTOP ; OF [BUFFER]
|
|
STA DBUFHI
|
|
|
|
INC SECTOR+LO ; ALSO POINT
|
|
BNE DODSK1 ; TO THE
|
|
INC SECTOR+HI ; NEXT SECTOR
|
|
|
|
DODSK1: LDA SECTOR+LO
|
|
STA DAUX1
|
|
LDA SECTOR+HI
|
|
STA DAUX2
|
|
|
|
JSR DSKINV ; GET 2ND HALF OF BLOCK
|
|
LDA DSTATS ; ERROR IF
|
|
BMI DERR ; [DSTATS] RETURNED NEGATIVE
|
|
|
|
; MOVE [BUFFER] TO PAGE [DBUFF]
|
|
|
|
LDY #0
|
|
STY DBUFF+LO ; MAKE SURE LSB IS ZEROED!
|
|
MOVEB: LDA BUFFER,Y
|
|
STA (DBUFF),Y
|
|
INY
|
|
BNE MOVEB
|
|
|
|
INC DBUFF+HI ; POINT TO NEXT RAM PAGE
|
|
DEC DCNT
|
|
BMI DSKP1
|
|
|
|
INC SECTOR+LO
|
|
BNE DSKP0
|
|
INC SECTOR+HI
|
|
DSKP0: JMP DSKLP1
|
|
|
|
|
|
DSKP1: INC DBLOCK ; POINT TO NEXT VIRTUAL PAGE
|
|
RTS
|
|
|
|
; *** ERROR #11: DISK ACCESS ***
|
|
|
|
DERR: LDA #11
|
|
JMP GERROR
|
|
|
|
END
|
|
|