マイコン独立大作戦
CRT/VGAIF+KEYIF+SDCARDIFボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
昔はそれが普通のことだったのですが、安価なCRTディスプレイが生産中止となって久しい今日ではそれ
は叶わぬことと諦めていたのですが…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[総合第20回]
●完全独立型ZB3DOS(CP/M互換DOS)も完成です!
Windowsから独立するといいましてもWindowsから全く縁を切ってしまうというわけにはいきません。
ですから独立するためにどうしても必要なSDカードもFAT16でそのままWindows互換にせざるを得ませんでした。
そこでちょいと悩んでしまいましたのがCP/M互換DOSです。
Windows互換でかつCP/M互換なんて、それはちょっと無理なお話です。
CP/MはBIOSの部分でハードの制約から離れる仕組みにはなっていますけれど、限られた資源の中でそのようにするのはなかなかに困難です。
問題になりましたのは、セクタのサイズです。
CP/Mの1セクタは128バイトなのに対して、SDカードでのFAT16の1セクタはその4倍の512バイトです。
つまりCP/MはDISKのREAD/WRITEのためのバッファを128バイト単位で設けるのに対して、SDカードのREAD/WRITEのバッファは512バイト単位にする必要があります。
さらに困ったことには、CP/MではREAD/WRITEのときのバッファの数に特に制約を設けていないらしいというところでした。
CP/Mがあちこちを虫食い的に128バイト単位でREAD/WRITEすると考えた場合に、そのたびに512バイトのバッファを作っていったら、メモリがいくらあっても足りません。
実際のところそんな悠長な問題ではありませんでした。
そうでなくても貴重なF800〜FFCFの2KBをVRAMに占拠されてしまっています。
そこへもってきて最低でもディレクトリバッファとFATのためのバッファを各512バイトはどうしても必要です。
メモリマップを確認してみましたらCP/M互換DOSがワークエリアを含めるとEA00の前あたりまでを占めています。
F000〜F7FFはZB3BASICシステムのワークエリアですが、CP/M互換DOSはZB3BASICのBIOSともいうべき基本的なI/OルーチンをCALLしていますから、そのワークエリアはつぶすわけにはいきません。
結局のところ、CP/Mのための汎用データバッファはわずか512バイトしか確保できませんでした。
それじゃあいくらなんでも無理。
できません。
と片付けてしまったらそれでおしまいです。
できないと思うところをなんとかするのが工夫というもの。
まあちょっと効率は悪くなりますけれど、解決策をみつけました。
CP/M互換DOSが複数のデータバッファを設けて、同時並行処理的にREAD/WRITEを行ったとしても、それはあくまで言葉のあやで、1個のCPUがやっていることですから、同時には1つの処理しかやれません。
つまり。
CP/M互換DOSが同時に複数のファイルをOPENして異なるセクタの読み書きを並行して行なったとしても、ある1時点では1つのセクタに対してアクセスしているだけのはずです。
CP/M互換DOSがあるセクタの128バイトをREADまたはWRITEするときにSDカードシステムルーチンはその128バイトを含む512バイトをバッファに読み込みます。
次のタイミングでCP/M互換DOSが同じ512バイトの中の別の128バイトをREAD/WRITEしてくれればありがたいのですけれど、その保証はありません。
別の512バイトを読み込まなければならないときもあります。
それに全部対応しようとするから、無理ということになります。
上に書きましたように、ある時点を考えれば、そのときは1つのセクタだけにアクセスできればよいはずです。
データバッファとして使えるのは512バイトの1セクタ分しかありませんから、CP/M互換DOSがアクセスしてくるたびに前に読み込んだ512バイトは捨ててしまって、あらためて該当する512バイトをSDカードからバッファに読み込むことにしました。
READはそれでよいのですがWRITEはどうするか?
この場合も同じ方法でクリアできました。
WRITEの場合にも該当する128バイトを含む512バイトを一旦バッファに読み込みます。
そこで128バイト分のデータを書き換えたらそのままその512バイトをSDカードに書いてしまいます。
本来ならば512バイト単位で1度のREAD/WRITEで済むところを4回アクセスしなければなりませんし、WRITEの場合には先に読み出してから書き込まなければなりませんから都合8回のアクセスが必要になります。
ま、しかし限られたメモリの中で条件をクリアするためにはやむをえませんでしょう。
READについては問題なくできることを確認しましたが、実際に同時に複数のファイルをOPENしてREAD/WRITEをすることについては、まだこれからテストをして確認してみなければなりませんが、多分上の考え方でいけると思います。
何はともあれ、見事独立を果たしたZB3DOS(CP/M互換DOS)の画像をご覧ください。
まずは前回と同じZB3BASICから起動します。
ここではテストのためCP/M互換DOSはSZBDS1O.BINというファイル名でSDカードにセーブしてあります。
それをLDコマンドでCC00番地からロードします。
CP/M互換DOSのスタートアドレスはE200です。
JP E200[Enter]でZB3BASICからZB3DOS(CP/M互換DOS)に制御が渡されます。
A>の表示はZB3BASICではなくてCP/M互換DOSのプロンプト表示です。
同じDIRコマンドですが、A>の表示のところで使っているDIRはCP/M互換DOSのコマンドです。
仮想Aドライブのディレクトリが表示されています。
MBASICを起動しました。
そのあとSTARTREKをロードしました。
このあといよいよSTARTREKの始まりです。
USB接続型ではスタートレック号はゆっくりと進んでいきましたが、独立型の画面は超高速です。
速度が速過ぎて、ご覧の通りの写真になってしまいました。
ゲーム開始です。
3Dが当たり前の今のゲームから見たらなんとも単純な画面ですが、それでも20インチの大画面でのゲームは見ごたえがあります。
せっかくですからカラーでゲームの雰囲気を出してみました。
いかにも宇宙船の戦闘ゲームといった雰囲気が出ます。
こちらはちょっときれいな感じの画面になります。
これもきれいですね。
どの色もなかなかにきれいです。
[Ctrl]+[C]の入力でゲームが終了します。
MBASICのSYSTEMコマンドでCP/M互換DOSに戻ります。
CP/M互換DOSでZB3[Enter]と入力すると、ZB3BASICに戻ります。
CP/M互換DOSはスクリーンエディタではなくてラインエディタですから’a’は表示されませんが、ZB3BASICに戻ると画面右下に’a’が表示されてスクリーンエディタになります。
CRT/VGAIF+KEYIF+SDCARDIFボードの製作[総合第20回]
2017.3.1upload
前へ
次へ
ホームページトップへ戻る