前々回でディスクアクセスの改善をしましたが、やっぱり書き込み時に無限ループに入りハングアップすることが確認できました。
真の原因は、write:ルーチンの中の、データを書き込みした後の、Lowレベルからの復帰に問題がありました。
実際のプログラム(抜粋)は、データの最後のcrc2バイト(ダミーデータ0xff)を書き込みした後に、データレスポンス0x05をチェックしたのち、Lowレベル(0x00)から復帰するために再度レスポンスをチェック(0x00以外になるまで)していますが、このレスポンスをチェックするルーチンr1_respを間違って設定していました。
このr1_respの中では、0xffをチェックしているため、直ちにLowベルになった場合は、0xffになるまでループするようになっていました。
ld d,0xff
call spi_8bit ;crc
ld d,0xff
call spi_8bit ;crc
call r1_resp
and 0x0f
cp 0x05
jr nz,cmd25_err2
cmd25_wch:
call r1_resp
cp 0x00
jr z,cmd25_wch
・
・
・
r1_resp:
call resp
cp 0xff
jr z,r1_resp
ret
resp:
ld d,0xff
call spi_8bit
ld a,e
ret
データレスポンス0x05をチェックしたのち、Lowレベル(0x00)から復帰するために再度レスポンスをチェック(0x00以外になるまで)するルーチンは、素直にレスポンス値を返す サブルーチン resp:に設定する必要がありました。
下記 write:ルーチンの該当部分を call r1_respからcall respに変更しました。
過去の 拡張用BIOSについては変更しました。
ld d,0xff
call spi_8bit ;crc
ld d,0xff
call spi_8bit ;crc
call r1_resp
and 0x0f
cp 0x05
jr nz,cmd25_err2
cmd25_wch:
call resp
cp 0x00
jr z,cmd25_wch