2020年8月1日土曜日

自前Z80エミュレータのテスト完了

昨年作成したきり放置気味だった自作Z80エミュレータ(C++)でシステムテストを実施して完成させました。

システムテストは、別途ゲームギアのエミュレータを作成して実施しました。(なお、作成したゲームギアについては、現在進行系でゲームギア関連ビジネスが動いているようなので、念のため非公開にしておきます...既に完成度が高いエミュレータなら沢山ありますし)

Z80を搭載したゲーム機なんて沢山あるんじゃないかと思いきや、意外と少なくて、シングルコアで純正Z80を搭載しているのは、調べた限りではSG-1000、Sega MARK III、Sega Master System、Game Gearぐらいのようです。(ゲームボーイがZ80カスタムなので若干惜しい)

そして、その中で私がハードとソフトを唯一持っているのがGGだったので、GGエミュレータを作ることにしました。なお、GGのハード仕様については、以下の資料を読んで把握。
セガのハードは中々面白くて、初代SG-1000の中身はだいたいMSXと同じ構造です。
そして、SM3、SMS、GGはVDP(Video Display Processor)をゲーム向きの専用設計(モード4)に切り替えていますが、ハード構造的にはSG-1000と(ついでに、オセロマルチビジョンとも?)互換性を持たせられる設計になっているようです。

モード4のVDPはかなりシンプルな構造です。
16KBのRAM(VRAM)の中にパターンテーブル、ネームテーブル、OAM(Sprite Attribute)がある形。
ファミコンのハード仕様を理解していれば、容易に理解できると思います。
ファミコンと違ってネームテーブルがかなり扱いやすくなっていて、キャラクタパターン(1byte)と属性データ(1byte)のセット(2byte)で1セルを表現する形になっています。(ファミコンでゲームを作った事がある人なら分かると思いますが、かなりプログラムし易いメモリレイアウトになっています)

GGの場合、MSX相当(SG-1000相当)のモード実装は不要っぽかったので、2週間ぐらいで作れました。(途中4連休もあったので楽勝)
GG Dumperで手持ちのカセットからROMを吸い出して動作検証したところ、手持ちソフトの範囲では10割正常に動きました。(そんなに沢山持ってないのが悔やまれる...)

【動作確認したソフト】
・ベアナックル2
・GG忍
・ソニック・ザ・ヘッジホッグ2
・ドラゴンクリスタル
・デビリッシュ
・魔導物語1(PSG/PCMでちゃんと喋ります)
・魔導物語A
本体が通電不可能なので、今度ハードオフで見つけたら調達予定...
(ついでに検証ソフトも増やしたい)

私の自前Z80の場合、ほぼ実機相当のマシンサイクル単位(実は厳密には少し違うけど...)で同期実装が可能なので、エミュレータ開発者の誰もが苦労する同期実装周りで苦労することはありませんでした。GGの場合、LCDディスプレイ領域は160x144ピクセルですが、内部的には1フレーム342x262ピクセル(NTSC)で処理していて、4Hzにつき3ピクセル描画する形で同期すれば完璧な同期を実現できます。(CPUパワーはかなり消費しますが)

このテスト過程で発見したZ80側のバグがこのPull Requestでfixされています。

先日、このZ80エミュレータにゲームボーイのCPU(LR35902)のコンパチブルモードも実装したので、ゲームボーイのエミュレータも作ろうと思えば作れますね。(作るとは言っていない)

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...