(UTF-8: Japanese)

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

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

Copyright (C) 2015 ＰＩ．
version 1.61 (2015/12/23)

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

□はじめに


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

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

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



□対応プラットフォーム


(1)Windows

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

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

※version 1.10から、SDL 2.0.3をベースに独自パッチを当てた版に変更しました。
これはWindows 8.xでタッチイベントを正しく判定できない問題に対処するための
ものです。


(2)Linux

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

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

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

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


(3)Android

Android 4.0 (Ice Cream Sandwitch)以降のARMアーキテクチャまたはx86アーキテク
チャのデバイスで動作します。

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

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



□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

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


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


(3)キーボード

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

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

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

また、シフト系のキーは以下のように割り付いています。

  Caps Lock → (PC88)CAPS
  Scroll Lock → (PC88)カナ
  左Alt → (PC88)GRPH


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

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

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

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

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

タイムアウト時間は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 File Explorer""ASTRO File Manager"といったファイラーアプリでディスクイ
メージファイルを指定すると、上記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)キーボード

日本語レイアウトキーボードで、"変換""無変換""カタカナ"などの日本語変換特有
のキーは、全て機能しません。これはSDL 2.0.3の実装による制限です。


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

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


(3)インテリジェントマウス

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で行います。


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

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

原則として"Keyboard enable"と"Joystick enable"は排他で使用してください。
また、デバイスによっては初回入力が無視され（このときに内部で登録）それ以降
キーが効くものもあります。この動作は仕様です。


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

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

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


(5)Android 4.4(Kitkat)

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


(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への移植が可能と思います。興味のある方は是非チャレンジ
してください。
(EOF)
