CBDOS can now return floppy header
This commit is contained in:
1 parent
70887cc53c
commit
52b2686f0e
6 files changed
+144
-93
No files matched your search
+42
-40
@@ -109,14 +109,7 @@
|
|||||||
!addr FD_STATUS_IDX = $806E ; - floppy
|
!addr FD_STATUS_IDX = $806E ; - floppy
|
||||||
!addr RD_STATUS_IDX = $806F ; - ram disk
|
!addr RD_STATUS_IDX = $806F ; - ram disk
|
||||||
|
|
||||||
!addr DMAJOB_LIST = $8070 ; 15 bytes, a general purpose DMA list
|
!addr SD_DESC = $8070 ; current file descriptor
|
||||||
!addr DMAJOB_SRC_MB = DMAJOB_LIST+2
|
|
||||||
!addr DMAJOB_DST_MB = DMAJOB_LIST+4
|
|
||||||
!addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here
|
|
||||||
!addr DMAJOB_SRC_ADDR = DMAJOB_LIST+9
|
|
||||||
!addr DMAJOB_DST_ADDR = DMAJOB_LIST+12
|
|
||||||
|
|
||||||
!addr SD_DESC = $807F ; current file descriptor
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -129,54 +122,63 @@
|
|||||||
|
|
||||||
; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies - XXX implementation to be written
|
; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies - XXX implementation to be written
|
||||||
|
|
||||||
!addr FD_BAM_CACHE_0 = $8A00 ; - floppy drive 0
|
!addr FD_BAM_CACHE_0 = $8200 ; - floppy drive 0
|
||||||
!addr FD_BAM_CACHE_1 = $8E00 ; - floppy drive 1
|
!addr FD_BAM_CACHE_1 = $8600 ; - floppy drive 1
|
||||||
|
|
||||||
; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written
|
; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written
|
||||||
|
|
||||||
!addr SHARED_BUF_0 = $9200 ; XXX temporarily hardcoded for usage by SD card
|
!addr SHARED_BUF_0 = $8A00 ; XXX temporarily hardcoded for usage by SD card
|
||||||
!addr SHARED_BUF_1 = $9400 ; XXX temporarily hardcoded for usage by floppy
|
!addr SHARED_BUF_1 = $8C00 ; XXX temporarily hardcoded for usage by floppy
|
||||||
!addr SHARED_BUF_2 = $9600
|
!addr SHARED_BUF_2 = $8E00
|
||||||
!addr SHARED_BUF_3 = $9800
|
!addr SHARED_BUF_3 = $9000
|
||||||
!addr SHARED_BUF_4 = $9A00
|
!addr SHARED_BUF_4 = $9200
|
||||||
!addr SHARED_BUF_5 = $9C00
|
!addr SHARED_BUF_5 = $9400
|
||||||
!addr SHARED_BUF_6 = $9E00
|
!addr SHARED_BUF_6 = $9600
|
||||||
!addr SHARED_BUF_7 = $A000
|
!addr SHARED_BUF_7 = $9800
|
||||||
!addr SHARED_BUF_8 = $A200
|
!addr SHARED_BUF_8 = $9A00
|
||||||
!addr SHARED_BUF_9 = $A400
|
!addr SHARED_BUF_9 = $9C00
|
||||||
!addr SHARED_BUF_A = $A600
|
!addr SHARED_BUF_A = $9E00
|
||||||
!addr SHARED_BUF_B = $A800
|
!addr SHARED_BUF_B = $A000
|
||||||
!addr SHARED_BUF_C = $AA00
|
!addr SHARED_BUF_C = $A200
|
||||||
!addr SHARED_BUF_D = $AC00
|
!addr SHARED_BUF_D = $A400
|
||||||
!addr SHARED_BUF_E = $AE00
|
!addr SHARED_BUF_E = $A600
|
||||||
!addr SHARED_BUF_F = $B000
|
!addr SHARED_BUF_F = $A800
|
||||||
|
|
||||||
; Memory shadow, needed for SD card support
|
; Memory shadow, needed for SD card support
|
||||||
|
|
||||||
!addr SD_MEMSHADOW_BUF = $8200 ; 256 byte buffer for preserving original memory content
|
!addr SD_MEMSHADOW_BUF = $AA00 ; 256 byte buffer for preserving original memory content
|
||||||
|
|
||||||
; Command/filename buffers, 128 bytes each - XXX extend to 256 bytes (change implementation)
|
; Command/filename buffers, 128 bytes each - XXX extend to 256 bytes (change implementation)
|
||||||
|
|
||||||
!addr SD_CMDFN_BUF = $B300 ; - SD card
|
!addr SD_CMDFN_BUF = $AB00 ; - SD card
|
||||||
!addr FD_CMDFN_BUF = $B400 ; - floppy
|
!addr FD_CMDFN_BUF = $AC00 ; - floppy
|
||||||
!addr RD_CMDFN_BUF = $B500 ; - ram disk
|
!addr RD_CMDFN_BUF = $AD00 ; - ram disk
|
||||||
|
|
||||||
; Directory entry buffers, in BASIC format, $30 bytes each
|
; Directory entry buffers, in BASIC format, $30 bytes each
|
||||||
|
|
||||||
!addr XX_DIRENT_BUF = $B600
|
!addr XX_DIRENT_BUF = $AE00
|
||||||
!addr SD_DIRENT_BUF = $B600 ; - SD card
|
!addr SD_DIRENT_BUF = $AE00 ; - SD card
|
||||||
!addr FD_DIRENT_BUF = $B630 ; - floppy
|
!addr FD_DIRENT_BUF = $AE30 ; - floppy
|
||||||
!addr RD_DIRENT_BUF = $B660 ; - ram disk
|
!addr RD_DIRENT_BUF = $AE60 ; - ram disk
|
||||||
|
|
||||||
; Status buffers, content terminated by 0, $30 bytes each
|
; Status buffers, content terminated by 0, $30 bytes each
|
||||||
|
|
||||||
!addr XX_STATUS_BUF = $B690
|
!addr XX_STATUS_BUF = $AE90
|
||||||
!addr SD_STATUS_BUF = $B690 ; - SD card
|
!addr SD_STATUS_BUF = $AE90 ; - SD card
|
||||||
!addr FD_STATUS_BUF = $B6C0 ; - floppy
|
!addr FD_STATUS_BUF = $AEC0 ; - floppy
|
||||||
!addr RD_STATUS_BUF = $B6F0 ; - ram disk
|
!addr RD_STATUS_BUF = $AEF0 ; - ram disk
|
||||||
|
|
||||||
|
; Common DMA list
|
||||||
|
|
||||||
|
!addr DMAJOB_LIST = $AF20 ; 15 bytes, a general purpose DMA list
|
||||||
|
!addr DMAJOB_SRC_MB = DMAJOB_LIST+2
|
||||||
|
!addr DMAJOB_DST_MB = DMAJOB_LIST+4
|
||||||
|
!addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here
|
||||||
|
!addr DMAJOB_SRC_ADDR = DMAJOB_LIST+9
|
||||||
|
!addr DMAJOB_DST_ADDR = DMAJOB_LIST+12
|
||||||
|
|
||||||
;
|
;
|
||||||
; Reserved 18 KB for floppy track buffers + some area for track metadata
|
; Reserved 20 KB for floppy track buffers + some area for track metadata
|
||||||
;
|
;
|
||||||
|
|
||||||
!addr XX_REMAINING = $B720
|
!addr XX_REMAINING = $AF2F
|
||||||
@@ -9,9 +9,9 @@ dir_hdr: ; 32 bytes - header
|
|||||||
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
|
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
|
||||||
!byte $00, $00 ; line number 0
|
!byte $00, $00 ; line number 0
|
||||||
!byte $12, $22 ; reverse mode, quote
|
!byte $12, $22 ; reverse mode, quote
|
||||||
!pet " " ; space for disk/directory name
|
!pet " " ; space for disk/directory name XXX should be space, or shift+space?
|
||||||
!byte $22, $20 ; quote, space
|
!byte $22, $20 ; quote, space
|
||||||
!pet "00 2a" ; default ID, disk format
|
!pet " 2a" ; default ID, disk format
|
||||||
!byte $00 ; end of the line
|
!byte $00 ; end of the line
|
||||||
|
|
||||||
dir_hdr_sd: ; 32 bytes - header
|
dir_hdr_sd: ; 32 bytes - header
|
||||||
@@ -20,7 +20,7 @@ dir_hdr_sd: ; 32 bytes - header
|
|||||||
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
|
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
|
||||||
!byte $00, $00 ; line number 0
|
!byte $00, $00 ; line number 0
|
||||||
!byte $12, $22 ; reverse mode, quote
|
!byte $12, $22 ; reverse mode, quote
|
||||||
!pet "sd card " ; space for disk/directory name
|
!pet "sd card " ; space for disk/directory name XXX should be space, or shift+space?
|
||||||
!byte $22, $20 ; quote, space
|
!byte $22, $20 ; quote, space
|
||||||
!pet "fat32" ; filesystem
|
!pet "fat32" ; filesystem
|
||||||
!byte $00 ; end of the line
|
!byte $00 ; end of the line
|
||||||
|
|||||||
@@ -58,20 +58,3 @@ dev_fd_cmd_OPEN_dir:
|
|||||||
@lp1_end:
|
@lp1_end:
|
||||||
|
|
||||||
jmp fs_1581_read_dir_open
|
jmp fs_1581_read_dir_open
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; XXX experimental code below
|
|
||||||
|
|
||||||
; Try to read track 40, sector 0 (disk header)
|
|
||||||
|
|
||||||
lda #40
|
|
||||||
sta PAR_TRACK
|
|
||||||
lda #$00
|
|
||||||
sta PAR_SECTOR
|
|
||||||
|
|
||||||
jsr dev_fd_util_readsector
|
|
||||||
|
|
||||||
; XXX continue implementation
|
|
||||||
|
|
||||||
jmp dos_EXIT_CLC
|
|
||||||
@@ -14,42 +14,35 @@ dev_fd_util_readsector:
|
|||||||
|
|
||||||
; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR
|
; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR
|
||||||
|
|
||||||
; lda PAR_TRACK
|
lda PAR_TRACK
|
||||||
; dec
|
dec
|
||||||
; sta FDC_TRACK ; $D084
|
sta FDC_TRACK ; $D084
|
||||||
|
|
||||||
; lda PAR_SECTOR
|
lda PAR_SECTOR
|
||||||
; cmp #20
|
cmp #20
|
||||||
; bcc @side0
|
bcc @side0
|
||||||
|
|
||||||
@side1:
|
@side1:
|
||||||
|
|
||||||
; lda #%00001000 ; set side 1
|
lda #%00001000 ; set side 1
|
||||||
; tsb FDC_CONTROL ; $D080
|
tsb FDC_CONTROL ; $D080
|
||||||
|
|
||||||
; lda PAR_SECTOR
|
lda PAR_SECTOR
|
||||||
; sec
|
sec
|
||||||
; sbc #20
|
sbc #20
|
||||||
|
|
||||||
; ldx #$01
|
ldx #$01
|
||||||
; +skip_2_bytes_trash_nvz
|
+skip_2_bytes_trash_nvz
|
||||||
|
|
||||||
@side0:
|
@side0:
|
||||||
|
|
||||||
; ldx #$00
|
ldx #$00
|
||||||
; stx FDC_SIDE ; $D086
|
stx FDC_SIDE ; $D086
|
||||||
; clc
|
clc
|
||||||
; ror
|
ror
|
||||||
; sta FDC_SECTOR ; $D085
|
inc
|
||||||
|
|
||||||
; XXX temporary code, just for testing (replacement for the commented-out code)
|
|
||||||
|
|
||||||
lda #39
|
|
||||||
sta FDC_TRACK ; $D084
|
|
||||||
lda #00
|
|
||||||
sta FDC_SECTOR ; $D085
|
sta FDC_SECTOR ; $D085
|
||||||
lda #00
|
|
||||||
sta FDC_SIDE ; $D086
|
|
||||||
|
|
||||||
; 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.?
|
||||||
|
|
||||||
@@ -73,7 +66,7 @@ dev_fd_util_readsector:
|
|||||||
@lp3:
|
@lp3:
|
||||||
lda FDC_STATUS_A ; $D082
|
lda FDC_STATUS_A ; $D082
|
||||||
and #%01100000
|
and #%01100000
|
||||||
cmp #%01100000 ; 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
|
||||||
|
|||||||
@@ -15,10 +15,59 @@ fs_1581_read_dir_open:
|
|||||||
|
|
||||||
jsr dev_fd_util_readsector ; XXX handle read errors
|
jsr dev_fd_util_readsector ; XXX handle read errors
|
||||||
|
|
||||||
|
; Create the first directory listing entry (title, id)
|
||||||
|
|
||||||
|
ldx #$1F ; first fetch the template
|
||||||
|
@lp1:
|
||||||
|
lda dir_hdr,x
|
||||||
|
sta FD_DIRENT_BUF,x
|
||||||
|
dex
|
||||||
|
bpl @lp1
|
||||||
|
|
||||||
|
ldx #$0F ; file name
|
||||||
|
@lp2:
|
||||||
|
lda SHARED_BUF_1+$04,x
|
||||||
|
sta FD_DIRENT_BUF+$08,x
|
||||||
|
dex
|
||||||
|
bpl @lp2
|
||||||
|
|
||||||
|
lda SHARED_BUF_1+$16 ; disk ID XXX test this on a disk with ID
|
||||||
|
cmp #$A0
|
||||||
|
beq @skip1
|
||||||
|
sta FD_DIRENT_BUF+$1A
|
||||||
|
@skip1:
|
||||||
|
lda SHARED_BUF_1+$17
|
||||||
|
cmp #$A0
|
||||||
|
beq @skip2
|
||||||
|
sta FD_DIRENT_BUF+$1B
|
||||||
|
@skip2:
|
||||||
|
|
||||||
; XXX continue implementation
|
lda SHARED_BUF_1+$19 ; dos version
|
||||||
|
sta FD_DIRENT_BUF+$1D
|
||||||
|
lda SHARED_BUF_1+$1A
|
||||||
|
sta FD_DIRENT_BUF+$1E
|
||||||
|
|
||||||
|
; Provide pointer to the header
|
||||||
|
|
||||||
|
lda #$20
|
||||||
|
sta FD_ACPTR_LEN+0
|
||||||
|
lda #$00
|
||||||
|
sta FD_ACPTR_LEN+1
|
||||||
|
|
||||||
|
lda #<FD_DIRENT_BUF
|
||||||
|
sta FD_ACPTR_PTR+0
|
||||||
|
lda #>FD_DIRENT_BUF
|
||||||
|
sta FD_ACPTR_PTR+1
|
||||||
|
|
||||||
|
; Set directory phase to 'file name'
|
||||||
|
|
||||||
|
lda #$01
|
||||||
|
sta FD_DIR_PHASE
|
||||||
|
|
||||||
|
; XXX copy 1st half of BAM
|
||||||
|
; XXX preload the next entry
|
||||||
|
; XXX copy 2nd half of BAM
|
||||||
|
|
||||||
|
; End
|
||||||
|
|
||||||
jmp dos_EXIT_CLC
|
jmp dos_EXIT_CLC
|
||||||
+29
-5
@@ -11,13 +11,13 @@ msg_ACPTR:
|
|||||||
; Check if there is a talker active
|
; Check if there is a talker active
|
||||||
|
|
||||||
ldx IDX1_TALKER
|
ldx IDX1_TALKER
|
||||||
bmi msg_ACPTR_fail_no_talker
|
+bmi msg_ACPTR_fail_no_talker
|
||||||
|
|
||||||
; Check if active channel is status one
|
; Check if active channel is status one
|
||||||
|
|
||||||
lda XX_CHANNEL, X
|
lda XX_CHANNEL, X
|
||||||
cmp #$0F
|
cmp #$0F
|
||||||
beq msg_ACPTR_status
|
+beq msg_ACPTR_status
|
||||||
|
|
||||||
; XXX add support for read contexts (multiple channels)
|
; XXX add support for read contexts (multiple channels)
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ msg_ACPTR:
|
|||||||
ldx IDX2_TALKER
|
ldx IDX2_TALKER
|
||||||
lda XX_ACPTR_LEN+0,x
|
lda XX_ACPTR_LEN+0,x
|
||||||
ora XX_ACPTR_LEN+1,x
|
ora XX_ACPTR_LEN+1,x
|
||||||
beq msg_ACPTR_fail_no_data
|
+beq msg_ACPTR_fail_no_data
|
||||||
|
|
||||||
; Read a byte of data from the buffer
|
; Read a byte of data from the buffer
|
||||||
|
|
||||||
@@ -62,11 +62,35 @@ msg_ACPTR_read_SD:
|
|||||||
@3:
|
@3:
|
||||||
jmp dos_EXIT_CLC
|
jmp dos_EXIT_CLC
|
||||||
|
|
||||||
|
|
||||||
msg_ACPTR_read_FD:
|
msg_ACPTR_read_FD:
|
||||||
|
|
||||||
; XXX provide implementation
|
; Read and return one byte
|
||||||
|
|
||||||
|
jsr FD_ACPTR_helper
|
||||||
|
sta TBTCNT
|
||||||
|
sta REG_A
|
||||||
|
|
||||||
|
; Increment pointer, decrement length
|
||||||
|
|
||||||
|
inc FD_ACPTR_PTR+0
|
||||||
|
bne @1
|
||||||
|
inc FD_ACPTR_PTR+1
|
||||||
|
@1:
|
||||||
|
dec FD_ACPTR_LEN+0
|
||||||
|
lda FD_ACPTR_LEN+0
|
||||||
|
cmp #$FF
|
||||||
|
bne @2
|
||||||
|
dec FD_ACPTR_LEN+1
|
||||||
|
@2:
|
||||||
|
; If new length is 0, try to read next block of data
|
||||||
|
|
||||||
|
ora FD_ACPTR_LEN+1
|
||||||
|
bne @3
|
||||||
|
jsr dev_fd_cmd_READ
|
||||||
|
bcc @3
|
||||||
|
jsr kernalstatus_EOI
|
||||||
|
@3:
|
||||||
|
jmp dos_EXIT_CLC
|
||||||
|
|
||||||
msg_ACPTR_read_RD:
|
msg_ACPTR_read_RD:
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user