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
|
||||
|
||||
; 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
|
||||
|
||||
@@ -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