2024年2月12日月曜日

MAMEでYAMAHA TX81Zをエミュレートする方法

 MAMEでYAMAHA TX81Zをエミュレートする方法

この記事の内容を鵜呑みにし、事故や損失を招いた場合でも当方は一切の責任は負いかねます。自己責任でお願いします。特にシステムROMは、必ず自身が所有するTX81Zから吸い出して使用してください。


アーケードシミュレータとして有名なMAMEでYAMAHAのFM音源モジュールTX81Zがエミュレートできるようなので試してみました。
主に自分用のメモなので、この記事のわかりやすさは2の次として書いています。

今回使用したMAMEのバージョンは0.262です。




➀システムROMとLCD用のバイナリファイルを用意する


MAMEはTZ81Zの回路を忠実に再現します。CPUやFM音源LSI(YM2141)はもちろん、
74シリーズをはじめとするロジックICのシミュレートも行っています。一種の回路シミュレータみたいなものでしょう。
この回路情報は、有志の方がとても頑張ってプログラム化してMAME内に組み込んでいます。
しかし、システムROMをはじめとする著作権が絡む回路やプログラム、バイナリデータは
組み込まれていません。

なので、MAMEでTZ81Zをエミュレートするためには、システムROMを入手する必要があります。TZ81Zを分解してROMの吸い出しを行えばいいということです。
この部分はかなり難易度が高く、TX81Zを入手することから始め、ROMのはんだ取り、吸出し器の入手や作成をしなければいけません。TX81Zのバージョンによっては、システムROMがソケットに取り付けられています。当方が入手したTZ81Zは基板にはんだ付けされていました。

自作の吸出し器によるシステムROMの吸出しの様子


システムROMは27512相当の512kbit (64k * 8bit)のものが使われています。
吸出したファイルは生のバイナリファイルにする必要があります。ファイルサイズは必ず64kB(65536バイト)になるはずです。
めでたくROMを吸出せたら、チェックサム(CRC32)とSHA1の値をチェックします。

