diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 776c4fa8..2bb91aeb 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -109,12 +109,12 @@ !addr FD_STATUS_IDX = $806E ; - floppy !addr RD_STATUS_IDX = $806F ; - ram disk + ; Various, most likely to be reworked + !addr SD_DESC = $8070 ; current file descriptor - !addr FD_DIRENT = $8071 ; directory entry to read, 0-15 - ; XXX Free space @@ -173,9 +173,16 @@ !addr FD_STATUS_BUF = $AEC0 ; - floppy !addr RD_STATUS_BUF = $AEF0 ; - ram disk - ; Common DMA list + ; Shared buffer metadata tables, 18 bytes each - !addr DMAJOB_LIST = $AF20 ; 15 bytes, a general purpose DMA list + !addr BUFTAB_UNIT = $AF20 ; which unit the buffer is assigned to + !addr BUFTAB_DEV = $AF32 ; which device within the unit + !addr BUFTAB_TRACK = $AF44 ; which track (or other kind of handle) + !addr BUFTAB_SECTOR = $AF56 ; which sector is stored in the first half of the buffer + + ; Common DMA list, 15 bytes + + !addr DMAJOB_LIST = $AF68 !addr DMAJOB_SRC_MB = DMAJOB_LIST+2 !addr DMAJOB_DST_MB = DMAJOB_LIST+4 !addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here @@ -183,7 +190,7 @@ !addr DMAJOB_DST_ADDR = DMAJOB_LIST+12 ; - ; Reserved 20 KB for floppy track buffers + some area for track metadata + ; Reserved 20 KB for floppy track buffers + some area still free ; - !addr XX_REMAINING = $AF2F + !addr XX_REMAINING = $AF87 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 d9fb7247..bf020b28 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -81,5 +81,15 @@ dev_fd_util_readsector: jsr util_dma_launch_from_hwbuf ; execute DMA job + ; Fill-in metadata for buffer #1 + + lda #$00 + sta BUFTAB_DEV+1 + lda PAR_TRACK + sta BUFTAB_TRACK+1 + lda PAR_SECTOR + and #%11111110 + sta BUFTAB_SECTOR+1 + clc rts 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 a9f23b88..474bd196 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -94,6 +94,13 @@ fs_1581_read_dir_open: lda #$08 sta FD_DIRENT + ; Make sure the 1st sector in buffer points to 2nd one + + lda #40 + sta SHARED_BUF_1+0 + lda #03 + sta SHARED_BUF_1+1 + ; End jmp dos_EXIT_CLC @@ -108,7 +115,7 @@ fs_1581_read_dir: cmp #$08 beq @get_sector_lo cmp #$10 - beq @get_sector_hi + +beq @get_sector_hi ; FALLTROUGH @@ -188,15 +195,68 @@ fs_1581_read_dir: @get_sector_lo: - ; XXX provide implementation + ; Check if this was the last sector + + lda SHARED_BUF_1+0 + beq fs_1581_read_dir_blocksfree + lda SHARED_BUF_1+1 + cmp #$FF + beq fs_1581_read_dir_blocksfree + + ; Transition from 1st half of the buffer, to (possibly) the second one + + lda SHARED_BUF_1+0 + cmp BUFTAB_TRACK+1 + bne @get_sector_lo_next + + lda SHARED_BUF_1+1 + dec + cmp BUFTAB_SECTOR+1 + bne @get_sector_lo_next + + ; It's OK, we can transition to the upper half of the buffer lda FD_DIRENT - bra @cont + jmp @cont + +@get_sector_lo_next: + + lda SHARED_BUF_1+0 + sta PAR_TRACK + lda SHARED_BUF_1+1 + sta PAR_SECTOR + bra @get_sector_common @get_sector_hi: - ; XXX provide implementation + ; Check if this was the last sector + lda SHARED_BUF_1+$100+0 + beq fs_1581_read_dir_blocksfree + lda SHARED_BUF_1+$100+1 + cmp #$FF + beq fs_1581_read_dir_blocksfree + + ; Load new sector + + lda SHARED_BUF_1+$100+0 + sta PAR_TRACK + lda SHARED_BUF_1+$100+1 + sta PAR_SECTOR + +@get_sector_common: + + jsr dev_fd_util_readsector ; XXX handle read errors + + ; Set new FD_DIRENT + + lda PAR_SECTOR + and #$01 + beq @2 + lda #$08 +@2: + sta FD_DIRENT + jmp @cont fs_1581_read_dir_blocksfree: