more work on SDCARD support
This commit is contained in:
1 parent
28f38987f7
commit
d9e8faab38
1 file changed
+116
-14
+116
-14
@@ -11,17 +11,21 @@
|
|||||||
|
|
||||||
!addr CARD_IS_SDHC = $80 ; $00 = SD, $80 = SDHC
|
!addr CARD_IS_SDHC = $80 ; $00 = SD, $80 = SDHC
|
||||||
!addr CARD_SIZE = $81 ; 4 bytes
|
!addr CARD_SIZE = $81 ; 4 bytes
|
||||||
|
!addr CARD_SECNUM = $85 ; 4 bytes - sector number
|
||||||
|
|
||||||
; Temporary XXX addresses are temporary
|
|
||||||
|
|
||||||
!addr TMP_SECNUM = $85 ; 4 bytes - sector number
|
; Temporary data XXX addresses are temporary
|
||||||
|
|
||||||
!addr TMP_STEP = $89 ; 4 bytes
|
!addr TMP_STEP = $89 ; 4 bytes
|
||||||
|
!addr TMP_RETRIES = $8D ; 1 byte
|
||||||
|
|
||||||
|
|
||||||
; XXX hardware address SD_SECTORBUF = 0xffd6e00L;
|
; XXX hardware address SD_SECTORBUF = 0xffd6e00L;
|
||||||
|
|
||||||
|
|
||||||
|
; External entry points:
|
||||||
|
; - m65_sdcard_init
|
||||||
|
; - m65_sdcard_readsector
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -68,7 +72,7 @@ m65_sdcard_init_sdhc:
|
|||||||
lda #$80
|
lda #$80
|
||||||
sta CARD_IS_SDHC
|
sta CARD_IS_SDHC
|
||||||
|
|
||||||
; Prepare data for determining card size - put $00200000 to TMP_STEP and TMP_SECNUM
|
; Prepare data for determining card size - put $00200000 to TMP_STEP and CARD_SECNUM
|
||||||
|
|
||||||
; SDHC claims 32GB limit, and reading from beyond that might cause
|
; SDHC claims 32GB limit, and reading from beyond that might cause
|
||||||
; trouble. However, 32bits x 512byte sectors = 16TB addressable.
|
; trouble. However, 32bits x 512byte sectors = 16TB addressable.
|
||||||
@@ -76,17 +80,18 @@ m65_sdcard_init_sdhc:
|
|||||||
; or at least the top few bits.
|
; or at least the top few bits.
|
||||||
|
|
||||||
; XXX this should be initialized to 0 in a loop
|
; XXX this should be initialized to 0 in a loop
|
||||||
|
; XXX is it needed for anything
|
||||||
|
|
||||||
lda #$00
|
lda #$00
|
||||||
sta TMP_SECNUM+0
|
sta CARD_SECNUM+0
|
||||||
sta TMP_STEP+0
|
sta TMP_STEP+0
|
||||||
sta TMP_SECNUM+1
|
sta CARD_SECNUM+1
|
||||||
sta TMP_STEP+1
|
sta TMP_STEP+1
|
||||||
sta TMP_SECNUM+2
|
sta CARD_SECNUM+2
|
||||||
sta TMP_STEP+2
|
sta TMP_STEP+2
|
||||||
|
|
||||||
lda #$02
|
lda #$02
|
||||||
sta TMP_SECNUM+3
|
sta CARD_SECNUM+3
|
||||||
sta TMP_STEP+3
|
sta TMP_STEP+3
|
||||||
|
|
||||||
bra m65_sdcard_init_getsize
|
bra m65_sdcard_init_getsize
|
||||||
@@ -98,20 +103,21 @@ m65_sdcard_init_sdsc:
|
|||||||
lda #$40 ; use byte addressing
|
lda #$40 ; use byte addressing
|
||||||
sta SD_CTL
|
sta SD_CTL
|
||||||
|
|
||||||
; Prepare data for determining card size - put $00200000 to TMP_STEP and TMP_SECNUM
|
; Prepare data for determining card size - put $00200000 to TMP_STEP and CARD_SECNUM
|
||||||
|
|
||||||
; XXX this should be initialized to 0 in a loop
|
; XXX this should be initialized to 0 in a loop
|
||||||
|
; XXX is it needed for anything
|
||||||
|
|
||||||
lda #$00
|
lda #$00
|
||||||
sta TMP_SECNUM+0
|
sta CARD_SECNUM+0
|
||||||
sta TMP_STEP+0
|
sta TMP_STEP+0
|
||||||
sta TMP_SECNUM+1
|
sta CARD_SECNUM+1
|
||||||
sta TMP_STEP+1
|
sta TMP_STEP+1
|
||||||
sta TMP_SECNUM+3
|
sta CARD_SECNUM+3
|
||||||
sta TMP_STEP+3
|
sta TMP_STEP+3
|
||||||
|
|
||||||
lda #$02
|
lda #$02
|
||||||
sta TMP_SECNUM+2
|
sta CARD_SECNUM+2
|
||||||
sta TMP_STEP+2
|
sta TMP_STEP+2
|
||||||
|
|
||||||
; FALLTROUGH
|
; FALLTROUGH
|
||||||
@@ -122,8 +128,104 @@ m65_sdcard_init_getsize:
|
|||||||
; (binary search of sector numbers is NOT safe for some reason.
|
; (binary search of sector numbers is NOT safe for some reason.
|
||||||
; It frequently reports bigger than the size of the card)
|
; It frequently reports bigger than the size of the card)
|
||||||
|
|
||||||
; XXX finish
|
lda #$00
|
||||||
|
sta CARD_SECNUM+0
|
||||||
|
sta CARD_SECNUM+1
|
||||||
|
sta CARD_SECNUM+2
|
||||||
|
sta CARD_SECNUM+3
|
||||||
|
|
||||||
|
; step = 16*2048
|
||||||
|
|
||||||
|
sta TMP_STEP+0
|
||||||
|
sta TMP_STEP+2
|
||||||
|
sta TMP_STEP+3
|
||||||
|
lda #$08
|
||||||
|
sta TMP_STEP+1
|
||||||
|
|
||||||
|
; XXX finish the implementation
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
m65_sdcard_readsector: ; XXX reads sector CARD_SECNUM
|
||||||
|
|
||||||
|
; Set read address, depending on card type
|
||||||
|
|
||||||
|
bit CARD_IS_SDHC
|
||||||
|
bpl m65_sdcard_readsector_sdsc
|
||||||
|
|
||||||
|
m65_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 m65_sdcard_readsector_read
|
||||||
|
|
||||||
|
|
||||||
|
m65_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 m65_sdcard_readsector_fail ; branch if sector number too large for SD card
|
||||||
|
lda CARD_SECNUM+3
|
||||||
|
bne m65_sdcard_readsector_fail ; branch if sector number too large for SD card
|
||||||
|
|
||||||
|
; FALLTROUGH
|
||||||
|
|
||||||
|
m65_sdcard_readsector_read:
|
||||||
|
|
||||||
|
; Wait till card is ready
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; Set number of retries
|
||||||
|
|
||||||
|
lda #$0A
|
||||||
|
sta TMP_RETRIES
|
||||||
|
|
||||||
|
; XXX
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
m65_sdcard_readsector_fail:
|
||||||
|
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user