最終更新:2024/3/17
2024/3/17 Version1.21をリリースしました
2024/3/2 バス制御の安定化に合わせてバージョン番号をリナンバしました(1.03->1.10,1.04->1.20)
2024/2/23 Ver1.03fおよびVer1.04bをリリースしました(1.03fは安定板、1.04bは人柱版です)
XVIの16MHzモードで安定するようになりました(改良版ファームウェアの適用が必要です)。
基本的にXVIを含めてMPUクロック、システムクロックは10MHzでの使用を推奨します。
またRaspberryPi自体のオーバーおよびアンダークロックは推奨しません。
Version1.20->1.21 *人柱版
- WindrvXMのSEEK処理をXEiJ互換仕様に変更
- WindrvXMのREAD/WRITEを32KB単位で分割実行するように変更
- WindrvXMのオプション指定にTimerLEDをアクセスランプにするモードを追加
- WindrvXMの非同期処理で追い越しが発生する問題を修正
- WindrvXMのボリューム名が破壊される問題を修正
Version1.04b->1.20(20240302) *人柱版
- GreenPAKの個体差を吸収するためにバス制御のタイミングを調整
- PhantomX起動後の経過時間を取得するポートを追加
- スーパーバイザプロテクト領域のバスエラー処理修正
- バージョン番号をリナンバ
Version1.03f->1.10(20240302) *安定板
- GreenPAKの個体差を吸収するためにバス制御のタイミングを調整
- バージョン番号をリナンバ
Version1.03e->1.04b(20240223) *人柱版
- MPUコアをC++からCにコンバート
- MPUコアのジャンプテーブルの最適化
- MPUコアのプリフェッチを16ワードに拡大
- MPUコアのキャッシュ構造をプリフェッチ用に最適化
- MPUコアの例外処理やフラグ挙動のバグ修正
- インストラクションポインタのレジスタ固定(GCCのfixed-regを利用)
- Aarch64対応(ソースコードの論理的対応のみ)
- ライトバックモード時のDMA駆動におけるキャッシュ不整合バグ修正
- WindrvXMの実装(SDカードをファイルシステムとしてマウント可能)
- その他修正多数
Version1.03e->1.03f(20240223) *現時点の安定板
- ライトバックモード時のDMA駆動におけるキャッシュ不整合バグ修正
PhantomXは簡潔にいえばX68000用のMPUアクセラレータです。他のアクセラレータと同様に本体のMC68000を交換して使用します。 X68000のハードウェア仕様に最適化して設計されたX68000専用のアクセラレータです。 MC68000を採用した他のレトロPCやゲーム機等でも使えるような汎用的なアクセラレータではありません。
サポートする機種はACE/EXPERT/PRO/SUPER/XVIです。 初代及びXVI Compactは物理的な制約により使用できません(無理やり使えるようにした猛者はいらっしゃいます)。
PhantomXの実体はRaspberryPi(Zero/Zero WH/Zero2/2B/3A+/3B/3B+/4Bをサポート)とMPUのソフトウェアエミュレータです。 RaspberryPiをX68000に接続するための専用のベースボードとリロケータを使用します。
アクセラレータとしての速度はRaspberryPiの性能に依存します。
リロケータ
X68000のMPUであるMC68000は出荷時からソケット化されており取り外しが可能です。 ソケットはSDIP(シュリンクDIP)という1.778mmピッチのものです(最近ではあまり一般的なものではありません)。 ソケットの位置はモデル毎に異なりますがACE/EXPERT/SUPER、XVI、PROの3種に大別されます。
リロケータの役割は二つあります。一つ目はSDIPを一般的な2.54mmピッチのDIPに変換すること。 二つ目はモデル毎に異なるソケット位置を調整することです。 一つのリロケータで全モデルのソケット位置変換に対応するように設計されています。
ベースボード
PhantomXのハードウェアで中心となるベースボードです。 MC68000のDIP版と同一のピン配置を持つコネクタを持っています。 これをリロケータに取り付けたものをMPUのソケットに接続します。
ベースボードのロゴの左右にある4つのワイドバスD-FFはRaspberryPiのGPIOとのレベル変換とバス信号の保持を行うためのロジックICです。 RaspberryPiの限られたGPIOを切り替えながら処理を行います。
ベースボードの下4つはルネサスエレクトロニクス株式会社のSLG46826Gです(Dialog Semiconductorはルネサスに吸収されました)。 これはGreenPAK Programmable Mixed-Signal Matrix In-System Programmabilityという製品の一種です。 FPGAの簡易版とも言える優れたものでロジックICで構成すれば数十個必要な回路がこれ一つで構成できます。
4つのSLG46826Gにはそれぞれ独自に開発したファームウェアが書き込まれています。 GP#1がバスシーケンス制御、GP#2がDMACとのバス調停、GP#3がバスシーケンス監視、GP#4がIPL信号線制御となります。
その他にGPIOコネクタ(20x2ハウジング)、SLG646826Gのファームウェアを書き換えるためのI2C用ジャンパ、 MPUソケットのVCC(5V)をRaspberryPiに供給するためのジャンパが実装してあります。
2024年1月以降に頒布する基板にはSLG46826Gの廉価版であるSLG46824Gを使用しています。 使用している機能範囲において性能は全く同じです。
機能構造
PhantomXのソフトウェア内の機能構成を次に示します。 可能な限りレイヤ構成を取っておりRaspberryPiに依存する部分を分離するように設計しました。 またベアメタルで動作するためRaspberryPi OSは必要ありません。
MC680X0エミュレーション
XM6で実績のあるStarScreamというMPUコアを参考に自作したコアを使用します。 このMPUコアはC++で実装しておりコードネームは"Xero"です。 MC68000,68030,68040,68060のエミュレーションが可能です(一部簡易実装含む)。 元々はMC68030以降のキャッシュ機構を実装していましたが現在は削除しています。 代わりに内部メモリハンドラ内に独自のキャッシュ機構を実装しました。
内部メモリハンドラ
XeroにはMC680X0の殆どの命令を実装しています。 命令のフェッチやメモリの読み込み、書き込みが必要な場合は内部メモリハンドラを経由して処理を行います。 外部メモリハンドラへのアクセスを極力削減するために独自のキャッシュ機構を持っています。 キャッシュの容量はX68000の実装メモリと同じものだけ確保するようになっています。 したがってキャッシュヒットし続ける限りはX68000のメインメモリにアクセスすることはありません。 但し書き込み処理はライトスルーですのでメインメモリに書き込みを行います。
Version1.03cから試験的にライトバックモードをサポートしました。 ライトバックモードでは明示的にフラッシュしない限りメインメモリへの書き込みは行われません。外部メモリハンドラ
X68000へのバスアクセスを経由するための中継層です。 内部メモリハンドラからのリクエストをフックして前後処理を行います。 最も重要な処理は独自キャッシュの整合性保証です。 X68000にはDMACがあるためMPUが関与しない形でDMACがメインメモリに書き込みを行います。 この時内部メモリハンドラ内のキャッシュ情報と不整合が発生します。 一方でDMACへの動作指示はMPUが行いますから、 DMACへの指示内容を監視することでキャッシュ不整合が発生する領域を予測できます。 つまりDMACの動作直前で内部メモリハンドラ内のキャッシュを無効化することで不整合を回避します。 その他にMPUエミュレーションが速すぎるために発生する各種不具合(オーバークロック時に発生する不具合と同等のもの)を 軽減するための強制ウェイト挿入や、X68030に偽装するためのフェイクデバイスを実装しています。
Version1.03cで試験的に導入されたライトバックモードに対応するためキャッシュの無効化だけでなく、 一部の領域を動的にライトスルー化する等の不整合回避が強化されました。GPIO制御
外部メモリハンドラ内で最終的にX68000へのバスアクセスが必要になった場合にはGPIO制御で処理を行います。 実際のバスアクセス制御はベースボード上のSLG46826Gのファームウェアで行いますのでアドレスバスや データバスの設定とバスアクセス完了後のステータスチェックとデータ取得だけを行います。
既知の問題
- IO拡張ボードの浮動小数点演算プロセッサ(FPU)が動作しません
XVIの専用スロットに増設するものは動作します。→改良版ファームウェアで解消しました。- 厳密なチューニングが施されたアプリケーションはタイミングが合いません
S44PLAY/FMPPLAYでは音割れ等の不具合が発生します。- IOアクセスが主体のアプリケーションでは実機より遅くなります
ひたすらGRAMやTRAMを更新する場合にIOアクセス速度の制限が表面化するかもしれません(しないかもしれない)。
先にも書いたとおり4つのSLG46826Gはそれぞれ大きく役割が与えられており、個別のファームウェアを書き込んであります。 ファームウェアはGreenPAK Designerで開発しています。 GreenPAK DesignerからファームウェをHEX形式でエクスポートしてSLG46826GのI2Cインターフェースを使って書き込みます。 書き込みにはRaspberryPiを使用しています。 書き込みに必要なアプリケーションも開発していますので厳重に手順を守れば後からファームウェアの更新も可能となっています。
GreenPak Designerで開発したバスアクセス制御
ベースボードのジャンパ設定
ベースボードにはいくつかジャンパがあります。 設定が必要なジャンパはMPUソケットのVCC(5V)をRaspberryPiの電源に供給するためのジャンパのみです。 別途RaspberryPiに電源を供給する必要はありません(むしろ絶対に外部電源を接続しないでください)。 X68000の電力不足等を理由にRaspberryPiに外部電源を供給せざるを得ない場合はこのジャンパを必ず外してください。
X68000 PRO(PRO2)
横置きモデルのPROは最も導入が簡単なモデルです。 ケースを外して支柱を外せばMPUソケットに直ぐにアクセスが可能です。 MPUの外し方は詳しくは説明しませんがIC引き抜き工具を利用した方がよいでしょう (ドライバー等で徐々に引き抜くことは可能ですが不慮の事故が発生する可能性があります)。 写真では既にMPUを外した状態です(下がフロント、上が拡張IOです)。 バネ式のMPUソケットが取り付けてありますが横のコンデンサとの干渉を防ぐため MPUソケットの上に丸ピン用のソケットを載せて嵩上げしています。 ソケット上のコンデンサが干渉する可能性がありますので横向きに付け替えるか、斜めに倒す必要があるかもしれません。
リロケータはその他のモデルと共用しておりXVIに接続する時と方向が違います。 写真の方向で重ね合わせるようにリロケータ、ベースボード、RaspberryPiを実装する必要があります。
MPUソケットに実装した状態です(メインボードへの電源コネクタがギリギリです)。
X68000 ACE/EXPERT(EXPERT2)/SUPER
縦型モデルの10MHz機です。 MPUのソケットにアクセスするためにはメインボードを取り外してシールドを除去する必要があります。 またメインボードの左下の隅にソケットがあるためMPUの引き抜きもメインボードを外した状態で行う必要があるでしょう (IC引き抜き工具推奨)。 写真はACEのメインボードで既にMPUを外した状態です。バネ式のMPUソケットが取り付けてありますが 横のコンデンサとの干渉を防ぐためMPUソケットの上に丸ピン用のソケットを載せて嵩上げしています。
リロケータはPROと同じ方向で重ね合わせてください。
MPUソケットに実装した状態です。 ソケットがケースの下に重なっているうえ、PhantomXのコネクタが見えにくいので注意が必要です。 上からペンライト等でピンの位置を確認しながら実装してください。
X68000 XVI
MPUのソケットにアクセスするためにはメインボードを取り外してシールドを除去する必要があります。 メインボードの中央よりの左下にソケットがあるためアクセスは比較的容易です。 MPUの引き抜きは念のためメインボードを外した状態で行ってください(IC引き抜き工具推奨)。 写真はメインボードのMPUを外した状態です。バネ式のMPUソケットが取り付けてありますが 横のコンデンサとの干渉を防ぐためMPUソケットの上に丸ピン用のソケットを載せて嵩上げしています。
10MHzモードでご利用下さい、16MHzモードを使用するには改良版ファームウェアの導入が必要です。
リロケータとベースボード、RaspberryPiを次の方向で重ね合わせてください(PROやその他縦型モデルとは逆方向になります)。
MPUソケットに実装した状態です。ソケットの上端部分が見える位置にありますので目視でピンの位置合わせが可能です。
ライセンス
PhantomXはリロケータとベースボードに加えてRaspberry Pi上で動作するソフトウェアの 総称あるためソフトウェア単体でご利用頂くことはできません。
HP上等で案内する公式頒布サイト(ショップ等)でリロケータとベースボードを正規に購入して いただいた方に限りソフトウェアの使用が許諾されます。
なお公式頒布サイトでは譲渡やオークション等での転売禁止を購入条件としています。
譲渡やオークション等での転売でリロケータとベースボードを入手された方にはソフトウェア の使用は許諾されません。同人ハード及びソフトウェアという特性上あくまであるがまま"AS IS"で頒布します。
従って使用者が受けたあらゆる損害に対して一切責任を持ちません。
またソフトウェアに不備もしくは不具合があったとしてもそれを修正する責任もありません。
PhantomXを利用することでRaspberry PiやX68000が故障するリスクがあります。
あくまで自己責任でチャレンジしてください。
この条件に納得できない場合はご使用をお控えください。またソフトウェアに関してはこのHP以外での配布を認めておりません。
SDカードの初期化
32GB以下のSDHCカードをPCに挿入しSDアソシエーションが提供している"SDメモリカードフォーマッター"で初期化してください。
SDメモリカードフォーマッターは容量が64GB以上のSDXCカードをFAT32にフォーマットできませんのでご注意ください。SDXCカードを強制的にFAT32でフォーマットする方法(Raspberry Pi ImagerのOS削除等)もありますが推奨しておりません。
下の様にFAT32で全領域がフォーマットされれば成功です。
SDカードが空の状態でPCから見えるか確認してください。
ソフトウェアのダウンロード
VDISKドライバ(PXVDISK.SYS)とPhantomX制御コマンド(PXCTL.X)も中に入っています。
1.2系にはWindrvXMのドライバも入っています(ライセンス確認済み)。
人柱版(1.2x系)phantomx version1.21のダウンロード
安定版(1.1x系)phantomx version1.10のダウンロード
旧版(1.02系)phantomx version1.02cのダウンロード
ソフトウェアの展開と転送
ダウンロードしたZipファイルを展開すると下記のファイルが入っているはずです。
RaspberryPiのファームウェア等が含まれているので初回は全て転送の必要があります。
config.txtに省電力用の設定がありますので必ず展開されたファイルのものを使用してください。
全ファイルを初期化したSDカードにコピーします。
SDカードをRaspberryPiに挿入して完了です。
ソフトウェアの更新
バージョンアップ時に更新が必要なモジュールは下記の通りです。
モジュール 説明 kernel.img PhantomX本体(Raspberry Pi Zero/W用) kernel7.img PhantomX本体(Raspberry Pi Zero2/2B/3A+/3B/3B+用) kernel7l.img PhantomX本体(Raspberry Pi 4B用)
その他ドライバやユーティリティの更新がある場合はdriverとvdiskbootフォルダも必要に応じて最新化してください。
GreenPAKのファームウェアの更新手順は別ページに用意しました。
最初は何も設定せずにデフォルトで使用してください。以下の設定は応用編で詳しく解説します。
設定ファイル
"phantomx.ini"が設定ファイルです。ダウンロードしたモジュールには以下のように記述されています。
1行で1設定の定義ファイルで"キー"と"値"のペアで設定します。 "キー"と"値"の間は空白またはタブで区切ってください。 また先頭に"#"を付けるとその行は無視されます。空白行があっても構いません。
上記の例では全て#でコメントアウトされていますので何も設定していない状態と同じになります。
設定項目
キー 値 EMUMODEL エミュレーションするMPUを指定します。
指定できる値と意味は以下の通り(ハイメモリはオプション設定が必要です)。000 : MC68000(ハイメモリ設定可) *デフォルト
030 : MC68030(MMU、ハイメモリ設定可)
040 : MC68040(MMU、内蔵FPU、ハイメモリ設定可)
060 : MC68060(MMU、内蔵FPU、ハイメモリ設定可)EMUWAIT エミュレーションに強制的にウェイトを入れるレベルを指定します。
0:ウェイト無し *デフォルト
1..7:数値が大きくなるにしたがって徐々にウェイトが増えますHIMEM ハイメモリ(ローカルメモリ)のモードを指定します。
060turbo互換($10000000 ~ )モード
0~768の任意の数字でメモリ量(MB)を指定します(但し16MB単位で切り捨て)。
256MB以内を推奨します。
実際に有効になるメモリ量はラズパイの搭載メモリ量に依存します。
1GB以上のモデル:768MBまで
512MBのモデル:384MBまで
TS-6BE16互換($01000000 ~ 16MB)モードTS-6BE16を指定します(最初の1文字しかチェックしていないのでTおよびtでもOK)。
容量は16MB固定です。IPLROM IPLROM($fe0000-$ffffff)のROMデータファイルのパスを指定します。
指定がなければX68000本体のIPLROMを使用します。
IPLROMを差し替える必要がある時に指定してください。CGROM CGROM($f00000-$fbffff)のROMデータファイルのパスを指定します。
指定がなければX68000本体のCGROMを使用します。
CGROMを差し替える必要がある時に指定してください。SCSIINROM 内蔵SCSIROM($fc0000-$fc1fff)のROMデータファイルのパスを指定します。
指定がなければX68000本体の内蔵SCSIROMを使用します。
内蔵SCSIROMを差し替える必要がある時に指定してください。SUPER/XVI以外の内蔵SCSIを持たないSASI機モデルで指定した場合は
偽の内蔵SCSI I/Fをエミュレーションします (何もSCSI機器が接続されていない様に見えます)。SRAM SRAM($ed0000-$edffff)のデータファイルのパスを指定します。
本体のSRAMは使用されなくなり同時に64KBに拡張されます。
指定されたファイルが存在しない場合には自動で作成されます。SRAMに書き込みを行うとこのファイルも更新されますのでバッテリバックアップの代わりとしても利用可能です。
設定項目(エミュレーションするMPU種毎の設定)
以下の設定項目はEMUMODELに指定したMPU種別に応じて有効になります。
キー名の後ろにある"{000|030|040|060}"はEMUMODELに相当します。
キー 値 IPLROM{000|030|040|060} EMUMODELに応じてIPLROM($fe0000-$ffffff)のROMデータファイルのパスを指定します。
指定がなければIPLROMの指定に従います。CGROM{000|030|040|060} EMUMODELに応じてCGROM($f00000-$fbffff)のROMデータファイルのパスを指定します。
指定がなければCGROMの指定に従います。SCSIINROM{000|030|040|060} EMUMODELに応じて内蔵SCSIROM($fc0000-$fc1fff)のROMデータファイルのパスを指定します。
指定がなければSCSIINROMの指定に従います。SRAM{000|030|040|060} EMUMODELに応じてSRAM($ed0000-$edffff)のデータファイルのパスを指定します。
指定がなければSRAMの指定に従います。HIMEM{000|030|040|060} EMUMODELに応じてハイメモリ(ローカルメモリ)を指定します。
指定がなければHIMEMの指定に従います。設定項目(不揮発性仮想ディスク)
専用ドライバで使用可能な不揮発性の仮想的なディスクの設定です。
通称ですがVDISKと呼んでいますので以下VDISKと表現します。
最大で8個のディスクイメージの設定が可能です(最大容量4294966272バイト=4095MB)。
ディスクイメージのファイルは事前に用意する必要があります。
キー 値 例 VDISK{0|1|2|3|4|5|6|7} VDISKのイメージデータファイルのパス。
右の例のように複数並べて定義してください。
VDISKをHumanから使用するにはドライバ(PXVDISK.SYS)が必要です。
例にあるようにphantomx.iniにVDISK0,VDISK1,VDISK2の3つVDISKを設定している場合に、
全てのVDISKを使用する場合はCONFIG.SYSに次を加えてください(SYSディレクトリにドライバがある場合)。DEVICE = \SYS\PXVDISK.SYS #0
DEVICE = \SYS\PXVDISK.SYS #1
DEVICE = \SYS\PXVDISK.SYS #2phantomx.iniで設定していないIDに対しては常駐エラーになりますのでご注意ください。
また、TimerLEDをアクセスランプ代わりに使う"A"オプションが使えます。
DEVICE = \SYS\PXVDISK.SYS #0A
参考までにWindowsのDOS窓から指定した容量のファイルを作成する例です。
128MBの空ファイルを作成する
fsutil file createnew VDISK0.DAT 134217728 VDISK0 VDISK0.DAT VDISK1 VDISK1.DAT VDISK2 VDISK2.DAT設定項目(特殊用途)
キー 値 説明 FDDSWAP 0:内蔵FDD(0,1)と拡張FDD(2,3)をスワップしない(デフォルト)
1:内蔵FDD(0,1)と拡張FDD(2,3)をスワップする内蔵FDD0,1と拡張FDD2,3へのアクセスを相互変換します。
これは拙作のFDX68を活用するために個人的に用意したオプションです。
FC2CUT 0:FC2ピンカット互換機能を使用しない(デフォルト)
1:FC2ピンカット互換機能を使用するNetBSD/x68kでX Windowを使いたい人だけのための特殊オプション。
VDISK_ASIO 0:非同期IO処理有効(デフォルト)
1:非同期IO処理無効RaspberryPIがシングルコアのZero及びZeroWHでは無効になります
オプションで有効化することはできません。WRITEBACK 0:独自キャッシュはライトスルー(デフォルト)
1:独自キャッシュはライトバックリスク承知の上でスピードを追究したい人向けの特殊オプション。
DMAC動作時にはキャッシュ不整合が予測される対象エリア判定して、
動的にライトスルーに変更します。
ライトスルーに変更された領域はリセットされるまで維持されます。WINDRVXM WINDRVXM.SYS登録時のデフォルト引数
CONFIG.SYSにWINDRVXM.SYSを引数なしで登録した時の代替引数です。
引数を指定して登録した場合にはこの設定は無視されます。環境変更(SDカード上のフォルダ構成等)をphantomx.iniで運用可能です。
例えばSDカードに"share"というフォルダを作成して、
WINDRVXM /share
のように指定しておきます。一方、CONFIG.SYSには
DEVICE = \SYS\WINDRVXM.SYS
と引数無しで登録します。この場合は結果として
DEVICE = \SYS\WINDRVXM.SYS /share
と登録したことと同じになります。TimerLEDをアクセスランプとして使用するオプションが追加されています。
WINDRVXM /share +L
と引数に+Lを追加してください。
デフォルト(指定なし)はオフです。*Version1.2x系以降
外部メモリハンドラ内で独自のIOアドレスに対してPhantomX独自の拡張デバイスが存在します。
IOアドレス(制御ポート)
PhantomXやRaspberryPiの情報取得や動作設定を行うためのレジスタです。
アドレス サイズ 項目 リード ライト 内容 $EA8000 w レジスタポート 現在のレジスタ番号 設定するレジスタ番号 データポートから読み/書きするレジスタの指定です。 0x0000:バージョン番号
0x0001:エミュレーション中のMPU
0x0002:ウェイトレベル
0x0003:FDDSWAP
0x0004:ライトバックモード
0x0010:VDISKのID
0x0011:VDISKの機能
0x00f0:RaspberryPiのSOC温度
0x00ff:リセット指示$EA8002 w データポート 現在のデータ値 設定するデータ値 レジスタポートで指定したレジスタのデータを読み/書きします。 レジスタ番号が0x0000(バージョン番号)の場合
リードするとバージョン番号をBCDで返します(例えばVersion1.02は$0102)。
ライトは無視されます。
特殊用途としてライト時に内部の独自キャッシュを全て無効化する効果があります。レジスタ番号が0x0001(エミュレーション中のMPU)の場合
0:MC68000,3:MC68030,4:MC68040,6:MC68060 となります。
リセットすると新たなMPU種で再開可能です。
設定ファイルは更新しません。レジスタ番号が0x0002(ウェイトレベル)の場合
1命令実行する度にウェイトを入れて実行速度を低下させます。
0で無効、1~7の7段階で数字が大きくなるほどウェイトが大きくなります。
設定ファイルは更新しません。レジスタ番号が0x0003(FDDSWAP)の場合
内蔵FDDのIDと拡張FDDのIDを入れ替えます。
0で無効、1で有効
設定ファイルは更新しません。レジスタ番号が0x0004(ライトバックモード)の場合
独自キャッシュのライトバックモードを設定します。
0で無効、1で有効
設定ファイルは更新しません。レジスタ番号が0x0010(VDISK ID)の場合
アクセスするVDISKのIDを0~7で指定します。
設定ファイルにVDISKを複数設定している場合に
ディスク選択することが可能です。レジスタ番号が0x0011(VDISK 機能)の場合
VDISKがサポートする機能を取得します。
現在は非同期転送のサポート状態のみをレポートします。
$0000 : 非同期無効 $0001:非同期有効
ライトは無視されます。0x00f0(RaspberryPiのSOC温度)の場合
リードするとSOCの温度をBCDで返します(例えば60.05℃は$6005)。
ライトは無視されます。0x00ff(リセット指示)の場合
書き込み専用です。
安全のため$deadを書き込んだ時のみリセットします。$EA8008 l ミリ秒カウンタ(上位32ビット) 現在のの経過時間(上位32ビット) - PhantomX起動後の経過時間(ミリ秒単位)です。
経過時間は64ビットで管理されていますこのポートは上位32ビットを返します。
*Version1.2x系以降
$EA800C l ミリ秒カウンタ(下位32ビット) 現在のの経過時間(下位32ビット) - PhantomX起動後の経過時間(ミリ秒単位)です。
経過時間は64ビットで管理されていますこのポートは下位32ビットを返します。
*Version1.2x系以降
IOアドレス(不揮発性仮想ディスク/VDISK)
拡張デバイスのレジスタポートに0x0010(VDISK ID)を設定した後にデータポートで指定したIDのVDISKに対する操作を行うIOポートです。
アドレス サイズ 項目 リード ライト 内容 $EA8010 l ディスク容量 総セクタ数 不可 VDISKの総セクタ数です。
セクターサイズは1024Byte固定です。$EA8014 l 現在セクタ番号 現在のセクタ番号 設定するセクタ番号 リード(現在のセクタ番号)
設定されたセクタ番号を返します。
ライト(設定するセクタ番号)
データを読み/書きするセクタ番号(0以上)を設定します。
現在セクタ番号に対して次の操作コマンドが有効になります。$EA8019 b 操作コマンド コマンド実行状態 操作コマンド リード(コマンド実行状態)
VDISKの読み込みまたは書き込み操作が実行中かどうかを返却します。
$00:アイドル(コマンド指示待ち)
$01:ビジー(コマンド実行中)
Version1.02以前では常に$00が読みだされます。
Version1.03以降で非同期タイプのコマンドを発行した場合には
アイドル状態になるまでドライバ側で監視が必要です。ライト(コマンド実行指示)
現在セクタ番号に対してデータウィンドウにデータを読み込むか、
データウィンドウからデータを書き込むかを指示します。
$00:読み込み
$01:書き込み
$10:読み込み(非同期)
$11:書き込み(非同期)
非同期のコマンドはVersion1.03以降で使用することが出来ます。
RaspberryPi Zero(1コアモデル)では非同期指定でも同期実行になります。$EA8400...$EA87FF b,w,l データウィンドウ セクタデータ セクタデータ 現在セクタから読み込んだデータ、もしくは
現在セクタに書き込むデータ。$EA9000...$EA9FFF b,w,l ブートROM ROMデータ - VDISKから起動するためのブートROM。
ROMの先頭に8個の起動ハンドルが設定されています。
起動ハンドルはそれぞれID0から7までに対応しています。SWITCH.Xでブートするドライブを指定できます。
ID0から起動:SWITCH.X BOOT=ROM$EA9000
ID1から起動:SWITCH.X BOOT=ROM$EA9004
ID2から起動:SWITCH.X BOOT=ROM$EA9008
ID3から起動:SWITCH.X BOOT=ROM$EA900C
ID4から起動:SWITCH.X BOOT=ROM$EA9010
ID5から起動:SWITCH.X BOOT=ROM$EA9014
ID6から起動:SWITCH.X BOOT=ROM$EA9018
ID7から起動:SWITCH.X BOOT=ROM$EA901C
IOアドレス(WindrvXM/ホストファイルシステム) *Version1.2x系以降
X68000エミュレータ XM6に実装されているWindrvXM(ホストファイルシステム)と似た動作を行うIOポートです。
WindrvXM.SYSがアクセスすることだけを想定していますので直接このポートを使用すると予期せぬ不具合が発生するかもしれません。
WindrvXMの特性であるノンブロッキング処理はマルチコアモデル(ラズパイZero以外)において有効になります。
アドレス サイズ 項目 リード ライト 内容 $E9F000 b 実装モード 識別文字 不可 リード(識別文字)
'Y':WindrvXMモード有効
ライト(無効)
何も効果はなくバスエラーは発生しません。
$E9F001 l 制御ポート ステータス コマンド リード(現在のステータス)
0x00:ビジー
0x01:アイドルライト(コマンド投入)
0x00:実行開始
0xff:実行終了VDISKフォーマット情報
イメージファイルはヘッダ無しのFAT16ファイルシステムそのものです (ディスクのBPBはイメージファイルのサイズからドライバが自動で算出します)。
以下に代表的なサイズのイメージファイルに対してフォーマット情報を記載します。この情報をフリーソフトのDiskExplorerに設定することでWindows上から VDISKイメージファイル内のファイルにアクセスが可能になります。
項目 64MB
(67108864Byte)128MB
(134217728byte)256MB
(268435456byte)512MB
(536870912byte)1GB
(1073741824byte)FAT種別 FAT16 FAT16 FAT16 FAT16 FAT16 FATの位置 0 0 0 0 0 FATの数 1 1 1 1 1 FATサイズ 131072 65536 65536 66560 66560 ルートの位置 131072 65536 65536 66560 66560 データ領域の位置 147456 81920 81920 82944 82944 クラスタサイズ 1024 4096 8192 16384 32768 総クラスタ数 65536 32768 32768 32768 32768
上記以外のサイズに関してはPXCTL.Xコマンドを使って設定されたVDISKのIDに対するフォーマット情報を出力できます。 ID0に設定されたVDISKのフォーマット情報を出力する例。
X68000の電源を入れMPUソケットに電源が供給されるとRaspberryPiも起動を開始します。
PhantomXのカーネルモジュールが起動を開始するまでに数秒かかる場合があります。MPUアクセラレータですのでこれまでと変わらずX68000としてご利用いただけます。
ただしパフォーマンスは格段に向上しているはずです。RaspberryPi 4B(後期)を使った時のパフォーマンスです。
最新の1.2x系ではパフォーマンスが大幅に向上しており最大700MHzに相当します。
System Informationの結果
Winner2の結果
RaspberryPi Zeroを使った時のパフォーマンスです。
非力なZeroですが体感的にはX68030以上のように思えます。
System Informationの結果
Winner2の結果
新しいバージョンのIPLROMを使う
ACE/EXPERT/PRO/SUPERのIPLROMはXVIのIPLROMで拡張されたSRAM初期化(CLRキーを押しながらリセット)機能等が使用できないため不便です。 そのような悩みも設定ファイルでXVIのIPLROMに差し替えれば解決です。
SDカードに差し替えるIPLROMのデータファイルを準備して設定ファイルに指定してください。
無償公開されたXVIのIPLROMを使用する例
これがACEでも使えると本当に助かります
X68030の雰囲気を味わう
MC68030をエミュレーションさせて上位機種であるX68030に似た環境を再現できます。 PhantomXはEMUMODELに030以上が指定された場合X68030で拡張されたいくつかのIOポートを内部的に偽のデバイスとして再現します。
X68030のIPLROMは無償公開されたもの(IPLROM30.DAT)が利用できます。
内蔵SCSIROMに相当するROM30.DATは無償公開されていませんのでご自身で用意する必要があります(内蔵SCSI用のROMで代替するなどいくつかやり方はあります)。
CGROMもX68030の物を使用しないとSX-Window等の12ドットフォントが表示されない場合があります。
下で説明するXEiJで生成できるROMを使用することもできます。
X68030のROMを利用する例
MC68030モード
X68030だと認識されています(試験機はXVIです)
060turboの雰囲気を味わう
EMUMODELに040もしくは060が指定された場合はそれぞれMC68040、MC68060をエミュレーションします。 この時X68030で拡張されたいくつかのIOポートを内部的に偽のデバイスとして再現します。
@kamadoxさんのXEiJで生成できるROMを使用する方法を書いておきます(ありがたや~)。
1.XEiJを起動して機種を060turboに変更します
2.XEIJIPLROM30.DATを生成します
3.XEIJROM30.DATを生成します
4.XEIJIPLROM30.DATとXEIJROM30.DATをSDカードに保存します
5.phantomx.iniでROMファイルを指定します
XEiJのROMで起動したMC68060モード
いつものマンデルブロ
X68000からPhantomXを制御する
慣れてくるとphantomx.iniに複数の定義を書いてEMUMODELを動的に切り替えたり速すぎるのでウェイトを入れたいといった操作を行いたいと思います。
そのような場合はアーカイブで提供するPXCTL.Xコマンドをご利用下さい。
何もオプションを付けずに実行すると簡単なHELPが出てきます。
見ての通りなのですが
-iは現在の設定情報を表示します。
-rはソフトリセットをかけます。
-eはphantomx.iniで指定しているEMUMODELを一時的に切り替えます。
手動リセットまたは-rでソフトリセットするとMPUコアの種別が変更されます。
つまり例えば030モードにすぐに変更する場合"pxctl -e 3 -r"と指定します。-wは一時的にウェイトを入れて速度を落とします
1にすると速度が大幅に落ち、その後2,3,4と増える度に徐々に遅くなります。-cは独自キャッシュをライトスルーもしくはライトバックモードに変更します。 tでライトスルー、bでライトバックです。
-fは内蔵FDD(0,1)と拡張FDD(2,3)のアクセスをスワップします。
-vはVDISKのディスク情報を表示します。
VDISKから起動する
VDISKはSASIやSCSIのディスクと同様に起動が可能です。 しかもSASIよりも大容量ですのでSCSIディスクと同様の運用が可能です。もはやSCSIディスクすら必要としません。
起動用のサンプルとして提供するSDカード内に"vdiskboot"フォルダを用意しました。 このフォルダ内のphantomx.ini,SRAM.DAT,VDBOOT.DATをSDカード直下にコピーすれば、仮想ディスクから起動します。
サンプルのphantomx.iniは次のとおり記述されています。
つまりVDISKからの起動設定がなされたSRAMとVDISKであるVDBOOT.DATを定義しています。
VDISKのROMブート設定は"SWITCH.X BOOT=ROM$EA9000"で行いました。つまりVDISKのID0から起動になります。
その他IDから起動する場合はアドレスを$EA9000 + ID x 4で指定してください。 例えばID2から起動するなら"SWITCH.X BOOT=ROM$EA9008"となります。
サンプルで提供するVDISKのイメージは一般公開されているHUMAN302.XDFと同一になっています。追加で各種ドライバも保存しています。
起動可能なVDISKイメージの作成方法は通常のディスクとほぼ変わりません。 イメージファイルを作成しphantomx.iniに定義した後CONFIG.SYSにPXVDISK.SYSを組み込んで認識させます。
ドライブとして認識されればFORMAT ドライブ名で初期化した後、SYS ドライブ名でHUMAN.SYSを転送してください。 その後必要なモジュールを複写してください。
VDISKから起動した様子
VDISKイメージをWindows上で操作する
様々なエミュレータ用のディスクイメージをWindows上で操作することができるDiskExplorerを利用することで VDISKイメージからファイルを取り出したり、書き込んだりすることができます。 当然ながらDiskExplorerはPhantomXのVDISKイメージを正式にはサポートしていませんのでマニュアル設定で認識させる必要があります。
DiskExplorerでイメージファイルを選択した後(ManualFD)を選択してください。
次にプロファイルを手動設定します。VDISKのフォーマット情報を参考に設定してください。 代表的なサイズの情報は記載してありますのでサイズを合わせたイメージファイルで運用するとよいでしょう(スクリーンショットは1GBの例)。
正しく認識されると次の様にVDISK内のファイルが表示されます。
WindrvXMでSDカード上のファイルにアクセスする
X68000エミュレータ XM6およびXM6 TypeGを使用されている方はご存じのWindrvXM.SYSを組み込むことができます。
XM6と同様なので詳しくは説明しませんがCONFIG.SYSにWindrvXM.SYSを組み込むだけで有効になります。
正しくドライバが組み込まれた場合には割り当てられたドライブ名が表示されます(写真はドライブF)。
何も引数を指定しなければSDカードの直下がそのままマウントされます。
SDカード直下に"share"等の専用フォルダを作ってマウントすることをお勧めします。
phantomx.iniの設定項目であるWINDRVXMにデフォルト引数を設定しておくと、
CONFIG.SYSでのフォルダ指定を省略することもできます。例)
専用フォルダを複数作成してそれぞれ別のドライブとして認識させると便利ですよ。
例)SDカード直下にmovieフォルダとmusicフォルダを作ってそれぞれにドライブを割り当てる場合。
Version1.21からTimerLEDをアクセスランプとして使用するオプションを追加しました。
WindrvXMのオプション指定には様々な物がありますが未使用の'L'に割り当てています。例)上記の例にTimerLEDをアクセスランプに使用するオプションを追加する場合
BASEショップにてリロケータとベースボードを有償頒布中です。
改良版ファームウェア(20240118)
- GreenPAKの個体差を吸収するためのタイミング調整(GP1.hex)
ライセンス条項や公式頒布サイトの情報を更新(20240108)
- ホームページ全体の修正
改良版ファームウェア(20240103)
- DMACとの排他制御方式を改良(GP1.hex,GP2.hex)
- XVI専用ファームの分離(GP1_XVI.hex)
改良版ファームウェア(20231114)
- DMACとの競合調停方式を変更(GP1,GP2)
- DMACバス仕様終了時のウェイトを変更(GP1)
- ASアサートタイミングの変更(GP1)
- その他リファクタリング(GP1,GP2)
Version1.03d->1.03e(20231114)
- インライン化による軽微なチューニング
- バスエラー発生時にリトライする対象を拡大
- バスアクセスのウェイト追加で安定化
- その他小修正
改良版ファームウェア(20231016)
- KelperXのノーウェイトアクセスに対応するためデータラッチタイミングを調整しました(GP1.hexのみ更新)
Version1.03dリリース(20231014)
- RaspberryPI4用に最適化したカーネルを分離(kernel7l.img)
- PXCTLで独自キャッシュのモード(ライトスルーとライトバック)変更ができるように拡張
- PXCTLでソフトウェアリセットができるように拡張
- VDISKの非同期IO処理をオプション化(デフォルトはオン)
- 割り込み処理の改善による高速化と安定化
- メインメモリへの読み込み、書き込みエラー時のリトライ処理追加
- SRAM書き込み不許可時にバスエラーが発生しないように修正
- 拡張エリアセットのバグ修正
- 独自キャッシュのブロックサイズ調整
- その他小修正
改良版ファームウェア(20231014)
- XVI 16MHzモードが使用できない制限を解除(バスサイクルを全体調整)
- FPU拡張ボードが使用できない制限を解除(RW信号の遅延ネゲート再現)
- DMACとのネゴシエーション処理の改善と安定化
- その他マクロセル使用の最適化
2023/8/3 Version1.03cリリース
- 独自キャッシュのライトバックモードオプションの有効化(デフォルトはオフ)
- 独自キャッシュとDMACの不整合回避ロジックを強化(アレイチェイン、リンクアレイチェイン対応含む)
- 内部メモリハンドラのチューニング(スパーバイザー切替え時のファンクションコード生成等)
- エリアセット及び拡張エリアセットのロジックを内部メモリハンドラに統合
- POLYPHONのIOポートに強制ウェイトを追加 *試験実装
- その他小修正
2023/7/23 Version1.03bリリース
- リセット処理前に本体が安定するまでのウェイトを追加(リセットボタン押下時の障害回避)
- IPLROM1.6のSASI判定に誤ったデータを返却する障害を修正(SASI機でSCSIINROMを設定した時)
- バス制御サイクル短縮化のウェイト調整(ウェイト調整パラメータ追加しデフォルトを10nsから15nsに変更) *試験実装
- その他小修正
2023/7/16 Version1.03aリリース
- バス制御方式の改善によるサイクル短縮化(1サイクル相当のためメインメモリでは2割改善)
- ハイメモリの上限値を拡張(ラズパイの搭載メモリが1GB以上のモデル:最大768MB、512MBのモデル:最大384MB)
- ハイメモリを000モードでも設定可能に変更(制限解除)
- VDISKの非同期IOに対応(ラズパイがZeroを除くマルチコアのモデルの場合)
- VDISKのドライバの改良(非同期IO対応、IOサイズの拡張、チェックメディア結果のキャッシュ)
- OPMウェイト方式の変更
2023/3/12 Version1.02cリリース
- SDカードドライバを新バージョンに変更
- プリフェッチバッファの自己書き変え対策を実装
- その他小修正
2022/12/4 Version1.02bリリース
- ハイメモリ(ローカルメモリ)のデフォルト設定をオフに変更
- ハイメモリ(ローカルメモリ)を16MB単位で設定できるように変更(最大384MB)
- 疑似内蔵SCSIのデグレ修正(NetBSD対応に伴う方式変更のデグレ修正)
- SCSI(内蔵、外付け)のウェイト変更
2022/11/25 Version1.02リリース
- メモリハンドラのリファクタリング(再実装に近い)
- 全モードで8ワードプリフェッチ方式に変更
- MMU関連のバグ修正(NetBSD/x68kの起動を確認)
- メインメモリ実装量の判定方式変更
- 060turbo互換のハイメモリ(ローカルメモリ)を増量して384MBに変更
- FC2ピンカット相当のオプション追加(NetBSD/x68k上のX Window起動を確認)
- MFP USARTへのウェイト追加(キーボードフリーズ対策)
- PhantomX存在チェック追加(PXVDISK.SYS/PXCTL.X)
- その他修正多数
2022/5/29 Version1.01リリース
- FatFsのクラスタリンクテーブルを使用(高速シーク対応)
- 外部メモリハンドラのバグ修正(アドレス範囲の判定)
- VDISKアクセスパフォーマンスチューニング(ランダムアクセスの高速化)
- エミュレーションのウェイトレベルをより自然に増加するように変更
- ハイメモリ(ローカルメモリ)を060turbo互換とTS-6BE16互換から選択可
- 動作していなかったトレース割り込みを修正
- SASI機にSCSIINROMを設定した時にSASIポートを隠蔽
- OPMアクセスウェイトの実装方法変更
- 内部メモリハンドラのチューニング
- SCSI SELECT後のウェイト処理変更
- SCSI DREQのウェイト対象除外
- MIDI TSRレジスタのウェイト処理変更
2022/5/22 Version1.01rc5リリース(人柱版)
2022/5/19 Version1.01rc4リリース(人柱版)
2022/5/16 Version1.01rc3リリース(人柱版)
2022/5/12 Version1.01rc2リリース(人柱版)
2022/5/8 Version1.01rcリリース(人柱版)
2022/4/18 Version1.00bリリース(バグ修正)
2022/4/17 Version1.00リリース