2003/12/9 EmuZ-5500の開発、ようやく始動。 開発対象はMZ-5500/6500/6550とします。 設計方針・基本構造は、既に実績のあるEmuZ-2500のものを踏襲します。 win32側のコードはほぼ全て流用して、仮想マシンから可能な限りwin32依存な コードを除外することを目標に。 という訳で、開発フォルダ内にsrc/vmを掘って早速コード作成開始。 まずはvmクラスを作成、read_io, write_ioの雛型を用意してやります。 この中に順次実装したクラスのio呼び出しを追加していくことに。 簡単なところでメモリ管理クラスから。 MZ-5500/6500の場合、$a0000-$bffffの128KBのエリアに漢字ROMや辞書ROMが バンク切り替えでマップされている以外は、原則メモリエリアは固定。 $f0000-$fffffの上位64KBについては、最上位16KBのみIPL-ROMでそれ以外は 予備ROMエリアになっていますが、面倒なのでひっくるめて64KB単位でバンクを 管理することにします。 uint8* bank_r[16], bank_w[16]を定義して、このポインタ配列に各メモリ配列の ポインタを入れてやります。例えば、漢字ROM領域はこんな感じで。 bank_r[0xa] = kanji1 + 0x00000; // 0xa0000 - 0xaffff bank_r[0xb] = kanji1 + 0x10000; // 0xb0000 - 0xbffff bank_w[0xa] = dummy_w; // 0xa0000 - 0xaffff bank_w[0xb] = dummy_w; // 0xb0000 - 0xbffff 実際のアクセスは、 bank_w[addr >> 16][addr & 0xffff] = data; return bank_r[addr >> 16][addr & 0xffff]; このように。bank_r, bank_wと読み書きでマップ用ポインタを分けているのは、 ROM領域にデータを書き込んでもROMの内容を破壊しないようにするためです。 バンク切り替えするときは、$230のI/Oの値に応じて、マップ用ポインタ配列を 適当に再設定してやるだけ。 基本的に、EmuZ-2500と全く同じ実装の仕方ですね。メモリマップはMZ-2500の方が 自由度高かったですけど。 お次、ポートA-C。主にディップスイッチの読み込みなど。 取り敢えずクラスを作って、ポート読み書き用の関数の定義だけ作成した ところでAM3:30。本日はここまで。糞して寝ます。 #本日のBGMはCAVE系シューティングのサントラ。 #ぐわんげ、怒首領蜂、エスプレイドからお気に入りを抜粋したもの。 #ぐわんげ3面の曲、やっぱええなあ。 2003/12/10 ポートA-Cの機能実装。 ポートA中のリセットボタンについては、押している間は値を維持する必要が あるっぽい。とは言えメニューからリセットを実行するような場合は、押し続ける という操作ができない。 そこで、リセット操作後は10フレームだけ押した状態を維持するようにする。 10フレームというのは特に根拠はない。