diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s index aa5eb88b..6a4f76f7 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s @@ -6,11 +6,11 @@ dev_fd_cmd_READ: - lda SD_MODE + lda FD_MODE cmp #$03 +beq fs_1581_read_file - lda SD_DIR_PHASE + lda FD_DIR_PHASE cmp #$01 +beq fs_1581_read_dir cmp #$02 diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s index b4292cf7..d9fb7247 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -43,7 +43,6 @@ dev_fd_util_readsector: inc sta FDC_SECTOR ; $D085 - ; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.? lda #$40 @@ -66,7 +65,7 @@ dev_fd_util_readsector: @lp3: lda FDC_STATUS_A ; $D082 and #%01100000 - cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point + cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point bne @lp3 ; Copy sector to buffer in RAM diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index 807973a7..a9f23b88 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -112,12 +112,12 @@ fs_1581_read_dir: ; FALLTROUGH -fs_1581_read_dir_cont: +@cont: ; Set address of the RAW directory entry - lda >SHARED_BUF_1 - sta par_LDA_nnnn_Y+1 + ldy #>SHARED_BUF_1 + sty par_LDA_nnnn_Y+1 asl asl @@ -154,39 +154,70 @@ fs_1581_read_dir_cont: sta PAR_FSIZE_BLOCKS+0 iny jsr code_LDA_nnnn_Y - sta PAR_FSIZE_BLOCKS+0 + sta PAR_FSIZE_BLOCKS+1 ldy #$05 ; copy the file name @lp1: jsr code_LDA_nnnn_Y - sta PAR_FNAME-5 + sta PAR_FNAME-5,y iny cpy #$15 bne @lp1 - ; + ; Prepare output entry, starting from XX_DIRENT_BUF + initial offset - ; XXX + jsr util_dir_filesize_blocks + ldx #(FD_DIRENT_BUF - XX_DIRENT_BUF) + ldx #$30 + jsr util_dir_basic + + ; Provide pointers and length + + sta FD_ACPTR_LEN+1 + txa + sec + sbc #$30 + sta FD_ACPTR_LEN+0 + + lda #<(FD_DIRENT_BUF) + sta FD_ACPTR_PTR+0 + lda #>(FD_DIRENT_BUF) + sta FD_ACPTR_PTR+1 + clc + rts @get_sector_lo: - ; XXX + ; XXX provide implementation + lda FD_DIRENT + bra @cont @get_sector_hi: - ; XXX - - - - ; XXX provide implementation - jmp dos_EXIT_SEC - fs_1581_read_dir_blocksfree: - ; XXX provide implementation + ; XXX calculate free blocks from BAM instead - jmp dos_EXIT_SEC + ; Set pointer to 'BLOCKS FREE.' line + + lda #$13 + sta FD_ACPTR_LEN+0 + lda #$00 + sta FD_ACPTR_LEN+1 + + lda #dir_end + sta FD_ACPTR_PTR+1 + + ; Mark end of directory + + lda #$00 + sta FD_DIR_PHASE + + clc + rts 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 fdcbaaa8..3b80ad80 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s @@ -68,120 +68,17 @@ fs_hvsr_read_dir: ; Prepare output entry, starting from XX_DIRENT_BUF + initial offset - ldx #$00 ; offset for SD card unit + ldx #(SD_DIRENT_BUF - XX_DIRENT_BUF) + jsr util_dir_basic - lda #$01 ; link to the next line - dummy, will be regenerated by BASIC - sta XX_DIRENT_BUF, x - inx - sta XX_DIRENT_BUF, x - inx - - lda PAR_FSIZE_BLOCKS+0 ; store number of blocks - sta XX_DIRENT_BUF, x - inx - lda PAR_FSIZE_BLOCKS+1 - sta XX_DIRENT_BUF, x - inx - - lda #' ' ; indent file name - -@lp1: - dey - bmi @lp1_done - sta XX_DIRENT_BUF, x - inx - bra @lp1 - -@lp1_done: - - lda #$22 ; opening quote - sta XX_DIRENT_BUF, x - inx - - ldy #$FF ; put file name - -@lp2: - - iny - lda PAR_FNAME, y - cmp #$A0 - beq @lp2_done - cpy #$10 - beq @lp2_done - sta XX_DIRENT_BUF, x - inx - bra @lp2 - -@lp2_done: - - lda #$22 ; closing quote - sta XX_DIRENT_BUF, x - inx - - ldy #$10 ; put spaces for indentation - -@lp3: - - dey - lda PAR_FNAME, y - cmp #$A0 - bne @lp3_done - - lda #' ' - sta XX_DIRENT_BUF, x - inx - bra @lp3 - -@lp3_done: - - lda PAR_FTYPE ; put 'damaged' mark if needed - bmi @closed - lda #'*' - +skip_2_bytes_trash_nvz - -@closed: - - lda #' ' - sta XX_DIRENT_BUF, x - inx - - lda PAR_FTYPE ; put file type - and #$3F - dec - asl - asl - tay - -@lp4: - - lda dir_types, y - beq @lp4_done - sta XX_DIRENT_BUF, x - inx - iny - bra @lp4 - -@lp4_done: - - lda PAR_FTYPE ; read-only mark (if needed) - and #$40 - beq @skipro - lda #'<' - sta XX_DIRENT_BUF, x - inx - -@skipro: - - lda #$00 ; put end of the line - sta XX_DIRENT_BUF, x - inx + ; Provide pointers and length stx SD_ACPTR_LEN+0 sta SD_ACPTR_LEN+1 - lda #<(XX_DIRENT_BUF) + lda #<(SD_DIRENT_BUF) sta SD_ACPTR_PTR+0 - lda #>(XX_DIRENT_BUF) + lda #>(SD_DIRENT_BUF) sta SD_ACPTR_PTR+1 clc @@ -191,8 +88,6 @@ fs_hvsr_read_dir_blocksfree: ; Set pointer to 'BLOCKS FREE.' line - ; XXX determine free space - lda #$13 sta SD_ACPTR_LEN+0 lda #$00 diff --git a/src/dos_m65/utils/util_dir_basic.s b/src/dos_m65/utils/util_dir_basic.s new file mode 100644 index 00000000..c01a9d7e --- /dev/null +++ b/src/dos_m65/utils/util_dir_basic.s @@ -0,0 +1,117 @@ + +; Create BASIC line from directory entry + + +; in: .X = offset from XX_DIRENT_BUF, .Y = characters to indent after line number +; out: .X (low byte) = current position, .A = 0 + + +util_dir_basic: + + lda #$01 ; link to the next line - dummy, will be regenerated by BASIC + sta XX_DIRENT_BUF, x + inx + sta XX_DIRENT_BUF, x + inx + + lda PAR_FSIZE_BLOCKS+0 ; store number of blocks + sta XX_DIRENT_BUF, x + inx + lda PAR_FSIZE_BLOCKS+1 + sta XX_DIRENT_BUF, x + inx + + lda #' ' ; indent file name + +@lp1: + dey + bmi @lp1_done + sta XX_DIRENT_BUF, x + inx + bra @lp1 + +@lp1_done: + + lda #$22 ; opening quote + sta XX_DIRENT_BUF, x + inx + + ldy #$FF ; put file name + +@lp2: + + iny + lda PAR_FNAME, y + cmp #$A0 + beq @lp2_done + cpy #$10 + beq @lp2_done + sta XX_DIRENT_BUF, x + inx + bra @lp2 + +@lp2_done: + + lda #$22 ; closing quote + sta XX_DIRENT_BUF, x + inx + + ldy #$10 ; put spaces for indentation + +@lp3: + + dey + lda PAR_FNAME, y + cmp #$A0 + bne @lp3_done + + lda #' ' + sta XX_DIRENT_BUF, x + inx + bra @lp3 + +@lp3_done: + + lda PAR_FTYPE ; put 'damaged' mark if needed + bmi @closed + lda #'*' + +skip_2_bytes_trash_nvz + +@closed: + + lda #' ' + sta XX_DIRENT_BUF, x + inx + + lda PAR_FTYPE ; put file type + and #$3F + dec + asl + asl + tay + +@lp4: + + lda dir_types, y + beq @lp4_done + sta XX_DIRENT_BUF, x + inx + iny + bra @lp4 + +@lp4_done: + + lda PAR_FTYPE ; read-only mark (if needed) + and #$40 + beq @skipro + lda #'<' + sta XX_DIRENT_BUF, x + inx + +@skipro: + + lda #$00 ; put end of the line + sta XX_DIRENT_BUF, x + inx + + rts