From 062c73a80979405260d323e4b86d28b177cbbe10 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 8 Mar 2021 21:47:51 +0100 Subject: [PATCH] initial (very primitive) general sector caching --- src/dos_m65/dos_init.s | 26 +++++++++++++----- .../filesystem_cbm/fs_cbm_nextdirentry.s | 27 +++++-------------- src/dos_m65/lowlevel/lowlevel_readsector.s | 24 ++++++++++++++++- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 85b48e5c..f4c5c5d3 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -39,20 +39,28 @@ dos_INIT: sta IDX1_TALKER sta IDX2_TALKER - ; Initialize device handlers + ; Initialize buffer metadata - jsr unit_sd_init - jsr unit_fd_init - jsr unit_rd_init + lda #$0 + ldx #17 +@2: + sta BUFTAB_TRACK, x + dec + sta BUFTAB_UNIT, x + sta BUFTAB_DEV, x + sta BUFTAB_SECTOR, x + inc + dex + bpl @2 ; Initialize DMA list ldy #$08 -@2: +@3: lda dos_dmalist_template, y sta DMAJOB_LIST, y dey - bpl @2: + bpl @3: ; Initialize helper code in RAM @@ -70,6 +78,12 @@ dos_INIT: sta code_RTS_03 sta code_RTS_04 + ; Initialize device handlers + + jsr unit_sd_init + jsr unit_fd_init + jsr unit_rd_init + ; Safer version of 'dos_EXIT' - does not affect speed related registers clc diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index fc500dac..e53ee21e 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -78,7 +78,7 @@ fs_cbm_nextdirentry: clc rts -@get_sector_lo: +@get_sector_lo: ; processing the 1st half of the buffer finished ; Check if this was the last sector @@ -88,31 +88,16 @@ fs_cbm_nextdirentry: cmp #$FF beq @end_of_dir - ; Transition from 1st half of the buffer, to (possibly) the second one + ; Load the next sector lda SHARED_BUF_1+0 - cmp BUFTAB_TRACK+1 - bne @get_sector_lo_next - - lda SHARED_BUF_1+1 - dec - cmp BUFTAB_SECTOR+1 - bne @get_sector_lo_next - - ; It's OK, we can transition to the upper half of the buffer - - lda FD_DIRENT - jmp @cont - -@get_sector_lo_next: - - lda SHARED_BUF_1+0 - sta PAR_TRACK + sta PAR_TRACK lda SHARED_BUF_1+1 sta PAR_SECTOR + bra @get_sector_common -@get_sector_hi: +@get_sector_hi: ; processing the 2nd half of the buffer finished ; Check if this was the last sector @@ -122,7 +107,7 @@ fs_cbm_nextdirentry: cmp #$FF beq @end_of_dir - ; Load new sector + ; Load the next sector lda SHARED_BUF_1+$100+0 sta PAR_TRACK diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s index c75e23ca..fc180823 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -1,9 +1,31 @@ -; Read a single sector from a block device +; Read a sector pair from a block device lowlevel_readsector: + ; XXX compare device and unit too + + ; Check if buffer contains data from given track + + lda PAR_TRACK + cmp BUFTAB_TRACK+1 + bne lowlevel_readsector_force + + ; Check if sectors match + + lda PAR_SECTOR + and #%11111110 + cmp BUFTAB_SECTOR+1 + bne lowlevel_readsector_force + + ; Data already loaded into buffer - do nothing + + clc + rts + +lowlevel_readsector_force: + ; Select FDD sector as buffer lda #%10000000 ; select floppy buffer