目次

  1. Makefile
    1. Makefile.host
    2. Makefile.x68k
  2. XEiJ を作るときに使うファイル
    1. crc32.mac
    2. def_M.equ
    3. doscall.mac
    4. drawingmode.pl
    5. efp.gp
    6. favicon.pl
    7. Graph.pm
    8. hermite.gp
    9. iocscall.mac
    10. itob.pl
    11. itoc.pl
    12. omusubifont.s
    13. opcode.pl
    14. optdiv.pl
    15. rompat.mac
    16. rompat13.s
    17. rompat13.x
    18. rompattobytes.pl
    19. sjdump.pl
    20. stresc.mac
    21. two_pi.pl
  3. テストプログラム
    1. cir.s
    2. cir.x
    3. crtcmmtest.s
    4. crtcmmtest.x
    5. fefunctest.bas
    6. fputest.s
    7. fputest.x
    8. instructiontest.s
    9. instructiontest.x
    10. vcntest.s
    11. vcntest.x
    12. vcntest2.s
    13. vcntest2.x

1. Makefile

ホストファイルシステム を使い、同じ misc ディレクトリでホストマシンと X68000 の両方で make します。

1.1. Makefile.host

ホストマシンで使う Makefile です。efp.gp を使って fputest.s を作ります。

$ make -f Makefile.host

1.2. Makefile.x68k

X68000 で使う Makefile です。rompat13.x、omusubifont.x、cir.xfputest.xvcntest.xvcntest2.xinstructiontest.xcrtcmmtest.x を作ります。シェルは command、アセンブラは has060、リンカは lk、コンプレッサは lzx、make は make になっています。環境に応じて編集してください。

B:\>make -f Makefile.x68k

2. XEiJ を作るときに使うファイル

2.1. crc32.mac

CRC32 を計算するマクロです。

2.2. def_M.equ

ビットマップを読みやすくする定数です。

2.3. doscall.mac

DOS コールのマクロです。

2.4. drawingmode.pl

DrawingMode.java を自動生成する Perl スクリプトです。日本語の注釈を作るところから Java のコードを整形するところまで全部やっています。

2.5. efp.gp

浮動小数点演算ルーチンの定数データと fputest.s を自動生成する GP スクリプトです。

2.6. favicon.pl

ルックアンドフィールのファビコンのデータを自動生成する Perl スクリプトです。

2.7. Graph.pm

浮動小数点演算ルーチンの注釈の関数のグラフを描くライブラリです。

2.8. hermite.gp

ADPCM のエルミート補間のコードを自動生成する GP スクリプトです。

2.9. iocscall.mac

IOCS コールのマクロです。

2.10. itob.pl

~= {…} の右辺を "…".getBytes (XEiJ.ISO_8859_1) に変換する Perl スクリプトです。初期化コードが巨大化してコンパイルできなくなるのを避けます。

2.11. itoc.pl

~= {…} の右辺を "…".toCharArray () に変換する Perl スクリプトです。初期化コードが巨大化してコンパイルできなくなるのを避けます。

2.12. omusubifont.s

おむすびフォントのソースです。

2.13. opcode.pl

M68000 ファミリの命令の一覧表を作る Perl スクリプトです。コアや逆アセンブラの switch~case も出力します。

2.14. optdiv.pl

整数除算を乗算とシフトに変換する方法を表示する Perl スクリプトです。高速化のために多用しています。

$ perl misc/optdiv.pl 99999999 10000
  x/10000==x*109951163>>>40 (0<=x<=494389998) [99999999*109951163==10995116190048837]

これは 0≤x≤494389998 の範囲で整数除算の x/10000 と乗算とシフトの x*109951163>>>40 の結果が一致するという意味です。99999999/10000 は 32 ビット整数で計算できますが 99999999*109951163>>>40 は 64 ビット整数で計算する必要があるので Java のコードでは (int)(x*109951163L>>>40) のような書き方になります。

2.15. rompat.mac

rompat13.s で使うマクロです。

2.16. rompat13.s

rompat13.x のソースです。

2.17. rompat13.x

ROM 1.3 のパッチです。実行プログラムではありません。

2.18. rompattobytes.pl

rompat13.x を Java のソースに変換する Perl スクリプトです。

2.19. sjdump.pl

指定されたファイルの内容をダンプする Perl スクリプトです。Java のソースの形で出力できます。コードにバイナリデータを埋め込むときに使います。

2.20. stresc.mac

エスケープシーケンスを処理しながら文字列を展開するマクロです。CRC32 が同じ文字列は 1 回だけ展開します。

2.21. two_pi.pl

浮動小数点演算ルーチンで使う 2/pi のデータを自動生成する Perl スクリプトです。GMP を使います。sin 関数の定義域は -∞~+∞ なので通常は引数を pi/2 で割った余りを求めて - π /4~+ π /4 の範囲に移してから多項式近似で計算します。このとき 2n を pi/2 で割った余りを求めるにはおよそ n ビットの π の値が必要です。引数が浮動小数点数で指数部の範囲が限られている場合は 2/pi の値を必要なだけ定数として展開しておきます。使うときは n ビットの多倍長計算を行う必要はなくて 2/pi のデータの一部分だけを使います。

