more work on SD card support
This commit is contained in:
1 parent
32a73bb5f8
commit
7452d683aa
4 files changed
+76
-29
No files matched your search
@@ -66,4 +66,30 @@
|
|||||||
!set __SID_R2_OFFSET = $20 ; right SID 2, $D420
|
!set __SID_R2_OFFSET = $20 ; right SID 2, $D420
|
||||||
!set __SID_L1_OFFSET = $40 ; left SID 1, $D440
|
!set __SID_L1_OFFSET = $40 ; left SID 1, $D440
|
||||||
!set __SID_L2_OFFSET = $60 ; left SID 2, $D460
|
!set __SID_L2_OFFSET = $60 ; left SID 2, $D460
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; SD card commands
|
||||||
|
;
|
||||||
|
; XXX command codes taken from XEMU emulator, to be updated when official documentation exists
|
||||||
|
|
||||||
|
!set CARD_CMD_RESET = $00 ; reset SD card
|
||||||
|
!set CARD_CMD_RESET_FL = $10 ; reset with flags, XXX what's this?
|
||||||
|
!set CARD_CMD_END_RESET = $01 ; end reset
|
||||||
|
!set CARD_CMD_END_RESET_FL = $11 ; end reset with flags
|
||||||
|
!set CARD_CMD_READ = $02 ; read sector
|
||||||
|
!set CARD_CMD_WRITE = $03 ; write sector
|
||||||
|
!set CARD_CMD_WRITE_1 = $04 ; multi-sector write, 1st sector
|
||||||
|
!set CARD_CMD_WRITE_2 = $05 ; multi-sector write
|
||||||
|
!set CARD_CMD_WRITE_3 = $06 ; multi-sector write, last sector
|
||||||
|
!set CARD_CMD_FLUSH = $0C
|
||||||
|
!set CARD_CMD_SDHC_OFF = $40 ; for older cores only?
|
||||||
|
!set CARD_CMD_SDHC_ON = $41 ; for older cores only?
|
||||||
|
; XXX $44, $45 - completely unclear to me
|
||||||
|
!set CARD_CMD_MAP_BUF = $81
|
||||||
|
!set CARD_CMD_UNMAP_BUF = $82
|
||||||
|
!set CARD_CMD_FILL_ON = $83
|
||||||
|
!set CARD_CMD_FILL_OFF = $84
|
||||||
|
!set CARD_CMD_SELECT_INT = $C0 ; select internal slot
|
||||||
|
!set CARD_CMD_SELECT_EXT = $C1 ; select external slot
|
||||||
}
|
}
|
||||||
@@ -54,13 +54,38 @@ sdcard_set_addr_sdsc:
|
|||||||
lda CARD_SECNUM+2
|
lda CARD_SECNUM+2
|
||||||
rol
|
rol
|
||||||
sta SD_ADDR+3
|
sta SD_ADDR+3
|
||||||
bcs sdcard_set_addr_fail ; branch if sector number too large for SD card
|
bcs sdcard_helper_fail ; branch if sector number too large for SD card
|
||||||
lda CARD_SECNUM+3
|
lda CARD_SECNUM+3
|
||||||
beq sdcard_set_addr_done ; do not branch if sector number too large for SD card
|
beq sdcard_set_addr_done ; do not branch if sector number too large for SD card
|
||||||
|
|
||||||
; FALLTROUGH
|
; FALLTROUGH
|
||||||
|
|
||||||
sdcard_set_addr_fail:
|
sdcard_helper_fail:
|
||||||
|
|
||||||
sec
|
sec
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Wait till card is ready
|
||||||
|
;
|
||||||
|
; Input: none
|
||||||
|
; Output: Carry set = error
|
||||||
|
; Preserves: .Y, .Z
|
||||||
|
|
||||||
|
sdcard_wait_ready:
|
||||||
|
|
||||||
|
lda SD_CTL
|
||||||
|
; Sometimes we see this result, i.e., sdcard.vhdl thinks it is done,
|
||||||
|
; but sdcardio.vhdl thinks not. This means a read error.
|
||||||
|
cmp #$01
|
||||||
|
beq sdcard_helper_fail
|
||||||
|
tax
|
||||||
|
and #$40
|
||||||
|
bne sdcard_helper_fail
|
||||||
|
txa
|
||||||
|
and #$03
|
||||||
|
bne sdcard_wait_ready
|
||||||
|
|
||||||
|
clc
|
||||||
|
rts
|
||||||
@@ -33,7 +33,7 @@ sdcard_readsector_try_loop:
|
|||||||
|
|
||||||
; Wait till card is ready
|
; Wait till card is ready
|
||||||
|
|
||||||
jsr sdcard_readsector_wait
|
jsr sdcard_wait_ready
|
||||||
bcs sdcard_readsector_fail
|
bcs sdcard_readsector_fail
|
||||||
|
|
||||||
; Read command
|
; Read command
|
||||||
@@ -43,7 +43,7 @@ sdcard_readsector_try_loop:
|
|||||||
|
|
||||||
; Wait for command completion
|
; Wait for command completion
|
||||||
|
|
||||||
jsr sdcard_readsector_wait
|
jsr sdcard_wait_ready
|
||||||
bcs sdcard_readsector_fail
|
bcs sdcard_readsector_fail
|
||||||
|
|
||||||
|
|
||||||
@@ -96,27 +96,3 @@ sdcard_readsector_copy_data:
|
|||||||
|
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
|
|
||||||
sdcard_readsector_wait:
|
|
||||||
|
|
||||||
; Wait till card is ready
|
|
||||||
|
|
||||||
lda SD_CTL
|
|
||||||
; Sometimes we see this result, i.e., sdcard.vhdl thinks it is done,
|
|
||||||
; but sdcardio.vhdl thinks not. This means a read error.
|
|
||||||
cmp #$01
|
|
||||||
beq sdcard_readsector_wait_fail
|
|
||||||
tax
|
|
||||||
and #$40
|
|
||||||
bne sdcard_readsector_wait_fail
|
|
||||||
txa
|
|
||||||
and #$03
|
|
||||||
bne sdcard_readsector_wait
|
|
||||||
|
|
||||||
clc
|
|
||||||
rts
|
|
||||||
|
|
||||||
sdcard_readsector_wait_fail:
|
|
||||||
|
|
||||||
sec
|
|
||||||
rts
|
|
||||||
@@ -17,7 +17,7 @@ sdcard_writesector:
|
|||||||
and #$03
|
and #$03
|
||||||
bne sdcard_writesector ; XXX add a timer here
|
bne sdcard_writesector ; XXX add a timer here
|
||||||
|
|
||||||
; End reset
|
; End reset XXX should this be done for sector reading too?
|
||||||
|
|
||||||
lda #$01
|
lda #$01
|
||||||
sta SD_CTL
|
sta SD_CTL
|
||||||
@@ -25,12 +25,20 @@ sdcard_writesector:
|
|||||||
; Set write address
|
; Set write address
|
||||||
|
|
||||||
jsr sdcard_set_addr
|
jsr sdcard_set_addr
|
||||||
|
bcs sdcard_writesector_fail
|
||||||
|
|
||||||
|
; FALLTROUGH
|
||||||
|
|
||||||
|
sdcard_writesector_write:
|
||||||
|
|
||||||
|
; Set number of retries
|
||||||
|
|
||||||
|
lda #$0A
|
||||||
|
sta CARD_TMP_RETRIES
|
||||||
|
|
||||||
|
; FALLTROUGH
|
||||||
|
|
||||||
|
sdcard_writesector_try_loop:
|
||||||
|
|
||||||
jsr sdcard_writesector_copy_data
|
jsr sdcard_writesector_copy_data
|
||||||
|
|
||||||
@@ -43,6 +51,18 @@ sdcard_writesector:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sdcard_writesector_fail:
|
||||||
|
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;
|
;
|
||||||
; Helper routines
|
; Helper routines
|
||||||
;
|
;
|
||||||
|
|||||||
Reference in new issue
Block a user