floppy directory display starts working

This commit is contained in:
FeralChild64 committed 2021-03-05 19:15:41 +01:00
1 parent f8c048fab3
commit 57bdda7eb5
5 files changed
+173 -131

No files matched your search

+2 -2
View File
@@ -6,11 +6,11 @@
dev_fd_cmd_READ: dev_fd_cmd_READ:
lda SD_MODE lda FD_MODE
cmp #$03 cmp #$03
+beq fs_1581_read_file +beq fs_1581_read_file
lda SD_DIR_PHASE lda FD_DIR_PHASE
cmp #$01 cmp #$01
+beq fs_1581_read_dir +beq fs_1581_read_dir
cmp #$02 cmp #$02
@@ -43,7 +43,6 @@ dev_fd_util_readsector:
inc inc
sta FDC_SECTOR ; $D085 sta FDC_SECTOR ; $D085
; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.? ; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.?
lda #$40 lda #$40
@@ -66,7 +65,7 @@ dev_fd_util_readsector:
@lp3: @lp3:
lda FDC_STATUS_A ; $D082 lda FDC_STATUS_A ; $D082
and #%01100000 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 bne @lp3
; Copy sector to buffer in RAM ; Copy sector to buffer in RAM
+48 -17
View File
@@ -112,12 +112,12 @@ fs_1581_read_dir:
; FALLTROUGH ; FALLTROUGH
fs_1581_read_dir_cont: @cont:
; Set address of the RAW directory entry ; Set address of the RAW directory entry
lda >SHARED_BUF_1 ldy #>SHARED_BUF_1
sta par_LDA_nnnn_Y+1 sty par_LDA_nnnn_Y+1
asl asl
asl asl
@@ -154,39 +154,70 @@ fs_1581_read_dir_cont:
sta PAR_FSIZE_BLOCKS+0 sta PAR_FSIZE_BLOCKS+0
iny iny
jsr code_LDA_nnnn_Y jsr code_LDA_nnnn_Y
sta PAR_FSIZE_BLOCKS+0 sta PAR_FSIZE_BLOCKS+1
ldy #$05 ; copy the file name ldy #$05 ; copy the file name
@lp1: @lp1:
jsr code_LDA_nnnn_Y jsr code_LDA_nnnn_Y
sta PAR_FNAME-5 sta PAR_FNAME-5,y
iny iny
cpy #$15 cpy #$15
bne @lp1 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: @get_sector_lo:
; XXX ; XXX provide implementation
lda FD_DIRENT
bra @cont
@get_sector_hi: @get_sector_hi:
; XXX
; XXX provide implementation ; XXX provide implementation
jmp dos_EXIT_SEC
fs_1581_read_dir_blocksfree: 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+0
lda #>dir_end
sta FD_ACPTR_PTR+1
; Mark end of directory
lda #$00
sta FD_DIR_PHASE
clc
rts
+5 -110
View File
@@ -68,120 +68,17 @@ fs_hvsr_read_dir:
; Prepare output entry, starting from XX_DIRENT_BUF + initial offset ; 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 ; Provide pointers and length
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
stx SD_ACPTR_LEN+0 stx SD_ACPTR_LEN+0
sta SD_ACPTR_LEN+1 sta SD_ACPTR_LEN+1
lda #<(XX_DIRENT_BUF) lda #<(SD_DIRENT_BUF)
sta SD_ACPTR_PTR+0 sta SD_ACPTR_PTR+0
lda #>(XX_DIRENT_BUF) lda #>(SD_DIRENT_BUF)
sta SD_ACPTR_PTR+1 sta SD_ACPTR_PTR+1
clc clc
@@ -191,8 +88,6 @@ fs_hvsr_read_dir_blocksfree:
; Set pointer to 'BLOCKS FREE.' line ; Set pointer to 'BLOCKS FREE.' line
; XXX determine free space
lda #$13 lda #$13
sta SD_ACPTR_LEN+0 sta SD_ACPTR_LEN+0
lda #$00 lda #$00
+117
View File
@@ -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