3. テストプログラム

3.1. cir.s

cir.x のソースです。

3.2. cir.x

060turbo モードのとき マザーボードコプロセッサ の CIR を読み書きするプログラムです。実機とエミュレータの両方で動かしてエミュレータのコプロセッサの動作を確認します。コプロセッサの注釈に実行例があります。

3.3. crtcmmtest.s

crtcmmtest.x のソースです。

3.4. crtcmmtest.x

CRTC のメモリモード (R20 のビット 10-8) の動作を確認するプログラムです。未公開のメモリモード 2 と、メモリモード 4 と同じ 5、6、7 もテストします。拡張グラフィックス画面 が ON のときは OFF にしてリセットしてからテストしてください。

3.5. fefunctest.bas

FE ファンクション命令 のサンプルプログラムです。

3.6. fputest.s

efp.gp で自動生成された fputest.x のソースです。

$ make -f Makefile.host fputest.s

3.7. fputest.x

特権命令を除く浮動小数点命令の動作を確認するテストプログラムです。演算結果を期待された結果 (実機の結果ではない) と比較します。

使い方

実行するにはフリーエリアが 10MB くらい必要です。

コマンドラインに何も書かないと使い方が表示されます。

B:\>fputest.x
usage: fputest.x <mnemonic or option> ...
  FABS FACOS FADD ... -- Run tests selected by the first few letters of a mnemonic.
  all -- Run all tests.
  destination=0..[1] -- Check the destination operand.
  easy -- It's the same as margin=1 nans=0.
  failed=0..[1] -- Output the results of failed tests.
  fpsp=[0]..1 -- Test the instructions processed by the software package.
  hard -- It's the same as margin=0 nans=1.
  logging=0..[1] -- Output the results to "fputest.log".
  margin=0..[1]..11 -- The acceptable margin of error in transcendental functions.
  maximum=0..[100]..1000000 -- The maximum number of results outputted for each test.
  nans=[0]..1 -- Check the mantissa of NaNs.
  status=0..[1] -- Check the status register.
  stdout=0..[1] -- Output the results to the standard output.
  successful=[0]..1 -- Output the results of successful tests.

すべてのテストを実行するときは all を指定します。結果は標準出力とログファイル fputest.log の両方に出力されます。

B:\>fputest.x all
begin: 2017-01-30T04:39:15+09:00
fpu: MC68882
option: destination easy failed fpsp=0 margin=1 maximum=100 nans=0 status successful=0
test: FABS.X FPm,FPn
score: tested=38136 failed=0(0.00%) successful=38136(100.00%)
──── 中略 ────
test: FTWOTOX.X FPm,FPn
score: tested=39576 failed=0(0.00%) successful=39576(100.00%)
total: tested=3028872 failed=0(0.00%) successful=3028872(100.00%)
end: 2017-01-30T04:40:11+09:00

超越関数は期待された結果と比較して末尾の 1 ビット (1ulp) までの誤差が許容されます。1 ビットの誤差も許さないときは hard または margin=0 を指定します。

B:\>fputest.x hard all
begin: 2017-01-30T04:40:12+09:00
fpu: MC68882
option: destination failed fpsp=0 hard margin=0 maximum=100 nans status successful=0
test: FABS.X FPm,FPn
score: tested=38136 failed=0(0.00%) successful=38136(100.00%)
──── 中略 ────
test: FTWOTOX.X FPm,FPn
score: tested=39576 failed=0(0.00%) successful=39576(100.00%)
total: tested=3028872 failed=368(0.02%) successful=3028504(99.98%)
end: 2017-01-30T04:41:13+09:00

特定の命令だけテストするときは all の代わりにニモニックの先頭の数文字を書きます。例えば fsin を指定すると FSIN、FSINCOS、FSINH がテストされます。

B:\>fputest.x fsin
begin: 2017-01-30T04:41:15+09:00
fpu: MC68882
option: destination easy failed fpsp=0 margin=1 maximum=100 nans=0 status successful=0
test: FSIN.X FPm,FPn
score: tested=46872 failed=0(0.00%) successful=46872(100.00%)
test: FSINCOS.X FPm,FPc:FPs
score: tested=46872 failed=0(0.00%) successful=46872(100.00%)
test: FSINH.X FPm,FPn
score: tested=39576 failed=0(0.00%) successful=39576(100.00%)
total: tested=133320 failed=0(0.00%) successful=133320(100.00%)
end: 2017-01-30T04:41:22+09:00

FSIN だけテストしたいときはオペレーションサイズのドットまで書きます。

B:\>fputest.x fsin.
begin: 2017-01-30T04:41:24+09:00
fpu: MC68882
option: destination easy failed fpsp=0 margin=1 maximum=100 nans=0 status successful=0
test: FSIN.X FPm,FPn
score: tested=46872 failed=0(0.00%) successful=46872(100.00%)
total: tested=46872 failed=0(0.00%) successful=46872(100.00%)
end: 2017-01-30T04:41:30+09:00

