さあ、考えよう


さて、物を作ったり、プログラムを書くときに、まず初めに何をしなければならないか?
そうです。何をするか考えることです。

目標は少しぐらい高いほうがやりがいがあります。
とはいっても、高すぎるのは問題です。
「EmuZ-2000の上でWindows2000を動かそう!」などはもってのほかです。

あと、EmuZ-2000を使って有効なものにしなければなりません。
「テキストエディタボードを作ろう!」とか「VisualC++に対抗してVirtualC++ボードを作ろう」
とか、最早何を言っているのか訳がわからないものも論外です。
最近、EmuZ-2000君が
「FFTって大変だよね。非力なCPUでは何が高速か!って感じだよね。
 そうだ、ボードはFFT演算ボードにしようよ!ハードアシストがあれば、非力なCPUでもいけるよ!
 ハミング・ハニング・ブラックマン窓掛けくらいは出来るようにしてさ!
 パワー算出も出来るようにしよう!Logとって・・いや、こうなったらDFTだ!DFTボードだ!!」
などと現在はまっている仕事を何とかしたいがために夢を見始めるのも禁止します。
しかも、あなたが期待しているのはH/Wであって、今作ろうとしているのはDLL(S/W)です。
大体EmuZ-2000でFFTやって何するのよ?

さて、何がいいものやら・・・

う〜ん、MZ-2000で欲しかったもの・・・
そういえばMZ-2500って、MZ-2200ユーザーだった私には夢のマシンでした。
結局買えませんでしたが・・・
Z80の6MHzで、メモリマッピングが出来るH/Wがあって、グラフィックメモリも大きくて、
いやぁ、凄いマシンでした。
線とか、円とか、描くって言うより出るって感じでしたね。
ハードウェアのアシストがあると、矢張り凄いなぁ。リードモディファイライト機構は斬新だったなぁ。

ん?これってどう?
スピードや、メモリなどはどうしようもないけど、グラフィックのアシストが出来るボードって?
これって良くないかな?
円とか線とか箱とか、リードモディファイライトとか・・・ATのVGAチックな機構にしようか?
よし!この線で設計して見よう。


設計書

じゃあ、欲しい機能を徒然なるままに書き連ねて見よう。
・円が描ける
・線が引ける
・箱が書ける
でも、これってテストモニタとぶつかりすぎだよね。
(大丈夫です。このボード用のテストモニタ作りますよ:EmuZ-2000)

・3プレーン同時に特定の場所に書き込める(RMW)
・3プレーン同時に特定の場所を読み込める(RMW)
・任意の大きさのビットマップを任意の場所に貼り付けれる
・ペイントが出来る
・ハードウェアスクロール(任意のページ)をサポート
・PCGも持っちゃう!
・テキスト文字をグラフィックに書いちゃう!
とまあ、こんな感じかな?
あとは、
・Suga様の作られた、MZ-1R13と連携しちゃう
ってのも良いかも。

これで、おなか一杯になるかな?

では次に、どうやってEmuZ-2000と連携を取るかを考えなければならないですね。
オーバーヘッドを出来る限り小さくしたいので、IOで大量のデータをやり取りするのは
是非とも避けたいので、大きくなりがちなパラメータはメモリ渡しにしましょう!

I/Oの設計は以下のようにしましょう。
ポートアドレス 読み込み動作 書き込み動作 備考
$08 × パラメータメモリアドレスLow
$09 × パラメータメモリアドレスHigh
$0A RMW(プレーン1)
$0B RMW(プレーン2)
$0C RMW(プレーン3)
$0D × RMW書き込みモード
$0E ボードステータス パラメータコマンド実行
$0F スクロールステータス スクロール実行

$08、$09は、EmuZ-2000のメインメモリの任意のアドレスを示すようにする。
ここに示したアドレスより、パラメータが格納されているものとしてボードは理解する。
パラメータを実行するためには、$0Eへライトアクセスすれば実行する。
コマンド実行中かどうかを調べるために、ボードステータスを読み込むと、
コマンド終了(受付可能)か実行中(ビジー)かを取得できる。
RMWとパラメータコマンド、RMWとスクロールは、完全非同期で実行できるようにする。
但し、パラメータコマンドとスクロールはいずれかの機能を実行中はキューに積まれて
待ち状態に入る。(EmuZ-2000へは制御が返される)

う〜ん、贅沢なボードだなぁ。

では、このポート割付で問題が無いか、机上シミュレートして見ましょう。
・RMWを使って任意の場所への書き込み
 1.メモリバンクを切り替えるため、$0Dへ書き込みモードを指定する
 2.$0A,$0B,$0Cへそれぞれプレーン1,2,3の書き込みデータを格納する
 3.V−RAMアドレス($C000-$FFFF)の任意のアドレスへメモリライトする。
   (書き込みデータには意味は無い)
 4.必要な分だけ「2.3.」を繰り返す
 5.メモリバンクを元に戻すため、$0Dをノーマルモードへ戻す

おぉぉぉ!なんか良さそうだぞ!
読み込む場合には、2を行わずに、3の部分を読み込みに変えれば良いだけだ。
グラフィックメモリのデータは、$0A,$0B、$0Cに入ってくると。
うん、いい感じだ。

次に、スクロールだな。
スクロールは、上位ニブル(4Bit)がコマンド、下位ニブルがプレーンを示すように
すればよいと思う。
コマンド Bit7 Bit6 Bit5 Bit4
上方向へスクロール

下方向へスクロール


プレーン Bit2 Bit1 Bit0

コマンドは、どれか一つを選び、プレーンはORを取り複合で指定できる。

おおおおおぉぉぉぉ!いいねいいね!良すぎて死にそう・・・

では次に、パラメータコマンド
メモリの何処にパラメータコマンドを格納しているかを$08、$09へ格納しておく必要がある。
で、パラメータコマンドには以下のようなものを搭載する。
コマンドの詳細設計は、近々まとめて公開するようにします。
コマンド 名称 機能
00h Graphic Clear 任意のグラフィックプレーンをクリアする
01h Graphic Fill 任意のグラフィックプレーンをFillする
02h Write Line 任意の色で線を引く
03h Write Line Pattern 任意の色で、任意のパターンラインを引く
04h Write Circle 任意の色で円を書く
05h Write Circle Pattern 任意の色で、任意のパターン円を書く
06h Write Box 任意の色で箱を書く
07h Write Box Fill 任意の色で、塗りつぶされた箱を書く
08h Clipping Area Set クリッピングエリアを設定する
09h Area Scrool 指定されたエリアをスクロールする
0ah Pattern Put モノクロパターンを描画する
0bh Pattern Put Color カラーパターンを描画する
0ch Set PCG data PCGをセットする
0dh Get PCG data セットされたPCGデータをGetする
0eh Print Text Graphic テキストを任意の色でグラフィックに描画する
0fh Print PCG PCGをグラフィック画面へ描画する
10h Check 1R13 1R13が有るかどうかを調べる
11h Check 1R12 1R12が有るかどうかを調べる
12h Print KANJI 1R13から漢字データを取得して、任意の色で描画する
13h Reserved 予約
14h Reserved 予約

うわ!こんなの作れるのかよ!ほんとに・・・

なんか凄い事になって来た・・・・止めたくなったよ(T_T)
矢張り、目標は高すぎると問題だ・・・・しかも有効かなぁ?