前回でディスク容量を増やしましたが、ここで新しいSDCARD(8GByte)を使用すると、pipコマンド(ファイルコピー)でハングアップする現象が出ました。
いろいろと原因を探ると、writeコマンドを発行しているときに無限ループになっていることが判明しました。
いろいろと対応を探ると、write:ルーチンの中でcmd25コマンドを発行する前に、同期のために 8ビットのダミーデータ(call dummy_data)を実行していましたが、これが影響してるようでした。
下記に、当確部分のcall dummy_dataをコメントアウトして、実行したら改善しました。完全とはいい難いとは思いますが^^;
write:
; ld a,"W"
; call putchar
call get_sector
spi_write1:
ld a,(r7)
bit 6,a
jp z,write_SD_ver2
ld a,h ;SDHC
ld (cmd25+03),a
ld a,l
ld (cmd25+04),a
jr spi_write2
write_SD_ver2: ;Ver2
ld a,h
ld (cmd25+02),a
ld a,l
ld (cmd25+03),a
spi_write2:
; call dummy_data ;;Write error avoidance (comment out)
ld hl,cmd25
call cmd_out
call r1_resp
cp 0x00
jp nz,cmd25_err
また、直接の原因ではないと思いますが、SPIクロックCKをできるだけ50パーセントデューティーになるようにNOP命令を付加しました。(読み書き速度は落ちますが^^;)
spi_8bit: ;outdata Dreg,inputdata Ereg
push bc
ld c,0x00
ld b,0x08
loopspi:
xor a
rlc d
rra
res S_CLK,a ;CLK L
out (PIOAD),a
nop ;Added to make the duty 50%
nop ;Added to make the duty 50%
nop ;Added to make the duty 50%
nop ;Added to make the duty 50%
nop ;Added to make the duty 50%
nop ;Added to make the duty 50%
nop
nop
nop
nop
nop
nop
set S_CLK,a ;CLK H
out (PIOAD),a
in a,(PIOAD)
rrca
rl e
djnz loopspi
xor a
set S_DI,a ;DI H
out (PIOAD),a
pop bc
ret
以上2点については、前回のTMPZ84C015のDISK拡張容量のBIOSについては、対応済みです。