82 lines
1.4 KiB
NASM
82 lines
1.4 KiB
NASM
#include "jumptable.inc"
|
|
.org 0x9000
|
|
|
|
call JUMP_SDCWAKEUP
|
|
|
|
; We expect a 0x01 R1 response
|
|
ld hl, sCmd0
|
|
call JUMP_PRINTSTR
|
|
ld a, 0b01000000 ; CMD0
|
|
ld hl, 0
|
|
ld de, 0
|
|
ld c, 0x95
|
|
call JUMP_SDCCMDR1
|
|
cp 0x01
|
|
jr nz, .error
|
|
ld hl, sOk
|
|
call JUMP_PRINTSTR
|
|
|
|
; We expect a 0x01 R1 response followed by 0x0001aa R7 response
|
|
ld hl, sCmd8
|
|
call JUMP_PRINTSTR
|
|
ld a, 0b01001000 ; CMD8
|
|
ld hl, 0
|
|
ld de, 0x01aa
|
|
ld c, 0x87
|
|
call JUMP_SDCCMDR7
|
|
ld a, h
|
|
cp 0
|
|
jr nz, .error
|
|
ld a, l
|
|
cp 0
|
|
jr nz, .error
|
|
ld a, d
|
|
cp 0x01
|
|
jr nz, .error
|
|
ld a, e
|
|
cp 0xaa
|
|
jr nz, .error
|
|
ld hl, sOk
|
|
call JUMP_PRINTSTR
|
|
|
|
; Now we need to repeatedly run CMD55+CMD41 (0x40000000) until we
|
|
; the card goes out of idle mode, that is, when it stops sending us
|
|
; 0x01 response and send us 0x00 instead. Any other response means that
|
|
; initialization failed.
|
|
ld hl, sCmd41
|
|
call JUMP_PRINTSTR
|
|
.loop:
|
|
ld a, 0b01110111 ; CMD55
|
|
ld hl, 0
|
|
ld de, 0
|
|
call JUMP_SDCCMDR1
|
|
cp 0x01
|
|
jr nz, .error
|
|
ld a, 0b01101001 ; CMD41 (0x40000000)
|
|
ld hl, 0x4000
|
|
ld de, 0x0000
|
|
call JUMP_SDCCMDR1
|
|
cp 0x01
|
|
jr z, .loop
|
|
cp 0
|
|
jr nz, .error
|
|
; Success! out of idle mode!
|
|
ld hl, sOk
|
|
call JUMP_PRINTSTR
|
|
ret
|
|
.error:
|
|
ld hl, sErr
|
|
call JUMP_PRINTSTR
|
|
ret
|
|
|
|
sCmd0:
|
|
.db "Sending CMD0", 0xa, 0xd, 0
|
|
sCmd8:
|
|
.db "Sending CMD8", 0xa, 0xd, 0
|
|
sCmd41:
|
|
.db "Sending CMD41", 0xa, 0xd, 0
|
|
sOk:
|
|
.db "Ok", 0xa, 0xd, 0
|
|
sErr:
|
|
.db "Err", 0xa, 0xd, 0
|