PC-9801 のゲームを、インストール済みのフォルダごと Windows 11 のアプリのように動かすプレイヤーです。 GMPV3 Studio の「必要なデバイスの振る舞いと DOS ファンクションだけを自前で持つ小さな仮想 PC-98」を、 音だけでなく 画面・キーボード・マウス・ファイル まで広げたものです。
ゲームのフォルダ\
KAKYU.BAT, AI5.EXE, PLAY5.COM ... ← PC-98 のゲーム(HDD インストール済みのもの)
PC98PLAYER.EXE ← これを置く
PC98PLAYER.INI ← 設定(無ければ初回起動時に、最初に実行するファイルを選んで作ります)
PC98PLAYER.EXE をダブルクリックすると窓が開き、INI の Start= に書いたプログラムまたはバッチから動き出します。
INI の FloppyImage= には、フロッピーイメージのほかにフォルダ名も書けます(例 FloppyImage=DISK_A\)。そのフォルダの中身をそのままフロッピーのドライブとして見せるので、キーディスクのファイルを確かめるだけのゲームはイメージなしで通せます(セクタ単位の読み書きはできません)。
CD から作った ISO イメージ(.ISO)か生のデータトラック(.BIN)をゲームのフォルダに置き、INI に CDROM=GAME.ISO のように書くと、MSCDEX 付きの CD-ROM ドライブ(既定 Q:)として見せます。CD の中身をコピーしたフォルダの名前でもかまいません。CD-ROM のインストーラも Start=Q:\INSTALL.EXE で動かせます。CD-DA(音楽トラック)は、CDROM=GAME.CUE のように CUE シートで入れるか、音楽のファイル(WAV / MP3 / FLAC。ファイル名の最後の 2 桁がトラック番号)を入れたフォルダを CDDA= に書くと鳴ります。ゲームミュージック CD などの音楽 CD(トラック 1 から音楽)は、CDDA= だけを書くか CDType=AUDIO で入れられます。詳しくは取扱説明書の第一章 1-13。
ゲームのフォルダを用意するための次の 3 つの機能を、まとめて インストールアシスタント と呼びます。どれも EXE にドロップするだけで始まります。
- HDI の展開: ハードディスクイメージ(HDI / NHD / THD / HDD)をドロップすると、中身をカレントフォルダへ展開し(区画表から MS-DOS の FAT12/16 区画を探す。既にあるファイルは上書きしない)、最初に実行するファイルを選ぶだけで PC98PLAYER.INI を作ってそのまま起動します。イメージをそのまま開いて動かすことはしません。
- FDI をまとめてセットしてインストール: インストール用のフロッピーイメージ(1 枚以上)をドロップすると、フロッピーの中身が出るのでインストーラを選び、引数・フロッピー/ハードディスクのドライブ名・カレントドライブ・書き込み禁止を選んで実行します。ディスクの入れ替えは F11 の画面の「次のディスク」。終わったら起動するファイルを選んで INI を作れます。
- フロッピードライブからインストール: 実機のフロッピードライブ(A:\ など)をドロップすると同じ画面になります。入れ替えたディスクは自動で読み直します。
MS-DOS を使わず、電源を入れるとフロッピーの IPL から直接立ち上がる初期のゲーム(PC-88 からの移植など)向け。ドロップしたフロッピーイメージのどれにも MS-DOS のファイル表が無く、起動用のセクタを持つものがあれば、インストールアシスタントではなくブートモードで起動します(イメージのフォルダに Boot=FD の INI を作る)。
- 起動 ROM と同じく C0 H0 R1 から IPL を読む(MFM なら 1024 バイトを 1FC0:0000、FM/N=0 なら 512 バイトを 1FE0:0000)。BIOS(INT 18h・1Bh など)だけで動く
- ドライブは 2 台(F11 の画面で D キーで切り替え、N/P でフォルダのイメージを順に入れ替え)。ステートセーブも 2 台ぶんを覚える
- INT 1Bh は MF ビット(FM/MFM)を見て、FM のセクタを MFM では読ませない
- ROM の N88-BASIC(86) は持っていないので、ROM の領域を踏むと「このソフトをプレイするにはPC98実機またはそのROMデータを搭載した仮想マシンが必要です」と表示して終了(例: アリスソフト『ランス』は IPL のあと ROM の BASIC を呼ぶのでこの表示)
INI に MemoryEditor=1(または F11 の画面の「その他」→「M: メモリエディタ」)で、640KB のメモリを 16 進で見て直接書き換えられる別窓を開きます。「操作中はゲームを止める」のチェック、ダンプで W キーのコマンド入力(FF442299 のような 16 進のバイト列、s99/m999/l99999 の 10 進の値を選んだ番地へ書き込む)付き。ドラッグ(Shift+クリック/Shift+カーソル)で範囲を選んで W のコマンドを送ると、値の繰り返しで範囲を埋める。絞り込みサーチ付き(Search RESET(既定はゲームのメモリブロックだけが対象。シェル・常駐ドライバ・DOS の領域を除く)、値での検索 FF/FFFF/s99/m999/l99999999、(1)BYTE/(2)WORD/(4)DWORD の「増加+」「減少-」「不動=」「変動!=」)。
コードエディタ(F11 の画面の「その他」→「C: コードエディタ」、または INI に CodeEditor=1)は、「番地 値」を何行も書いておき、まとめて書き込む別窓です。接続記号が半角スペースなら「実行」を押したときに 1 回、半角 % なら「停止」を押すまで毎フレーム書き込み続けます(例 34784 3F420F00、34784%l9999)。番地を 00100-00200 のように「開始-終点」にすると、範囲を値の繰り返しで埋める。値は 16 進のバイト列か s99/m999/l99999。「実行」のたびに書き込み続けるコードは全部リセットして読み直し、今書き込み続けているコードは下の欄に一覧表示します。メモリエディタの候補の行をダブルクリックすると、その番地と半角スペースをコードエディタの末尾に書き足します。内容はゲームのフォルダの PC98PLAYER.SAV\CODES.TXT に残ります。
manual\index.html から章ごとに読めます(画像つき)。
| 章 | 内容 |
|---|---|
| 第一章 基本的な使い方 | ゲームのフォルダに EXE を置いて遊ぶ(Super Depth でのチュートリアル)。操作・ステートセーブ・INI の一覧 |
| 第二章 HDI イメージの利用 | インストールアシスタントで HDI を展開して INI を作る |
| 第三章 FDI イメージの利用 | FDI をまとめてセット/フロッピードライブからインストール |
| 第四章 トラブルシューティング集 | 症状別の対処・トレース・報告のしかた |
| 第五章 メモリエディタ | メモリの表示・書き換え、絞り込みサーチ、W キーのコマンド入力、操作中の一時停止、コードエディタ |
EXE を 1 か所に置いたまま使い回す場合は、ショートカットの「作業フォルダー」にゲームのフォルダを指定してください(作業フォルダーの PC98PLAYER.INI を読みます)。INI の Root= でゲームのフォルダを別の場所にすることもできます。
実機の ROM・フロッピー/HDD イメージ・MS-DOS 本体は 一切使いません。
| 層 | 中身 |
|---|---|
| CPU | i386 リアルモードのインタプリタ(8086/V30/286 上位互換、32bit レジスタ・386 命令込み) |
| ハードウェア | GDC(テキスト/グラフィック、200 ライン表示)、GRCG、EGC、16 色アナログパレット、8259、8253、キーボード、バスマウス、漢字 ROM ポート・外字、YM2608(OPNA)、86 ボードの PCM、MPU-PC98II(MIDI)・RS-232C の MIDI 出力、ROM のグラフィック LIO(INT A0h-AFh。画面設定・色・点・線・箱・塗りつぶし・PAINT(単色・タイル)・GGET/GPUT1。円・漢字の GPUT2 は未対応)、サウンド BIOS(INT D2h。SoundBIOS=1。音色は自前)、ブザーの音程の変化(BEEP 演奏)、386 の保護モード(GDT/LDT/IDT・32 ビットのコード。特権の検査・ページングは省略)と拡張メモリ(ExtMemMB=、INT 1Fh のブロック転送)、仮想フロッピー(D88/ベタ/FDI/NFD/SCP/HFE、実機の USB フロッピー・Greaseweazle。INT 1Bh の ID 指定読み書き・READ ID、DOS の FAT12/16 ドライブ、INT 25h/26h)、CD-ROM(ISO / CUE / BIN イメージかフォルダを MSCDEX 付きのドライブとして。読み出しだけ)と CD-DA(CUE の音楽トラック、または WAV / MP3 / FLAC のフォルダ) |
| BIOS | HLE: INT 18h(キー/CRT/グラフィック)、INT 1Ch(時計/インターバルタイマ)、IRQ1、INT 33h(マウスドライバ: カーソル表示・イベントハンドラ)、INT DCh |
| DOS | HLE: INT 21h をゲームのフォルダへ直結(ファイル・FCB・MCB メモリ管理・EXEC・常駐終了・FindFirst・SFT/List of Lists など) |
| 拡張メモリ | HLE: HIMEM.SYS(XMS 3.0) と EMM386(LIM EMS 4.0、ページフレーム D000h) |
| シェル | COMMAND.COM の代わりにバッチを解釈(ECHO/IF ERRORLEVEL/IF EXIST/GOTO/CALL/SET/PAUSE/FOR/COPY/DEL/MD/RD/REN/TYPE/DIR/VER/VOL/PROMPT/SUBST/COMMAND /C…)。プログラムから起動された COMMAND.COM は対話のシェル(プロンプト・EXIT で戻る)として動く。SUBST で作ったドライブ(SUBST E: \GAME\DATA など)も使える |
| 音 | GMPV3 Studio Core の OPNA レンダラ(ymfm)+自前合成のリズム ROM、ビープ、CD-DA(BIN / WAV / MP3 / FLAC) |
| 文字 | 漢字 ROM の代わりに Windows の MS ゴシックを必要な字だけその場で描画 |
ゲーム付属のサウンドドライバ(PMD / PLAY5 / MMD 等)はバッチどおり本当に常駐させ、ゲームはそれを呼んで鳴らします。
同梱の 設定INI作成.html をブラウザで開くと、項目を選ぶだけで INI を作って保存できます(今ある INI の読み込み・修正も可)。INI の項目を増やしたり既定値を変えたりしたら、このページの SCHEMA も合わせて直します。
[PC98PLAYER]
Start=KAKYU.BAT ; 最初に実行するプログラム/バッチ(必須)
Args= ; 引数
Scale=2 ; 表示倍率(1 で 640x400)
FullScreen=0 ; 起動時に全画面
Smooth=0 ; 拡大をなめらかに
CpuMHz=16 ; 仮想 CPU の速さ
Drive=A ; ゲームのフォルダを何ドライブに見せるか
SoundBoard=86 ; 86 / 26 / 0(なし)
SoundBIOS=0 ; 1 でサウンド BIOS(CC00h・INT D2h)を載せる(MIMPI の FM 演奏など。音色は自前)
SoundIRQ=12 ; 3 / 10 / 12 / 13
MIDI=1 ; 1 で MPU-PC98II(E0D0h)を載せ、Windows の MIDI 出力へ送る(RS-232C に送った MIDI も同じ出力へ)
MidiDevice=-1 ; MIDI の出力先(-1 = 既定)
FloppyImage= ; 起動時に入れるフロッピーイメージ(D88 / ベタ / FDI / NFD / SCP / HFE)。F11 の画面で入れ替え・取り出し
Boot= ; FD: MS-DOS を使わず FloppyDisk= のフロッピーの IPL から起動(PC-98 初期の独自形式のディスク)
FloppyDisk2= ; 2 台目のフロッピードライブに入れるディスク(Boot=FD でも MS-DOS のゲームでも)
FloppyDrive2= ; 2 台目のドライブ名(空なら 1 台目の次。例: Drive=C, FloppyDrive=A, FloppyDrive2=B)
FloppyDisk= ; FloppyImage= の別名(同じ働き。両方あれば FloppyDisk= を使う。実機のドライブやフォルダを指すとき向けの名前)
; 実機のドライブ: FDD:A(USB フロッピー)/ GW・GW:COM5(Greaseweazle。プロテクトつきの正規ディスクも読める)
FloppyWriteProtect=0 ; 1: 入れるフロッピーを必ず書き込み禁止にする(インストーラが要求することがある)
GWDrive=A ; Greaseweazle のドライブ(A / B。Shugart 接続は 0〜2)
GWRevs=3 ; Greaseweazle で 1 トラックを何回転読むか(1〜8)
FloppyDrive=B ; フロッピーのドライブ名(A〜Z。Drive=B と FloppyDrive=A で入れ替えも可)。Start=B:\INSTALL.BAT のようにも書ける
CDROM= ; CD-ROM のイメージ(.ISO / .CUE / .BIN)かフォルダ。MSCDEX 付きの CD-ROM ドライブとして見せる(読み出しだけ。.CUE なら CD-DA も鳴る)
CDDA= ; CD-DA の音楽のファイル(WAV / MP3 / FLAC)を入れたフォルダ。ファイル名の最後の 2 桁がトラック番号(track_02.mp3 → トラック 2)
CDType=AUTO ; CD の種類。AUDIO = 音楽 CD(トラック 1 から音楽。ゲームミュージック CD などを入れて遊ぶゲーム向け)、DATA = トラック 1 はデータ。AUTO は CDDA= だけ、または CDROM= のフォルダが音のファイルだけなら音楽 CD
CDDevice=MSCD001 ; CD-ROM の装置名(MSCDEX の /D:)。ゲームの起動オプションで装置名を指定するとき
CDDAVolume=100 ; CD-DA の音量(%)
CDDrive=Q ; CD-ROM のドライブ名(MSCDEX の既定と同じ Q:)。Start=Q:\INSTALL.EXE のようにも書ける
CurrentDrive= ; 起動時のカレントドライブ(空 = Start= のドライブ)
CurrentDirectory= ; 起動時のカレントディレクトリ(例 A:\NANPA\。無ければ作る)
GDCClock=2.5 ; グラフィック GDC のクロック(DIP SW 2-8)。2.5 / 5
FreeSpaceMB=96 ; ゲームのドライブの空き容量として見せる大きさ(MB)
MidiSpeedFix=100 ; MIDI の演奏速度 %(10〜1000。MPU のテンポ=クロック・トゥ・ホストだけを速める)
EMS=1 ; EMS(EMM386 相当)。EMSKB=4096 で容量。書かなければ CONFIG.SYS の NOEMS に従う
LoadDevices=1 ; 起動ドライブの CONFIG.SYS の DEVICE= のドライバ(MIDI・音楽のドライバなど)を組み込む(0 で組み込まない)
AVSDRV= ; PC-9821 の PCM ドライバ AVSDRV.SYS の代わり(INT D9h)。書かなければ CONFIG.SYS にあるときだけ。1 でいつも、0 で用意しない
XMS=1 ; XMS(HIMEM.SYS 相当)。XMSKB=8192 で容量
ExtMemMB=8 ; 拡張メモリ(1MB より上の RAM、MB)。自分で保護モードに入るゲーム向け。0 で無し
FirstMCB=0200 ; 先頭 MCB のセグメント(16 進)。空きメモリの始まり。ソフトによって調整
FakeYear= ; 2000 年問題対策: 年だけこの値にする(例 1998)
FakeDate= ; 2000 年問題対策: 起動した日をこの日付にする(例 1999/12/31)。以後は実時間で進む
Volume=100 ; 全体音量 %(0〜1000。100 超はソフトリミッタで割れを抑える。FMVolume / SSGVolume / BeepVolume / PCMVolume もあり)
MouseSpeed=100 ; マウスの速さ %
Title= ; 窓のタイトル(空ならフォルダ名)
Font=MS ゴシック ; 漢字に使うフォント
FontShift=1 ; 半角文字の左端の列を空ける(実機の ROM と同じに。MIMPI V4 の曲名の崩れ対策)
KanjiJIS=78 ; 78=PC-98 と同じ旧 JIS の並び / 83=新 JIS
ExitOnEnd=1 ; ゲーム(バッチ)が終わったら窓を閉じる
PauseInactive=0 ; 非アクティブ時に止める
MiddleRelease=1 ; 中ボタン(ホイール)クリックでマウスを放す(0 で無効)
MouseLockDisable=0 ; 1 でマウスを一切捕まえない(マウスを使わないソフト向け)/ 2 で捕まえずに、カーソルが画面の上にある間だけゲームへ送る(メモリエディタと併用するとき向け)
RhythmROM= ; 本物のリズム ROM(空・1=自動で探す / 0=内蔵の合成音 / ファイル名。無くても鳴ります)
Joystick=1 ; ゲームパッドを音源ボードのジョイスティック端子(ATARI 仕様)にあてる(0 で使わない)
JoyDevice=0 ; 0 = 最初に見つかったもの / 1〜16 = その番号
JoyDirection=JOY ; 方向の行き先: JOY / CURSOR(カーソルキー)/ TENKEY / NONE。JOY+CURSOR のように重ねられる
JoyButton1=A ; ボタン n の割り当て: A / B(トリガ)、RAPIDA / RAPIDB(連射)、キー名(RETURN・SPACE・ESC・KEYA・F1・NUM5…)、0x1C(キーコード)
JoyButton2=B ; A+RETURN のように重ねられる。NONE で無し。既定は 1=A 2=B 3=SPACE 4=RETURN
JoyDeadZone=50 ; アナログスティックの遊び %
JoyRapid=4 ; 連射の速さ(何フレームごとに切り替えるか)F11 → S(画面&サウンド設定) で、画面(倍率・なめらか・フォント)・音源ボード・MIDI(オン/オフ・出力先・割込み・演奏速度)・音量・CPU の速さなどを画面で変えて INI に保存できます(音量などはその場で反映。音源ボードや MIDI は保存時に再起動するか尋ねます。INI のコメントや並びはそのまま)。
INI を書き換えたら、F11 → R(プログラム再起動) で INI を読み直して起動し直します(PC98PLAYER を閉じずに設定を試せます。FloppyDisk= / FloppyImage= は変えたときだけ入れ替え)。
INI は Shift_JIS でも UTF-8 でも構いません。samples\ に例があります(ランス3の 2 ドライブ構成は rance3.INI、Greaseweazle で吸い出したキーディスクを使うスレイヤーズ!は slayers.INI、CD-ROM 版の ISO イメージで遊ぶ例は ed4_98cdrom.ini、CUE シートで CD-DA も鳴らす例は konpeki2pf_install.ini(インストール用)と konpeki2pf.ini(実行用))。
| Windows | PC-98 |
|---|---|
| 英数字・記号キー | 物理位置どおり(JIS 配列基準) |
| F1〜F10 | f・1〜f・10 |
| Alt | GRPH / カタカナひらがな = カナ / 変換 = XFER / 無変換 = NFER |
| Home / End | HOME CLR / HELP |
| PageDown / PageUp | ROLL UP / ROLL DOWN |
| Insert / Delete | INS / DEL |
| Pause または ScrollLock | STOP / PrintScreen = COPY |
| 窓をクリック | マウスを捕まえる(PC-98 のバスマウスとして動く) |
| F12 / 中クリック(ホイール) | マウスを放す(中クリックは MiddleRelease=0 で無効) |
| Shift+F11 | ステートセーブ(スロット選択画面) |
| F11 | ステートロード(スロット選択画面) |
| Shift+F12(押している間) | 早送り |
| Alt+Enter | 全画面の切替 |
| ゲームパッド | 音源ボードのジョイスティック(上下左右+トリガ A・B。ボタンにキーも割り当て可) |
どの場面でも、その瞬間の PC-98 まるごとを保存・復元できます(ゲーム側にセーブ機能が無くても使えます)。
- Shift+F11 で画面が暗くなり、8 個のスロットが縮小画像つきで並びます。F11 なら読み込み用の同じ画面です
- カーソルキーまたはマウスで選び、Enter / 左クリック で決定、Esc / 右クリック / F11 でやめます
- 保存済みのスロットは上書きします。空のスロットは読み込めません(その旨を表示)
- 選択画面を開いている間はゲームが止まります
- 保存先はゲームのフォルダの
PC98PLAYER.SAV\SLOT1.P98S〜SLOT8.P98S(1 個約 1.4MB)。窓を閉じても残るので、次に起動したときタイトル画面から読み込めます
保存するもの: CPU・メモリ全体・VRAM・各デバイス、常駐ドライバを含む DOS の状態(開いているファイルは位置ごと開き直す)、 バッチの実行位置、そして FM 音源チップの内部状態(鳴っている音の余韻まで)。 検証では、保存した時点から続けた映像と、読み込み後に続けた映像が 1 ビットも違わず一致しました。
PC-98 の漢字 ROM・ANK ROM を、本物の ROM も第三者のビットマップフォントも使わずに組み立てます(core/fontrom.cpp)。
| 範囲 | 作り方 |
|---|---|
| JIS 非漢字・第 1/第 2 水準、NEC 特殊文字(13 区)、NEC 選定 IBM 拡張 | MS ゴシックをそのまま描く |
| ANK 0x20-0x7E・半角カナ | MS ゴシック(0x5C は ¥) |
| ANK の 年月日時分秒円、10 区の ヰヱヮヵヶ | MS ゴシックを 幅 8 ドットに縦長で描いて半角化 |
| 10 区の半角 ガ〜ポ・ヴ | 半角カナに 濁点・半濁点を合成 |
| 11 区の半角 〔〕〈〉《》『』【】 | 全角の字形から字のある位置で 8 ドット切り出し |
| JIS 8 区・PC-98 の 11 区(半角)・12 区(全角)の罫線(U+2500〜254B の 76 字) | Unicode の字名から腕の太さ・点線を読み取り 幾何学的に描画 |
| ANK 0x80-0x9F・0xE0-0xFF(ブロック・罫線・三角・丸・斜線)、制御コード略号、矢印 | 幾何学的に描画 |
| ♠♥♦♣ | 自作ドット絵 |
| 外字(76・77 区) | RAM として保持。CG ウインドウ・ポート A9h・INT 18h AH=1Ah の書き込みを反映(ステートセーブにも含む) |
- PC-98 と同じく旧 JIS(1978)の並びで引きます(1983 年改正で入れ替わった 26 組を入れ替え)。
KanjiJIS=83で無効 - テキスト画面の 簡易グラフ(属性 bit4、モード F/F で切替: 2x4 ブロック)に対応
- テキスト VRAM の全角右半分は「直前のセルが全角の左半分だったか」で決める(実機どおり)
- 外字は 76・77 区の第 2 バイト 00h〜7Fh の 128 字ずつ(東方の得点・残機表示が使う 21h 未満も含む)
- 字形の確認:
PC98PLAYER.EXE --fontsheetでPC98FONT.BMPに一覧を書き出します
| ゲーム | Start= | 結果 |
|---|---|---|
| 下級生 | KAKYU.BAT | NMD/PLAY5 常駐 → ロゴ → 名前入力画面まで。キー・マウス操作可 |
| 同級生2 | NANPA2.BAT | FREE/AMD/PLAY5 → ロゴ(FM でジングル再生)→ メニュー → プロローグ確認まで |
| 瑠璃色の雪 | RURI.COM | MMD 常駐(MIDI=1 時は MPU-PC98II を検出、設定で MIDI 選択可)・PMDB2 常駐 → AIL ロゴ → メニュー → 本編。MIDI 選択時は MMD がクロック通知(FD)割込みで演奏 |
| 痕(Leaf, 1996) | KIZU.BAT | オープニングの月の場面で、雲を EGC(CPU 転送元・4A4h=1500h・シフトを毎フレーム変える)でプレーンごとに描いて流す |
| Dante98(ログイン ディスク&ブック) | AUTOEXEC.BAT | MUSIC.COM(FM 音源ドライバ)が「INT 48h のセグメントが 0060h なら未登録、INT 0Ah と同じなら常駐済み」で判断する。使っていない割込みベクタを実機の MS-DOS と同じ 0060:xxxx の IRET にして、常駐できるように(マニュアルの「サウンド BIOS を切り離す」はもともとその状態) |
| スレイヤーズ!(バンプレスト, 1994) | SL.BAT | マウスの割込み処理がスレーブだけ EOI し、マスタの EOI を IRR 次第で省く → マスタの IR7 が処理中のまま。PC-98 のマスタは特殊完全入れ子モードなので、その間もスレーブの割込み(音源・マウス)を通す |
| TFM version 5(INASOFT, ファイラー) | TFM.COM | ①INT 18h AH=00h の矢印キーが文字コード付き(3A0Bh など)で、AX=3A00h と比べるソフトでカーソルが動かなかった → 実機の BIOS と同じく矢印・INS・DEL などは文字コード 0。②32 ビット除算の商と余りを同じ引数で続けて呼ぶと「空回り」と誤判定し、タイマ割込みを止めたまま停止していた(「読み出し中...」のまま)→ 空回りの判定でスタックの先頭(戻り先)も比べる |
| Ray IV2(音楽&映像ソフト, 1995) | RAY.EXE | RIN.COM 常駐 → LIO の入口を ROM の表から写して GINIT → オープニング → メニュー → 曲の演奏(FM) |
| メタ女 府立メタトポロジー大学付属女子高校 SP(HDD 版) | MTJ.BAT | MACACHE(LoL から DPB の鎖を辿る)→ RFMOUSE / PCP / PCML 常駐。PCML の音声は PIT で割込み、EOI に 0A0h(回転つき)を使い、86 の A466h bit0(LR クロック)で 1 標本ずつ同期する |
| MIMPI V3.8(MIDI プレーヤー) | MIMPIV3.EXE | CANYON.MID を MIDI(MPU・RS-232C)・FM(サウンド BIOS、SoundBIOS=1)・BEEP(/I8)で演奏。画面は LIO で描く |
| LEGAM | LEGAM.EXE | PMD/MMDR 常駐 → タイトル → 新規開始 → マップ・会話・BGM(PMD)再生 |
| FLEIA | FLEIA.BAT | NA 常駐 → タイトルメニュー(テキスト VRAM の全角文字) |
| 親父王 | OYAJIO.EXE | 簡易グラフで描くシューティングの画面 |
| 東方封魔録 体験版 | GAME.BAT | ZUN.COM で 86 ボードと判定 → PMD86 → タイトル → ゲーム本編(得点・残機の外字表示) |
| 東方夢時空 お試し版 | GAME.BAT | PMD86 → タイトル → キャラ選択 → 対戦(200 ライン表示・隠し VRAM のスプライト) |
| 東方幻想郷 体験版 | GAME.BAT | PMD86 → 音源選択 → キャラ選択 → 本編(EGC・GDC スクロール・右端のタイル置き場を黒テキストで隠す) |
| 東方怪綺談 体験版 | GAME.BAT | PMD86 → 本編 → コンティニュー画面 |
実行速度は検証機で実時間の約 10 倍(描画・音込み)なので、普通の PC で余裕があります。 ステートセーブは東方幻想郷のゲーム中でも、保存時点から続けた映像と読み込み後の映像が一致することを確かめています。
- EGC を実装(公開資料の仕様から独自に実装)。ZUN のゲームは EGC で画面を描く
- 黒の文字は不透明。ZUN のゲームはテキスト画面の黒・反転の空白で、グラフィックの余白(タイルの置き場)を隠す
- DOS ワークエリア 0000:0712h(テキスト行数-1) を用意。master.lib の text_fillca などが参照する (以前は DOS のデータ領域が 0600h〜を上書きしていた)
- ONGCHK / ZUN.COM の音源判定: 86 ボードは A460h bit0 が 0 の間、拡張ポート 18Ch/18Eh が見えない(実機どおり)→ 86 と正しく判定
- バッチの
IF ERRORLEVEL==5のように=でつながった書き方を受け付ける(東方の GAME.BAT がこう書く) - INT 18h AH=42h の 200 ライン表示で、VRAM のどちらの半分を表示するかを正しく(東方夢時空は前半 200 ラインをスプライト置き場に使う)
- INT 18h AH=0Ah でテキスト属性 bit4 の意味(縦線/簡易グラフ)を切り替える(同級生2 の縦縞もこれで解消)
- 外字の第 2 バイトが 21h 未満の字(得点・残機の表示)
- PC-9801-86 の PCM(FIFO・割込み)。PMD86 は PCM の割込みフラグを見て待つので、無いと止まる
- PMD が List of Lists から SFT を辿るので、鎖を正しく終わらせた
ゲーム本体は入手せず、Internet Archive のマニュアル・資料等から要件を調べ、足りない機能を足しました。
実物での確認はできていないので、動かない場合は PC98PLAYER.INI に Trace=1 を書くと、ゲームのフォルダに PC98PLAYER.LOG(起動したプログラム・未対応の DOS ファンクションや I/O ポート)が残ります。
| ソフト | 分かったこと | 対応 |
|---|---|---|
| RPGツクール Dante98 / Dante98 II | II は 386 以上・1.6MB 以上・HIMEM.SYS を使う起動ディスク・FM 必須(26K/86/118) | XMS、マウス、OPNA |
| スタープラチナ(カスタム, 1996) | PC-9801VM 以降の 16 色・FM・右クリックで進む | FCB 系 DOS ファンクション、マウス |
| 雛鳥の囀(STUDiO B-ROOM, 1997) | FM 版と MIDI 版(SC-88 推奨)がある | MPU-PC98II(MIDI=1)、EMS/XMS |
| Steam-Heart's(GIGA, 1994) | 570KB 以上の空き・HDD では HDSH.BAT・26K FM + MPU-PC98 の MIDI・ジョイスティックは FM 音源のポート | バッチの COPY/FOR/MD 等、MPU-PC98II |
| 銀河英雄伝説 IV EX | 286 以上・HDD 必須・FM(86/26K)と MIDI(MT-32/SC-55)・独自の起動ディスクを作る | MPU-PC98II、FCB、COMMAND /C |
※ 「銀河英雄伝説 VI EX」は見つからず(VI は Windows 専用)、PC-98 の IV EX のことと判断しました。
- LIO の GCIRCLE・GPUT2・GROLL(N88-BASIC 系)。GDC の描画コマンド(直線・矩形・円弧・グラフィックキャラクタ)は対応済み
- サウンド BIOS(INT D2h)の MML 演奏などの機能(MIMPI が使う、レジスタ書き込み・発音・音色・音量だけ対応)
- ADPCM(86 ボード+ちびおと、SPB 等の ADPCM RAM)
- MPU-PC98II のインテリジェントモードの演奏機能(UART モードと、D0h 系の直接送信・問い合わせのみ対応)
- 保護モードのうち、ページング・仮想 86 モード・タスク切り替え、VCPI/DPMI(EMM386 の下で動く DOS エクステンダ)。自分で保護モードに切り替えて拡張メモリを使うソフトは動きます(
ExtMemMB=) - 256 色(PEGC)、31kHz 表示
- N88-BASIC(86)(ROM)で動くソフト(ブートモードで ROM の BASIC を呼ぶと、その旨を表示して終了)
バージョンはリリースした日付で ver 261007(2026 年 10 月 7 日)のように呼びます。EXE のプロパティの「詳細」と、F11 の画面の右下に表示されます。
各バージョンの変更点は CHANGELOG.md にあります。
- 公開ページ: https://i486.mods.jp/
- GitHub の Releases には、バージョンごとに 2 つの zip を置きます。
PC98PLAYER_<版>.zip… 実行パッケージ(PC98PLAYER.EXE・取扱説明書・設定INI作成.html・サンプル INI)。遊ぶだけならこちらPC98PLAYER_<版>_src.zip… ソースコード一式(EXE を含まない)。自分でビルドする人向け
- Releases に GitHub が自動で付ける「Source code (zip / tar.gz)」は、リポジトリの中身そのもの(
_src.zipとほぼ同じ)です。
実行パッケージ(PC98PLAYER_<版>.zip)の PC98PLAYER.EXE は、公開しているソースコード(PC98PLAYER_<版>_src.zip)と同じものから Visual Studio 2026 でビルドしたものです。
電子署名は付いていないため、ダウンロードや初回起動のときに Windows の SmartScreen が「発行元を確認できません」と警告したり、
Windows Defender などが機械学習ベースの判定(例: Trojan:Script/Wacatac.H!ml の「!ml」は機械学習による推定の印)で誤検知したりすることがあります。
PC98PLAYER はネット接続・他プロセスへの干渉・キー入力の記録などは一切しません。
- 誤検知を減らすため、EXE にはバージョン情報・アプリケーションマニフェスト(asInvoker)・アイコンを埋め込んでいます。
- 配布元(i486.mods.jp・GitHub の Releases)以外から入手した EXE は使わないでください。
- それでも警告が出る場合は、ソースコード(
PC98PLAYER_<版>_src.zip)から自分で Visual Studio でビルドするか、 Microsoft の誤検知報告(https://www.microsoft.com/wdsi/filesubmission)に提出してください。
- Visual Studio 2026:
tools\fetch_ymfm.cmdを実行 →PC98PLAYER.slnを開いてRelease|x64 - CMake:
cmake -S . -B build && cmake --build build --config Release - mingw-w64(Linux からのクロス):
build_win.sh tools/harness.cppは窓を出さずに走らせて画面(PPM)と音(WAV)を書き出す検証用(Linux)
ソースは UTF-8。MSVC では /utf-8 を指定済みです。
本体は MIT。ゲーム・ROM・フォントは一切同梱しません。FM 音源は ymfm(BSD 3-Clause, Aaron Giles)を使います。CD-DA の MP3・FLAC の展開には dr_mp3 / dr_flac(David Reid。パブリックドメイン/MIT-0。third_party/dr_libs/ に同梱)を使います。
他のエミュレータのソースコードは使っていません(EGC・PCM86・XMS/EMS・MPU なども独自実装)。
core/opna_renderer.* と core/rhythm_rom.* は GMPV3 Studio Core から流用しています。

