(UTF-8: Japanese)

-----------------------------------------------------------------------

eXellent Multi-platform emulator type 8 - 'XM8'
based on ePC-8801MA

Copyright (C) 2015-2018 ＰＩ．
version 1.70 (2018/01/23)

-----------------------------------------------------------------------

□はじめに


XM8は、Windows/Linux/Androidのマルチプラットフォームに対応したPC-8801MA
(PC-8801mkIISR上位互換)のエミュレータです。

仮想マシン部分は、武田俊也氏の"Common Source Project"から、PC-8801MAエミュ
レータである"ePC-8801MA"に該当する部分を武田氏の了解を頂いた上で、独自に
改良したものを使用しています。以下のURLより詳細情報を得られます。
http://takeda-toshiya.my.coocan.jp/

ビデオ・サウンド・インプットなどホストOSとのインタフェースは、SDL(Simple
Media Library) 2.0を使用しています。以下のURLより詳細情報を得られます。
http://www.libsdl.org/



□対応プラットフォーム


(1)Windows

Windows XP以降のバージョンで動作します。32bit版/64bit版双方のバイナリを
同梱しています。

実行時に必要となる SDL 2.0.7のDLLは、ライセンスに従って再配布しています。
ライセンスは"README-SDL.txt"を参照してください。


(2)Linux

Linux 2.6以降の各ディストリビューションで動作します。

基本的にソースファイルからのビルドが必要ですが、作者環境であるXUbuntu 16.04
でビルドした32bit版/64bit版のバイナリを同梱しました。

上記に近い環境であればビルドは不要で、以下の操作で実行できます。

sudo apt-get install libsdl2-2.0
chmod +x xm8
./xm8


(3)Android

Android 4.0(Ice Cream Sandwitch)以降のARMアーキテクチャまたはx86アーキテク
チャのデバイスで動作します。version 1.70以降は64bit(arm64-v8aおよびx86-64)の
ネイティブコードが含まれているため、32bit環境/64bit環境の双方で動作します。

ただしPlayストアではなくapkファイルでの配布となりますので、以下の要領で
任意のapkファイルをインストール可能に設定した後、インストールしてください。
インストール直後は設定を元に戻すことをお勧めします。

"設定"→"セキュリティ"→"提供元不明のアプリ"→
"提供元がPlayストアではないアプリのインストールを許可する"に設定

Android 6.0(Marshmallow)以降を使用している場合、XM8にストレージへのアクセス
権限を与える必要があります。初回起動時に以下のメッセージが表示されますので
"許可"を選んでください。(一度許可すれば以降は操作不要です)

"XM8に「ご利用の端末上の写真、メディア、ファイルへのアクセス」を許可しま
すか？"



□ROMファイル


Windows向けPC-88エミュレータ"M88"またはPC-98x1向けPC-88エミュレータ"P88SR"
向けのROMセットを利用します。以下の通りです。

[M88向けROMセットを利用する場合]

"N80.ROM"
"N88.ROM"
"N88_0.ROM"
"N88_1.ROM"
"N88_2.ROM"
"N88_3.ROM"
"DISK.ROM"
"KANJI1.ROM"
"KANJI2.ROM" (オプション)
"JISYO.ROM" (オプション)
"2608_BD.WAV" (オプション)
"2608_HH.WAV" (オプション)
"2608_RIM.WAV" (オプション)
"2608_SD.WAV" (オプション)
"2608_TOM.WAV" (オプション)
"2608_TOP.WAV" (オプション)

[P88SR向けROMセットを利用する場合]

"PC88.ROM"
"KANJI1.ROM"
"KANJI2.ROM" (オプション)
"JISYO.ROM" (オプション)
"2608_BD.WAV" (オプション)
"2608_HH.WAV" (オプション)
"2608_RIM.WAV" (オプション)
"2608_SD.WAV" (オプション)
"2608_TOM.WAV" (オプション)
"2608_TOP.WAV" (オプション)

PC-8801mkIISR以降のROMセットを使用可能ですが、以下の点に注意が必要です。

