デゼニランドでつかまえてスマートフォン用の表示で見るデゼニランドでつかまえてこの広告は、90日以上更新していないブログに表示しています。FP-1100ごくごく一部で求められていたような気がしたので、FP-1100のサブCPU直接制御サンプルプログラムをまとめてみました。実記でもエミュレータでも動くように調整しました。ご自由にお使い、または参考にしてください。実際必要なのはSUBINIT以下になります。SUBINITをCALLしてください。SUBINITでは、画面を40字モードに切り替えた後、サブCPUのFF80h〜にプログラムを転送します。サブCPUのプログラムは後半のsubdata〜になります。サブ側のハックが成功すると、サブCPUはメインからの1byteを待ち続けます。1byteを受け取るとその値を下位8ビットとして&HFFxx番地にジャンプします。off(FFAEh・ポートBの内容をメインに送る(FFB5h・8バイトを連続で受け取り、(HL)に書き込み(FFC6hのルーチンを作ってあります。どれも読みやすさを優先したもので、まだまだ最適化できると思います。メモリもまだちょっと余裕あります。FPのキースキャンは「サブCPUの&HE400にラインNoを書き込んでから少し待つと、ポートBにスキャン結果が帰ってくる」ので、HLに&HE400をセットしてあげた後にラインNoを1バイト送信してあげて、さらにポートBの内容を受け取っています。FP-1100の基礎知識としてこちらのエントリ(http://d.hatena.ne.jp/tanzi/20150623/p2)も参考にしてください。更なる高速化への夢:・せっかくCPUが二つあるのに全くと言っていいほど並列化されていないので、いかに並列化させるかがポイント?・キャラクタ消去専用のルーチンを作っておけばちょっと並列化できる・メインからグラフィックデータを1バイトずつ送るとつきっきりなので並列化できない。VRAMアクセスでウェイトがかかるのがネックになりそうだが、CPUが並列で動く恩恵のほうが大きいのでは?・キーボード読み取りにも時間がかかっている。複数ラインの読み取りが必要な場合、もっと処理を考えないといけないような気がする。・複数のデータをやりとりする場合、一度同期すればあとはクロック数をみてサブとメインのタイミングを合わせるとこができそうだけど・・・エミュと実機で再現性が違ったりいろいろ問題もありそう。いえ、このまま使っても無印88のゲームくらいだったら動かせそうな予感。FP-1100>>>>>>>こちらにサンプルコードをまとめてみました。FP-1100は画面表示・キー入力・BEEP音その他の入出力関係がサブCPU側に切り離されていて、本来メインCPUからはBASICルーチンを介してしかアクセス出来ない。用意されたサブCPUとのやりとりルーチンは、送るパラメータの数によって4種類ある。Aregにコマンドコードを入れてコール。Aregにコマンドコード、Bregにパラメータを入れてコール。Aregにコマンドコード、BCregにパラメータを入れてコール。パラメータが三つ以上。Aregにコマンドコード、Bregにパラメータ個数、HLregにパラメータ先頭アドレスを入れてコール。コマンドコードは&H01〜&H33まで用意されていて、画面表示やキー入力などの入出力関係にマシン語からアクセスすることが出来る。結局BASICで使っているルーチンそのままなのでBASIC以上の表現は無理。これは初心者が使いやすいシステムではあるのだが、スピードがとてつもなく遅い上、各ルーチンのチューンも不可能でリアルタイムゲームには不向き。BASICルーチンからではリアルタイムキー入力は出来ないしBEEP音も決められた2種類の長さしか出せない。上記以外にも直接実行番地をコールしてBASICルーチンを利用する手段もある。サブCPUを直接制御する場合、最低限以下のものを覚えておけば事足りるかと。×さて、このサブとメインのやり取りだが、サブCPUはコマンドコードを元にテーブルを参照してそれぞれの処理先にジャンプするという仕組み。サブCPUはメモリ内のでたらめな数値を参照してジャンプしてしまう。大半は暴走してしまうのだが、偶然(?)にもジャンプ先がVRAM内を指すコマンドコードが存在する。いうことは、画面上にグラフィックとしてサブCPU用のコードを表示させておき、うまく処理をそこに移せばサブCPUを乗っ取ることが出来る。以上がFP-1100におけるサブCPU乗っ取りの大まかなストーリー。具体的な例として、&H6Bをコマンドコードとして送ると、サブCPUは&H3A60番地をコールする。44,10)のキャラクタ位置、青のVRAMに相当する。その位置にサブCPUプログラムを書き込んでおけばよい。60↑BASICによる単純なサブCPU乗っ取りの例。高速でBEEPのオンオフを繰り返すだけ。RETこんな感じである(BEEPのポートについては後述)。簡単な検証やユーティリティプログラムではVRAM上にプログラムを置きっぱなしにして毎回コールしても良いが、リアルタイムゲームに応用した過去の例を見るとサブCPUのワークエリアにプログラムを転送してそこで実行させるのが一般的だったようである。サブCPUのワークは&HFF80〜のみ。書き込むと&HFFになる)であり、さらに水平同期中にVRAMにアクセスがあると次の水平同期までWAITがかかる。1byte書き込むのに約64μSecかかる。ちなみに並び方もキャラクタ単位に8byte縦に並んで次は横に移るという、ちょっと変則的な並び。フリーエリアサブCPUはμPD7801G。こちらのリンク(http://www.st.rim.or.jp/~nkomatsu/nec/uPD7807.html)はuPD7807に関するものだが、これは7801の上位互換なので参考になる。こちらのリンク(http://www.disgruntleddesigner.com/chrisc/GamePokekon/files/uPD78c06_Instruction_Set.txt)はインスタラクションセット。8bitプログラムの経験者なら上の2つの資料で問題なくコードのほうは書けるだろう。メイン<>サブのやりとりポートは以下の通り。メインCPUポート&HFFC0にwriteしたデータがセットされる。書き込むとメンCPUの&HFF80からreadできる。サブCPUの&HE800へ。サブCPUの&HE800の内容がセットされる。ON↑これでサブCPUに割り込み信号を送る。FPユーザーのバイブル100%活用法によれば、INTSは4μs以上1にしてから0に戻さねば上手く割り込みがかからないことがあるとのこと。4μsはメインCPUの16クロックサイクル相当。OFFこんな感じでちゃんと動いているようなのでよくわからない。LOOPこんな感じで割り込み信号を待てばよい。結局、グラフィックを表示させようとすればメインCPUから1byteづつデータを送ってあげるしかない。(少なくとも当時雑誌に発表されたものはそうしていた)そのたびにメインとサブはREADYフラグを立てたりコマンド待ちをしたりしなくてはならず、さらにVRAM書き込み時のWAITもあるため思ったようにスピードは出せない。それでもサブCPUを乗っ取ったゲームプログラムはそうでないものに比べて格段に速かった。ちなみにFPは完全なグラフィックマシン。テキストRAMは持っていなくてすべてグラフィック画面に描かれる。FM-7と同じような構成。BASIC上から見るとPCGがあるように見えるが、これは単にVRAMに送る文字データを書き換えてるだけ。PCG搭載機種でよく使われていたキャラパターン書き換えを使った擬似スクロールなどのテクニックは使えない。ちなみにメイン側&H9000〜のテキストRAMっぽく見える通称キャラクタバッファも単なる仮想テキストRAM。■キーボードサブCPU、&HE400の下位4ビットにラインNoを書き込んでから少し待つと、ポートBにKI1~KI8のビットがセットされる。KIが反転信号なのに注意。いうのがどのくらいなのかは未検証。&HE400の6bit目がキーボード読み込み許可。以下、キーボードマトリクス。BREAKまた、通常時サブCPUはキーボードスキャンで割り込みがかかっているため、スピードダウンしている。サブCPUを乗っ取る場合、まずDIで割り込みを禁止するのがセオリー?■BEEP音サブCPU、&HE400の5bit目でBEEPのオンオフ。NO以上、FP-1100でのサブCPU乗っ取りに関する情報をまとめてみたがひとつ問題が。FP-1100エミュレータのeFP-1100、とても良い出来で重宝しているのだが、サブCPUを乗っ取ったプログラムで動かないものがいくつかあるようだ(2015.6.23現在)。動くプログラムもあり、どこ原因がちょっと究明できていないためなんとも言えないのだが。こんな複雑な構成のコンピュータをクロックタイミングまでバッチリ実機に合わせるのは相当大変だと思うので、どこかでサブとメインのタイミングがずれているんだとは思うけど。エミュレータでもちゃんと動く汎用の入出力ルーチンを制作中なので、次回はソースコードつきでそれを解説できたらいいな。MZ-80Bこちらのページを参考にMZ-80Bのライン入出力ユニットを作ってみた。用途としては外部のデータレコーダを使うというよりはiPhoneを直接繋いでPCとデータをやりとりするのが主になると思ったので、コネクタはiPhoneの4極3.5mmプラグがそのまま刺さるようにした。8255の足を乗っ取っる形での実装なので、8255自体を交換すれば元に戻る、本体を傷つけない改造だ。装着時、本体カセットデッキの再生&録音は切り離されるが、モーター等は繋がっているのでダミーのテープを入れておけばイジェクトや巻き戻しのギミックもちゃんと楽しめる。規模は小さいけどICの足を折るので緊張する。あと4極の配線が面倒。本体に取り付けたところ。白く見えるICが8255。背面の拡張スロット部分からジャックを出しているがちゃんとマウントしたいところ。無事iPhoneからデータを読み込めました。MZ-80Bと2000はオプションのGRAMが無いと非常にショボショボで市販ゲームや雑誌掲載プログラムもほとんど動かない上、モニタとカセットデッキがどうしても故障しがち。売れた機種なので中古市場に数はあるがまともなコンディション(しかもGRAM付き)となると探すのはけっこう難しい。この改造でとりあえずカセットデッキの問題はなんとかなるので、実機に興味のある人の選択肢が広がればなぁと思う。FP-1100FP-1100はマイファーストマイコン。当時理解しきれなかったサブCPUの直接制御関連を今こそマスターしたい。