From bdc5dc1360df522db6dc860a6e8a3a9a2f4f53af Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 14 Feb 2021 21:54:47 +0100 Subject: [PATCH] more work on reading SD card directory --- src/dos_m65/,aliases_dos.s | 2 + src/dos_m65/assets/dos_parts_dir.s | 19 ++++ src/dos_m65/dev_sdcard/dev_sd_init.s | 1 + src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s | 107 ++++++++++++++++------ 4 files changed, 100 insertions(+), 29 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index ff23b011..9a7ec1e6 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -96,3 +96,5 @@ !addr RD_CMDFN_BUF = $8200 ; buffer for command and/or file name, 128 bytes, ram disk !addr SD_DIRENT = $8280 ; 256 byte buffer for 'dirent' structure + !addr SD_DIR_DESC = $8380 ; file descriptor for reading directory + diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index a1af128b..bdb7be75 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -31,3 +31,22 @@ dir_end: ; 19 bytes !byte $00, $00 ; line number 0 !pet "blocks free." !byte $00, $00, $00 ; end of the line, end of program marker + +; File types / extensions + +dir_ext_01: !pet "seq" ; SEQ +dir_ext_02: !pet "prg" ; PRG +dir_ext_03: !pet "usr" ; USR +dir_ext_04: !pet "rel" ; REL +dir_ext_05: !pet "dir" ; directory +dir_ext_06: !pet "d67" ; CBM 2040 (DOS 1) - disk image +dir_ext_07: !pet "d64" ; CBM 1541 / 2031 / 3040 / 4040 - disk image +dir_ext_08: !pet "d71" ; CBM 1571 - disk image +dir_ext_09: !pet "d81" ; CBM 1581 - disk image +dir_ext_0A: !pet "d80" ; CBM 8050 - disk image +dir_ext_0B: !pet "d81" ; CBM 8250 / 1001 - disk image +dir_ext_0C: !pet "d90" ; CBM D9060 / D9090 - hard disk image +dir_ext_0D: !pet "d1m" ; CMD FD 2000 / 4000 - disk image (DD) +dir_ext_0E: !pet "d2m" ; CMD FD 2000 / 4000 - disk image (HD) +dir_ext_0F: !pet "d2m" ; CMD FD 4000 - disk image (ED) +dir_ext_10: !pet "dhd" ; CMD HD - hard disk image diff --git a/src/dos_m65/dev_sdcard/dev_sd_init.s b/src/dos_m65/dev_sdcard/dev_sd_init.s index 75f1b8b8..2eafa48b 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_init.s +++ b/src/dos_m65/dev_sdcard/dev_sd_init.s @@ -16,6 +16,7 @@ dev_sd_init: stx SD_ACPTR_LEN+1 stx SD_ACPTR_PTR+0 stx SD_ACPTR_PTR+1 + stx SD_DIR_PHASE dex @1: inx 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 70bf51e2..5b20fbf3 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s @@ -6,22 +6,15 @@ fs_hvsr_read_dir_open: - ; Read dirent structure into $1000 and then copy it to SD_DIRENT - ; Starting at $1000 VIC sees chargen, so this should be a safe place - ; Content of the original memory location will be preserved + ; Open the directory - jsr fs_hvsr_dirent_swap - - ldx #$00 ; file descriptor; we use $00 for reading directory - ldy #$10 ; target page number - - lda #$11 ; dos_opendir + lda #$12 ; dos_opendir sta HTRAP00 +nop ; XXX handle read errors - jsr fs_hvsr_dirent_swap + sta SD_DIR_DESC ; store directory descriptor XXX invent better name ; Reset status to OK @@ -51,31 +44,71 @@ fs_hvsr_read_dir_open: fs_hvsr_read_dir: - jsr fs_hvsr_dirent_swap + ; Read dirent structure into $1000 and then copy it to SD_DIRENT + ; Starting at $1000 VIC sees chargen, so this should be a safe place + ; Content of the original memory location will be preserved - ldx #$00 ; file descriptor; we use $00 for reading directory - ldy #$10 ; target page number + jsr fs_hvsr_dirent_prepare - lda #$12 ; dos_readdir + ldx SD_DIR_DESC ; directory descriptor + ldy #$10 ; target page number + + lda #$13 ; dos_readdir sta HTRAP00 +nop - ; XXX handle read errors - - sta $400 - stx $401 - jsr fs_hvsr_dirent_swap + ; If nothing to read, output 'blocks free' + + bcc fs_hvsr_read_dir_blocksfree + + ; Dirent structure - important fields: + ; - $00-$3F - file name + ; - $40 - file name length + ; - $55 - file type and attributes + + ; Validate entry + + ; X check for directory! + + lda SD_DIRENT+$40 + sec + sbc #$04 ; strip 4 bytes - for dot and extension + sta SD_DIRENT+$40 + bmi fs_hvsr_read_dir ; if name too short, try next entry + beq fs_hvsr_read_dir ; if name too short, try next entry + cmp #$11 + bcs fs_hvsr_read_dir ; if stripped name is 17 characters or longer, try the next entry + sta SD_DIRENT+$40 ; store corrected file name length + + ; Detect file type (+64 for read-only, +128 = damaged) + ; 0 = not supported + ; 1 = SEQ + ; 2 = PRG + ; 3 = USR + ; 4 = REL + ; 5 = DIR + ; 6 = D67 ; CBM 2040 (DOS 1) - disk image + ; 6 = D64 ; CBM 1541 / 2031 / 3040 / 4040 - disk image + ; 7 = D71 ; CBM 1571 - disk image + ; 8 = D81 ; CBM 1581 - disk image + ; 9 = D80 ; CBM 8050 - disk image + ; 10 = D81 ; CBM 8250 / 1001 - disk image + ; 11 = D90 ; CBM D9060 / D9090 - hard disk image + ; 12 = D1M ; CMD FD 2000 / 4000 - disk image (DD) + ; 13 = D2M ; CMD FD 2000 / 4000 - disk image (HD) + ; 14 = D2M ; CMD FD 4000 - disk image (ED) + ; 15 = DHD ; CMD HD - hard disk image + + + ; Try to prepare output row + + + ; XXX provide proper implementation here jmp fs_hvsr_read_dir_blocksfree ; XXX temporary - ; Dirent structure: - ; - 4 bytes - inode - ; - 2 bytes - ('off' - not sure what's this) - ; - 4 bytes - ('reclen' - is it file size?) - ; - 2 bytes - type - fs_hvsr_read_dir_blocksfree: ; Set pointer to '0 BLOCKS FREE.' line @@ -95,11 +128,12 @@ fs_hvsr_read_dir_blocksfree: lda #$00 sta SD_DIR_PHASE - ; .X = file descriptor + ; Close the directory within the hypervisor XXX maybe move it to close routine - ; lda #$13 ; dos_closedir - ; sta HTRAP00 - ; +nop + ldx SD_DIR_DESC + lda #$14 ; dos_closedir + sta HTRAP00 + +nop clc rts @@ -109,8 +143,22 @@ fs_hvsr_read_dir_blocksfree: ; Helper routines ; +fs_hvsr_dirent_prepare: + + ldx #$00 + txa +@1: + ldy $1000, x + sty SD_DIRENT, x + sta $1000, x + inx + bne @1 + + rts + fs_hvsr_dirent_swap: + php ldx #$00 @1: lda $1000, x @@ -120,4 +168,5 @@ fs_hvsr_dirent_swap: inx bne @1 + plp rts