From 22cf6128b9b794b0ce65928d7624fc97a4806fd1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 24 Feb 2021 22:33:21 +0100 Subject: [PATCH] some work towards PRG file loading via CBDOS --- src/dos_m65/dev_sdcard/dev_sd_cmd_open.s | 58 ++++++++++------- src/dos_m65/dev_sdcard/fs_hvsr_open_file.s | 12 ---- src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s | 3 - src/dos_m65/dev_sdcard/fs_hvsr_read_file.s | 72 ++++++++++++++++++++++ 4 files changed, 108 insertions(+), 37 deletions(-) delete mode 100644 src/dos_m65/dev_sdcard/fs_hvsr_open_file.s create mode 100644 src/dos_m65/dev_sdcard/fs_hvsr_read_file.s diff --git a/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s b/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s index 02148279..a5680640 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s +++ b/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s @@ -15,22 +15,7 @@ dev_sd_cmd_OPEN_EOI: ; XXX this dispatcher is temporary - ; XXX add support for second card - - lda SD_CMDFN_BUF - cmp #'$' - beq dev_sd_cmd_OPEN_dir - - ; XXX implement for file names - - jmp dos_EXIT_SEC - - -dev_sd_cmd_OPEN_dir: - - ; XXX this should be moved to common part - - ; Erase filter pattern for the directory + ; Erase filter pattern XXX this should be moved to common part ldy #$0F lda #$A0 @@ -39,18 +24,47 @@ dev_sd_cmd_OPEN_dir: dey bpl @lp1 - ; Copy the filter from command + ; XXX add support for second card + + lda SD_CMDFN_BUF + cmp #'$' + beq dev_sd_cmd_OPEN_dir + + ; FALLTROUGH + +dev_sd_cmd_OPEN_file: + + ; Copy the filter from command XXX this should be moved to common part and deduplicated with directory opening ldy #$00 -@lp2: - lda SD_CMDFN_BUF+1, y +@lp1: + lda SD_CMDFN_BUF, y cmp #$A0 - beq @lp2_end + beq @lp1_end sta PAR_FPATTERN, y iny cpy #$10 - bne @lp2 + bne @lp1 -@lp2_end: +@lp1_end: + + jmp fs_hvsr_read_file_open + + +dev_sd_cmd_OPEN_dir: + + ; Copy the filter from command XXX this should be moved to common part and deduplicated with file opening + + ldy #$00 +@lp1: + lda SD_CMDFN_BUF+1, y + cmp #$A0 + beq @lp1_end + sta PAR_FPATTERN, y + iny + cpy #$10 + bne @lp1 + +@lp1_end: jmp fs_hvsr_read_dir_open diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_open_file.s b/src/dos_m65/dev_sdcard/fs_hvsr_open_file.s deleted file mode 100644 index cab06208..00000000 --- a/src/dos_m65/dev_sdcard/fs_hvsr_open_file.s +++ /dev/null @@ -1,12 +0,0 @@ - -; -; Hypervisor virtual filesystem - opening the file -; - - -fs_hvsr_read_file_open: - - ; XXX provide implementation - - sec - rts diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s index c7d9abf6..554e2086 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s @@ -4,9 +4,6 @@ ; -; XXX optimize the flow; we do not need 256-byte SD_DIRENT buffer, directory entries can be constructed directly - - fs_hvsr_read_dir_open: ; Open the directory diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s b/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s new file mode 100644 index 00000000..e4dcc5c1 --- /dev/null +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_file.s @@ -0,0 +1,72 @@ + +; +; Hypervisor virtual filesystem - opening the file +; + + +fs_hvsr_read_file_open: + + ; Open the directory + + lda #$12 ; dos_opendir + sta HTRAP00 + +nop + + ; XXX handle read errors + + sta SD_DESC ; store directory descriptor XXX invent better name + + ; Reset status to OK + + lda #$00 + sta PAR_TRACK + sta PAR_SECTOR + jsr util_status_SD + + ; XXX deduplicate part above with opening directory + + ; Read dirent structures into $1000, find the first matching file + ; Starting at $1000 VIC sees chargen, so this should be a safe place + + jsr fs_hvsr_direntmem_prepare + +@lp_find: + + jsr fs_hvsr_util_nextdirentry ; fetch the next file name + +bcs fs_hvsr_file_not_found + + ; Only accept files of type 'PRG' + + lda PAR_FTYPE + and #%10111111 + cmp #$02 + bne @lp_find + + ; Check if file name matches the filter + + jsr util_dir_filter + bne @lp_find ; if does not match, try the next entry + + ; Found the file - load it + + ; XXX provide implementation + + + + clc + rts + +fs_hvsr_file_not_found: + + jsr fs_hvsr_direntmem_restore ; restore $1000 memory content + + ldx SD_DESC + lda #$16 ; dos_closedir + sta HTRAP00 + +nop + + lda #39 ; file not found error + jsr util_status_SD + + sec + rts