凡例

備考

XEiJ の浮動小数点数の内部表現は MC68882 と異なり、拡張精度で言うところの「指数部が 0 でない非正規化数」や「小数部が 1 の並びでない NaN」をそのままの状態でレジスタに格納することができません。そのため、FMOVECR の一部がエラーになります。

MC68882 (実機) の FCOS、FSIN、FSINCOS、FTAN は引数の絶対値が大きくなるにつれて結果が意味をなさなくなります。このことはマニュアルに書かれていて開発当時の制約では諦めるしかなかったのだと思いますが、期待された結果ではないのでエラーになります。

MC68882 (実機) の FMOVECR で読み出される ROM の値はあちこち間違っているように見えますが、実機と同じ値を返さないとエラーになります。

MC68882 (実機) の FSGLDIV、FSGLMUL はアンダーフローしたとき、不正確な結果なのに FPSR の INEX2 と INEX をセットしなかったり、0 から遠ざかる方向に丸めなければならないのに切り捨てて 0 にしてしまうことがあります。これらは期待された結果ではないのでエラーになります。

3.8. instructiontest.s

instructiontest.x のソースです。HAS060.X version 3.09+89 以上でアセンブルできます。

3.9. instructiontest.x

MPU の特権命令を除く整数命令の動作をテストします。オペランドに書かれたレジスタまたはメモリとコンディションコードの変化およびゼロ除算などの例外発生の有無が実機 (X68030 または 060turbo) と一致しているときは OK、異なるときは ERROR と表示されます。比較は引数の形式毎に行われます。内容毎ではないので、どの引数を与えたときに実機と異なる結果になったのかこのプログラムではわかりません。もちろん、あらゆる引数の組み合わせをテストしているわけではないので、OK と表示されたからといって命令の動作が間違っていないとは限りません。

テストする命令のニモニックの先頭の文字をコマンドラインで指定します。命令は空白で区切って複数指定できます。all を指定するとすべてのテストが実行されます。ニモニックの手前に easy または hard と書くことでテストのレベルを選択できます。easy はコンディションコードの未定義のビットを無視します。hard はコンディションコードの未定義のビットまで一致していなければエラーになります。デフォルトは easy です。なお、ゼロ除算が発生したときの Z と V は MC68030 で引数以外の要因で変化することがあるので hard でも無視されます。

B:\>instructiontest easy all hard all
processor:MC68060, level:easy
           instruction               expected     actual
abcd.b Dr,Dq                        $59d7dfd3   $59d7dfd3   OK      1.72s
abcd.b -(Ar),-(Aq)                  $d4e484fa   $d4e484fa   OK      3.81s
add.b Dr,Dq                         $ba2388e4   $ba2388e4   OK      5.31s
add.w Dr,Dq                         $e7fbc8a3   $e7fbc8a3   OK      2.76s
──── 中略 ────
tst.l #<data>                       $80995333   $80995333   OK      0.00s
unlk Ar                             $0b6076c4   $0b6076c4   OK      0.35s
unpk Dr,Dq,#<data>                  $4359d714   $4359d714   OK      0.67s
unpk -(Ar),-(Aq),#<data>            $5316c1a7   $5316c1a7   OK      1.18s
processor:MC68060, level:hard
           instruction               expected     actual
abcd.b Dr,Dq                        $fddca661   $fddca661   OK      1.99s
abcd.b -(Ar),-(Aq)                  $116c5546   $116c5546   OK      3.49s
chk.w (Ar),Dq                       $18ad244c   $18ad244c   OK      3.17s
chk.l (Ar),Dq                       $10d41b6b   $10d41b6b   OK      3.50s
──── 中略 ────
nbcd.b Dr                           $60ea153e   $60ea153e   OK      0.06s
nbcd.b (Ar)                         $3d33357d   $3d33357d   OK      0.06s
sbcd.b Dr,Dq                        $acce4f74   $acce4f74   OK      1.83s
sbcd.b -(Ar),-(Aq)                  $d290f440   $d290f440   OK      3.55s
tested:542, passed:542(100.00%), failed:0(0.00%)
1005.15s
B:\>

3.10. vcntest.s

vcntest.x のソースです。

3.11. vcntest.x

vcntest.pngビデオコントローラの動作を確認するためのツールです。マウスで操作します。

3.12. vcntest2.s

vcntest2.x のソースです。

3.13. vcntest2.x

vcntest2.pngビデオコントローラの注釈に書いた例を実際に試すプログラムです。キーを押すと次に進みます。「黄」の文字は黄色で、「赤」の文字は赤で表示されます。文字とその色がすべて一致していることを確認します。

SE1T

E2_XHPG

E2_XHCG

パレットは 2 赤 (偶数)、3 青、4 赤紫、5 水色

パレットは 2 赤 (奇数)、3 青、4 赤紫、5 水色