PAGE SBTTL "--- CBM64 FAST DISK HANDSHAKE ROUTINES ---" ; ------------------ ; 1541 DRIVE EQUATES ; ------------------ PB EQU $1800 JOBS EQU $00 HDRS EQU $06 DATA EQU $0A INDEX EQU $0B DATIN EQU $01 DATOUT EQU $02 CLKIN EQU $04 CLKOUT EQU $08 ATNIN EQU $80 READ EQU $80 WRITE EQU $90 VERIFY EQU $A0 SEEK EQU $B0 SECSEK EQU SEEK+8 BUMP EQU $C0 JUMPC EQU $D0 EXEC EQU $E0 BUF1 EQU $0300 BUF2 EQU $0400 BUF3 EQU $0500 BUF4 EQU $0600 BUF5 EQU $0700 DSKCNT EQU $1C00 ; DISK CONTROLLER PORT ADDRESS ORG BUF3 INIT0: LDA PB AND #$FF-DATOUT-CLKOUT STA PB JSR CLK0 CMDWT: LDA DSKCNT ; READ CONTROLLER AND #%11110111 ; CLEAR BIT 3 STA DSKCNT ; TO SHUT OFF THE DAMNED LITTLE RED LIGHT JSR BYTGET ; GET TRACK ID (1-35) TAX ; SAVE HERE BEQ CMDEND ; IF ZERO CMP #$FF ; OR $FF, BEQ CMDEND ; DISENGAGE STA HDRS ; ELSE SET TRACK # JSR BYTGET ; GET SECTOR # STA HDRS+1 ; AND SET IT LDA DSKCNT ; TURN BACK ON ORA #%00001000 ; THE STUPID LITTLE STA DSKCNT ; RED LIGHT JSR RDFILE ; GET THE DATA JMP CMDWT ; WAIT FOR NEXT TRACK/SECTOR CMDEND: RTS ; EXIT HARD LOOP DEBNC: LDA PB ; WAIT FOR SERIAL LINE CMP PB ; TO SETTLE DOWN BNE DEBNC RTS CLK0: JSR DEBNC AND #CLKIN BNE CLK0 RTS BYTGET: LDA #$80 STA DATA GTBIT: JSR DEBNC TAY AND #CLKIN BEQ GTBIT SEI TYA ORA #DATOUT STA PB JSR CLK0 LDA PB AND #$FF-DATOUT STA PB GTBO0: JSR DEBNC TAY AND #CLKIN BEQ GTBO0 JSR CLK0 CLI TYA LSR A ROR DATA BCC GTBIT LDA DATA RTS BYTSND: LDX #8 STA DATA BITSND: LDA PB TAY AND #CLKIN BEQ BITSND TYA ORA #DATOUT STA PB SEI BSND0: LDA PB TAY AND #CLKIN BNE BSND0 BSND1: TYA AND #$FF-DATOUT STA PB SPEED: LDA PB TAY AND #CLKIN BEQ SPEED TYA LSR DATA BCC BSND2 ORA #DATOUT BSND2: STA PB BSND3: LDA PB TAY AND #CLKIN BNE BSND3 TYA AND #$FF-DATOUT STA PB DEX BNE SPEED CLI RTS RDFILE: LDA #READ STA JOBS TSTDO3: LDA JOBS BMI TSTDO3 TSTDO5: LDA #0 STA INDEX TSTDO4: LDY INDEX LDA BUF1,Y JSR BYTSND INC INDEX BNE TSTDO4 RTS ; FILL REMAINDER OF SECTOR ; WITH JUNK DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 DB 0,0 END