diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index deb45823..a1805c31 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -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 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 ba648a57..9be04389 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s @@ -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