more work on reading SD card directory
This commit is contained in:
1 parent
f8c8e71f9f
commit
bdc5dc1360
4 files changed
+100
-29
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
Reference in new issue
Block a user