more work towards physical floppy suppport
This commit is contained in:
1 parent
3a80867854
commit
8e13ef4016
5 files changed
+89
-55
No files matched your search
@@ -12,3 +12,5 @@
|
|||||||
|
|
||||||
;; #ALIAS# m65_speed_tape_cbdos = KERNAL_0.m65_speed_tape_cbdos
|
;; #ALIAS# m65_speed_tape_cbdos = KERNAL_0.m65_speed_tape_cbdos
|
||||||
;; #ALIAS# m65_speed_restore = KERNAL_0.m65_speed_restore
|
;; #ALIAS# m65_speed_restore = KERNAL_0.m65_speed_restore
|
||||||
|
|
||||||
|
;; #ALIAS# wait_x_bars = KERNAL_0.wait_x_bars
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
|
|
||||||
; Helper routines for low-level disk operations
|
|
||||||
|
|
||||||
|
|
||||||
lowlevel_ensure_presence:
|
|
||||||
|
|
||||||
lda FDC_STATUS_B ; $D083 ; check if disk is inserted XXX this is probably not enough!
|
|
||||||
and #$08
|
|
||||||
beq @not_present
|
|
||||||
rts
|
|
||||||
|
|
||||||
@not_present:
|
|
||||||
|
|
||||||
pla
|
|
||||||
pla
|
|
||||||
|
|
||||||
jsr lowlevel_motor_off ; if disk not present, disable drive motor
|
|
||||||
|
|
||||||
; XXX set error code, invalidate buffers, etc.
|
|
||||||
|
|
||||||
sec
|
|
||||||
rts
|
|
||||||
|
|
||||||
lowlevel_motor_on:
|
|
||||||
|
|
||||||
lda #%00100000 ; enable drive motor and LED
|
|
||||||
tsb FDC_CONTROL ; $D080
|
|
||||||
bra lowlevel_wait_clr_BUSY
|
|
||||||
|
|
||||||
lowlevel_motor_off:
|
|
||||||
|
|
||||||
lda #%00100000 ; disable drive motor and LED
|
|
||||||
trb FDC_CONTROL ; $D080
|
|
||||||
|
|
||||||
; FALLTROUGH
|
|
||||||
|
|
||||||
lowlevel_wait_clr_BUSY:
|
|
||||||
|
|
||||||
bit FDC_STATUS_A ; $D082
|
|
||||||
bmi lowlevel_wait_clr_BUSY
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
lowlevel_wait_set_RDREQ:
|
|
||||||
|
|
||||||
bit FDC_STATUS_B ; $D083
|
|
||||||
bpl lowlevel_wait_set_RDREQ
|
|
||||||
|
|
||||||
rts
|
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
|
||||||
|
; Helper routines for low-level disk operations
|
||||||
|
|
||||||
|
|
||||||
|
lowlevel_fdc_ensure_presence_refresh:
|
||||||
|
|
||||||
|
jsr lowlevel_fdc_wait_clr_BUSY ; to be extra sure
|
||||||
|
|
||||||
|
; XXX stepping head is definitely needed, but probably still not enough
|
||||||
|
|
||||||
|
lda #%00011000 ; step head 1 track in (XXX: check if it is really in)
|
||||||
|
sta FDC_COMMAND ; $D081
|
||||||
|
jsr lowlevel_fdc_wait_clr_BUSY
|
||||||
|
|
||||||
|
lda #%00010000 ; step head 1 track out (XXX: check if it is really out)
|
||||||
|
sta FDC_COMMAND ; $D081
|
||||||
|
jsr lowlevel_fdc_wait_clr_BUSY
|
||||||
|
|
||||||
|
; FALLTROUGH
|
||||||
|
|
||||||
|
lowlevel_fdc_ensure_presence:
|
||||||
|
|
||||||
|
lda FDC_STATUS_B ; $D083 ; check if disk is inserted
|
||||||
|
and #$08
|
||||||
|
beq @not_present
|
||||||
|
rts
|
||||||
|
|
||||||
|
@not_present:
|
||||||
|
|
||||||
|
pla
|
||||||
|
pla
|
||||||
|
|
||||||
|
jsr lowlevel_fdc_motor_off ; if disk not present, disable drive motor
|
||||||
|
|
||||||
|
; XXX set error code, invalidate buffers, etc.
|
||||||
|
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
lowlevel_fdc_motor_on:
|
||||||
|
|
||||||
|
lda #%00100000 ; enable drive motor and LED
|
||||||
|
tsb FDC_CONTROL ; $D080
|
||||||
|
|
||||||
|
; Allow some time for spin-up; according to https://wiki.osdev.org/Floppy_Disk_Controller
|
||||||
|
; 300 ms should be more than enough
|
||||||
|
|
||||||
|
phx
|
||||||
|
ldx #$0F
|
||||||
|
jsr wait_x_bars
|
||||||
|
plx
|
||||||
|
|
||||||
|
bra lowlevel_fdc_wait_clr_BUSY
|
||||||
|
|
||||||
|
lowlevel_fdc_motor_off:
|
||||||
|
|
||||||
|
lda #%00100000 ; disable drive motor and LED
|
||||||
|
trb FDC_CONTROL ; $D080
|
||||||
|
|
||||||
|
; FALLTROUGH
|
||||||
|
|
||||||
|
lowlevel_fdc_wait_clr_BUSY:
|
||||||
|
|
||||||
|
bit FDC_STATUS_A ; $D082
|
||||||
|
bmi lowlevel_fdc_wait_clr_BUSY
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
lowlevel_fdc_wait_set_RDREQ:
|
||||||
|
|
||||||
|
bit FDC_STATUS_B ; $D083
|
||||||
|
bpl lowlevel_fdc_wait_set_RDREQ
|
||||||
|
|
||||||
|
rts
|
||||||
@@ -9,7 +9,7 @@ lowlevel_readsector:
|
|||||||
lda #%00001111 ; set drive 0 (internal) and side 0
|
lda #%00001111 ; set drive 0 (internal) and side 0
|
||||||
trb FDC_CONTROL ; $D080
|
trb FDC_CONTROL ; $D080
|
||||||
|
|
||||||
jsr lowlevel_ensure_presence
|
jsr lowlevel_fdc_ensure_presence_refresh
|
||||||
|
|
||||||
; Check if buffer contains data from given track
|
; Check if buffer contains data from given track
|
||||||
; XXX compare device and unit too
|
; XXX compare device and unit too
|
||||||
@@ -32,8 +32,8 @@ lowlevel_readsector:
|
|||||||
|
|
||||||
lowlevel_readsector_force:
|
lowlevel_readsector_force:
|
||||||
|
|
||||||
jsr lowlevel_motor_on ; enable drive motor and LED
|
jsr lowlevel_fdc_motor_on ; enable drive motor and LED
|
||||||
jsr lowlevel_ensure_presence
|
jsr lowlevel_fdc_ensure_presence
|
||||||
|
|
||||||
lda #%10000000 ; select floppy buffer
|
lda #%10000000 ; select floppy buffer
|
||||||
trb SD_BUFCTL ; $D689
|
trb SD_BUFCTL ; $D689
|
||||||
@@ -74,8 +74,8 @@ lowlevel_readsector_force:
|
|||||||
lda #$40
|
lda #$40
|
||||||
sta FDC_COMMAND ; $D081
|
sta FDC_COMMAND ; $D081
|
||||||
|
|
||||||
jsr lowlevel_wait_set_RDREQ ; wait till sector is found
|
jsr lowlevel_fdc_wait_set_RDREQ ; wait till sector is found
|
||||||
jsr lowlevel_wait_clr_BUSY ; wait for BUSY flag to clear
|
jsr lowlevel_fdc_wait_clr_BUSY ; wait for BUSY flag to clear
|
||||||
|
|
||||||
; Wait for DRQ and EQ flags to go high
|
; Wait for DRQ and EQ flags to go high
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ lowlevel_readsector_force:
|
|||||||
cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point
|
cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point
|
||||||
bne @lp1
|
bne @lp1
|
||||||
|
|
||||||
jsr lowlevel_motor_off ; disable drive motor
|
jsr lowlevel_fdc_motor_off ; disable drive motor
|
||||||
|
|
||||||
; Copy sector to buffer in RAM
|
; Copy sector to buffer in RAM
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,13 @@ unit_fd_init:
|
|||||||
sta FD_STATUS_BUF,x
|
sta FD_STATUS_BUF,x
|
||||||
bne @1
|
bne @1
|
||||||
|
|
||||||
|
; Initialize the controller
|
||||||
|
|
||||||
|
lda #$80 ; default track stepping rate
|
||||||
|
sta FDC_STEP
|
||||||
|
lda #$FF
|
||||||
|
sta FDC_CLOCK
|
||||||
|
|
||||||
; End of initialization
|
; End of initialization
|
||||||
|
|
||||||
rts
|
rts
|
||||||
Reference in new issue
Block a user