more work on SD card support
This commit is contained in:
1 parent
ff98d2c5c2
commit
32a73bb5f8
3 files changed
+147
-35
No files matched your search
@@ -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
|
||||||
@@ -13,41 +13,10 @@ sdcard_readsector:
|
|||||||
|
|
||||||
; XXX check if card initialized and operable
|
; XXX check if card initialized and operable
|
||||||
|
|
||||||
; Set read address, depending on card type
|
; Set read address
|
||||||
|
|
||||||
bit CARD_IS_SDHC
|
jsr sdcard_set_addr
|
||||||
bpl sdcard_readsector_sdsc
|
bcs sdcard_readsector_fail
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
; FALLTROUGH
|
; FALLTROUGH
|
||||||
|
|
||||||
@@ -100,7 +69,6 @@ sdcard_readsector_fail:
|
|||||||
|
|
||||||
sdcard_readsector_copy_data:
|
sdcard_readsector_copy_data:
|
||||||
|
|
||||||
; XXX this should be a separate routine
|
|
||||||
; XXX use DMAgic for this
|
; XXX use DMAgic for this
|
||||||
|
|
||||||
phz
|
phz
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in new issue
Block a user