more work towards physical floppy suppport

This commit is contained in:
FeralChild64 committed 2021-05-13 17:56:43 +02:00
1 parent 3a80867854
commit 8e13ef4016
5 files changed
+89 -55

No files matched your search

+2
View File
@@ -12,3 +12,5 @@
;; #ALIAS# m65_speed_tape_cbdos = KERNAL_0.m65_speed_tape_cbdos
;; #ALIAS# m65_speed_restore = KERNAL_0.m65_speed_restore
;; #ALIAS# wait_x_bars = KERNAL_0.wait_x_bars
-49
View File
@@ -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
+6 -6
View File
@@ -9,7 +9,7 @@ lowlevel_readsector:
lda #%00001111 ; set drive 0 (internal) and side 0
trb FDC_CONTROL ; $D080
jsr lowlevel_ensure_presence
jsr lowlevel_fdc_ensure_presence_refresh
; Check if buffer contains data from given track
; XXX compare device and unit too
@@ -32,8 +32,8 @@ lowlevel_readsector:
lowlevel_readsector_force:
jsr lowlevel_motor_on ; enable drive motor and LED
jsr lowlevel_ensure_presence
jsr lowlevel_fdc_motor_on ; enable drive motor and LED
jsr lowlevel_fdc_ensure_presence
lda #%10000000 ; select floppy buffer
trb SD_BUFCTL ; $D689
@@ -74,8 +74,8 @@ lowlevel_readsector_force:
lda #$40
sta FDC_COMMAND ; $D081
jsr lowlevel_wait_set_RDREQ ; wait till sector is found
jsr lowlevel_wait_clr_BUSY ; wait for BUSY flag to clear
jsr lowlevel_fdc_wait_set_RDREQ ; wait till sector is found
jsr lowlevel_fdc_wait_clr_BUSY ; wait for BUSY flag to clear
; 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
bne @lp1
jsr lowlevel_motor_off ; disable drive motor
jsr lowlevel_fdc_motor_off ; disable drive motor
; Copy sector to buffer in RAM
+7
View File
@@ -23,6 +23,13 @@ unit_fd_init:
sta FD_STATUS_BUF,x
bne @1
; Initialize the controller
lda #$80 ; default track stepping rate
sta FDC_STEP
lda #$FF
sta FDC_CLOCK
; End of initialization
rts