MAME内にはあらかじめ、このCRC32とSHA1が記録されており、
吸出しミスなどを防ぐ仕組みがあります。
吸い出したROMのCRC32とSHA1と一致しない場合、正常に動作しないためチェックする必要があります。
チェックには"HashMyFile"というソフトを使用します。吸い出したROMをこのソフトで開くと、CRC32とSHA1が表示されます。
MAME側のCRC32とSHA1は、MAMEのソースファイル(https://github.com/mamedev/mame)内にあるsrc/mame/yamaha/ymtx81z.cppに記述されています。

「ROMX_LOAD」で始まる部分に、システムROMのバージョンとその対応するCRC32(CRCと書いてある括弧内)とSHA1が記述されているので比較してください。
もしashMyFileで見た値と異なる場合は、吸出しミスか対応していないバージョンのROMです。

一致する項目を見つけたら、吸い出したシステムROMのファイル名を「ROMX_LOAD」内の最初の""で囲まれたファイル名に変更します。

"tx81z-v1.6.ic15"
"tx81z-27512-image-version-1_5.ic15"
"tx81z-v1.4.ic15"
"tx81z-v1.3.ic15"
"tx81z-v1.2.ic15"
"tx81z-v1.1.ic15"
"tx81z-27512-image-first-version-1_0.ic15"
以上のいづれかのファイル名になると思います。拡張子は".ic15"です。

今回、当方が入手したTX81ZのしすてむROMバージョンはV1.5でしたので、ROMイメージ名は"tx81z-27512-image-version-1_5.ic15"となりました。



次に、LCD用のbinファイルを入手します。これはLCDのフォントデータで、TX81ZのLCDをエミュレートするのに必要なファイルとなります。
こちらはROMではないので、アップロードサイトでダウンロードします。
hd44780_a00.binをどこからか見つけてあげればよいのですが、こちらは様々な方が作成しているのか複数の種類があります。厄介なことにこのファイルもMAMEはCRC32とSHA1のチェックをしていて、異なるCRC32とSHA1の場合起動できません。
なので、CRC32とSHA1が合うhd44780_a00.binを根気よく探す必要があります。
特にMAMEのバージョンによって合うhd44780_a00.binが違う場合があるようです。

今回はMAME0.262用のhd44780_a00.binを用意します。
上記サイトで、MAME0.262用の「h44780.zip」をダウンロードします。
ダウンロードしたzipファイルの中にhd44780_a00.binが入っています。


MAME側のhd44780_a00.binのCRC32とSHA1は、MAMEのソースファイル(https://github.com/mamedev/mame)内にあるsrc/devices/video/hd44780.cppに記述されています。
CRC32とSHA1が一致しているか確かめましょう。


さて、ここまでで2つのファイルが入手出来ました。
tx81z-27512-image-first-version-1_0.ic15
hd44780_a00.bin

この2つをzipファイルにします。
エクスプローラー上で上記2つのファイルを選択して「送る(N)」→「圧縮(zip形式)フォルダー」を選択します。
出来上がったzipファイル名は「tx81z.zip」に変更します。ちなみに、エクスプローラーの表示オプションで「登録された拡張子を表示しない」のチェックを外さないと.zipが2重で記述されてしまうので注意してください。


➁MAMEでTX81Zをエミュレートする


この出来上がった「tx81z.zip」をMAME.exeの同ディレクトリの「roms」フォルダーに入れてあげるとエミュレートできるはずです。が、実際はそう甘くはありませんでした。
実はMAME側は、別のバージョンのTX81ZのシステムROMも必要とします。
厳密には、1つのバージョン用のシステムROMしか使用しないのですが、別のバージョンのシステムROMも無いとファイル不足と判定されて実行できなくなります。
(本当は当方の技量が足りなく、なんとかできるのかもしれませんが…)

バージョンの異なるTX81Zを複数台入手しろという無茶な要求をしてくるので、このままでは困ります。
そこで、MAMEのソースファイルの一部を書き換えて1つのバージョンのみ実行できるようにします。

具体的には対象のバージョンのROM以外のROMの読み込みをする部分のプログラムを削ります。



➀MAMEのソースコードをダウンロードして編集
からMAMEのソースをダウンロードします。
緑色の「<>code」をクリックして「download ZIP」をクリックします。
ダウンロードが完了したら適当な場所に解凍してsrc/mame/yamaha/ymtx81z.cppをコードエディタ(メモ帳でも可)で開きます。

プログラムの後尾の方に
ROMX_LOAD~と記述されている部分があるので、吸い出したシステムROM以外のバージョンの「ROM_SYSTEM_BIOS~」と「ROMX_LOAD~」の行を削除します。
合計で12行削除することとなります。
その後、上書き保存してコードエディタを閉じます。




➁コンパイラ&ビルドツールをダウンロード
からMAME用のビルドツールをダウンロードします。
「msys64-2022-01-12.exe」をクリックしてダウンロードします。
ダウンロードしたmsys64-2022-01-12.exeをダウンロードフォルダ以外の適当な場所(先ほどダウンロードしたMAMEのソースコードとは別の場所)に移動させて実行します。
7zip解凍ウィザードが表示されるので、任意の場所(先ほどダウンロードしたMAMEのソースコードとは別の場所)にコンパイラ&ビルドツールを展開します。

「➀MAMEのソースコードをダウンロードして編集」で用意したファイルを先ほど展開したファイル群の中にある「src」ディレクトリにすべて移動させます。

次に、解凍先の中にある「autorebase.bat」を実行します。
その後、同ディレクトリの「win32env.bat」を実行し、「make」と打ち込んでエンターキーを押します。
すると、コンパイルとビルドが始まるので、完了するまで、数時間待ちます。
当方のしょぼいパソコンの環境では6時間ほどかかりました。

「src」フォルダの中にmame.exeが作成されているはずです。
同ディレクトリの「roms」にtx81z.zipを入れてmame.exeを実行し、TX81Zがエミュレーションできるのを確認しましょう。

実行できるのを確認したら今度は、エミュレートされたTX81ZにMIDIを入力をしてみます。



➂エミュレートされたTX81ZにMIDI入力してみる。



パソコン内のDTMソフトからエミュTX81ZへMIDIを入力する場合、仮想MIDIケーブルソフトを使用します。
今回は「loopMIDI」というソフトを使用しました。

「loopMIDI」の設定で、任意のMIDIポート名を作成(今回は「mameMIDI」とする)します。
これで、仮想MIDIケーブルの設定は完了です。


次にMAME側の設定をします。
まず、MAMEのTX81Zの設定ファイルを作成するために一度、MAMEを実行します。日本語化した後、メインメニュー画面で「TX81Z FM Tone Generator」の項目を右クリックして「システム設定を保存」をダブルクリックします。

MAMEを終了すると、mame.exeと同じディレクトリに「tx81z.ini」というファイルが生成されます。

「tx81z.ini」を開き、一行追加して
midiin   mameMIDI
と記述して上書き保存します。TX81Zの設定のダンプをしたい時などで使うTX81ZからのMIDI出力の場合は、
midiout   ”loppMIDIで決めた別の名前”
の行を追記してあげます。

あとは、MAMEでTX81Zを実行するだけです。
DTMソフトなどでMIDI出力先ポートに「mameMIDI」を指定してCH1でノート送信すると発音するはずです。


ちなみに、フルスクリーンモードを解除して実行したい場合、mame.exeと同じディレクトリにある「mame.ini」内の
window   0 
window   1
にします。
※「mame.ini」は、MAMEの「共通設定」で「設定を保存する」を押すと生成されます。



・まとめ


MAMEのTX81Zの発音の再現性(YM2141 OPZのエミュレート)はまだ完全ではないらしいですが、かなり実用的だと思います。

また、実機のエミュレーションなので、MAMEをデバッグモードで実行してレジスタ表示をさせれば、YM2141の解析などで役に立ちそうです。

エミュレーションまで少々手間がかかりますが、実機に限りなく近いエミュレーションができるのでおすすめです。




































0 件のコメント:

コメントを投稿