more work on reading SD card directory

This commit is contained in:
FeralChild64 committed 2021-02-14 21:54:47 +01:00
1 parent f8c8e71f9f
commit bdc5dc1360
4 files changed
+100 -29

No files matched your search

+2
View File
@@ -96,3 +96,5 @@
!addr RD_CMDFN_BUF = $8200 ; buffer for command and/or file name, 128 bytes, ram disk !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_DIRENT = $8280 ; 256 byte buffer for 'dirent' structure
!addr SD_DIR_DESC = $8380 ; file descriptor for reading directory
+19
View File
@@ -31,3 +31,22 @@ dir_end: ; 19 bytes
!byte $00, $00 ; line number 0 !byte $00, $00 ; line number 0
!pet "blocks free." !pet "blocks free."
!byte $00, $00, $00 ; end of the line, end of program marker !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
+1
View File
@@ -16,6 +16,7 @@ dev_sd_init:
stx SD_ACPTR_LEN+1 stx SD_ACPTR_LEN+1
stx SD_ACPTR_PTR+0 stx SD_ACPTR_PTR+0
stx SD_ACPTR_PTR+1 stx SD_ACPTR_PTR+1
stx SD_DIR_PHASE
dex dex
@1: @1:
inx inx
+78 -29
View File
@@ -6,22 +6,15 @@
fs_hvsr_read_dir_open: fs_hvsr_read_dir_open:
; Read dirent structure into $1000 and then copy it to SD_DIRENT ; Open the directory
; Starting at $1000 VIC sees chargen, so this should be a safe place
; Content of the original memory location will be preserved
jsr fs_hvsr_dirent_swap lda #$12 ; dos_opendir
ldx #$00 ; file descriptor; we use $00 for reading directory
ldy #$10 ; target page number
lda #$11 ; dos_opendir
sta HTRAP00 sta HTRAP00
+nop +nop
; XXX handle read errors ; XXX handle read errors
jsr fs_hvsr_dirent_swap sta SD_DIR_DESC ; store directory descriptor XXX invent better name
; Reset status to OK ; Reset status to OK
@@ -51,31 +44,71 @@ fs_hvsr_read_dir_open:
fs_hvsr_read_dir: 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 jsr fs_hvsr_dirent_prepare
ldy #$10 ; target page number
lda #$12 ; dos_readdir ldx SD_DIR_DESC ; directory descriptor
ldy #$10 ; target page number
lda #$13 ; dos_readdir
sta HTRAP00 sta HTRAP00
+nop +nop
; XXX handle read errors
sta $400
stx $401
jsr fs_hvsr_dirent_swap 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 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: fs_hvsr_read_dir_blocksfree:
; Set pointer to '0 BLOCKS FREE.' line ; Set pointer to '0 BLOCKS FREE.' line
@@ -95,11 +128,12 @@ fs_hvsr_read_dir_blocksfree:
lda #$00 lda #$00
sta SD_DIR_PHASE sta SD_DIR_PHASE
; .X = file descriptor ; Close the directory within the hypervisor XXX maybe move it to close routine
; lda #$13 ; dos_closedir ldx SD_DIR_DESC
; sta HTRAP00 lda #$14 ; dos_closedir
; +nop sta HTRAP00
+nop
clc clc
rts rts
@@ -109,8 +143,22 @@ fs_hvsr_read_dir_blocksfree:
; Helper routines ; 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: fs_hvsr_dirent_swap:
php
ldx #$00 ldx #$00
@1: @1:
lda $1000, x lda $1000, x
@@ -120,4 +168,5 @@ fs_hvsr_dirent_swap:
inx inx
bne @1 bne @1
plp
rts rts