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

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

最近「X68000エミュレータ開発って、そんなに難しいの?」という声を聞くので解説。1987年の初代機発売(36.9万円)の時点で、シャープのカスタムは勿論、当時のLSIを「これでもか」と沢山詰め込んでいるのでそのソフトウェアモデル実装だけでかなりの量になる→

2022-11-18 18:03:50
PI. @xm6_original

一例を挙げるとSCC(Z8530)のマニュアルは現在も入手可能で英文394ページのボリューム。このようなものを10種類以上実装するものと考えて欲しい(もちろん簡易実装で済ませることはできるが、当然実機との差異は出る)→ zilog.com/docs/serial/sc…

2022-11-18 18:03:50
PI. @xm6_original

難物とされるCRTCやFDCなどは「未公開仕様の挙動」「未定義動作の挙動」も考えないとダメ。あとは数値の厳密性とか。例えばFDCに指定するステップレートは当該マニュアルでは1ms単位で指定するかのように書いてあるが、実際は1.024ms単位となっている(過去に実測した)以上。

2022-11-18 18:03:51
Studio_NAND @Studio_NAND

@xm6_original FDCのレジスタに読み書きする値を忠実に再現しても、実機とは違うのであんま意味ない気がするのだが? X68は知らんけど、昔のソフトはコピープロテクトのため、インデックスホールが2個開いた5インチディスクとか、変則フォーマット(同一トラック内にセクタ長が違うセクタがある)とかあった。

2022-11-18 20:16:05
PI. @xm6_original

@Studio_NAND ターゲットソフトがFDCレジスタの読み込みを行う前提で、実機とエミュレーターで返す値がそれぞれ異なった時、ターゲットソフトの作りによっては想定外の値を受けることで無限ループなど、異常動作を引き起こすことが考えられます。実機でも有り得る値を返すことが重要です。

2022-11-18 21:28:08
Studio_NAND @Studio_NAND

@xm6_original FDDのシークはフィードバックなしの完全なオープン制御で、ステップレートは接続するFDDが脱調しない速度に決めます。 FDCはFDDのTRK00信号でトラックカウンタをリセットし、あとはシークコマンドのシーク先トラック番号と現在のトラックカウンタを大小比較で、DIR信号(UP/DN方向)が決まります。

2022-11-19 14:04:38
Studio_NAND @Studio_NAND

@xm6_original その後、ステップレートで指定された間隔でSTEPパルスが出力され、同時にFDC内のトラックカウンタを増減します。 エミューレートといっても、FDC自体がなかったり実際のFDDが繋がってないと全く関係ないです。

2022-11-19 14:05:57
PI. @xm6_original

@Studio_NAND 仰る通りで、XM6ではFDCのSEEKコマンドが発行された時点でステップレートに基づく所要時間を算出し、そのタイミングで、仮想FDCがSEEK完了を示す割り込みを仮想CPUに対して発行します。これによりSEEK待ち時間の間にCPUが実行可能な命令サイクル数も、かなり実機に近づけることができます。 けます。

2022-11-19 16:22:57
PI. @xm6_original

X68000のエミュレーションといっても色々なレベルがあります。ADPCM再生を例にとると、WinX68k系はホスト側のサウンドバッファ要求時にDMA転送を繰り返す動作で、これは比較的軽いです。しかし本来の15.6kHz再生は128us間隔で1ByteずつDMA転送させるもので、XM6はこの実装です。当然重くなります。 twitter.com/TransAmGTA92/s…

2022-11-23 22:10:43
EXCEED. @TransAmGTA92

そういや、#X68000Z に使われるであろうSoCについての情報が一切無い訳だが(ARM なのはほぼ間違いないだろうけど)どのくらいのスペックのものなのだろう?あのガワからすると、あまり発熱するものは採用できないような気もするが、かといってX68Kのエミュレーションにはそれなりのパワーが無いと…

2022-11-23 03:49:03

PI. @xm6_original

X68000エミュレータその2。フロッピー読み込みの話題。最も手抜きするならIOCS $46を横取りしてMPUレジスタで示されたメモリに書けばOK。WinX68k系はもう少し本格的で、FDCへRead Dataコマンドが発行されたら瞬時にER-PHASEが始まり、あとはMPUの200サイクル毎にDMA転送する。→

2022-11-24 20:32:59
PI. @xm6_original

