more work on SD card support

This commit is contained in:
FeralChild64 committed 2020-09-28 19:10:54 +02:00
1 parent ff98d2c5c2
commit 32a73bb5f8
3 files changed
+147 -35

No files matched your search

+66
View File
@@ -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
+3 -35
View File
@@ -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
+78
View File
@@ -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