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