GIMONS DEVELOPER WORKS/PhantomX

最終更新:2024/3/17

X68000 MPUアクセラレータ PhantomX
-Phantom of mc680x0 for X68000-
LOGO

告知

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 *人柱版

Version1.04b->1.20(20240302) *人柱版

Version1.03f->1.10(20240302) *安定板

Version1.03e->1.04b(20240223) *人柱版

Version1.03e->1.03f(20240223) *現時点の安定板

はじめに

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の性能に依存します。
PHANTOMX XVI ACE


ハードウェア

リロケータ

X68000のMPUであるMC68000は出荷時からソケット化されており取り外しが可能です。 ソケットはSDIP(シュリンクDIP)という1.778mmピッチのものです(最近ではあまり一般的なものではありません)。 ソケットの位置はモデル毎に異なりますがACE/EXPERT/SUPER、XVI、PROの3種に大別されます。

リロケータの役割は二つあります。一つ目はSDIPを一般的な2.54mmピッチのDIPに変換すること。 二つ目はモデル毎に異なるソケット位置を調整することです。 一つのリロケータで全モデルのソケット位置変換に対応するように設計されています。
RELOCATOR1 RELOCATOR2

ベースボード

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に供給するためのジャンパが実装してあります。
BASEBOARD1 BASEBOARD2

2024年1月以降に頒布する基板にはSLG46826Gの廉価版であるSLG46824Gを使用しています。 使用している機能範囲において性能は全く同じです。


ソフトウェア

機能構造

PhantomXのソフトウェア内の機能構成を次に示します。 可能な限りレイヤ構成を取っておりRaspberryPiに依存する部分を分離するように設計しました。 またベアメタルで動作するためRaspberryPi OSは必要ありません。
STRUCTURE

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のファームウェアで行いますのでアドレスバスや データバスの設定とバスアクセス完了後のステータスチェックとデータ取得だけを行います。

既知の問題


ファームウェア

先にも書いたとおり4つのSLG46826Gはそれぞれ大きく役割が与えられており、個別のファームウェアを書き込んであります。 ファームウェアはGreenPAK Designerで開発しています。 GreenPAK DesignerからファームウェをHEX形式でエクスポートしてSLG46826GのI2Cインターフェースを使って書き込みます。 書き込みにはRaspberryPiを使用しています。 書き込みに必要なアプリケーションも開発していますので厳重に手順を守れば後からファームウェアの更新も可能となっています。

GreenPak Designerで開発したバスアクセス制御
FIRMWARE


導入(ハードウェア)

ベースボードのジャンパ設定

ベースボードにはいくつかジャンパがあります。 設定が必要なジャンパはMPUソケットのVCC(5V)をRaspberryPiの電源に供給するためのジャンパのみです。 別途RaspberryPiに電源を供給する必要はありません(むしろ絶対に外部電源を接続しないでください)。 X68000の電力不足等を理由にRaspberryPiに外部電源を供給せざるを得ない場合はこのジャンパを必ず外してください。


BASEBOARD JUMPER



X68000 PRO(PRO2)

横置きモデルのPROは最も導入が簡単なモデルです。 ケースを外して支柱を外せばMPUソケットに直ぐにアクセスが可能です。 MPUの外し方は詳しくは説明しませんがIC引き抜き工具を利用した方がよいでしょう (ドライバー等で徐々に引き抜くことは可能ですが不慮の事故が発生する可能性があります)。 写真では既にMPUを外した状態です(下がフロント、上が拡張IOです)。 バネ式のMPUソケットが取り付けてありますが横のコンデンサとの干渉を防ぐため MPUソケットの上に丸ピン用のソケットを載せて嵩上げしています。 ソケット上のコンデンサが干渉する可能性がありますので横向きに付け替えるか、斜めに倒す必要があるかもしれません。


PRO SOCKET

リロケータはその他のモデルと共用しておりXVIに接続する時と方向が違います。 写真の方向で重ね合わせるようにリロケータ、ベースボード、RaspberryPiを実装する必要があります。


PRO BOARD PRO BOARD2

MPUソケットに実装した状態です(メインボードへの電源コネクタがギリギリです)。


PRO INSTALL



X68000 ACE/EXPERT(EXPERT2)/SUPER

縦型モデルの10MHz機です。 MPUのソケットにアクセスするためにはメインボードを取り外してシールドを除去する必要があります。 またメインボードの左下の隅にソケットがあるためMPUの引き抜きもメインボードを外した状態で行う必要があるでしょう (IC引き抜き工具推奨)。 写真はACEのメインボードで既にMPUを外した状態です。バネ式のMPUソケットが取り付けてありますが 横のコンデンサとの干渉を防ぐためMPUソケットの上に丸ピン用のソケットを載せて嵩上げしています。


