プリンタポートの場合
カードリーダをプリンタポートに接続する場合のコードを考えてみました。昔のパソコンの大部分は入力がBUSY信号のみですが、幸いなことにSPIで必要とする入力信号は1本なので、これで間に合います。
PC-6001のプリンタ関連ポートの操作
PC-6001のプリンタ関連のポートは以下のとおりです。
0x91 data output 0xc0 busy(bit1)
なお、回路では出力の際、インバータを通しているので、ビットは反転出力する必要があります。
コード
では、早速コードを見てみましょう。例により、レジスタEを出力としています。
ld d, #0xff _main: ld a, d out (#0x91), a dec a out (#0x91), a in a, (#0xc0) add a, d rl e ; _mainからを8回繰り返す ret
ここではハードウェアの設定として、以下を仮定しています。
- CLKはビット0とします。
- DIはビット1~7のどこでもかまいません。
ここでのトリックは、
add a, d
です。ポート0xc0からの入力は、ビット1以外は常に0なので、これで入力がある(a=0x02)場合は0xffを足すとキャリーが立ちます。しかも、レジスタDを使いまわせるので、利用するレジスタがA, F, D, Eの4つのみです。
結構これは重要で、このルーチンの外側でループを使ってバッファに書き込みを行うので、
ld (hl), e
のようにバッファへのポインタ(この場合HL)とループカウンタを利用します。ジョイスティックの場合はバイト入力でAFDEHL を使ってしまい、残りのレジスタは2つ。ループカウンタ用のレジスタをBにしてdjnzでまわしても、ぎりぎりレジスタが足りないので、実は裏レジスタを 利用しています。惜しい...。
プリンタポートだとその必要がないのでexxと裏表のレジスタ転送の分が浮きます。バイトごとにこの処理が必要なので、1セクタあたり12T*512回分。合計6,144Tで、意外に馬鹿になりません。
もし、SDカードからの入力信号が1のときにポート0xc0の値が0になるようであれば、上記の代わりに
ld c, #0x02
を準備しておいて、
sub c
とするとよいでしょう。
T-stateは1bitあたり53、1バイトで441となります。裏レジスタを利用しなくて済む分も考慮して、1セクタあたりの時間は約260,000T、期待できる転送レートは3kB/s(VDG on)または6kB/s(VDG off)となります。前回よりさらに1.5倍のスピードになりますね。
なお、これは現在のSDカードアダプタを、ケーブル配線のみ変更すれば適用可能です。ただ、テストはしていませんのでご注意ください。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!