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

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