最近、週末に PC-8001 でプログラムしていて、一部マシン語にしようとZ80を触っていたら、Z80沼にはまってしまい、興味の対象が MZ-80K2のエミュレーションに移ってしまいました (笑) 。
興味が移ってしまったものは仕方ないということで、約1年ぶりに プロジェクトを開いて、自分で書いたコードのおさらい。(ほぼ記憶喪失なので)
実行させながら、挙動を確認。ようやく全貌を思い出しました。
前回までのおさらい
・Z80のすべての機能を実装 、未定義命令も含めて実装したつもり。。
・MZ-80のVRAM領域をできるだけ高速に描画できるように試行錯誤、満足まではいかないがとりあえず使えそうなレベルにしあげて、とはいえリフレッシュレート 60Hz は結構きつい。
・CGROMの読み込み
・モニタROM を 00000H~00FFFH にロード
・とりあえず、タイマーで 1ms間隔 で Z80 の命令を実行
・モニタROM を実行して、タイトル表示、入力待ちになるまでを確認。
今回やったこと
・z80の実行を別スレッド化して、Z80のマシンサイクルも考慮して実行できるようにした
・レジスタの内容をビジュアルに表示できるようにした。
問題発生
2MHz までスピードがあげられない!! という大きな問題に直面中。
Z-80 だけ実行 —> 1.2MHz
Z-80 + VRAM描画 —> 0.8MHz
Z-80 + VRAM描画 + レジスタな内容表示 —> 0.6MHz
Corei7のマシンで、2MHzのマシンエミュレーションができないのは問題ですね。
まずは何としても Z-80実行で 4MHz程度、VRAM描画して 3MHz 程度は出せるようにしたいですね。。そうしないとエミュレーションスピードの選択メニューに 1.5倍、2倍、Full とか表示できないよ~。
Delphi で開発しているので、描画部分はちょっと高速化が難しいところありますが、Z80の実行は余裕で 10MHz くらい出したい!
Delphi は一部アセンブラで記述もできるけど、そうすると Android で動かないプログラムになっちゃうんだよね。しかもDelphi のコンパイラが吐き出すマシン語に勝てる気がしない (笑)。
1980年に購入した、40年来の愛機 MZ-80K2。。カセットデッキのプーリーのゴムを交換したりヘッドを綺麗にして使えるようになっていますが、ちょっとキー入力に難ありなので、接点復活剤でもためそうかな。。
目標は、MZ-80至上最高のゲームプログラムを作成すること。
メモリ48KB、CPU Z80 2MHz 、キャラグラのみという厳しい制約の中でどこまでできるのか。
なぜ MZ-80K2 のエミュレーターを作成しているのかという、純粋にエミュレーターを作りたいというのもありますが、MZ-80K2 実機でコーディングするのはさすがに骨が折れるので、現代的に上下スクロールできるエディタを使ってコーディングしてZ80アセンブラでコンパイルして実機で読み込むということがしたいだけです。
しかし、MZ-80の場合は、カセットデッキ内蔵なので、読み込みに問題があるのですが、 MZ-700も所有していので、MZ-700のRS232C通信でマシン語を書き込んで、いったんMZ-700でカセットにSAVE してから、MZ-80でLOADかなと思っています。
もしくはエミュレータで動作確認した、16進数のダンプリストを印刷して、マシン語の打ち込みかな?
打ち込みはもちろん RaspberryPi を使って、OCRして、ロボットハンドをコントロールして打ち込みかな。 (ローテクとハイテクの融合) 24時間ダンプリスト打ち込みロボ!!
当然ロボットハンドは、Solidworks で設計して、3Dプリントして、小型のサーボ組み込んで。。。
夢はふくらむ。