From 7452d683aa12b304f5b13d68a8eac51d9e2f6548 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 2 Oct 2020 17:58:08 +0200 Subject: [PATCH] more work on SD card support --- src/aliases/,aliases_hardware_m65.s | 26 +++++++++++++++++++++ src/dos_m65/sdcard/sdcard_helpers.s | 29 ++++++++++++++++++++++-- src/dos_m65/sdcard/sdcard_readsector.s | 30 +++---------------------- src/dos_m65/sdcard/sdcard_writesector.s | 22 +++++++++++++++++- 4 files changed, 77 insertions(+), 30 deletions(-) diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 6f545945..8a03c46e 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -66,4 +66,30 @@ !set __SID_R2_OFFSET = $20 ; right SID 2, $D420 !set __SID_L1_OFFSET = $40 ; left SID 1, $D440 !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 } diff --git a/src/dos_m65/sdcard/sdcard_helpers.s b/src/dos_m65/sdcard/sdcard_helpers.s index d53a2c8e..94acd3db 100644 --- a/src/dos_m65/sdcard/sdcard_helpers.s +++ b/src/dos_m65/sdcard/sdcard_helpers.s @@ -54,13 +54,38 @@ sdcard_set_addr_sdsc: lda CARD_SECNUM+2 rol 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 beq sdcard_set_addr_done ; do not branch if sector number too large for SD card ; FALLTROUGH -sdcard_set_addr_fail: +sdcard_helper_fail: sec 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 diff --git a/src/dos_m65/sdcard/sdcard_readsector.s b/src/dos_m65/sdcard/sdcard_readsector.s index 8fe2194d..14c595e7 100644 --- a/src/dos_m65/sdcard/sdcard_readsector.s +++ b/src/dos_m65/sdcard/sdcard_readsector.s @@ -16,7 +16,7 @@ sdcard_readsector: ; Set read address jsr sdcard_set_addr - bcs sdcard_readsector_fail + bcs sdcard_readsector_fail ; FALLTROUGH @@ -33,7 +33,7 @@ sdcard_readsector_try_loop: ; Wait till card is ready - jsr sdcard_readsector_wait + jsr sdcard_wait_ready bcs sdcard_readsector_fail ; Read command @@ -43,7 +43,7 @@ sdcard_readsector_try_loop: ; Wait for command completion - jsr sdcard_readsector_wait + jsr sdcard_wait_ready bcs sdcard_readsector_fail @@ -96,27 +96,3 @@ sdcard_readsector_copy_data: clc 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 diff --git a/src/dos_m65/sdcard/sdcard_writesector.s b/src/dos_m65/sdcard/sdcard_writesector.s index 851f6d44..f6ef24ae 100644 --- a/src/dos_m65/sdcard/sdcard_writesector.s +++ b/src/dos_m65/sdcard/sdcard_writesector.s @@ -17,7 +17,7 @@ sdcard_writesector: and #$03 bne sdcard_writesector ; XXX add a timer here - ; End reset + ; End reset XXX should this be done for sector reading too? lda #$01 sta SD_CTL @@ -25,12 +25,20 @@ sdcard_writesector: ; Set write address 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 @@ -43,6 +51,18 @@ sdcard_writesector: + + + +sdcard_writesector_fail: + + sec + rts + + + + + ; ; Helper routines ;