From 8e13ef40166a5f1f249b2a1e9b5e56a787e0f3a1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 13 May 2021 17:56:43 +0200 Subject: [PATCH] more work towards physical floppy suppport --- src/dos_m65/dos_imports.s | 2 + src/dos_m65/lowlevel/lowlevel_helpers.s | 49 -------------- src/dos_m65/lowlevel/lowlevel_helpers_fdc.s | 74 +++++++++++++++++++++ src/dos_m65/lowlevel/lowlevel_readsector.s | 12 ++-- src/dos_m65/unit_floppy/unit_fd_init.s | 7 ++ 5 files changed, 89 insertions(+), 55 deletions(-) delete mode 100644 src/dos_m65/lowlevel/lowlevel_helpers.s create mode 100644 src/dos_m65/lowlevel/lowlevel_helpers_fdc.s diff --git a/src/dos_m65/dos_imports.s b/src/dos_m65/dos_imports.s index 825cd530..a0f019c9 100644 --- a/src/dos_m65/dos_imports.s +++ b/src/dos_m65/dos_imports.s @@ -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 diff --git a/src/dos_m65/lowlevel/lowlevel_helpers.s b/src/dos_m65/lowlevel/lowlevel_helpers.s deleted file mode 100644 index cd81ec98..00000000 --- a/src/dos_m65/lowlevel/lowlevel_helpers.s +++ /dev/null @@ -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 diff --git a/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s b/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s new file mode 100644 index 00000000..1d4d0696 --- /dev/null +++ b/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s @@ -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 diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s index 8d2de407..4cb3d26f 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -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 diff --git a/src/dos_m65/unit_floppy/unit_fd_init.s b/src/dos_m65/unit_floppy/unit_fd_init.s index 45143cce..9e254cba 100644 --- a/src/dos_m65/unit_floppy/unit_fd_init.s +++ b/src/dos_m65/unit_floppy/unit_fd_init.s @@ -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