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

+19 -17
View File
@@ -34,20 +34,22 @@ dir_end: ; 19 bytes
; 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 "tap" ; tape image
; dir_ext_07: !pet "d67" ; CBM 2040 (DOS 1) - disk image
; dir_ext_08: !pet "d64" ; CBM 1541 / 2031 / 3040 / 4040 - disk image
; dir_ext_09: !pet "d71" ; CBM 1571 - disk image
; dir_ext_0A: !pet "d81" ; CBM 1581 - disk image
; dir_ext_0B: !pet "d80" ; CBM 8050 - disk image
; dir_ext_0C: !pet "d81" ; CBM 8250 / 1001 - disk image
; dir_ext_0D: !pet "d90" ; CBM D9060 / D9090 - hard disk image
; dir_ext_0E: !pet "d1m" ; CMD FD 2000 / 4000 - disk image (DD)
; dir_ext_0F: !pet "d2m" ; CMD FD 2000 / 4000 - disk image (HD)
; dir_ext_10: !pet "d4m" ; CMD FD 4000 - disk image (ED)
; dir_ext_11: !pet "dhd" ; CMD HD - hard disk image
dir_types:
!pet "seq", $00 ; SEQ
!pet "prg", $00 ; PRG
!pet "usr", $00 ; USR
!pet "rel", $00 ; REL
!pet "dir", $00 ; directory
; !pet "tap", $00 ; tape image
; !pet "d67", $00 ; CBM 2040 (DOS 1) - disk image
; !pet "d64", $00 ; CBM 1541 / 2031 / 3040 / 4040 - disk image
; !pet "d71", $00 ; CBM 1571 - disk image
; !pet "d81", $00 ; CBM 1581 - disk image
; !pet "d80", $00 ; CBM 8050 - disk image
; !pet "d81", $00 ; CBM 8250 / 1001 - disk image
; !pet "d90", $00 ; CBM D9060 / D9090 - hard disk image
; !pet "d1m", $00 ; CMD FD 2000 / 4000 - disk image (DD)
; !pet "d2m", $00 ; CMD FD 2000 / 4000 - disk image (HD)
; !pet "d4m", $00 ; CMD FD 4000 - disk image (ED)
; !pet "dhd", $00 ; CMD HD - hard disk image
+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