ACE SOCKET

リロケータはPROと同じ方向で重ね合わせてください。


ACE BOARD ACE BOARD2

MPUソケットに実装した状態です。 ソケットがケースの下に重なっているうえ、PhantomXのコネクタが見えにくいので注意が必要です。 上からペンライト等でピンの位置を確認しながら実装してください。


ACE INSTALL



X68000 XVI

MPUのソケットにアクセスするためにはメインボードを取り外してシールドを除去する必要があります。 メインボードの中央よりの左下にソケットがあるためアクセスは比較的容易です。 MPUの引き抜きは念のためメインボードを外した状態で行ってください(IC引き抜き工具推奨)。 写真はメインボードのMPUを外した状態です。バネ式のMPUソケットが取り付けてありますが 横のコンデンサとの干渉を防ぐためMPUソケットの上に丸ピン用のソケットを載せて嵩上げしています。

10MHzモードでご利用下さい、16MHzモードを使用するには改良版ファームウェアの導入が必要です。


XVI SOCKET

リロケータとベースボード、RaspberryPiを次の方向で重ね合わせてください(PROやその他縦型モデルとは逆方向になります)。


XVI BOARD XVI BOARD2

MPUソケットに実装した状態です。ソケットの上端部分が見える位置にありますので目視でピンの位置合わせが可能です。


XVI INSTALL


導入(ソフトウェア)

ライセンス

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で全領域がフォーマットされれば成功です。
SDFORMAT SDCOMPLETE

SDカードが空の状態でPCから見えるか確認してください。

SDEMPTY


ソフトウェアのダウンロード


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に省電力用の設定がありますので必ず展開されたファイルのものを使用してください。

EXPANDFILES

全ファイルを初期化したSDカードにコピーします。

COPYFILES

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"が設定ファイルです。ダウンロードしたモジュールには以下のように記述されています。

#EMUMODEL	000
#IPLROM		IPLROM.DAT
#CGROM		CGROM.DAT
#SCSIINROM	SCSIINROM.DAT
#SRAM		SRAM.DAT

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 #2

phantomx.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のフォーマット情報を出力する例。

PXCTL.X -V 0

使用方法

X68000の電源を入れMPUソケットに電源が供給されるとRaspberryPiも起動を開始します。
PhantomXのカーネルモジュールが起動を開始するまでに数秒かかる場合があります。

MPUアクセラレータですのでこれまでと変わらずX68000としてご利用いただけます。
ただしパフォーマンスは格段に向上しているはずです。

RaspberryPi 4B(後期)を使った時のパフォーマンスです。
最新の1.2x系ではパフォーマンスが大幅に向上しており最大700MHzに相当します。

System Informationの結果
RPI4_SI
Winner2の結果
RPI4_WINNER2

RaspberryPi Zeroを使った時のパフォーマンスです。
非力なZeroですが体感的にはX68030以上のように思えます。

System Informationの結果
RPIZ_SI
Winner2の結果
RPIZ_WINNER2


応用編

新しいバージョンのIPLROMを使う

ACE/EXPERT/PRO/SUPERのIPLROMはXVIのIPLROMで拡張されたSRAM初期化(CLRキーを押しながらリセット)機能等が使用できないため不便です。 そのような悩みも設定ファイルでXVIのIPLROMに差し替えれば解決です。

SDカードに差し替えるIPLROMのデータファイルを準備して設定ファイルに指定してください。

無償公開されたXVIのIPLROMを使用する例

IPLROM		IPLROMXV.DAT

これがACEでも使えると本当に助かります
SRAM_CLEAR

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を利用する例

EMUMODEL	030
IPLROM		IPLROM30.DAT
CGROM		CGROM30.DAT
SCSIINROM	ROM30.DAT

MC68030モード
030_1

X68030だと認識されています(試験機はXVIです)
030_2

060turboの雰囲気を味わう

EMUMODELに040もしくは060が指定された場合はそれぞれMC68040、MC68060をエミュレーションします。 この時X68030で拡張されたいくつかのIOポートを内部的に偽のデバイスとして再現します。

@kamadoxさんのXEiJで生成できるROMを使用する方法を書いておきます(ありがたや~)。

1.XEiJを起動して機種を060turboに変更します
XEIJ1

2.XEIJIPLROM30.DATを生成します
XEIJ2

3.XEIJROM30.DATを生成します
XEIJ3

4.XEIJIPLROM30.DATとXEIJROM30.DATをSDカードに保存します

5.phantomx.iniでROMファイルを指定します

