「X68000エミュレータ開発って、そんなに難しいの?」

X68000 EMULATOR XM6の作者さんによるエミュレータ開発に関するツイートと関連ツイートをまとめました。
182
PI. @xm6_original

上記より、割り込みコントローラを筆頭とするイベントを極力忠実に再現し、可能な限り細かな仮想時間単位でスケジューリングすることが望ましい。XM6はこの認識に立ち、イベントの時間単位を500ns(2MHz)に設計している。→

2022-11-30 22:21:33
PI. @xm6_original

イベント時間単位をここまで小さくすると、次に発生すべきイベントを探索したり、そのイベントでオーバーしたMPUサイクル数を次に向けて辻褄あわせしたりといった処理が相当重くなってくる。「68000を10MHzクロックで駆動する」だけなら上限まで連続的に実行すればよく、大したホスト負荷ではない。→

2022-11-30 22:21:33
PI. @xm6_original

XM6はMPUの実行を僅かなサイクルで切り上げ、次のイベントを素早くスケジューリングする。さらに既に説明したグラフィックスのレンダリングを行ったり、FM音源の合成を行なうことで、X68000エミュレータはどんどん重くなる。しかし、それと引き換えに実機互換性は確実に高くなる。(完)

2022-11-30 22:21:33

PI. @xm6_original

X68000エミュレータその9。DMAC(HD63450)について。Inside X68000の記述はかなり詳しいが、私は偶然、日立が68000ファミリASSPを製品展開した時代に大口ユーザ向けに提供された分厚いマニュアルを借りる機会があり、DMACのユーザーズマニュアルを見ることができた。その成果はXM6に活かされている。→

2022-12-01 20:26:44
PI. @xm6_original

オートリクエスト限定速度モードの場合、DMACはX68000のメモリバス監視を定期的に行ってバスが空いているタイミングに転送を行うと記述されているが、この動作を真面目に実装すると大変な負荷になってしまう。ここはある程度、端折って実装するしかない。→

2022-12-01 20:26:44
PI. @xm6_original

幸いDMAC合計4チャネルのうち、FDD/HDD(SASIまたはSCSI)/ADPCMの3チャネル分は用途が固定されており、用途ごとの転送タイミングもそこそこ決まっているので、ユーザ用に解放された最後の1チャネルの転送を、現物あわせでチューニングしている。→

2022-12-01 20:26:45
PI. @xm6_original

つまり過剰にDMA転送を行うとMPUのサイクル数が減少し、結果的に誤動作するソフトが存在する。X68000(10MHz機)のバスは1つなので、DMA転送を行うときはMPUはメモリアクセスできない。つまり命令フェッチができなくなる。よってDMA転送量にあわせてMPUが実行可能なサイクル数を減らす必要が出てくる。→

2022-12-01 20:26:45
PI. @xm6_original

その8で述べたスケジューラにこの点を織り込み、DMA転送量+MPU転送量が一定になるのが理想となる。厳密にはMPUが乗除算命令などALU内で完結する重い命令を実行しているときはMPUとDMACの両方が動けるはずだが、そこまで再現しなくてもまず問題ない。(完)

2022-12-01 20:26:46
Makoto Kamada @kamadox

DMACの動作中にMPUが動きすぎると誤動作するソフトの例。Xellent30のch30inst.xはIOCS _DMAMOVEでch30.sysをSRAMへ転送開始してすぐにSRAMへの書き込みを禁止している。IOCS _DMAMODEで転送終了を待っていないのでDMACの動作中にMPUが動きすぎるインストールに失敗する。 twitter.com/xm6_original/s…

2022-12-02 22:47:03

PI. @xm6_original

X68000エミュレータその10。連載はいったん本日で終了し、まとめ。FDD遅延(その2)、SCSIバス(その4)、MFPの割り込み要求遅延(その7)、DMA転送時のMPU実行速度低下(その8)など、「なぜ、ここまでやるの?」という疑問をもった方がいるかもしれない。これはレトロPCエミュレータという特性が大きい。→

2022-12-02 22:40:24
PI. @xm6_original

8bit/16bit時代のゲーム機エミュレータの場合、ROMデータのCRCを算出してゲームタイトルを特定し、それ専用の対策ルーチンを適用する等、いわゆるハックと呼ばれる手段がある。これに対しレトロPCエミュレータはハックは基本的にできない。市販タイトルは一部に過ぎず、ソフトは無限に存在する。→

2022-12-02 22:40:24
PI. @xm6_original

特定のソフトが開発中のエミュレータでうまく動かず、エミュレーションを修正したところ、今度は他のソフト動作がおかしくなった、という「あちらを立てればこちらが立たず」という状態に陥ることは非常に多い。しかし実機では両方とも動作することは厳然たる事実である。→

2022-12-02 22:40:24
PI. @xm6_original

両方のソフトを解析し、「これなら両立するかも」という仮説を立て、テストプログラムを作成・実機で動かし、仮説が正しいかどうかを検証する。この「共通解を探す」プロセスが非常に多いのがレトロPCエミュレータの難しさになる。これより冒頭で述べた過剰とも言える再現が必要になってくる。→

2022-12-02 22:40:25
PI. @xm6_original

これを支える基礎が緻密なスケジューリングである。XM6は500nsを最小単位として設計しており、これにより当初の目論見を上回る実機互換性と豊富な機能を実現できた。しかし(その8)の通り他のエミュレータと比べてホスト負荷が高く、それにグラフィックスのレンダリングとFM音源合成が加わる。→

2022-12-02 22:40:25
PI. @xm6_original

エミュレータの動作は原理的にシングルスレッド性能が高い方がよく、マルチコア化はあまり向いていない。そういう意味で言うと「ホストCPUは十分なCPUパワーを持っている」と感じたのはCore2Duoの頃かもしれない。それより前はパレットの連続変化などでフレームレートの急激な低下が起きていた。→

2022-12-02 22:40:26
PI. @xm6_original

現在のx64プロセッサであれば全く問題ない。これに対しスマートデバイス向けARMプロセッサは一般論としてx64に及ばない。GIMONSさんの実験によればRP2(Cortex-A7)では実用にならず、RP3(Cortex-A53)なら最適化次第で何とかなりそうだという。ただこれも68000MPUコアをアセンブラ化した場合の話だ。(完)

2022-12-02 22:40:26

 
 
 
 

サムネ用

PI. @xm6_original

#X68000 #68の日 XM6ユーティリティversion2.06.02を公開しました。SCSIEXROM.DAT(SCSI拡張ボード互換ROM)について指定SCSI IDからの起動ができない不具合を15年振りに修正しました。画像は昨年からの使いまわしです。retropc.net/pi/ pic.twitter.com/USi2PlapzS

2022-06-08 22:10:49
拡大