作者: Makoto Kamada
ウェブページ: http://stdkmd.com/xeij/
XEiJ (X68000 Emulator in Java) は Java 言語で記述された X68000 エミュレータです。エミュレータといっても周辺回路の隅々まで実機とまったく同じものを作ろうとしているわけではなく、どちらかと言えば X68000 の新しい形を考えることを楽しんでいます。実装方法のアイデアや新しい機能を思い付いたら全体像など見えなくてもとりあえずプログラムを書き始め、詰まったらまた何か湧いてくるまで脇に置いておく、そんなことを繰り返しているのでソースコードは作りかけのところばかりですが、注釈のどれか 1 つでも誰かの役に立つことがあれば公開する意味があるかも知れないと思っています。
http://stdkmd.com/xeij/ に引っ越しました。Java コントロールパネルのセキュリティタブの例外サイトリストに http://mada.la.coocan.jp/ を登録されている場合は http://stdkmd.com/ への変更をお願いします。
ウインドウの位置、ディスクイメージファイル名、SRAM の内容などを終了時に設定ファイルに保存して次回起動時に復元します。コマンドラインから起動したときの設定ファイルは、Windows のとき %APPDATA%/XEiJ/XEiJ.ini、それ以外は ~/XEiJ.ini または ./XEiJ.ini です。Java アプレットのときは Web Storage を、Java Web Start のときは PersistenceService を使用して設定をローカルファイルに保存します。
表示モードテストのパターンテストを更新しました。背景に敷き詰められると邪魔な 0 番の番号を省き、反転を示す印は小さく、手前のスプライトを明るく、奥のスプライトとバックグラウンドを暗く表示します。
デバッガ db.x とソースコードデバッガ scd.x にある「リモートコンソールモードのとき受信バッファに溜まった入力が 1 文字置きに欠落する」というバグを回避して、入力を 1 行ずつ転送するターミナルとの相性を改善しました。
音声出力速度制御を OFF にできるようにしました。音程が不安定になるのは音が途切れるよりも気持ち悪いという人は OFF にしてください。
要求する Java SE のバージョンを 8u31 (1.8.0_31) 以上に更新しました。Java™ SE Development Kit 8, Update 31 Release Notes [www.oracle.com]
CRTC のステージを再構築しました。CRTC IRQ と V-DISP は水平フロントポーチで遷移します。ラスタブレークも一緒で H-SYNC はブレーク後数命令ないし数十命令後に遷移します。
ビデオコントローラの重ね合わせの処理を変更しました。スプライト画面とテキスト画面のどちらか代表する画面を選んでからグラフィックス画面と重ね合わせます。
表示モードテストを追加しました。CRTC やビデオコントローラなどの表示モードの確認と、任意のテストデータで動作テストを行えます。
音声モニタの出力波形は左クリックと右クリックで時間方向、Shift キーを押しながらだと振幅方向に拡大縮小します。
XEiJ は Java 言語で記述されています。最新の Java SE 実行環境があれば OS に関係なく動作し、コマンドライン、Java アプレット、Java Web Start のいずれでも起動できます。
マウスの移動距離のデータを作るときに逆アクセラレーション計算を行うことで X68000 の IOCS のマウスカーソルをホストマシンのマウスカーソルの真下に貼り付けます。さらに X68000 のマウスカーソルが表示されていてホストマシンのマウスカーソルが X68000 の画面の上にあるときはホストマシンのマウスカーソルを透明にします。これでホストマシンのマウスカーソルが X68000 の画面の上にある間だけ X68000 のマウスカーソルになり、X68000 用のマウスを使うソフトウェアをホストマシンのアプリケーションに近い感覚で操作することができます。シームレスマウスの効果は じょんぐ を見るとわかりやすいと思います。
XEiJ はリモートデバイスから ROM 起動するための仮想拡張ボードを搭載しており、ホストマシンの任意のディレクトリを Human68k の起動ドライブにすることができます。CONFIG.SYS やデバイスドライバなどの起動シーケンスに必要なファイルがすべてホストマシンのディレクトリで検索されるので、Human68k の環境を構築するためにホストマシン側から内容を操作しにくいフロッピーディスクやハードディスクのイメージファイルを作る必要がありません。イメージファイルという箱庭から開放された X68000 に慣れると、イメージファイルの中に Human68k の環境を構築するのがとても面倒なことに思えてきます。
XEiJ は動作速度に十分な余裕がないときバッファアンダーランを避けるためにサンプリングデータを引き伸ばして出力します。音程が不安定になることがありますが、音がぶつぶつ途切れるよりは耳とスピーカーに優しいかも知れません。
軽量化のため、通常は F ライン例外を経由して FLOATn.X が処理する FE ファンクションコールを XEiJ は MPU の命令として処理します。
XEiJ は X68030 モードのとき浮動小数点演算を MC68882 よりも高い精度で行い、その引数や結果を MC68882 の 80 ビット拡張精度 (仮数部 64 ビット) よりも 16 ビット多い 96 ビット拡張精度 (仮数部 80 ビット) で読み書きすることができます。MC68882 は 80 ビット拡張精度浮動小数点数を 16 ビットの予約領域を挟んで 96 ビットを消費する形でメモリに書き込みますが、XEiJ はその予約領域に 96 ビット拡張精度浮動小数点数の仮数部の末尾の 16 ビットを格納します。予約領域が $0000 になっていないのでバイナリデータを他所の環境で利用する場合は注意してください。
-l200000 20000d 00200000 fmovecr.x #$00,FP0 00200004 fmove.x FP0,$00200010 0020000C _EXIT
-g=200000 program terminated normally -d200010 20001b 00200010 4000 0000 C90F DAA2 2168 C235 @...ノ.レ「!hツ5
-g=200000 program terminated normally -d200010 20001b 00200010 4000 C4C6 C90F DAA2 2168 C234 @.トニノ.レ「!hツ4
XEiJ の音声モニタには、波形、周波数分布 (スペクトラムアナライザ)、鍵盤、音色データおよび ADPCM の状態が表示されます。
波形は OPM と PCM の合成前の波形です。左クリックまたは右クリックで時間方向を拡大縮小、Shift キーを押しながら左クリックまたは右クリックで振幅方向を拡大縮小できます。波形の狙ったところを拡大縮小させたいときは右下のボタンで更新を停止させてから行います。
スペクトラムアナライザ (FFT アナライザ) は低音域の分解能と高音域の反応速度を両立させるために周波数の範囲を 5 分割しています。また、どこが何 Hz か数字で書く代わりに周波数を下の鍵盤に合わせてあり、単純な音色ならば白鍵でも黒鍵でも鍵の中央の真上に輝線が現れます。
鍵盤はキーオンとリリースの様子を示しています。平均律で KC と KF を合わせた周波数に近い鍵が反応します。
音色データは YM2151 のレジスタの内容を MML の音色定義データのフォーマットに変換したものです。レジスタの内容をそのまま表示するよりもわかりやすいと思います。
XEiJ はプログラムカウンタのインクリメント以外の変化すなわち割り込みを含むすべての分岐の分岐元と分岐先のアドレスを直近の 65535 回までメモリ上の分岐ログに保存しています。分岐ログウィンドウを開くとプログラムカウンタの変化を遡って逆アセンブルすることができます。
プログラムフロービジュアライザは分岐ログをリアルタイムに可視化するツールです。プログラムカウンタが 16MB のアドレス空間のどこを巡回しているのかがひと目でわかり、クリックで逆アセンブルさせればそこで何をやっているのかもすぐにわかります。1 命令ずつトレースするよりもプログラムの大きな構造を把握しやすいと思います。
動作確認を Intel Core i7-3770 3.40GHz, Windows 7 Professional (64 ビット) のデスクトップ PC で行っており、デフォルトの X68000 Hybrid (16.7MHz) で男弾(オトコダマ)の高クロック機用 (背景スクロールあり、BGM あり、効果音多重再生) が鈍化テストで 75% くらいまで問題なく動作することから、プロセッサは Intel Core i7-3770 3.40GHz と比較して 4 倍くらい遅くても大丈夫だと思います。公開されている CPU ベンチマークの結果を参考にして大雑把な目安を立てると PassMark CPU Benchmarks - Single Thread Performance [www.cpubenchmark.net] のスコアが 520 あたりのマルチコアプロセッサが下限ではないかと思いますが、下限を上回っていても実際に問題なく動作するかどうかは試してみないとわかりません。
XEiJ は Java SE 実行環境の JRE 8 で動作します。GUI は Swing を使用しています。これを書いている時点で JRE 8 の最新版は JRE 8u31 (1.8.0_31) です。Java SE - Downloads | Oracle Technology Network | Oracle [www.oracle.com] で OS の種類とアーキテクチャに合った JRE の最新版をダウンロードしてインストールしてください。
XEiJ を Java アプレットとして起動するときはモダンブラウザと JRE に含まれている Java プラグインが必要です。64 ビットの OS を使用している場合は 64 ビットモードで動作するブラウザで動かすことをお勧めします。OS が 64 ビットでもブラウザが 32 ビットモードで動いていると組み込まれる Java プラグインも 32 ビット版になるため、64 ビット版のブラウザで 64 ビット版の Java プラグインを使用した場合と比較して 2~3 倍の負荷がかかり、処理が重くなってしまいます。
インターネットオプションのセキュリティタブのインターネットゾーンの「保護モードを有効にする」と詳細設定タブの「拡張保護モードを有効にする」と (もしもあれば) 「拡張保護モードで 64 ビット プロセッサを有効にする」にチェックを入れて IE を再起動すると 64 ビットモードになります。ローカルでは常に 32 ビットモードになってしまうようです。
32 ビットモードで動作します。
Windows 7/8 用 Google Chrome の 64 ビット版です。64 ビットモードで動作します。
32 ビットモードで動作します。
64 ビットモードで動作します。ローカルでは LiveConnect が動作しないため Java アプレットのサイズを変更できません。
XEiJ にはデジタル署名を付けていません。Java 7 Update 51 (7u51、2014 年 1 月 14 日公開) 以降で Java アプレットの実行がブロックされる場合は、Java コントロールパネルを開いてセキュリティタブの例外サイトリストに http://stdkmd.com/ を加えてください。参考: どうすれば例外サイト・リストを構成できますか。 [java.com]
無償公開された Human68k version 3.02 のシステムディスク [retropc.net] です。とりあえずコマンドプロンプトが表示されるところを見たい人と X-BASIC を動かしてみたい人向け。
Mitsuky さん [retropc.net] による縦スクロールシューティングゲーム 男弾(オトコダマ) [retropc.net] です。DSHELL のメニューで「◎遊ぶ(10MHz機用)」と「◎遊ぶ(高クロック機用)」を選べるようになっているので、速いマシンを持っている人は是非高クロック機用を試してみてください。スプライト管理システム XSP によって繰り出されるハードウェアの限界を超えた数のスプライトが画面狭しと飛び散ります。操作はテンキーの 2、4、6、8 またはカーソルキーで移動、X がショット、Z がボンバーです。標準キーボードの左下にあるひらがなキーの LED を点灯させておくとショットが自動連射になります。
▪男弾(オトコダマ)の説明 [retropc.net]
▪男弾(オトコダマ)のグラフィックの説明 [retropc.net]
▪男弾(オトコダマ)のディスクイメージ版の補足説明 [retropc.net]
▪男弾(オトコダマ)の 1 面攻略法 [retropc.net]
『 X68000 マシン語プログラミング』でおなじみの 村田敏幸さん [retropc.net] による麻雀ソフト じょんぐ [retropc.net] です。マウスで遊びます。音はありません。ポン、チー、カン、ロンするときは右クリック。
▪じょんぐの説明 [retropc.net]
▪じょんぐのコマンドラインリファレンス [retropc.net]
▪じょんぐのコンフィギュレーションファイルの説明 [retropc.net]
拙作の ごーじゃすリバーシ [retropc.net] です。ボードの上で石が裏返る様子を 512x512 ドット 65536 色モードのグラフィック画面でアニメーション表示させるという無茶なことをしていますが、それを除けばただのリバーシです。音はありません。
▪ごーじゃすリバーシの説明 [retropc.net]
XEiJ の使用許諾条件と両立できない条件が付されているソフトウェアのソースコードを XEiJ に取り込むことはできません。送っていただくことができるソースコードは、送ってくださった方自身が追加・修正された部分の著作権を保持していると考えて差し支えないものに限らせていただきます。
以下は Windows 7 (64 ビット) の場合です。
JDK を使用します。Java SE - Downloads | Oracle Technology Network | Oracle [www.oracle.com] から jdk-8u31-windows-x64.exe をダウンロードしてインストールします。
環境変数 Path に JDK の bin ディレクトリのパスを追加します。コントロールパネル→システム→システムの詳細設定→環境変数と進み、システム環境変数の Path を選択して編集、変数値の末尾に JDK の bin ディレクトリを追加します。このとき既存のパスを壊さないように注意します。JDK の bin ディレクトリのパスは JDK のバージョンによって異なります。
;C:\Program Files\Java\jdk1.8.0_31\bin
JDK 8 で LiveConnect を使うため、netscape/javascript/JSObject.class が jfxrt.jar ではなく plugin.jar から読み込まれるようにする必要があります。-extdirs "" を指定して jfxrt.jar を外し、代わりにクラスパスに plugin.jar と javaws.jar と deploy.jar を加えます。
>mkdir class >del /q class\*.class >javac -d class -encoding UTF-8 XEiJ.java -extdirs "" -cp "C:\Program Files\Java\jre1.8.0_31\lib\plugin.jar;C:\Program Files\Java\jre1.8.0_31\lib\javaws.jar;C:\Program Files\Java\jre1.8.0_31\lib\deploy.jar" >jar cfe XEiJ.jar XEiJ -C class . -C . IPLROM.DAT IPLROMXV.DAT IPLROMCO.DAT IPLROM30.DAT CGROM_XEiJ.DAT HUMAN.SYS COMMAND.X license_XEiJ.txt license_FSHARP.txt license_MAME.txt
$ mkdir class $ rm -f class/*.class $ javac -d class -encoding UTF-8 XEiJ.java -extdirs "" -cp "C:/Program Files/Java/jre1.8.0_31/lib/plugin.jar;C:/Program Files/Java/jre1.8.0_31/lib/javaws.jar;C:/Program Files/Java/jre1.8.0_31/lib/deploy.jar" $ jar cfe XEiJ.jar XEiJ -C class . -C . IPLROM.DAT IPLROMXV.DAT IPLROMCO.DAT IPLROM30.DAT CGROM_XEiJ.DAT HUMAN.SYS COMMAND.X license_XEiJ.txt license_FSHARP.txt license_MAME.txt
XEiJ.jar を実行します。main のクラスは jar ファイルのマニフェストに書いてあるので指定する必要はありません。パラメータで起動デバイスを指定できます。
>java -jar XEiJ.jar -boot HUMAN302.XDF
>java -jar XEiJ.jar -boot .
<object> または <applet> を使って HTML ファイルにアプレットを埋め込みます。必要なファイルをすべて jar ファイルに入れ、archive の値の XEiJ.jar の後にコンマで区切って並べます。HTML ファイルをモダンブラウザで開いて Java アプレットの実行を許可すると XEiJ が起動します。
<div>
<div style="text-align:center">
<object height="639"
id="XEiJApplet"
type="application/x-java-applet;version=1.8"
width="768">
<param name="archive" value="XEiJ.jar,HUMAN302.jar,SXWIN315.jar"/>
<param name="boxbgcolor" value="#000"/>
<param name="code" value="XEiJ$XEiJApplet.class"/>
<param name="mayscript" value="true"/>
<param name="model" value="Hybrid"/>
<param name="clock" value="EXPERT"/>
<param name="boot" value="HUMAN302.XDF"/>
<param name="fd1" value="SXWIN315.XDF"/>
<param name="sound" value="off"/>
<param name="interpolation" value="nearest"/>
Java プラグインがインストールされていないか、実行が許可されていません。
</object>
</div>
</div>
<div>
<div style="text-align:center">
<applet archive="XEiJ.jar,HUMAN302.jar,SXWIN315.jar"
code="XEiJ$XEiJApplet.class"
height="639"
id="XEiJApplet"
mayscript
width="768">
<param name="boxbgcolor" value="#000">
<param name="model" value="Hybrid">
<param name="clock" value="EXPERT">
<param name="boot" value="HUMAN302.XDF">
<param name="fd1" value="SXWIN315.XDF">
<param name="sound" value="off">
<param name="interpolation" value="nearest">
Java プラグインがインストールされていないか、実行が許可されていません。
</applet>
</div>
</div>
jnlp ファイルへのリンクをクリックすると XEiJ が起動します。Google Chrome の場合は jnlp ファイルがダウンロードされると画面下に表示されるボタンをクリックします。デフォルトのセキュリティ設定では全画面表示が使えません。
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
codebase="http://stdkmd.com/xeij/"
href="human.jnlp">
<information>
<title>Human68k version 3.02 のシステムディスク - XEiJ</title>
<vendor>XEiJ</vendor>
<homepage href="http://stdkmd.com/xeij/"/>
<description>無償公開された Human68k version 3.02 のシステムディスク です。とりあえずコマンドプロンプトが表示されるところを見たい人と X-BASIC を動かしてみたい人向け。</description>
<icon href="XEiJ.png"/>
<offline-allowed/>
</information>
<related-content href="http://retropc.net/x68000/software/sharp/human302/"/>
<resources>
<j2se version="1.8+"/>
<jar href="XEiJ.jar"/>
<jar href="HUMAN302.jar"/>
<jar href="SXWIN315.jar"/>
</resources>
<application-desc main-class="XEiJ">
<argument>-model=Hybrid</argument>
<argument>-clock=EXPERT</argument>
<argument>-boot=HUMAN302.XDF</argument>
<argument>-fd1=SXWIN315.XDF</argument>
<argument>-sound=off</argument>
<argument>-interpolation=nearest</argument>
</application-desc>
</jnlp>
--------------------------------------------------------------------------------
XEiJ License (2014-04-17)
You can use, modify and redistribute the XEiJ (X68000 Emulator in Java) if the
following conditions are met.
1. Derivatives of the XEiJ must be distributed without any pay.
2. Redistributions of the XEiJ must include those source codes necessary to
make them.
3. You must attach this text to redistributions of the XEiJ.
Copyright
Source codes and data of the XEiJ except for the following parts are
copyrighted by Makoto Kamada.
1. Freely-published basic softwares for X68000 including IPLROM.DAT, HUMAN.SYS
and so on are copyrighted by each right-holder company.
http://retropc.net/x68000/software/sharp/
2. The emulation algorithm of YM2151 is based on ym2151.c of the MAME.
http://mamedev.org/
3. The default font data is composed of several fonts designed by Keitarou
Hiraki and Num Kadoma.
http://hp.vector.co.jp/authors/VA000874/
http://www.geocities.jp/littlimi/
Disclaimer
XEiJ is provided as is. No warranty against disadvantages caused by use and/or
inability to use this software is given regardless of whether it had been able
to be foreseen.
--------------------------------------------------------------------------------
XEiJ 使用許諾条件 (2014-04-17)
XEiJ (X68000 Emulator in Java) は以下の条件で使用し、改変し、再配布することが
できます。
1. XEiJ の派生物は無償で配布されなければなりません。
2. XEiJ の再配布にはそれを make するために必要なソースコードを含めなければなり
ません。
3. XEiJ の再配布には本文書を添付しなければなりません。
著作権
XEiJ の以下を除くソースコードとデータは Makoto Kamada の著作物です。
1. IPLROM.DAT、HUMAN.SYS などを含む無償公開された X68000 用の基本的なソフトウ
ェアは権利各社の著作物です。
http://retropc.net/x68000/software/sharp/
2. YM2151 のエミュレーションアルゴリズムは MAME の ym2151.c を元にしています。
http://mamedev.org/
3. デフォルトのフォントデータは平木敬太郎氏と門真なむ氏によってデザインされた
いくつかのフォントで構成されています。
http://hp.vector.co.jp/authors/VA000874/
http://www.geocities.jp/littlimi/
免責
XEiJ は現状のまま (AS-IS) 提供されます。このソフトウェアを用いたことあるいは用
いることができなかったことで不利益が生じたとしても、それが予見可能だったかどう
かに関わらず補償されません。
--------------------------------------------------------------------------------
X68000 の基本的なソフトウェアの無償公開に尽力された権利各社およびシャープ・プロダクツ・ユーザーズ・フォーラムの方々、美しいフォントを公開されている平木敬太郎さん、門真なむさん、実行サンプルとして使わせていただいたフリーソフトウェアの作者の方々、動作報告と応援のメッセージを寄せてくださった皆さん、ありがとうございます。
Inside X68000 (桑野雅彦著)
CZ-674C サービスマニュアル (シャープ)
#1000 技術資料 (シャープ)
M68000 Family Programmer's Reference Manual (Motorola)
MC68030 ユーザーズ・マニュアル (Motorola)
MC68881/882 User's Manual (Motorola)
060ISP, 060FPSP (Motorola)
研究解説 : チェビシェフ多項式による関数近似について [repository.dl.itc.u-tokyo.ac.jp] (岡本通子著)
基礎数値解析‐偏微分方程式の数値シミュレーション技法入門‐ [www.made.gifu-u.ac.jp] (田中光宏著)
SPARC64(TM) VIIIfx Extensions 日本語版 [jp.fujitsu.com] (富士通)
サルでも分かるCORDICアルゴリズム [teamcoil.sp.u-tokai.ac.jp] (遠藤雅守さん)
MAME | Multiple Arcade Machine Emulator [mamedev.org] (Nicola Salmoria and the MAME team)
S44PLAY.X [retropc.net]
FDDEVICE.X, FLOAT2.X, FLOAT4.X, FORMAT.X, HUMAN.SYS など
いろいろ
Java Platform Standard Edition 8ドキュメント [docs.oracle.com] (Oracle)
applet、object、および embed タグの使用 [docs.oracle.com] (Oracle)
LiveConnect のサポート [docs.oracle.com] (Oracle)
LiveConnect の概要 - JavaScript | MDN [developer.mozilla.org] (Mozilla)
Java Web Start とは何ですか。また、どうやって起動しますか。 [www.java.com] (Oracle)
Java(TM) Web Start [docs.oracle.com] (Oracle)
Java Sound Technology [docs.oracle.com] (Oracle)
XM6i - クロスプラットフォーム X68000/X68030 エミュレータ [xm6i.org] (isaki さん [twitter.com]) … NetBSD/i386、NetBSD/amd64、CentOS、Mac OS X、Win32
XM6 TypeG [www.geocities.jp] (GIMONS さん [twitter.com]) … Win32、Win64
X68000エミュレータXM6 version 2.05改 [coexe.web.fc2.com] (co さん [twitter.com]) … Win32
hissorii/px68k · GitHub [github.com] (ひっそりぃさん [twitter.com]) … PSP、Android、iOS
X68000 Emulator for Macintosh:Top [www22.ocn.ne.jp] (YOH さん) … Mac OS X
XM6 [yohkai.no-ip.info] (作者は PI. さん、リンク先はよ~かいさんのミラー) … Win32
WinX68k高速版/WinX68030の部屋 [www.geocities.jp] (tamu さん) … Win32
EX68 X68000 Emulator for Windows95/98/NT/2000 [www.ksky.ne.jp] (yamama さん) … Win32
無償公開されたシャープのソフトウェア - ソフトウェアライブラリ - X68000 LIBRARY [retropc.net]
@kamadox [twitter.com]
m_kamada [at] nifty.com