前々回でディスクアクセスの改善をしましたが、やっぱり書き込み時に無限ループに入りハングアップすることが確認できました。

真の原因は、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

おすすめの記事