Files
erkyrath.infocom-zcode-terps/64/zip/fast.src
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

201 lines
2.5 KiB
Plaintext

PAGE
SBTTL "--- FAST DISK READ: CBM64 ---"
; --------------
; INIT FAST READ
; --------------
FINIT: LDA #2
TAY
LDX #8
JSR SETLFS
LDA #2
LDX #LOW DNAME
LDY #HIGH DNAME
JSR SETNAM
JSR OPEN
LDX #15
JSR CHKOUT
LDY #9 ; SEND "U1:2,0,1,1"
FNT0: LDA DCMND,Y
JSR CHROUT
DEY
BPL FNT0
JSR CLRCHN ; RESET CHANNEL
LDX #15
JSR CHKOUT
LDA #'U' ; SEND "U3" COMMAND
JSR CHROUT
LDA #'3'
JSR CHROUT
LDA #$FF
STA FASTEN ; SET "FAST-READ ENABLED" FLAG
JMP CLRCHN ; CLEAR & RETURN
DNAME: DB "#2"
DCMND: DB "1,1,0,2:1U"
; ----------------------
; FAST-READ A DISK BLOCK
; ----------------------
; ENTRY: TARGET TRACK IN [TRACK]
; TARGET SECTOR IN [SECTOR]
; EXIT: DATA IN [IOBUFF]
DOFAST: LDA TRACK ; SPECIFY
JSR SNDBYT ; TRACK &
LDA SECTOR ; SECTOR TO READ
JSR SNDBYT
LDA #0
STA FINDEX ; INIT LOOP INDEX
DFST1: JSR ZOOM ; GET A BYTE FROM DISK
LDY FINDEX
STA IOBUFF,Y ; MOVE TO [IOBUFF]
INC FINDEX
BNE DFST1 ; FILL THE BUFFER
CLC
RTS
; -------------------
; DISENGAGE FAST-READ
; -------------------
FOFF: LDA #0
STA FASTEN ; CLEAR "FAST-READ ENABLED" FLAG
JSR SNDBYT ; SEND "TRACK 0"
LDA #8
JSR DOPEN ; CLOSE & OPEN BOOT DRIVE
JSR AOPEN ; OPEN DATA CHANNEL
LDX #15
JSR CHKOUT ; OUTPUT TO COMMAND CHANNEL
LDA #'U' ; SEND "UI" TO RE-INIT DRIVE
JSR CHROUT
LDA #'I'
JSR CHROUT
JMP CLRCHN ; CLEAR & RETURN
; -----------------------
; GET FAST BYTE FROM DISK
; -----------------------
ZOOM: LDA #$80
STA FDATA
GETBIT: LDA CI2PRA
ORA #$10
STA CI2PRA
GETBO0: LDA CI2PRA
TAY
AND #$80
BNE GETBO0
TYA
AND #$EF
STA CI2PRA
GETBO1: LDA CI2PRA
TAY
AND #$80
BEQ GETBO1
GETBO2: TYA
ORA #$10
STA CI2PRA
LDX #7
GETBO3: DEX
BNE GETBO3
LDA CI2PRA
TAY
AND #$EF
STA CI2PRA
TYA
ASL A
ROR FDATA
BCC GETBO2
LDA FDATA
EOR #$FF
RTS
; -----------------
; SEND BYTE TO DISK
; -----------------
SNDBYT: STA FDATA
LDX #8
BIT: JSR SCLK1
WAITD: JSR SETTLE
AND #$80
BNE WAITD
JSR SCLK0
SNDBO1: JSR SETTLE
TAY
AND #$80
BEQ SNDBO1
TYA
ORA #$10
LSR FDATA
BCC SNDBO2
ORA #$20
SNDBO2: STA CI2PRA
LDY #7
SNDBO3: DEY
BNE SNDBO3
JSR SCLK0
DEX
BNE BIT
RTS
; ---------------------------
; WAIT FOR I/O PORT TO SETTLE
; ---------------------------
SETTLE: LDA CI2PRA
CMP CI2PRA
BNE SETTLE
RTS
; ---------------
; SET CLKOUT TO 1
; ---------------
SCLK1: LDA CI2PRA
ORA #$10
AND #$DF
BNE PUTPRT
; ---------------
; SET CLKOUT TO 0
; ---------------
SCLK0: LDA CI2PRA
AND #$CF
PUTPRT: STA CI2PRA
NOP
NOP
RTS
END