work towards directory reading in CBDOS
This commit is contained in:
1 parent
61e2c7f5e5
commit
578be0bcc8
17 files changed
+277
-10
No files matched your search
@@ -35,8 +35,37 @@
|
|||||||
!addr IDX1_TALKER = $8012 ; talker idx, >=$80 = none
|
!addr IDX1_TALKER = $8012 ; talker idx, >=$80 = none
|
||||||
!addr IDX2_TALKER = $8013 ; talker idx * 2, >=$80 = none - for calling routines via vector table
|
!addr IDX2_TALKER = $8013 ; talker idx * 2, >=$80 = none - for calling routines via vector table
|
||||||
|
|
||||||
|
; Various temporary data
|
||||||
|
|
||||||
|
!addr XX_DIR_PHASE = $8014 ; directory output phase, values deponds on device driver
|
||||||
|
!addr SD_DIR_PHASE = $8014 ; - SD card
|
||||||
|
!addr FD_DIR_PHASE = $8015 ; - floppy
|
||||||
|
!addr RD_DIR_PHASE = $8016 ; - ram disk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; Free space: $8014-$8063
|
; Free space: $8014-$8063
|
||||||
|
|
||||||
|
!addr SD_ACPTR_helper = $8052 ; subroutine in RAM to read a byte
|
||||||
|
!addr code_LDA_01 = $8052 ; - LDA instruction
|
||||||
|
!addr SD_ACPTR_PTR = $8053 ; - 2 bytes; address in buffer, SD card
|
||||||
|
!addr code_RTS_01 = $8055 ; - RTS instruction
|
||||||
|
|
||||||
|
!addr FD_ACPTR_helper = $8056 ; subroutine in RAM to read a byte
|
||||||
|
!addr code_LDA_02 = $8056 ; - LDA instruction
|
||||||
|
!addr FD_ACPTR_PTR = $8057 ; - 2 bytes; address in buffer, floppy
|
||||||
|
!addr code_RTS_02 = $8059 ; - RTS instruction
|
||||||
|
|
||||||
|
!addr RD_ACPTR_helper = $805A ; subroutine in RAM to read a byte
|
||||||
|
!addr code_LDA_03 = $805A ; - LDA instruction
|
||||||
|
!addr RD_ACPTR_PTR = $805B ; - 2 bytes; address in buffer, ram disk
|
||||||
|
!addr code_RTS_03 = $805D ; - RTS instruction
|
||||||
|
|
||||||
|
!addr XX_ACPTR_LEN = $805E ; 2 bytes - length of data left for ACPTR
|
||||||
|
!addr SD_ACPTR_LEN = $805E ; - SD card
|
||||||
|
!addr FD_ACPTR_LEN = $8060 ; - floppy
|
||||||
|
!addr RD_ACPTR_LEN = $8062 ; - ram disk
|
||||||
|
|
||||||
!addr XX_MODE = $8064 ; current mode (0 = none, 1 = receiving command/file name)
|
!addr XX_MODE = $8064 ; current mode (0 = none, 1 = receiving command/file name)
|
||||||
!addr SD_MODE = $8064 ; - SD card
|
!addr SD_MODE = $8064 ; - SD card
|
||||||
!addr FD_MODE = $8065 ; - floppy
|
!addr FD_MODE = $8065 ; - floppy
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
dos_err_init_sdcard:
|
dos_err_init_sdcard:
|
||||||
|
|
||||||
!pet "73,m65 dos sdcard,00,00", 0
|
!pet "73,m65 dos sd card,00,00", 0
|
||||||
|
|
||||||
dos_err_init_floppy:
|
dos_err_init_floppy:
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ dos_err_init_ramdisk:
|
|||||||
|
|
||||||
dos_err_00: ; not an error
|
dos_err_00: ; not an error
|
||||||
|
|
||||||
!pet "ok", 0
|
!pet " ok", 0
|
||||||
|
|
||||||
dos_err_01: ; not an error
|
dos_err_01: ; not an error
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
;
|
||||||
|
; Data used to generate directory in CBM BASIC format
|
||||||
|
;
|
||||||
|
|
||||||
|
dir_hdr: ; 32 bytes - header
|
||||||
|
|
||||||
|
!byte $01, $08 ; program location
|
||||||
|
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
|
||||||
|
!byte $00, $00 ; line number 0
|
||||||
|
!byte $12, $22 ; reverse mode, quote
|
||||||
|
!pet " " ; space for disk/directory name
|
||||||
|
!byte $22, $20 ; quote, space
|
||||||
|
!pet "00 2a" ; default ID, disk format
|
||||||
|
!byte $00 ; end of the line
|
||||||
|
|
||||||
|
dir_hdr_sd: ; 32 bytes - header
|
||||||
|
|
||||||
|
!byte $01, $08 ; program location
|
||||||
|
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
|
||||||
|
!byte $00, $00 ; line number 0
|
||||||
|
!byte $12, $22 ; reverse mode, quote
|
||||||
|
!pet "SD CARD " ; space for disk/directory name
|
||||||
|
!byte $22, $20 ; quote, space
|
||||||
|
!pet "fat32" ; filesystem
|
||||||
|
!byte $00 ; end of the line
|
||||||
|
|
||||||
|
dir_end: ; 19 bytes
|
||||||
|
|
||||||
|
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
|
||||||
|
!byte $00, $00 ; line number 0
|
||||||
|
!pet "blocks free."
|
||||||
|
!byte $00, $00, $00 ; end of the line, end of program marker
|
||||||
@@ -9,3 +9,9 @@ dev_fd_cmd_OPEN:
|
|||||||
; XXX provide implementation
|
; XXX provide implementation
|
||||||
|
|
||||||
jmp dos_EXIT_SEC
|
jmp dos_EXIT_SEC
|
||||||
|
|
||||||
|
dev_fd_cmd_OPEN_EOI:
|
||||||
|
|
||||||
|
; XXX provide implementation
|
||||||
|
|
||||||
|
jmp dos_EXIT
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
;
|
||||||
|
; Read more data into the buffer
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
dev_fd_cmd_READ:
|
||||||
|
|
||||||
|
; XXX provide implementation
|
||||||
|
|
||||||
|
sec ; mark EOI
|
||||||
|
rts
|
||||||
@@ -12,6 +12,10 @@ dev_fd_init:
|
|||||||
stx FD_STATUS_IDX
|
stx FD_STATUS_IDX
|
||||||
stx FD_CMDFN_IDX
|
stx FD_CMDFN_IDX
|
||||||
stx FD_MODE
|
stx FD_MODE
|
||||||
|
stx FD_ACPTR_LEN+0
|
||||||
|
stx FD_ACPTR_LEN+1
|
||||||
|
stx FD_ACPTR_PTR+0
|
||||||
|
stx FD_ACPTR_PTR+1
|
||||||
dex
|
dex
|
||||||
@1:
|
@1:
|
||||||
inx
|
inx
|
||||||
|
|||||||
@@ -9,3 +9,9 @@ dev_rd_cmd_OPEN:
|
|||||||
; XXX provide implementation
|
; XXX provide implementation
|
||||||
|
|
||||||
jmp dos_EXIT_SEC
|
jmp dos_EXIT_SEC
|
||||||
|
|
||||||
|
dev_rd_cmd_OPEN_EOI:
|
||||||
|
|
||||||
|
; XXX provide implementation
|
||||||
|
|
||||||
|
jmp dos_EXIT
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
;
|
||||||
|
; Read more data into the buffer
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
dev_rd_cmd_READ:
|
||||||
|
|
||||||
|
; XXX provide implementation
|
||||||
|
|
||||||
|
sec ; mark EOI
|
||||||
|
rts
|
||||||
@@ -12,6 +12,10 @@ dev_rd_init:
|
|||||||
stx RD_STATUS_IDX
|
stx RD_STATUS_IDX
|
||||||
stx RD_CMDFN_IDX
|
stx RD_CMDFN_IDX
|
||||||
stx RD_MODE
|
stx RD_MODE
|
||||||
|
stx RD_ACPTR_LEN+0
|
||||||
|
stx RD_ACPTR_LEN+1
|
||||||
|
stx RD_ACPTR_PTR+0
|
||||||
|
stx RD_ACPTR_PTR+1
|
||||||
dex
|
dex
|
||||||
@1:
|
@1:
|
||||||
inx
|
inx
|
||||||
|
|||||||
@@ -10,3 +10,43 @@ dev_sd_cmd_OPEN:
|
|||||||
sta SD_MODE
|
sta SD_MODE
|
||||||
|
|
||||||
jmp dos_EXIT
|
jmp dos_EXIT
|
||||||
|
|
||||||
|
dev_sd_cmd_OPEN_EOI:
|
||||||
|
|
||||||
|
; XXX this dispatcher is temporary
|
||||||
|
|
||||||
|
; XXX add support for second card
|
||||||
|
|
||||||
|
lda SD_CMDFN_BUF
|
||||||
|
cmp '$'
|
||||||
|
beq dev_sd_cmd_OPEN_dir
|
||||||
|
|
||||||
|
; XXX implement for file names
|
||||||
|
|
||||||
|
jmp dos_EXIT_SEC
|
||||||
|
|
||||||
|
|
||||||
|
dev_sd_cmd_OPEN_dir:
|
||||||
|
|
||||||
|
; XXX add support for filtering
|
||||||
|
|
||||||
|
; Initialize 1st directory phase - header
|
||||||
|
|
||||||
|
lda #$01
|
||||||
|
sta SD_DIR_PHASE
|
||||||
|
|
||||||
|
; Provide pointer and length of the header
|
||||||
|
|
||||||
|
lda #$20
|
||||||
|
sta SD_ACPTR_PTR+0
|
||||||
|
lda #$00
|
||||||
|
sta SD_ACPTR_PTR+1
|
||||||
|
|
||||||
|
lda #<dir_hdr_sd
|
||||||
|
sta SD_ACPTR_PTR+0
|
||||||
|
lda #>dir_hdr_sd
|
||||||
|
sta SD_ACPTR_PTR+1
|
||||||
|
|
||||||
|
; End
|
||||||
|
|
||||||
|
jmp dos_EXIT
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
;
|
||||||
|
; Read more data into the buffer
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
dev_sd_cmd_READ:
|
||||||
|
|
||||||
|
; XXX provide implementation
|
||||||
|
|
||||||
|
sec ; mark EOI
|
||||||
|
rts
|
||||||
@@ -12,6 +12,10 @@ dev_sd_init:
|
|||||||
stx SD_STATUS_IDX
|
stx SD_STATUS_IDX
|
||||||
stx SD_CMDFN_IDX
|
stx SD_CMDFN_IDX
|
||||||
stx SD_MODE
|
stx SD_MODE
|
||||||
|
stx SD_ACPTR_LEN+0
|
||||||
|
stx SD_ACPTR_LEN+1
|
||||||
|
stx SD_ACPTR_PTR+0
|
||||||
|
stx SD_ACPTR_PTR+1
|
||||||
dex
|
dex
|
||||||
@1:
|
@1:
|
||||||
inx
|
inx
|
||||||
|
|||||||
@@ -44,6 +44,18 @@ dos_INIT:
|
|||||||
jsr dev_fd_init
|
jsr dev_fd_init
|
||||||
jsr dev_rd_init
|
jsr dev_rd_init
|
||||||
|
|
||||||
|
; Initialize helper code in RAM
|
||||||
|
|
||||||
|
lda #$AD ; LDA opcode, absolute
|
||||||
|
sta code_LDA_01
|
||||||
|
sta code_LDA_02
|
||||||
|
sta code_LDA_03
|
||||||
|
|
||||||
|
lda #$60 ; RTS opcode
|
||||||
|
sta code_RTS_01
|
||||||
|
sta code_RTS_02
|
||||||
|
sta code_RTS_03
|
||||||
|
|
||||||
; Exit DOS context
|
; Exit DOS context
|
||||||
|
|
||||||
jmp dos_EXIT
|
jmp dos_EXIT
|
||||||
@@ -16,6 +16,24 @@ dos_MEMCHK:
|
|||||||
dex
|
dex
|
||||||
bpl @1
|
bpl @1
|
||||||
|
|
||||||
|
; Check if helper code is undamaged
|
||||||
|
|
||||||
|
lda #$AD
|
||||||
|
cmp code_LDA_01
|
||||||
|
bne @fail
|
||||||
|
cmp code_LDA_02
|
||||||
|
bne @fail
|
||||||
|
cmp code_LDA_03
|
||||||
|
bne @fail
|
||||||
|
|
||||||
|
lda #$60
|
||||||
|
cmp code_RTS_01
|
||||||
|
bne @fail
|
||||||
|
cmp code_RTS_02
|
||||||
|
bne @fail
|
||||||
|
cmp code_RTS_03
|
||||||
|
bne @fail
|
||||||
|
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|||||||
+67
-6
@@ -11,7 +11,7 @@ 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
|
bmi msg_ACPTR_fail_no_talker
|
||||||
|
|
||||||
; Check if active channel is status one
|
; Check if active channel is status one
|
||||||
|
|
||||||
@@ -19,9 +19,65 @@ msg_ACPTR:
|
|||||||
cmp #$0F
|
cmp #$0F
|
||||||
beq msg_ACPTR_status
|
beq msg_ACPTR_status
|
||||||
|
|
||||||
; XXX providde implementation for non-status channels
|
; XXX add support for read contexts (multiple channels)
|
||||||
|
|
||||||
jmp msg_ACPTR_fail
|
; Not a status channel - check if we have something to read out
|
||||||
|
|
||||||
|
ldx IDX2_TALKER
|
||||||
|
lda XX_ACPTR_LEN+0,x
|
||||||
|
ora XX_ACPTR_LEN+1,x
|
||||||
|
beq msg_ACPTR_fail_no_data
|
||||||
|
|
||||||
|
; Read a byte of data from the buffer
|
||||||
|
|
||||||
|
jmp (msg_ACPTR_read_vectab, X)
|
||||||
|
|
||||||
|
msg_ACPTR_read_SD:
|
||||||
|
|
||||||
|
; Read and return one byte
|
||||||
|
|
||||||
|
jsr SD_ACPTR_helper
|
||||||
|
sta TBTCNT
|
||||||
|
|
||||||
|
; Increment pointer, decrement length
|
||||||
|
|
||||||
|
inc SD_ACPTR_PTR+0
|
||||||
|
bne @1
|
||||||
|
inc SD_ACPTR_PTR+1
|
||||||
|
@1:
|
||||||
|
dec SD_ACPTR_LEN+0
|
||||||
|
lda SD_ACPTR_LEN+0
|
||||||
|
cmp #$FF
|
||||||
|
bne @2
|
||||||
|
dec SD_ACPTR_LEN+1
|
||||||
|
@2:
|
||||||
|
; If new length is 0, try to read next block of data
|
||||||
|
|
||||||
|
ora SD_ACPTR_LEN+1
|
||||||
|
bne @3
|
||||||
|
jsr dev_sd_cmd_READ
|
||||||
|
bcc @3
|
||||||
|
jsr kernalstatus_EOI
|
||||||
|
@3:
|
||||||
|
jmp dos_EXIT
|
||||||
|
|
||||||
|
|
||||||
|
msg_ACPTR_read_FD:
|
||||||
|
|
||||||
|
; XXX provide implementation
|
||||||
|
|
||||||
|
|
||||||
|
msg_ACPTR_read_RD:
|
||||||
|
|
||||||
|
; XXX provide implementation
|
||||||
|
|
||||||
|
|
||||||
|
msg_ACPTR_fail_no_data:
|
||||||
|
|
||||||
|
; XXX What should be the reaction when trying to read and no data is present?
|
||||||
|
|
||||||
|
sta TBTCNT
|
||||||
|
bra msg_ACPTR_EOI
|
||||||
|
|
||||||
msg_ACPTR_status:
|
msg_ACPTR_status:
|
||||||
|
|
||||||
@@ -57,7 +113,7 @@ msg_ACPTR_status_got:
|
|||||||
|
|
||||||
jmp dos_EXIT_A
|
jmp dos_EXIT_A
|
||||||
|
|
||||||
msg_ACPTR_fail:
|
msg_ACPTR_fail_no_talker:
|
||||||
|
|
||||||
; XXX set error code
|
; XXX set error code
|
||||||
|
|
||||||
@@ -70,13 +126,12 @@ msg_ACPTR_reset_status:
|
|||||||
|
|
||||||
; FALLTROUGH
|
; FALLTROUGH
|
||||||
|
|
||||||
msg_ACPTR_eoi:
|
msg_ACPTR_EOI:
|
||||||
|
|
||||||
jsr kernalstatus_EOI
|
jsr kernalstatus_EOI
|
||||||
jmp dos_EXIT
|
jmp dos_EXIT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; Vector tables for jumps
|
; Vector tables for jumps
|
||||||
|
|
||||||
msg_ACPTR_status_vectab:
|
msg_ACPTR_status_vectab:
|
||||||
@@ -84,3 +139,9 @@ msg_ACPTR_status_vectab:
|
|||||||
!word msg_ACPTR_status_SD
|
!word msg_ACPTR_status_SD
|
||||||
!word msg_ACPTR_status_FD
|
!word msg_ACPTR_status_FD
|
||||||
!word msg_ACPTR_status_RD
|
!word msg_ACPTR_status_RD
|
||||||
|
|
||||||
|
msg_ACPTR_read_vectab:
|
||||||
|
|
||||||
|
!word msg_ACPTR_read_SD
|
||||||
|
!word msg_ACPTR_read_FD
|
||||||
|
!word msg_ACPTR_read_RD
|
||||||
+15
-1
@@ -7,10 +7,12 @@
|
|||||||
msg_CIOUT:
|
msg_CIOUT:
|
||||||
|
|
||||||
jsr dos_ENTER
|
jsr dos_ENTER
|
||||||
|
php
|
||||||
|
|
||||||
; Check operation mode
|
; Check operation mode
|
||||||
|
|
||||||
ldx IDX1_LISTENER
|
ldx IDX1_LISTENER
|
||||||
|
bmi msg_CIOUT_fail
|
||||||
lda XX_MODE, x
|
lda XX_MODE, x
|
||||||
|
|
||||||
cmp #$01
|
cmp #$01
|
||||||
@@ -18,14 +20,20 @@ msg_CIOUT:
|
|||||||
|
|
||||||
; Receiving command or file name
|
; Receiving command or file name
|
||||||
|
|
||||||
ldx IDX2_TALKER
|
ldx IDX2_LISTENER
|
||||||
jmp (msg_CIOUT_cmdfn_vectab, X)
|
jmp (msg_CIOUT_cmdfn_vectab, X)
|
||||||
@1:
|
@1:
|
||||||
; XXX handle cases of transferring data
|
; XXX handle cases of transferring data
|
||||||
|
|
||||||
|
plp
|
||||||
jmp dos_EXIT_SEC
|
jmp dos_EXIT_SEC
|
||||||
|
|
||||||
|
msg_CIOUT_fail:
|
||||||
|
|
||||||
|
; XXX should we set status?
|
||||||
|
lda #K_ERR_DEVICE_NOT_FOUND
|
||||||
|
|
||||||
|
jmp dos_EXIT_A_SEC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -41,6 +49,8 @@ msg_CIOUT_cmdfn_SD: ; get next byte of status - SD card
|
|||||||
@1:
|
@1:
|
||||||
lda #$00
|
lda #$00
|
||||||
sta SD_CMDFN_IDX,x
|
sta SD_CMDFN_IDX,x
|
||||||
|
plp
|
||||||
|
+bcs dev_sd_cmd_OPEN_EOI ; if EOI - execute command
|
||||||
jmp dos_EXIT
|
jmp dos_EXIT
|
||||||
|
|
||||||
msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy
|
msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy
|
||||||
@@ -53,6 +63,8 @@ msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy
|
|||||||
@1:
|
@1:
|
||||||
lda #$00
|
lda #$00
|
||||||
sta FD_CMDFN_IDX,x
|
sta FD_CMDFN_IDX,x
|
||||||
|
plp
|
||||||
|
+bcs dev_fd_cmd_OPEN_EOI ; if EOI - execute command
|
||||||
jmp dos_EXIT
|
jmp dos_EXIT
|
||||||
|
|
||||||
msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk
|
msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk
|
||||||
@@ -65,6 +77,8 @@ msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk
|
|||||||
@1:
|
@1:
|
||||||
lda #$00
|
lda #$00
|
||||||
sta RD_CMDFN_IDX,x
|
sta RD_CMDFN_IDX,x
|
||||||
|
plp
|
||||||
|
+bcs dev_rd_cmd_OPEN_EOI ; if EOI - execute command
|
||||||
jmp dos_EXIT
|
jmp dos_EXIT
|
||||||
|
|
||||||
msg_CIOUT_cmdfn_vectab:
|
msg_CIOUT_cmdfn_vectab:
|
||||||
|
|||||||
@@ -1224,7 +1224,7 @@ void DataSet::generateConfigDepStrings()
|
|||||||
|
|
||||||
// CBDOS features
|
// CBDOS features
|
||||||
|
|
||||||
featureStrM65 += "CBDOS : SDCARD ";
|
featureStrM65 += "CBDOS : SD CARD ";
|
||||||
|
|
||||||
// Keyboard support features
|
// Keyboard support features
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user