|
クヨクヨ悩んでいても仕方がない。
暫定仕様を考えて、最小限の機能を実装するところから始めよう。
目標は、「ぼくが持っているSDにアクセスできること」。
この時点で、このブログは自分用の利己的なメモと化す(笑)
特徴は、BASICからアクセス可能なことだ。
さっそくアセンブラの数行を書く。歴史的な数行だ(大袈裟なw)。
暫定仕様
○読むのも書くのも、BASICからのUSR関数で呼び出す。
○どのセクターを読み書きするかは、A=USR?(n)の n で指示する。
n は2バイト整数。
○読み書きは、SDで従来から一般的な512B単位とする。
○読み書きするデータはBASICがBUFFにアクセスして入出力する。
○書き込み後、BASICはSDから読み出してベリファイを行う。
○エラーについては、BASICがBUFFに返されたデータを見て判断。
○ターゲットはSDのみとする。(MMC非対応)
○当面、FATには対応しない。いわばHBI-55モード(笑)。
マシン語側の暫定仕様
○使用コマンドは、CMD0、ACMD41、CMD17、CMD24、CMD16。
○念のため、CMD16によりセクター長を512Bとする。(省略するかも。)
○/CSはプログラム側で負論理とする(74HC14を不要とする)。
不具合があれば、正論理に変更する(74HC14を加える)。
○エラーハンドリングは、CMDレスポンスのフォーマットR1のみ。
CMDレスポンス時のエラーは、1バイトをBUFFに書き込んでRETする。
書き込み実行時のエラーレスポンスは関知しない。(BASIC任せ)
○CMD17の読み込み前にBUFFを初期化する(例えば「00」で埋める)。
CMD24の書き込み時はBUFFの初期化を行わない。
BASICは、書き込みエラーをベリファイ時に知ることになる。
○SDの容量は関知しない。人間がSDカードの表示を見ろ。
○読み書きのセクタ・アドレスは、USR関数の引数の範囲となる。(注)
(注)CMD17及びCMD24の引数は4バイトある。
ただし1セクタ512Bなので、セクタごとの引数は次のようになる。
引数バイト 3 2 1 0
セクタ0:00 00 00 00
セクタ1:00 00 02 00
セクタ2:00 00 04 00
つまり引数バイト0は常に「00」である。
一方、USR関数で与えられる引数は2バイト整数である。
下位1バイトをセクタ引数1に、上位1バイトをセクタ引数2に割り当てる。
すると、引数バイト3も常に「00」である。
従って「00 FF FE 00」が、このプログラムにおける最大引数となる。
512Bを掛けると、アクセス可能な最大容量となる。いくらになるのかな?
考え違いしてたらごめんね。このへん、よく間違うの。
本質的なところは出来たも同然だ(爆)
あとはこれを実現する実質的な部分をコツコツと書くことになる。
その前に、PSGの初期化、SDカードの初期化、/CSの上げ下げやCLKの上げ下げ、CMDの発行とレスポンスの受け取り、読み取りデータの受け取り、不要CRCの読み捨て、ビジー待ち、ダミーCLKの挿入・・・などなど、細かな段取りをリストアップする必要がある。
PSGの8ピンを「H」にしたり「L」にしたり、なんていうシモジモの原始的ルーチンは、さらにその先にある。
ルーチンを積み上げて積み上げて積み上げてルーチンを作る。
どこかでルーチンがコケたら、「みなコケた〜」。
「MSXによるSDカードの読み書きをアセンブラで書く」。ささやかな機能しか実現しないくせに、予想外の大プロジェクトになりそうだなあ〜。
大丈夫か?>自分
※上記暫定仕様は、いつの間にか変更されているかも知れません。ご了承されたし。
|
過去の投稿日別表示
-
詳細
2014年12月08日
全1ページ
[1]
コメント(0)
全1ページ
[1]




