目次

  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. fputestdata.gp
    7. fputest.s
    8. fputest.x
    9. instructiontest.s
    10. instructiontest.x
    11. vcntest.s
    12. vcntest.x
    13. vcntest2.s
    14. vcntest2.x

1. Makefile

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

1.1. Makefile.host

ホストマシンで使う Makefile です。fputest.x のソースの fputestdata.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 を自動生成するスクリプトです。日本語の注釈を作るところから Java のコードを整形するところまで全部やっています。

2.5. efp.gp

浮動小数点演算ルーチンの定数データを作るプログラムです。PARI/GP を使います。

2.6. favicon.pl

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

2.7. Graph.pm

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

2.8. hermite.gp

ADPCM のエルミート補間のコードを作るプログラムです。PARI/GP を使います。

2.9. iocscall.mac

IOCS コールのマクロです。

2.10. itob.pl

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

2.11. itoc.pl

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

2.12. omusubifont.s

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

2.13. opcode.pl

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

2.14. optdiv.pl

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

> 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 のソースに変換するプログラムです。

2.19. sjdump.pl

ダンプツールです。Java のソースの形で出力できます。コードにバイナリデータを埋め込むときに使います。

2.20. stresc.mac

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

2.21. two_pi.pl

浮動小数点演算ルーチンで使う 2/pi のデータを作るスクリプトです。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. fputestdata.gp

fputest.x のソースの fputestdata.s を作るプログラムです。「期待された結果」を計算するために PARI/GP を使います。

3.7. fputest.s

fputest.x のソースです。

3.8. fputest.x

FPU の演算結果とステータスレジスタの変化をテストするプログラムです。期待された結果 (実機の結果ではない) と実際の結果が 1 ビットでも違うと fputest.log に出力されます。FSGLDIV と FSGLMUL は調整中。

3.9. instructiontest.s

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

3.10. 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.78s
abcd.b -(Ar),-(Aq)                  $d4e484fa   $d4e484fa   OK      3.30s
add.b Dr,Dq                         $ba2388e4   $ba2388e4   OK      4.69s
add.w Dr,Dq                         $e7fbc8a3   $e7fbc8a3   OK      2.38s
──── 中略 ────
tst.l #<data>                       $80995333   $80995333   OK      0.01s
unlk Ar                             $0b6076c4   $0b6076c4   OK      0.29s
unpk Dr,Dq,#<data>                  $4359d714   $4359d714   OK      0.58s
unpk -(Ar),-(Aq),#<data>            $5316c1a7   $5316c1a7   OK      1.09s
processor:MC68060, level:hard
           instruction               expected     actual
abcd.b Dr,Dq                        $fddca661   $fddca661   OK      1.74s
abcd.b -(Ar),-(Aq)                  $14d0b786   $14d0b786   OK      1.10s
chk.w (Ar),Dq                       $f3e31302   $f3e31302   OK      3.69s
chk.l (Ar),Dq                       $5ac878d5   $5ac878d5   OK      4.03s
──── 中略 ────
nbcd.b Dr                           $60ea153e   $60ea153e   OK      0.06s
nbcd.b (Ar)                         $3d33357d   $3d33357d   OK      0.07s
sbcd.b Dr,Dq                        $acce4f74   $acce4f74   OK      1.77s
sbcd.b -(Ar),-(Aq)                  $00f42bca   $00f42bca   OK      1.10s
tested:542, passed:542(100.00%), failed:0(0.00%)
864.18s
B:\>

3.11. vcntest.s

vcntest.x のソースです。

3.12. vcntest.x

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

3.13. vcntest2.s

vcntest2.x のソースです。

3.14. vcntest2.x

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

SE1T

E2_XHPG

E2_XHCG

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

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