EMUMODEL	060
IPLROM		XEIJIPLROM30.DAT
CGROM		CGROM30.DAT
SCSIINROM	XEIJROM30.DAT

XEiJのROMで起動したMC68060モード
060turbo_1

いつものマンデルブロ
060turbo_2


X68000からPhantomXを制御する

慣れてくるとphantomx.iniに複数の定義を書いてEMUMODELを動的に切り替えたり速すぎるのでウェイトを入れたいといった操作を行いたいと思います。

そのような場合はアーカイブで提供するPXCTL.Xコマンドをご利用下さい。

何もオプションを付けずに実行すると簡単なHELPが出てきます。

PhantomX Controller
Usage: PXCTL.X [-i] [-r] [-e EMUMODEL] [-w WAIT] [-c MODE] [-f SWAP] [-v ID]
 -i print curent information and settings
 -r reset and restart emulation
 -e change emulation model, EMUMODEL is {0|3|4|6}
    0:MC68000 3:MC68030 4:MC68040 6:MC68060
 -w change emulation wait, WAIT is {0...7}
 -c change chache mode , MODE is {t|b}
    t:WRITE THROUGH b:WRITE BACK
 -f swap fdd id 0/1 <-> 2/3, SWAP is {0|1}
    0:SWAP OFF 1:SWAP ON
 -v print virtual disk information, ID is {0...7}

見ての通りなのですが

-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は次のとおり記述されています。

EMUMODEL	000
SRAM		SRAM.DAT
VDISK0		VDBOOT.DAT

つまり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から起動した様子
VDISKBOOT


VDISKイメージをWindows上で操作する

様々なエミュレータ用のディスクイメージをWindows上で操作することができるDiskExplorerを利用することで VDISKイメージからファイルを取り出したり、書き込んだりすることができます。 当然ながらDiskExplorerはPhantomXのVDISKイメージを正式にはサポートしていませんのでマニュアル設定で認識させる必要があります。

DiskExplorerでイメージファイルを選択した後(ManualFD)を選択してください。

MANUALSELECT

次にプロファイルを手動設定します。VDISKのフォーマット情報を参考に設定してください。 代表的なサイズの情報は記載してありますのでサイズを合わせたイメージファイルで運用するとよいでしょう(スクリーンショットは1GBの例)。

MANUALSETTING

正しく認識されると次の様にVDISK内のファイルが表示されます。

MANUALOPEN

WindrvXMでSDカード上のファイルにアクセスする

X68000エミュレータ XM6およびXM6 TypeGを使用されている方はご存じのWindrvXM.SYSを組み込むことができます。

XM6と同様なので詳しくは説明しませんがCONFIG.SYSにWindrvXM.SYSを組み込むだけで有効になります。

WINDRVXM_DRIVER

正しくドライバが組み込まれた場合には割り当てられたドライブ名が表示されます(写真はドライブF)。

WINDRV_BOOTMSG

何も引数を指定しなければSDカードの直下がそのままマウントされます。

WINDRV_SDLIST

SDカード直下に"share"等の専用フォルダを作ってマウントすることをお勧めします。
phantomx.iniの設定項目であるWINDRVXMにデフォルト引数を設定しておくと、
CONFIG.SYSでのフォルダ指定を省略することもできます。

例)

DEVICE = \SYS\WINDRV.SYS /share

専用フォルダを複数作成してそれぞれ別のドライブとして認識させると便利ですよ。

例)SDカード直下にmovieフォルダとmusicフォルダを作ってそれぞれにドライブを割り当てる場合。

DEVICE = \SYS\WINDRV.SYS /movie /music

Version1.21からTimerLEDをアクセスランプとして使用するオプションを追加しました。
WindrvXMのオプション指定には様々な物がありますが未使用の'L'に割り当てています。

例)上記の例にTimerLEDをアクセスランプに使用するオプションを追加する場合

DEVICE = \SYS\WINDRV.SYS /movie /music +L

リロケータとベースボードの頒布(BASEのショップページにリンク)

BASEショップにてリロケータとベースボードを有償頒布中です。

履歴

改良版ファームウェア(20240118)

ライセンス条項や公式頒布サイトの情報を更新(20240108)

改良版ファームウェア(20240103)

改良版ファームウェア(20231114)

Version1.03d->1.03e(20231114)

改良版ファームウェア(20231016)

Version1.03dリリース(20231014)

改良版ファームウェア(20231014)

2023/8/3 Version1.03cリリース

2023/7/23 Version1.03bリリース

2023/7/16 Version1.03aリリース

2023/3/12 Version1.02cリリース

2022/12/4 Version1.02bリリース

2022/11/25 Version1.02リリース

2022/5/29 Version1.01リリース

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リリース



[EOF]