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

184 lines
2.1 KiB
Plaintext

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