From 32a73bb5f8d1dda5eb37aa25804af3a334600363 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 28 Sep 2020 19:10:54 +0200 Subject: [PATCH] more work on SD card support --- src/dos_m65/sdcard/sdcard_helpers.s | 66 +++++++++++++++++++++ src/dos_m65/sdcard/sdcard_readsector.s | 38 +----------- src/dos_m65/sdcard/sdcard_writesector.s | 78 +++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 35 deletions(-) create mode 100644 src/dos_m65/sdcard/sdcard_helpers.s create mode 100644 src/dos_m65/sdcard/sdcard_writesector.s diff --git a/src/dos_m65/sdcard/sdcard_helpers.s b/src/dos_m65/sdcard/sdcard_helpers.s new file mode 100644 index 00000000..d53a2c8e --- /dev/null +++ b/src/dos_m65/sdcard/sdcard_helpers.s @@ -0,0 +1,66 @@ + +; +; Various helper routines for SD card support +; + +; Based on https://github.com/MEGA65/mega65-libc/blob/master/cc65/src/sdcard.c + + + +; +; Sets read/write address +; +; Input: CARD_SECNUM, CARD_IS_SDHC +; Output: Carry set = error +; Preserves: .X, .Y, .Z +; + +sdcard_set_addr: + + bit CARD_IS_SDHC + bpl sdcard_set_addr_sdsc + +sdcard_set_addr_sdhc: + + lda CARD_SECNUM+0 + sta SD_ADDR+0 + lda CARD_SECNUM+1 + sta SD_ADDR+1 + lda CARD_SECNUM+2 + sta SD_ADDR+2 + lda CARD_SECNUM+3 + sta SD_ADDR+3 + + ; FALLTROUGH + +sdcard_set_addr_done: + + clc + rts + +sdcard_set_addr_sdsc: + + ; Multiply sector number by 512 + + lda #$00 + sta SD_ADDR+0 + clc + lda CARD_SECNUM+0 + rol + sta SD_ADDR+1 + lda CARD_SECNUM+1 + rol + sta SD_ADDR+2 + lda CARD_SECNUM+2 + rol + sta SD_ADDR+3 + bcs sdcard_set_addr_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: + + sec + rts diff --git a/src/dos_m65/sdcard/sdcard_readsector.s b/src/dos_m65/sdcard/sdcard_readsector.s index 1f20ae9b..8fe2194d 100644 --- a/src/dos_m65/sdcard/sdcard_readsector.s +++ b/src/dos_m65/sdcard/sdcard_readsector.s @@ -13,41 +13,10 @@ sdcard_readsector: ; XXX check if card initialized and operable - ; Set read address, depending on card type + ; Set read address - bit CARD_IS_SDHC - bpl sdcard_readsector_sdsc - -sdcard_readsector_sdhc: - - lda CARD_SECNUM+0 - sta SD_ADDR+0 - lda CARD_SECNUM+1 - sta SD_ADDR+1 - lda CARD_SECNUM+2 - sta SD_ADDR+2 - lda CARD_SECNUM+3 - sta SD_ADDR+3 - - bra sdcard_readsector_read - -sdcard_readsector_sdsc: ; multiply sector number by 512 - - lda #$00 - sta SD_ADDR+0 - clc - lda CARD_SECNUM+0 - rol - sta SD_ADDR+1 - lda CARD_SECNUM+1 - rol - sta SD_ADDR+2 - lda CARD_SECNUM+2 - rol - sta SD_ADDR+3 - bcs sdcard_readsector_fail ; branch if sector number too large for SD card - lda CARD_SECNUM+3 - bne sdcard_readsector_fail ; branch if sector number too large for SD card + jsr sdcard_set_addr + bcs sdcard_readsector_fail ; FALLTROUGH @@ -100,7 +69,6 @@ sdcard_readsector_fail: sdcard_readsector_copy_data: - ; XXX this should be a separate routine ; XXX use DMAgic for this phz diff --git a/src/dos_m65/sdcard/sdcard_writesector.s b/src/dos_m65/sdcard/sdcard_writesector.s new file mode 100644 index 00000000..851f6d44 --- /dev/null +++ b/src/dos_m65/sdcard/sdcard_writesector.s @@ -0,0 +1,78 @@ + +; +; Writes the sector to the SD card +; + +; Based on https://github.com/MEGA65/mega65-libc/blob/master/cc65/src/sdcard.c + + +; XXX finish, provide documentation + + +sdcard_writesector: + + ; XXX check if card initialized and operable + + lda SD_CTL + and #$03 + bne sdcard_writesector ; XXX add a timer here + + ; End reset + + lda #$01 + sta SD_CTL + + ; Set write address + + jsr sdcard_set_addr + + + + + + + + jsr sdcard_writesector_copy_data + + + + + + + + + + +; +; Helper routines +; + +sdcard_writesector_copy_data: + + ; XXX use DMAgic for this + + phz + phx + + ldx #$00 + ldz #$00 + +@1: + lda CARD_BUF,x + sta [CARD_BUFPNT],z + inc CARD_BUFPNT+1 + lda CARD_BUF+$100,x + sta [CARD_BUFPNT],z + dec CARD_BUFPNT+1 + + inz + inx + bne @1 + + ; Restore registers and quit + + plx + plz + + clc + rts