more CBDOS directory work, can now detect read-only files

This commit is contained in:
FeralChild64 committed 2021-02-15 23:59:02 +01:00
1 parent 0b5f2dcf2a
commit 230c20a7d0
2 files changed
+90 -32

No files matched your search

+71 -15
View File
@@ -67,7 +67,25 @@ fs_hvsr_read_dir:
; - $00-$3F - file name
; - $40 - file name length
; - $51-$54 - file length
; - $55 - file type and attributes
; - $55-$56 - file type ($10 = dir, $20 = regular) and attributes ($01 for read-only)
; Drop some strange (unknown) file types
lda SD_DIRENT+$55
bne fs_hvsr_read_dir
; Retrieve read-only status, store mark in SD_DIRENT+$FE
lda SD_DIRENT+$56
and #$01
bne @rdonly
lda #$00
+skip_2_bytes_trash_nvz
@rdonly:
lda #'<'
sta SD_DIRENT+$FF
; Validate/fix characters in file name
@@ -98,9 +116,36 @@ fs_hvsr_read_dir:
dex
bpl @lp1
; Validate file name length
; Determine type (file/directory), store marker offset in SD_DIRENT+$FE
; XXX check for directory!
lda SD_DIRENT+$56
and #$FE
; XXX code below does not work
;cmp #$20
;beq @cklen_file ; branch on file
;cmp #$10
;bne fs_hvsr_read_dir ; this type is unknown
bra @cklen_file ; XXX temporary
@cklen_dir:
; Validate file name length (directories)
lda SD_DIRENT+$40
beq fs_hvsr_read_dir
cmp #$11
bcs fs_hvsr_read_dir
; Set type offset for directory in SD_DIRENT+$FF
lda #$10
bra @all_prepared
@cklen_file:
; Validate file name length (regular files)
lda SD_DIRENT+$40
sec
@@ -113,15 +158,19 @@ fs_hvsr_read_dir:
sta SD_DIRENT+$40 ; store corrected file name length
tax
; Detect file type (+64 for read-only, +128 = damaged)
; Detect file type
lda SD_DIRENT, x
cmp #$2E
bne fs_hvsr_read_dir ; 3-character extension is required!
+bne fs_hvsr_read_dir ; 3-character extension is required!
; XXX temporary; detect file type by extension instead
lda #$04 ; XXX temporary; detect file type by extension instead
; Try to prepare output row, starting from SD_DIRENT+$80
@all_prepared:
sta SD_DIRENT+$FF ; store offset to file type in SD_DIRENT+$FF
; Prepare output entry, starting from SD_DIRENT+$80
lda #$01 ; link to the next line - dummy, will be regenerated by BASIC
sta SD_DIRENT+$80
@@ -162,20 +211,27 @@ fs_hvsr_read_dir:
sta SD_DIRENT+$80, x
inx
; XXX put read-only mark if needed
; No 'damaged' mark make sense for this filesystem
ldy #$03 ; XXX select proper file type instead
lda dir_ext_01+0, y
ldy SD_DIRENT+$FF ; put file type
@lp3:
lda dir_types, y
beq @lp3_done
sta SD_DIRENT+$80, x
inx
lda dir_ext_01+1, y
sta SD_DIRENT+$80, x
inx
lda dir_ext_01+2, y
iny
bra @lp3
@lp3_done:
lda SD_DIRENT+$FE ; read-only mark (if needed)
beq @skipro
sta SD_DIRENT+$80, x
inx
; No 'damaged' mark is needed here; put ending 0 and provide pointer
@skipro:
lda #$00
sta SD_DIRENT+$80, x