・PC-8801mkIISR/TR/FR/MRのROMセットを使用した場合、System Optionsでクロック
8MHzへ設定できません。実機同様の4MHz固定となります。

・2HDディスクからのブートには、PC-8801mkIIMR,PC-8801MH/MA/MA2/MC,PC-88VA/
VA2/VA3,PC-98DO/DO+といった、2HDをサポートする機種のROMセットが必要です。
これらのROMセットを使用した場合のみ、2DD/2HDモードをサポートします。


ROMファイルの配置は以下の通りです。

・Windows/Linuxは、実行ファイルと同じディレクトリに配置してください。

・ファイル名は全て大文字としてください（特にLinuxは注意してください）

・Androidは、デバイス内蔵ストレージに"XM8"というディレクトリを作成し配置し
てください。具体的なパスは端末により異なりますが、以下に例を挙げます。

/sdcard/XM8/*.ROM
/mnt/sdcard/XM8/*.ROM
/storage/sdcard0/XM8/*.ROM
/storage/emulated/0/XM8/*.ROM

いずれのプラットフォームでも必要なROMが見つからない場合はエラー画面と共にパ
スが表示されますので、それに従って配置してください。



□使い方

(1)起動

XM8を起動すると最低限必要なROMファイルが存在するかチェックし、OKであれば以
下の設定で仮想マシンをスタートさせます。

  起動モード：V2モード
  クロック  ：4MHz
  ＦＭ音源  ：OPN (YM2203)

これらは、"System Options"および"Audio Options"で変更可能です。変更すると、
いったんリセットされます（動作中の動的切り替えはできません）
設定情報はXM8の終了時に保存され、次回起動時に自動ロードされます。

リズム音源WAVファイルが存在しない場合でも、OPNA(YM2608)に設定することができ
ます。この場合リズム音源は再生されず、FM6音+SSG3音+ADPCM1音となります。


(2)ユーザI/F

XM8はPC-88の漢字ROMフォントを利用したプラットフォーム非依存のユーザI/Fを
搭載しています。以下にユーザI/Fへの入り方、戻り方を記します。


・キーボード

[F11]でユーザI/Fに入り、[ESC]で一つ上のレベルまたはユーザI/Fから抜けます。

・マウス

スクリーン右上の部分（ソフトウェアキーボードのMENU）を左クリックするか、
またはスクリーンの任意部分を右クリックするとユーザI/Fに入ります。
右クリックで一つ上のレベルまたはユーザI/Fから抜けます。

・タッチ

スクリーン右上の部分（ソフトウェアキーボードのMENU）をタップするとユーザ
I/Fに入ります。メニュー表示外の部分をタップすると一つ上のレベルまたはユー
ザI/Fから抜けます。

・ジョイスティック

ジョイスティック有効かつキーボードエミュレーション有効の場合、ボタン9～ボタ
ン11のいずれかで入ります。キーボードエミュレーション無効の場合、ボタン3～
ボタン11のいずれかで入ります。ボタン2で一つ上のレベルまたはユーザI/Fから抜
けます。

・Android

タッチ操作の他、"戻る"キーで一つ上のレベルまたはユーザI/Fから抜けます。


ユーザI/Fで出来ることは他のPC-88エミュレータと大差ありませんので、ここでは
詳述しません。

ただしversion 1.70では、Android 5.0(Lollipop)以降で外部SDカードを使用する
ためのUIを追加しました。後述の制限事項(5)を参照してください。


(3)キーボード

キーボードでサポートしている特殊操作を以下に記します。

  右Alt+Enter：全画面モード／ウィンドウモードの切り替え
  右Alt+F11  ：フルスピード／通常スピードの切り替え（Windowsのみ）

それぞれユーザI/Fからも切り替え可能です。

また、シフト系/日本語入力系のキーは以下のように割り付いています。

  Caps Lock   → (PC88)CAPS
  Scroll Lock → (PC88)カナ
  左Alt       → (PC88)GRPH
  変換        → (PC88)スペース[変換]
  無変換      → (PC88)スペース[決定]
  右Ctrl      → (PC88)全角


(4)ソフトウェアキーボード

タッチ操作のみでPC-88エミュレータを実現するため、XM8は画面上に透過表示でき
るソフトウェアキーボードを備えています。

キーボードレイアウトは12種類中から4パターンを選択できます。また半透明レベル
や一定時間操作されなかった場合のタイムアウト時間も選択可能です。

"Input Options"→"Softkey type 1"～"Softkey type 4"でパターンを設定しますが
連続する番号で同一パターンを設定した場合は1つとして扱われます。これを利用し
て、パターン数を1～4の範囲で自由に設定できます。

デフォルトの半透明レベルは96(37.5%)に設定しています。利用するアプリケーショ
ンや操作慣れの程度に応じて調整してください。

タイムアウト時間は400msから20000msの間で選択可能です。最大値である20000msに
設定した場合は無限（タイムアウトしない）動作を行います。

なお、フルキーボードレイアウトについて、CAPS/カナ/右SHIFTはロック動作を行い
ます。一度タップまたはクリックすると押し動作、もう一度タップまたはクリックす
ると離し動作となります。


(5)ステートロード・ステートセーブ

"Load State""Save State"で10種類のステートロード・セーブが可能です。これらは
ディスク毎ではなく、XM8全体で10種類となっています。

また0番はオートロード・オートセーブ用に割り当てており、XM8の終了時に0番へ自
動的にステートセーブを行い、次回起動時に0番からステートロードします。


(6)外部アプリケーションとの連携

Windows/Linuxでは、ドラッグ&ドロップによるディスクファイルの指定が可能です。

ファイルにディスクが2枚以上含まれていれば、ドライブ1に1枚目、ドライブ2に2枚
目をそれぞれセットします。1枚のみの場合はドライブ2はイジェクト状態とします。
その後、直ちにリセットします。


Androidでは拡張子"d88""D88"に対応するインテントフィルターを実装しています。
"ESファイルエクスプローラー"はこれに対応しています。(他のファイラーアプリは
未確認です)ディスクファイルを指定すると、上記Windows/Linuxと同様の動作を
行います。


(7)バッテリー動作

CPU時間の消費を抑えるため、フレームを間引いて表示する（フレームスキップ）
オプションを用意しています。"Video Options"→"No frame skip"～"3 frame skip"
の範囲で設定してください。フレームスキップすると表示動作の代わりにSleepしま
すので、その分消費電力を低減できます。

またバッテリーの残りが10%以下になると、"Battery level is too low"のメッセー
ジを表示してエミュレーション動作を強制的に停止します。11%以上、または電源の
接続で自動復帰します。

version 1.30から、バッテリー監視機能の有効化/無効化を選択可能としました。
System Options→Watch battery levelで行います。


□制限事項


(1)サンプリングレート

WindowsまたはLinuxでは、サンプリングレートを5種類(44100Hz, 48000Hz, 55467Hz,
88200Hz, 96000Hz)から選択することができます。

Androidでは、48000Hzを超えるサンプリングレート(55467Hz, 88200Hz, 96000Hz)を
使用できないため、"Audio Options"で表示されません。これはSDL 2.0.8βの実装に
よる制限です。


(2)ジョイスティック・インテリジェントマウス

XM8ではジョイスティックのみ使用できます。デフォルトではキーボードエミュレー
ションする設定になっています。同一ポートを兼用するインテリジェントマウスは
サポートしていません。

"Input Options"で、"Joystick enable"と"Joystick to keyboard"の両方を有効に
した場合のキー割り当ては次の通りです。

上方向 ：(PC88)テンキー 8
下方向 ：(PC88)テンキー 2
左方向 ：(PC88)テンキー 4
右方向 ：(PC88)テンキー 6
ボタン1：(PC88)フルキー SPACE
ボタン2：(PC88)フルキー RETURN
ボタン3：(PC88)フルキー ESC
ボタン4：(PC88)フルキー 左SHIFT
ボタン5：(PC88)フルキー Z
ボタン6：(PC88)フルキー X
ボタン7：(PC88)フルキー Y
ボタン8：(PC88)フルキー N
ボタン9～ボタン11：ユーザI/Fに入る

version 1.50から、上記割り当てをカスタマイズ可能としました。
Input Options→Joystick to keyboard mapで行います。

version 1.70から、使用しているジョイスティックのテストが行えるようにしました。
Input Options→Joystick testで行います。


(3)Android (全バージョン)

version 1.10から、"Input Options"に"Keyboard enable"を追加しました。これは
Androidでキーボードとゲームコントローラを正確に判定できないデバイスがあるこ
とに対応したものです。

"Keyboard enable"と"Joystick enable"は排他で使用することを想定していますが
キーボードデバイス、ジョイスティックデバイス双方の組み合わせによっては同時
使用も可能です。



使用端末によっては音切れが度々発生する場合があります。まずは"Audio Options"
→"Audio Buffer"の数値を300以上に上げて試してください。それでも改善されない
場合、次の2点を試したうえで微調整してください。

・機内モードに設定する
・バックグラウンドで動作中のプログラムをすべて終了させる

これで改善されるようなら、何らかの要因でCPU時間が強制的に奪われています。
"何らかの要因"は環境ごとに異なりますので、色々と試してみてください。



version 1.70では、XM8がバックグラウンドに遷移した後、再びフォアグラウンド
(前面)に戻ったときに必ずユーザーI/Fが表示される仕様に変更しました。
version 1.61以前から移行される方はご注意ください。


(4)Android 4.4(Kitkat)

Android 4.4では外部SDカードへの書き込みアクセスがOSによって制限されている
ため、外部SDカードにイメージファイルを置いて利用した場合は書き込みが行え
ません。制限を避けるには外部SDカードではなく、デバイス内蔵のストレージを利
用してください。


(5)Android 5.0以降(Lollipop, Marshmallow, Nougat, Oreo)

これらのバージョンで外部SDカードを使用するためには、ユーザがSDカードへの
アクセス権を与える必要があります。以下にその手順を記します。

Step 1:
 外部SDカードを装着、マウントしてください。

Step 2:
 XM8を起動し、"System Options"の最下段にある"Use ext.SD (on next launch)"
 にチェックを入れてください。"Choose SD Card → Select"に文言が変わります。

Step 3:
 XM8をいったん終了させ、再度起動してください。"次から開く："の画面になり
 ますので、"SDカード"をタップし、そのまま画面中央下にある"選択"をタップして
 ください。

上記操作で、外部SDカード上のイメージファイルに対し書き込みアクセスが可能です。

これ以降、Drive1/Drive2/CMTのファイル選択で内蔵ストレージのルートフォルダに
対し"../"を選ぶと外部SDのルートフォルダに遷移するようになります(逆も同様)

<注意>
Step 2の時点で外部SD上のイメージファイルを開いていた場合は、Step 3の操作後
も"読み取り専用"の内部情報が残ったままになるため、書き込みアクセス不可とな
ります。一旦イメージファイルをイジェクトし、再度開き直してください。


(6)Linux＋ジョイスティック

Linuxではジョイスティックの利用に制限があります。以下の情報を参照ください。
https://hg.libsdl.org/SDL/file/tip/docs/README-linux.md



□ライセンス


仮想マシン部分に使用している"Common Source Project"がGPLライセンスであるた
め、XM8もGPLライセンスとなります。またSDLはzlibライセンスとなっています。

詳しくは、"License"ディレクトリを参照してください。



□謝辞


武田俊也氏より仮想マシン部分の使用を快諾いただきました。お礼申し上げます。

実機チェックのため、RetroPC Foundationが管理しているレトロPC倉庫よりPC-8801
MA2を貸与いただきました。管理人の高木＠Molice氏には忙しい時間を縫って倉庫の
発掘及び動作チェックにご協力いただきました。大変ありがとうございました。

version 1.10のバージョンアップに当たっては、CHEMOOL氏より複数のデバイスでの
動作状況をレポートして頂きました。これによりWindows 8.xのタッチ動作や、And
roidのキーボード動作を改善できました。



□あとがき～version 1.00公開にあたって～

ようやくXM7(FM-7/77AV)、XM6(X68000)に続くXMシリーズ第三弾、XM8(PC-88)を公開
できました。


2012年頃より、Android向けのPC-88エミュレータを開発するという構想をあたためて
いましたが、仮想マシン部分の開発に掛かる莫大な時間を捻出できない点がネックと
なっていました。

しかし武田さんが"Common Source Project"の一環としてePC-98DOとそれからつながる
ePC-8801MAを開発され、次第に完成度が上がってきたことから、SDL 2.0と組み合わせ
Windowsで開発したePC-8801MAベースのアプリケーションをAndroidへ移行させる形で
構築することにしました。



これにより、XM8では以下の3点がポイントになっています。

(1)ホストとのインタフェースをWin32からSDLへ載せ替え
(2)プラットフォーム非依存ユーザI/F
(3)ソフトウェアキーボード


ただ(1)(2)(3)を実現して評価してみると、Windowsでは問題ないものの、Androidは
パフォーマンスの面で問題を抱えていることがわかりました。

たとえば富士通ARROWS M01(2014年12月発売、Android 4.4.2)で評価したところ、ク
ロック8MHz時の実効フレームレートは10fps～15fpsしか出ませんでした。これはあま
りにも寂しい数字ですし、バッテリー持ちの面でも非常に不利になります。
(注)実際にはARROWS M01の姉妹機である、ARROWS M305/KA4(法人向けモデル)を使用、
評価しています。

オリジナルのePC-8801MAやWindows/Linuxプラットフォームではフルフレームに近い
性能が出ていましたので、これはモバイル環境が非力というよりも、現在のPCがあ
まりに速すぎる、本当に贅沢すぎる性能を持っていると言えます。



そこで、上記(1)(2)(3)がほぼ完成した時点で、FM音源合成を含めたスケジューラの
大幅な手直しに踏み切りました。過去にX68000エミュレータXM6を開発した際、様々
な構成を研究した経緯がありましたので、その経験を活かして大きく手を入れていま
す。(Source\ePC-8801MA\vm\event.cppで#ifdef SDLで括っている部分)

これによりオリジナルが持つ厳密さや汎用性、特にサブCPUとの同期タイミングや
BEEP音の音質が犠牲になった反面、変更前と比べて3倍以上の高速化を達成でき、よ
うやくAndroidでも満足の行く性能を得ることができました。


あわせて仮想マシン部にも幾つか手を入れましたので、メモリウェイトや割り込み
タイミングに依存する部分の再現性が向上しています。

例えば、「信長の野望・武将風雲録」のオープニングでの音楽と画面の同期は、こ
れまでどのPC-88エミュレータでも再現できていなかったものと思いますが、XM8は
完全に同期できています。※クロック8MHz時のみ。実機も同様。

その他、実機(PC-8801MA2)上で独自のテストプログラムを走らせ、再現が難しいと
されるV1Sモード時の15k/24kモニタ設定によるGVRAMアクセスウェイトの違いやテキ
スト画面表示時のバス占有時間を測定し、それに近い結果になるよう調整しました。


ただ、ePC-8801MAの仮想マシン部をなるべく変更せず再利用しているため、色々な
ところで無理している部分があります。使用するROMファイルやディスクファイルに
しても、まずXM8で読み込みと解析を行い、その後に仮想マシン部でもう一度読み込
みをしていたりします。ePC-8801MAでステートセーブ・ロードにかかるファイルサ
イズが大きいため、XM8でも起動・終了にワンテンポかかる状態になっています。

こういった点は、やはり仮想マシン部を新開発しないと解決できません。いつ実現
できるかどうかは未定ですが、ゆくゆくはversion 2.00として独自の仮想マシンを
作成・内蔵したいと考えています。



□最後に


今回SDLをインタフェースとして利用したことで、SDLがサポートする他のOSへの
移植も容易に行えると思います。"common.h"の冒頭と"Platform.cpp"を改変する
程度で、Mac OS XやiOSへの移植が可能と思います。興味のある方は是非チャレンジ
してください。

(2018/01/23追記)
version 1.61の時点でiOSへのポートが行われているようです。以下のGitHubになり
ます。
https://github.com/yoshisuga/xm8-ios/
(EOF)