これはソフト互換性は成立しているが実機と比べて速すぎるアクセスになる。有名どころだと「ファランクス」のオープニングは楽曲演奏よりかなり速く終わる。しかし実機と同じ程度に(=正確に)アクセスを遅くするのは容易ではない。この点はXM6の大きな開発目標だった。→

2022-11-24 20:32:59
PI. @xm6_original

(1)FDDの回転数(360rpm)を考慮して、現在の回転位置が目的のセクタを行き過ぎたときは次の回転まで待たせる (2)DMAの転送要求を16us/Byteで行う (3)X68000はFDDのFDD内部のLSIで行っていると思われる。実測の結果、約54秒間アクセスがないとモータが止まり、次のアクセス時に余計に時間がかかる。→

2022-11-24 20:33:00
PI. @xm6_original

XM6は(1)(2)(3)をすべて実装しており、これによって、かなり実機に近いアクセス速度になる。しかしエミュレータの負荷が上がる一方なのは言うまでもない(完)

2022-11-24 20:33:00

PI. @xm6_original

X68000エミュレータその3、FM音源の合成について。WinX68k系はホストのサウンドバッファに空きが出来たタイミングでfmgenを駆動しており、この方式はエミュレータの負荷が最も低い。ただし高速なテンポやLFO(ビブラート)でのジッタは避けられず、人間の耳は意外とこの辺りに敏感で不快に感じやすい。→

2022-11-25 19:30:13
PI. @xm6_original

ヤマハFM音源はキーオン(又はオフ)後にレジスタを触ることで音色変化ができる。例えば「タイトー リリースカット」と呼ばれるテクニックがある。これらを再現するためXM6はレジスタ書き込み毎にFM音源合成を行っている。仮にホストが44.1k再生の場合、前回レジスタ書き込みから今回の書き込みまでの→

2022-11-25 19:30:14
PI. @xm6_original

仮想時間が22.7us以上空いていれば、その間隔に対応したサンプル数を生成する。この方式はレジスタ書き込み毎に仮想時間からサンプル数を算出するため極めて重い。このように44.1kHzに再生するデータをリングバッファに格納しても、ホストの再生クロックは厳密に44.1kにならないので、必ずバッファが→

2022-11-25 19:30:14
PI. @xm6_original

オーバーランまたはアンダーランする。このためオーバー/アンダー具合によって、44.1kHzではなくその前後、例えば44.0kHzや44.2kHzなどにリアルタイムに微調整する。このようにして「非常に重いが極めて時間的再現度の高い」XM6のFM音源出力エミュレーションが完成する。(完)

2022-11-25 19:30:15
LinearDrive @LDrive

PC88のYsやソーサリアンの曲では、音色切り替え時に休符が挟まっていると、休符の前に音色設定する箇所があちこち存在する。 休符の後(音符の直前)でないと、変なリリース音が出るのではと思っていた。 しかし処理をよく見ると、音色書き込み直前に必ずキーオフとリリースカットをしていた。(続く)

2022-11-27 14:12:28
LinearDrive @LDrive

仮想FM音源では時間ゼロでリリースカットも音色設定も終わってしまうので、休符で変なリリース音に見舞われていた。 よく考えてみると、FM音源実機では、リリースカット後の音色書き込み中に波形生成が進んで、リリースカットによる消音が進み、休符突入時には消音状態に近い結果になるようだ(続く)

2022-11-27 14:20:20
LinearDrive @LDrive

つまり、休符の前に音色設定を書くのは、意図的に、休符突入時に消音させたい書き方と解釈するべきなのかもしれない。(了)

2022-11-27 14:23:11
後藤 浩昭 / GORRY @gorry5

X68Soundという(EX68で使われた)OPMエミュ、レジスタへの書き込みを一度バッファリングし、「書き込みウェイト」を考慮しながら取り出して発音生成している。OPMのADSRレートの最大値は、「音色1つ分を書き込むくらいの期間で変化が十分進む」ので、この処理をしないと再現できない音が存在する twitter.com/LDrive/status/…

2022-11-27 15:58:29
後藤 浩昭 / GORRY @gorry5

MML的にいうと、@1に普通の音色、@2にRR最大の音色を入れて、「Q8@1c4@2@1d4」と書くことで「c4を鳴らした@1の音色のリリースがどれほど遅くても、リリースが十分効いた状態でd4が発音される」ことを期待したものがあった…ということ

2022-11-27 16:11:40