Move shadow to us, get some commands going
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user