------------------------------------------------------------------------------ X680x0 EMULATOR XM6 TypeG (version 3.21 L31) Unofficial and experimental release By GIMONS ------------------------------------------------------------------------------ □はじめに このアーカイブはPI.氏作成のXM6(version 2.05)を改造して既存バグの修正、 エミュレーション精度の向上、デバイスの追加、グラフィック、サウンド関係 の機能強化を行ったものです。 X68030対応についてはisakiさん作のxm6iからPMMU・FPUエミュレーションを マージさせていただきました。 またcoさん作のXM6改から最新のWindrvXMホスト機能や各種インプットデバイス の処理改善コードを提供していただきました。 このドキュメントはオリジナルのXM6.txtに説明してある内容に対してTypeG固有 の内容のみ記述しています。オリジナルのドキュメントを合わせて参照ください。 2015年春に念願だったPI.氏にお会いすることができソースコードを含めて フィードバックさせていただきました。 □動作環境 以下の動作環境で動作します。 (1)プロセッサ x86,x86-64プロセッサで動作します。 MMX拡張セットやCMOV命令は使用していません。 (2)OS WindowsVista以降の32/64ビットモードで動作します。 配布物の中にそれぞれの実行ファイルがあります。 作者が動作確認しているのは下記のOSになります。 Windows7 Professional 32ビット版 Windows7 Professional 64ビット版 (3)DirectX DirectX9を使用しています。 具体的にはその内部コンポーネントのDirectSound(サウンド)、DirectInput (入力デバイス)、DirectGraphics(グラフィックス)を使っています。恐らく 特別なランタイムのインストールは必要ないでしょう。 (4)ランタイムライブラリ ATL/MFC/Visual C++ランタイムライブラリ(UNICODE版)を使います。 再頒布パッケージ用のDLLを同梱してあります。 □機能強化ポイント (1)グラフィック関係 下記のある最終的に表示に関する各コンポーネントを強化しました。 ・CRTC 時分割処理の精度をラスター単位の処理に加えブロック単位(16ドット)も 選択できるようにしました。768x512で256色をサポートするグラフィック ローダ等が動作します。 これは走査線の中央で256色2面を切り替える処理のためラスター一括で 合成するエミュレータでは実現できない機能です。 ラスター割り込みタイミングの変更、グラフィック高速クリアやラスター コピーの動作を修正しました。インタレース処理も仕様上はサポートして いますが再現性に関しては未確認です。 またXVI Compact以降(XVI Compact,X68030,X68030 Compact)に追加された VGA表示用の50MHzOSCを換装するオプションを追加しました。 ・GVRAM グラフィック高速クリア処理を修正しました。 ・SPRITE BGスクロールの1ラスター遅延やスプライトの3ラスター遅延反映を実装 しました。各種シューティングゲームや「ぷよぷよ」などでその効果が 分かります。 その他にスクロールレジスタ等へのワードアクセスの挙動や未定義ビット の更新を修正しました。 未定義ビットは何らかの隠し機能があるかもしれませんが未確認です。 ・VC テキストパレットのバイトアクセスの挙動やvr1h,vr2hに対する遅延反映 処理を実装してあります。 ・RENDER 以下に示す特殊モードに対応しました。但し実機調査で判明した分だけで あり正しい動作であるかはよく分かりません。かなり特殊な使い方をする アプリでもほとんど問題になることはなくなりました。 @半透明モード A特殊プライオリティモード Bグラフィックのプレーン別スクロール(32色4面モードなど) Cスプライトコントローラのタイミングレジスタ特殊設定(推奨値以外) Dその他、データブック記載以外の使い方 ・CZ-6XXDエミュレーション CRTCの各種タイミング設定に対するCZ-6XXDの動作特性を独自に調査して 表示上のアスペクト比が実機と同様になるようにしています。またバック ポーチやフロントポーチのタイミングもサポートしており特殊な画面演出 をしたアプリでもほぼ正常に再現できます。 アスペクト比の再現においてはDirectGraphicsを利用してスムースな拡大 縮小を行いながらホストPCの負荷を下げています。その他0.5/1.5/1.8/2.0/ 3.0/4.0倍等の拡大縮小も可能です。 その他次のようなオプション機構があります。 @線形補間のon/off A15,24,31kHzそれぞれの水平表示位置、水平表示幅調整 BPCの垂直同期周波数でCRTCを駆動しTypeGのVSYNCを同期させる機能 C1024x848等の超高解像度モードにおいてドットバイドット表示する機能 (2)サウンド関係 ・サウンドエンジン XM6ではFM音源のエミュレーションに実績あるfmgenを使用しています。 加えてTypeGではx68ksound.dll由来のエンジンを内部に組み込んであります。 更にx68sound.dllは外部DLL版もサポートしています。実行ファイルと同じ フォルダにあれば優先して使用します。 その他にROMEOやGIMICを利用した外部FM音源モジュールを利用することが できますが作者は実機を持っていないため未確認です。 ・MercuryUnit V3,5と満開製作所のMK-MU1Oをサポートします。 各種マニュアル、データシート等を参考に実装してあります。 一応それなりに再現できているようですが実機と挙動が異なるかもしれません。 こちらもGIMICを利用した外部FM音源モジュールを利用することができます。 残念ながらMercuryUnitも作者は実機を持っていないため未確認です。 ・ROMEO/GIMIC利用について ROMEOはpcidebug.dll、GIMICはc86ctl.dllを必要とします。 c86ctl.dllの64ビット版は存在しますが公式HPに掲載されていないようです。 pcidebug.dllの64ビット版はhttp://pcidebug.yui.ne.jp/から手に入ります。 ・Sound Canvas VA対応ついて Sound Canvas VAがデフォルトのインストール先に導入されている場合には、 TypeG自体がVST HostとなってSound Canvas VAを利用できます。有効にする にはMIDIの設定で出力デバイスから選択してください。 ・サウンドシンセサイザ ADPCM/FM音源、MercuryUnitのPCM/FM音源の動作をグラフィカルに表示できる サウンドシンセサイザ機能を実装しました。オリジナルはXM7のものを参考に 実装しました。また内蔵FM音源はシンセサイザ上からチャネル毎にミュート することが可能です。 (2)XVI/XVI Compactモード V3.20からXVIおよびXVI Compactモードが選択できるようになりました。 オプションから選択するためには下記のROMファイルが必要になります。 この2機種は内蔵SCSIモデルです。 XVIモデル IPLROMXV.DAT (131072 バイト) … XVI の $FE0000..$FFFFFF SCSIINROM.DAT(8192バイト) … $FC0000-$FC1FFF XVI Compactモデル IPLROMCO.DAT (131072 バイト) … Compact の $FE0000..$FFFFFF SCSIINROM.DAT(8192バイト) … $FC0000-$FC1FFF (3)X68030モード ・CPUコア StarScreamの68000/68010命令セットに加えて68020相当の命令を追加実装 しました。PMMUに関する命令はxm6iのPMMUエミュレーションを組み込むこと で結果として68030相当のエミュレーションが可能になりました。 その他インストラクションパイプ制御、インストラクションキャッシュ、 データキャッシュを実装しています。 バスエラー時のスタックフレームは必要分だけになっており不正確です。 またトレースビットの実装も不十分ですが実用には問題ないでしょう。 ・FPU(68881) 浮動小数点プロセッサの命令セットおよび浮動小数点演算のが可能です。 これらも全てxm6i由来のものです。 ・拡張エリアセット 拡張エリアセットによるスーパーバイザーモードでのメモリ保護機能を実装 しました。 ・拡張メモリ ローカルメモリやハイメモリと呼ばれる拡張メモリを実装しました。拡張 方法はxm6iの実装に合わせておりTS-6BE16、060Turbo互換、xm6i独自拡張 から拡張方法を選択できます。 ・各種ウェイト制御 メインメモリ、各種ROM、周辺デバイスへのメモリウェイトを調整しました。 68030のバスアクセスタイミングは複雑なので概ね合っている程度と考えて ください。またメインメモリに関してはクロック30MHz以上でスタティック カラムモードを解除してウェイトを入れるようにしています。 ・必要なROMファイルについて X68030モードは下記のROMファイルが存在するかでチェックしています。 IPLROM30.DAT (131072 バイト) … X68030 の $FE0000..$FFFFFF ROM30.DAT (131072 バイト) … X68030 の $FC0000..$FDFFFF IPLROM30.DATはシャープから無償公開されていますのでそちらを利用する ことができます。 上記のROMファイルを実機からダンプするためにはdb.x等で該当するアドレス をファイルに出力して何らかの手段でWindows環境まで持ってきてください。 因みにROM30.DATは紛らわしいですがIPLROM30.DATではなくROM30.DATという 全く別のROMファイルです。このROMについてはX68030は所有していないけれ どSUPERやXVIをお持ちであるならば代替ROMを使うことができます。 、 SCSIINROM.DAT(内蔵SCSIインターフェース $FC0000-$FC1FFF)をダンプして、 サイズを8192バイトから131072バイトにパディングしてください。 パディングにはddコマンド等で後ろに単純に0x00で埋めてサイズだけ合わせ て下さい。もちろんX68030の持つ機能が全て使える訳ではありません。 □その他のバグ修正と追加実装 (1)VM関係 ・MPU StarScream0.27aに換装して64ビットモードに対応できるようにしました。 一部レジスタシフト等のバグ修正とオリジナルの拡張も組み込んであります。 ・MFP バスエラーの再現性向上とCPUとの動作タイミングの調整を修正しました。 @GPIPとその割り込みタイミングの微調整。 AIMR設定時の割り込みタイミングの変更。 Bトランスミットステータスレジスタの再実装。 CCPU→MFPへのデータ引渡しのタイミング調整。 これらの修正はクレイジークライマー、アルカノイド、サイバリオンなどの アプリで不具合として表面します。一見描画系に関係ないように見えて実は 割り込みやデータ受信のタイミングが影響していることは多々あるようです。 V3.13L30からGPIPの信号線変化に対する割り込みタイミングを1命令遅延 させました。これはMFPからの割込み発生直後にCPUコアを1命令割り込み 検出なしで駆動させることで1命令の割込み検出遅延を再現させたものです。 割込み処理構造の変更はこれで第四世代になりますが完成したとと思います。 ・DMAC 帯域限定転送制御とパック転送を新たに追加実装しました。バイトアクセス とワードアクセスでデバイスによっては動作が異なる場合にパック転送が 実装されていないと不具合がでます。例えばテキストパレットアクセスなど。 ・FDC 主に状態遷移割り込み(READY信号変化の割り込み)を修正しました。割り込み を利用した制御を行うようなOS(NetBSD等)での不具合に対処したものです。 シーク系コマンドや状態遷移後のにSENSE INTERRUPT STATUSコマンドのみを 受け付ける仕様でしたが、実機では連続シーク等が可能であることが判明 したためコマンド制限を解除しました。 ・FDD 2HCイメージのサポートの他にアンフォーマット時のセクタクリア処理を修正 しました。 ・FDI 1.2MBファイル形式のサポート (拡張子2HC、2HC専用) ・ADPCM アナログ回路エミュレーション(DCオフセット+LPF)を追加しました。 またXM6改由来のクロックアップ改造にも対応しています。 ・OPM OPMのライトフラグの挙動とビジー中の書き込み無視動作を再現しています。 波形合成エンジンはオリジナルが採用していたfmgen以外に内蔵版X68Sound が使用できます。これらの合成エンジンはCSMモードの改善を行っています。 また外部DLLを用意することでDLL版のX68SoundやROMEO(pcidebug.dll)、 GIMIC(c86ctrl.dll)を利用することができます。 ・SCSI/SASI/SXSI/DISK オリジナルのソースをベースにしていますが機能配置を大きく見直すことで より実機に近い挙動をするように改修しました。特にSCSIはバスの状態を 正確に再現できるよう修正を行いました。この改良でMINIXが起動できるよう になりました。 ・SCC 主にxm6iで修正されたコードを取り込みました。 ・MIDI クリックカウンタやシーケンサ処理が仕様通りに実装されていなかっため 追加実装しました。不必要な割り込みが発生することで MIDIが停止する 不具合が修正されます。 ・システムポート xm6iで修正されたコードを取り込んであります。アドレスと処理内容が かなり間違っていました。またバージョン情報の取得は先頭の$36('6')、 メジャーバージョン、マイナーバージョンの後に$67('g')が帰ります。 TypeGはメジャーバージョンが3系のXM6として偽装しています。 またバージョン情報の取得(独自拡張ポート)はオプション指定で無効化 できます。これは実装途中でsi.xが機種判定している処理を調査するため に拡張したものですが機能として残しておきました。 ・RTC エミューレータ終了時にRTCの情報をRTC.DATという名前で保存します。 タイマー設定等を起動時に復元することができます。合わせて電源オフ状態 でもRTCは駆動されるようになっていますのでタイマー設定での電源オンを 利用することができます。 ・CGROM X68030モードの時にはCGROM.DATの代わりにCGROM30.DATというファイル名 でCGROMデータを読み込みます。CGROM30.DATが無ければCGROM.DATという 優先順位です。これはX68030のCGROMの内容が他の機種と異なるための措置 です。xm6iの考え方を参考に拡張しました。 ・CZ-6BF1(拡張RS233Cカード) SCCをベースに拡張RS232Cカードを2枚実装できるようにしました。 (2)ターボモード XM6の「VM全体をノーウェイト動作」をショートカットキーだけでON/OFFする 機能です。ショートカットキーはCTRL+F12になります。最近PCでは速過ぎる ためVMの動作倍率をオプションから設定できるようにしています。 一部の方々から以前のショートカットに戻して欲しいという要望を受けたので、 あまり何も考えずにALT+F11から元のCTRL+F12に戻しました(w 個人的には推奨していませんがSHIFT+CTRL+F12でMPUのみノーウェイト動作を 切り替えることができます。 (3)エコモード MPUやVMのノーウェイト動作は非常に便利ですがMPUのSTOP命令を利用して 割り込みトリガで待つようなOS(MPL OSやNetBSD等)ではコマンドプロンプト の待ち状態でもホストPCのCPUを使い続けます。そこでCPUがHALT状態にある 場合には上記のMPU,VMのノーウェイト動作やターボモード動作を一時的にオフ にしてPCの負荷を下げます。 (4)ジョイスティック ・ジョイキー JoyKeyという機能でキーボードの方向キー(上下左右)でスティックの方向、 Z,X,A,Sでボタンの押下状態を再現します。 [ツール]→[JoyKeyモード] でエミュレーションのON/OFFが可能です。 但し[オプション]→[ジョイスティック]で割り当てデバイスに「JoyKey」 を選択してどのデバイスに対してJoyKeyを有効にするか選択してください。 またエミュレーションが有効な間はキーボードの上下左右、Z,X,A,Sの 各キー入力を無視します。 ・デバイスの割り当て拡張 デバイスの各ボタンにはX68K上で認識されるジョイスティックの各ボタン を割り当てますが、X68Kのキーボードの各ボタンを割り当てる機能を拡張 しています。応用としてターボモードのON/OFFなどを割り当てることが できます。 ・ステートセーブ ショートカットキー(ALT+F1/F2)でクイックロード/セーブが可能です。 xm6g.exeと同じディレクトリにSTATE.xm6というファイル名でステート ファイルが作成されます。 (5)ホストスケジューラ RTCとキーボードをホスト側の時間を基準に速度調整することでVM高速 モードを利用中でも正しく時刻が刻まれ、また無駄なキーリピートを抑制 できます。オプションから切り替えが可能ですがデフォルトで有効になって います。xm6iで実装された機能を一部変更して組み込みました。 (6)XM6改の改良をマージ 最新版のWindrvXMをはじめとした色々な改良を取り込んでいます。 WindrvXMの導入についてはXM6改のドキュメントを参照してください (7)ウィンドウ状態保存とリジューム機能の強化 オプションのレジュームから「ウィンドウ状態の保存」を有効にすると メインウィンドウの位置復帰だけでなくストレッチ状態も復帰します。 また全てのサブウィンドウについても終了時の位置とアイコン化状態を復帰 するように拡張してあります。これはステートファイルのロード時にも作用 します。 □Windowsメニュー 以下にメニューの概略を示します。なお動作中はマウスモードがWindows側に ある時に限り、右クリックでメインメニューと同じメニューが開きます。 説明の最後に★マークが付いたものはTypeGで拡張または変更したものです。 ファイル(F) 開く(O) ステートデータをロードします。 上書き保存(S) ステートデータを上書きで保存します。 名前をつけて保存(A) ステートデータを別名で保存します。 リセット(R) 仮想マシンをリセットします。 インタラプト(I) 仮想マシンにNMI割り込みをかけます。 電源スイッチ(P) 仮想マシンの電源スイッチをON/OFFします。 クイックロード(L) ステートデータをファイル指定なしでロードします。★ クイックセーブ(Q) ステートデータをファイル指定なしでセーブします。★ 終了(X) XM6を終了します。 FDD0,FDD1 開く(O) フロッピーディスクイメージを設定します。 イジェクト(E) フロッピーディスクイメージを取り外します。 書き込み保護(W) ライトプロテクトシールを操作します。 強制イジェクト(F) イジェクト禁止の場合に強制イジェクトします。 誤挿入(I) 誤挿入をシミュレーションします。 MO 開く(O) MOディスクイメージを設定します。 イジェクト(E) MOディスクイメージを取り外します。 書き込み保護(W) ライトプロテクトタブを操作します。 強制イジェクト(F) イジェクト禁止の場合に強制イジェクトします。 CD 開く(O) CD-ROMイメージを設定します。 イジェクト(E) CD-ROMイメージを取り外します。 強制イジェクト(F) イジェクト禁止の場合に強制イジェクトします。 表示(V) システム(S) システム情報を表示します。 プロセッサ(P) MPUまわりの情報を表示します。★ x68030モードではサブメニューからキャッシュ・MMUを 選択できます。 デバイス(D) 各種デバイスの情報を表示します。★ サブメニューに次のサブウィンドウを追加しました。 システムポート I/Oコントローラ ADPCM ジョイスティックインターフェース MercuryUnit Nereid 拡張RS232C ビデオ(V) ビデオRAMの情報を表示します。★ 無効になっていたテキストメニューを復活させました。 レンダラ(R) 表示合成用ワークメモリの情報を表示します。 Win32(W) Windows固有の情報を表示します。 キャプション(C) ウインドウ上部のタイトル部をon/offします。 メニューバー(M) ウインドウ上部のメニューをon/offします。 ステータスバー(B) ウインドウ下部のステータスバーをon/offします。 最新の情報に更新(F) すべてのウインドウを再描画します。 ストレッチ(T) 0.5,1.0,1.5,1.8,2.0,3.0,4.0倍のを選択できます。★ フルスクリーン(U) スクリーン表示を全画面モードに切り替えます。 デバッグ(D) 実行(X)/停止(B) 仮想マシンの実行を開始/停止します。(トグル動作)★ トレース(T) 1命令だけ実行します。 リセット(R) 仮想マシンをリセットします。 ツール(T) MPUクロック(C) MPUクロックを変更します。★ VM全体をノーウェイト動作(V) VMノーウェイトモードを有効にします。★ MPUをノーウェイト動作(N) MPUノーウェイトモードを有効にします。★ マウスモード(M) マウスエミュレーションの有効・無効を切り替えます。 JoyKey(J) JoyKeyの有効・無効を切り替えます。★ ソフトキーボード(K) ソフトウェアキーボードウィンドウを表示します。 時刻アジャスト(T) エミュレータ内の時計をWindows側を見て合わせます。 trap#0命令(I) d0.bに任意値をセットして、trap#0を実行します。 WAVキャプチャ(W) 再生サウンドをWAVファイルに記録します 画面キャプチャ(P) 画面をPNGファイルにキャプチャします。★ サウンドシンセサイザ(S) 内蔵音源のシンセサイザを表示します。★ MercuryUnitシンセサイザ(U) MercuryUnitのシンセサイザを表示します。★ フロッピーの作成(F) 新しいフロッピーイメージを作成します。 SASIディスクの作成(A) 新しいSASIハードディスクイメージを作成します。 SCSIディスクの作成(H) 新しいSCSIハードディスクイメージを作成します。 MOディスクの作成(D) 新しいSCSI光磁気ディスクイメージを作成します。 オプション(O) XM6の動作オプションを設定します。 ウィンドウ(W) 重ねて表示(C) サブウィンドウを再配置します(カスケード)★ → 廃止 並べて表示(T) サブウィンドウを再配置します(タイル)★ → 廃止 全てアイコン化(I) サブウィンドウをすべて最小化します。 アイコンの整列(A) アイコン化されたサブウインドウを並べます。★ → 廃止 全て隠す(H) サブウィンドウをすべて非表示にします。 全て復元(R) アイコン化や非表示の前の状態に戻します。 ヘルプ(H) 英語モード(E) 画面リソースを英語版に差し替えます。★ → 停止 バージョン情報(A) XM6のバージョン情報を表示します。 □速度 TypeGはオリジナルのXM6に比べて性能が劣化している訳ではありません。 様々な機能強化と同時にチューニングを行うことで負荷が低くなっています。 x68kは簡単にエミュレーションできるほどシンプルなマシンではありません。 一部のアプリケーションでは期待するほどの速度はでないでしょう。 □開発環境 開発ホスト:PC/AT互換機 Intel(R) Core(TM)i5-4690S CPU @ 3.20GHz Roland CM-64,MT-32(前期),SC-55K ターゲット: X68000XVI Compact(MC68000 16MHz) + MIDIボード X68030(MC68030 33MHz) + FPU + NeptuneEvolution CZ-601D(壊れかけ・・・赤出力不調) Roland CM-64,MT-32(前期),SC-55K □著作権、および謝辞 ベースとなったXM6はPI.氏が作成されており著作権を所有しております。 他の著作権に関する情報はオリジナルXM6のアーカイブに含まれるXM6.txtを参照 してください。 XM6 2.05 TypeG で機能強化した箇所についてはGIMONSが著作権を所有します。 実験成果公開という性質上、私のHP以外での配布を認めておりません。 FM音源の合成エンジンのX68Sound.dllはm_puusanさん作成のものを使っています。 この部分の著作権は作者であるm_puusanさんに帰属します。 一部のソースコード(サウンドエンジン強化)についてはnueさん、RuRuRuさん、 Fu-さんにコードを寄贈していただきました。 実機風のADPCMのLFPはOhTamagoさんから寄贈されたコードを組み込みました。 また同じくXM6 2.05をベースにマルチプラットホームでの動作サポートやx68030 への対応を進めているxm6iの成果の一部を統合しました。これらのコードの一部 はisakiさん、Y.Sugaharaさんが著作権を所有しております。 WindrvXMの作者であるcoさんが開発したXM6改の各種改良をマージさせていただき ました。TypeGのノウハウを友情出演という形でフィードバックもしています。 インプットデバイス系に大きな進化を得ることができました。これらのコードの 一部はcoさんが著作権を所有しております。 TypeGは様々なサポータの方々に貴重なフィードバックを頂いて進化してきました。 ここに感謝します。 □ソースコードについて 一部の開発協力者の方々を除いてソースコードは配布しておりません。 <補足> ソースコードを開示したら必ずしも良いフィードバックが得られると考えて いません。開発に協力の意思を示していただける方は直接連絡を取ってこられ ました。当然、そのような本当のX68000好きな方にはソースコードを提供して います。 □ライセンスについて ・XM6 TypeGはフリーソフトです. 当ソフトを利用して生じたあるいは生じると予測される損害について私および オリジナルのXM6作者は一切責任を負いません. ・その他のライセンス事項 オリジナルのXM6の規定に従います。特に雑誌/書籍での紹介や付属CD-ROMに よる配布に関しての制約事項にご注意願います。 □連絡先 twitter https://twitter.com/kugimoto0715 e-mail kugimoto0715@yahoo.co.jp