Move shadow to us, get some commands going

This commit is contained in:
Byron Lathi
2024-07-20 21:40:26 -07:00
parent f6eeb80e25
commit 3d05d07541
7 changed files with 287 additions and 20 deletions

View File

@@ -1,7 +1,7 @@
MEMORY
{
RAM: start = $0000, size = $200;
ROM: start = $FF00, size = $100, file = %O;
ROM: start = $F000, size = $1000, file = %O;
}
SEGMENTS {
@@ -25,6 +25,6 @@ FEATURES {
SYMBOLS {
# Define the stack size for the application
__STACKSIZE__: value = $0200, type = weak;
__STACKSTART__: type = weak, value = $0800; # 2k stack
__STACKSIZE__: value = $0800, type = weak;
__STACKSTART__: type = weak, value = $0200; # 2k stack
}

View File

@@ -1,5 +1,9 @@
.export _init, _nmi_int, _irq_int
.include "zeropage.inc"
.autoimport
.segment "VECTORS"
.addr _nmi_int ; NMI vector
@@ -10,6 +14,7 @@ SD_CONTROLLER = $e000
SD_CMD = SD_CONTROLLER
SD_ARG = SD_CONTROLLER + $4
SD_DATA = SD_ARG
SD_FIFO_0 = SD_CONTROLLER + $8
SD_FIFO_2 = SD_CONTROLLER + $C
@@ -39,6 +44,12 @@ _irq_int:
_init:
ldx #$ff
txs
cld
lda #<(__STACKSTART__ + __STACKSIZE__)
sta sp
lda #>(__STACKSTART__ + __STACKSIZE__)
sta sp+1
stz SD_PHY_CLKCTRL
stz SD_PHY_SAMP_VOLT
@@ -51,22 +62,50 @@ _init:
cmp #SDIOCLK_100KHZ
bne @wait_clk
stz SD_CMD+$3
lda #$04
sta SD_CMD+$2
; send_goidle();
jsr send_goidle
; send_r1(8, 0x1aa);
lda #$0
sta sreg+1
lda #$0
sta sreg
ldx #$01
lda #$aa
jsr pusheax
lda #$08
sta SD_CMD+$1
jsr send_r1
@acmd41:
; send_r1(55, 0x00);
lda #$0
sta sreg+1
lda #$0
sta sreg
ldx #$00
lda #$00
jsr pusheax
lda #55
jsr send_r1
; send_r1(41, 0x4000ff80);
lda #$40
sta SD_CMD
sta sreg+1
lda #$0
sta sreg
ldx #$ff
lda #$80
jsr pusheax
lda #41
jsr send_r1
jsr wait_busy
lda sreg+1
bpl @acmd41
lda #$01
sta SD_CMD+$1
lda #$48
sta SD_CMD
; cmd 11
; cmd 2
; cmd 3
jsr wait_busy
@end:
bra @end
@@ -75,4 +114,58 @@ _init:
wait_busy: lda SD_CMD+$1
bit #$40
bne wait_busy
rts
; No arguments, no response
; sends cmd0
; also clears removed and error flags?
send_goidle:
stz SD_ARG+$3
stz SD_ARG+$2
stz SD_ARG+$1
stz SD_ARG
stz SD_CMD+$3
lda #$04
sta SD_CMD+$2
lda #$80
sta SD_CMD+$1
lda #$40
sta SD_CMD
jsr wait_busy
rts
; Command in A
; Arg on stack as 32 bits
; returns the response in eax
; (How can we signal a failure then?)
send_r1:
pha ; push command to stack
jsr popeax
PHA
stx SD_ARG+$1
lda sreg
sta SD_ARG+$2
lda sreg+1
sta SD_ARG+$3
pla
sta SD_ARG ; lsb has to be the last written.
lda #$81 ; This also clears error flag (only for acmd41?)
sta SD_CMD+$1
pla
ora #$40
sta SD_CMD
jsr wait_busy
lda SD_DATA + $3
sta sreg+1
lda SD_DATA + $2
sta sreg
ldx SD_DATA + $1
lda SD_DATA
rts