前回のCMD0によるソフトウェアリセットが終了した後、CMD8を投げます。
CMD8は インターフェイスコンデション確認ということで、SDHC及びVer2以上のSDカードには必衰です。
手持ちが、古いSDカードがないため確認していませんが、古いSDカードの場合、戻り値が0x05となるようです。(未確認)
正常に戻ると01000001AAの返答があります。

コマンドを投げるに当たって、ビット同期をとるためのダミーの8bitデータ0xffをCSがHレベルの状態で出力します。
[asm] dummy_data:
xor a
set S_CS,a ;CS="H"
set S_DI,a ;DI="H"
out0 (OUTPUTP),a
ld b,8 ;1clok output
call loopspii
xor a
out0 (OUTPUTP),a
ret
[/asm]

CMD8コマンドの流れ

[asm] cmd8_out:
call dummy_data
ld hl,cmd8
call cmd_out
call r1_resp
cp 0x01
ret nz
ld b,4
ld hl,r7
cmd8_r:
call resp
ld (hl),a
inc hl
djnz cmd8_r
cmd8_r_d:
ld hl,cmd8_msg
call msgout
ld a,0x01
call hex_a_disp
ld hl,r7
ld b,4
cmd8_r_d_loop:
ld a,(hl)
call hex_a_disp
inc hl
djnz cmd8_r_d_loop
ld a,0x0d
call putchar
ld a,0x01
ret
cmd8_msg:
.str "CMD8:"
.db 0x00
[/asm]

ターミナルの返答は
CMD8:01000001AA
となります。

続いて、CMD55コマンドを投げた後、ACMD41コマンドを続けて投げます。
ACMD41コマンドの戻り値が0x00になるまで、繰り返し投げます。
CMD55は、アプリケーション特化コマンドで次のコマンドがアプリケーションコマンドであることを知らせます。
ACMD41は初期化開始アプリケーションコマンドです。

[asm] call cmd55_out
cp 0x01
jp nz,init_err
call acmd41_out
[/asm]

CMD5及びACMD41コマンド

[asm] cmd55_out:
call dummy_data
ld hl,cmd55
call cmd_out
call r1_resp
push af
ld hl,cmd55_msg
call msgout
pop af
push af
call hex_a_disp
ld a,0x0d
call putchar
pop af
ret
cmd55_msg:
.str "CMD55:"
.db 0x00

acmd41_out:
call dummy_data
ld hl,acmd41 ;sd-card Initialize
call cmd_out
call r1_resp
cp 0x00
push af
ld hl,acmd41_msg
call msgout
pop af
push af
call hex_a_disp
ld a,0x0d
call putchar
pop af
ret z
call cmd55_out
jr acmd41_out
acmd41_msg:
.str "ACMD41:"
.db 0x00
[/asm]

ターミナルからの返答
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:01
CMD55:01
ACMD41:00

次回CMD58によるOCR読み出しを行い、カード種別を判別していきます。

おすすめの記事