X680x0 のメーカー純正のソフトウェアの不具合について、症状、発生条件、再現手順、原因、対策などをまとめました。環境を構築するときやプログラミングなどで参考になると思います。


目次

  1. Human68k の不具合
    1. サブディレクトリ内のファイルが増えたときファイルなどが壊れることがある (Human68k 2.15/3.01/3.02)
    2. エラー $000D が発生する (Human68k 2.15/3.01/3.02)
    3. リモートデバイスから起動しようとすると暴走する (Human68k 2.15/3.01/3.02)
    4. 仮想ディレクトリの展開に失敗することがある (Human68k 3.02)
    5. サブのメモリ管理を使用すると暴走することがある (Human68k 2.15/3.01/3.02)
    6. X 形式の実行ファイルのメモリアロケーションモードが一部機能していない (Human68k 2.15/3.01/3.02)
    7. リモートデバイスの chmod コマンドが機能しない (Human68k 2.15)
    8. フロッピーディスクに対する IOCTRL(19,0) が正しく動作しない (Human68k 2.15)
    9. フロッピーディスクに対する IOCTRL(19,1) が正しく動作しない (Human68k 2.15/3.01/3.02)
  2. ROM (IPL/IOCS) の不具合
    1. _MS_PATST が機能しない (ROM 1.1)
    2. _CRTMOD が指定された画面モードと異なる色数でグラフィックパレットを初期化する (ROM 1.0/1.1/1.2/1.3)
    3. _GPALET で 65536 色モードのパレットを正しく取得できない (ROM 1.0/1.1/1.2/1.3)
    4. _DMAMOVE で転送サイズが $FF00 バイトを超えていると正しく転送できない (ROM 1.0)
    5. グラフィック関係の IOCS コールがリバースモードになったままになる (ROM 1.3)
    6. 電卓を使うと実行中のプログラムが誤動作することがある (ROM 1.0/1.1/1.2/1.3)
    7. カーソルが画面の最下行にあると電卓が画面外に表示される (ROM 1.0/1.1/1.2/1.3)
    8. _VDISPST の 1 回目の割り込みのタイミングがおかしい (ROM 1.0/1.1/1.2/1.3)
    9. 起動音を鳴らすと FM 音源ドライバが誤動作することがある (ROM 1.3)
    10. _MS_LIMIT で Y 方向の範囲を 1007 までしか設定できない (ROM 1.0/1.1/1.2/1.3)
    11. _SYS_STAT のコードが間違っている (ROM 1.3)
    12. 起動メッセージの Memory Managiment Unit のスペルが間違っている (ROM 1.3)
    13. メインメモリが 9MB のとき起動時に 19MB と表示される (ROM 1.3)
    14. クロック表示ルーチンで A6 レジスタの最上位バイトが破壊される (ROM 1.3)
    15. ソフトキーボードの↑キーの袋文字が閉じていない (ROM 1.0/1.1/1.2/1.3)
    16. 特定の SCSI 機器が接続されていると起動できない (ROM 1.3)
  3. ROM デバッガ、デバッガ DB.X、ソースコードデバッガ SCD.X の不具合
    1. X68030 で ROM デバッガを有効にすると起動できない (ROM デバッガ 2.32)
    2. リモートターミナルからの入力が 1 文字置きになる (ROM デバッガ 1.0/2.32、DB.X 3.00、SCD.X 3.00/3.01)
    3. MC68030 のとき終了時に例外ベクタ $3D~$3F を復元しない (SCD.X 3.00/3.01)
    4. 例外スタックフレームの内容が正しく表示されない (SCD.X 3.00/3.01)
    5. 実効アドレスの計算で絶対ショートアドレスが符号拡張されない (ROM デバッガ 1.0)
    6. 実効アドレスの計算でインデックスレジスタの選択を間違える (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00)
    7. 実効アドレスの計算で (d8,Ar,Rn.wl)/(d8,PC,Rn.wl) の d8 が負数のとき Ar/PC がサプレスされる (ROM デバッガ 2.32、DB.X 3.00)
    8. 実効アドレスの計算でスケールファクタを掛ける代わりにスケールファクタで割る (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00)
    9. 実効アドレスの計算でオペレーションサイズが .Q/.S/.D/.X/.P のとき -(Ar) のオフセットが違う (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    10. 実効アドレスの計算でベースレジスタサプレスが反映されない (SCD.X 3.00/3.01)
    11. 実効アドレスの計算でインデックスサプレスが反映されない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    12. FDBcc/PDBcc をアセンブルすると 2 大きいディスプレースメントが出力され、逆アセンブルすると 2 小さいアドレスが表示される (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    13. FSINCOS.X FPm,FPc:FPs を正しくアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    14. FMOVE.L from/to FPcr をアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    15. FTRAPcc/FNOP/FBcc/FSAVE/FRESTORE/FBRA を正しく逆アセンブルできない (SCD.X 3.00)
    16. ビットフィールドオペランドのデータレジスタの D を小文字で書くとアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    17. FScc Dr をアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    18. PTRAPcc をアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    19. フルスクリーンモードで ST/SF を逆アセンブルするとオペランドの表示位置が左に寄る (SCD.X 3.00/3.01)
    20. PMOVE.L/PMOVEFD.L from/to TTn を逆アセンブルするとオペレーションサイズがワードになる (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    21. PFLUSH/PFLUSHS/PLOADR/PLOADW/PTESTR/PTESTW を逆アセンブルするとイミディエイトオペランドが 2 回ずつ表示される (SCD.X 3.00/3.01)
    22. STOP.B/STOP.L がエラーにならない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    23. NOP.B/NOP.W/NOP.L がエラーにならない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    24. DFC の表示が SFC の値になっている (SCD.X 3.00/3.01)
    25. 拡張子が .SYS の実行ファイルをロードできない (DB.X 3.00、SCD.X 3.00/3.01)
    26. ! コマンドでシェルを呼び出すときコンソールモードでもテキスト画面の使用状態を変更してしまう (SCD.X 3.00/3.01)
    27. 例外発生時に浮動小数点レジスタを保存するとき FSAVE/FRESTORE していない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00)
    28. X コマンドで汎用以外のレジスタ名の手前にスペースがあるとエラーになる (SCD.X 3.00/3.01)
    29. XD0.D0+2 とは書けるのに XPC.PC+2 と書くとエラーになる (SCD.X 3.00/3.01)
    30. X コマンドで汎用以外のレジスタ名と設定値の区切りの判断の仕方がおかしい (SCD.X 3.00/3.01)
    31. 環境変数 comspec のファイル名がフルパスでないとシェルを起動できない (DB.X 3.00、SCD.X 3.00/3.01)
    32. 浮動小数点数の 10 の累乗のテーブルの誤差が大きい (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    33. 確保したメモリブロックの末尾のアドレスの計算が間違っている (SCD.X 3.00/3.01)
    34. CCR の未定義ビットを操作している (ROMデバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)
    35. 「No symbol file」の意味は「シンボルファイルがない」ではなくて「シンボルがないファイル」(SCD.X 3.00/3.01)
  4. XC ライブラリの不具合
    1. IOCTRLFDCTL() が正常に動作しない (XC ライブラリ 2.00)
    2. IOCTRLRTSET() が正常に動作しない (XC ライブラリ 2.00/2.11)
  5. ASK68K.SYS の不具合
    1. SHIFT、CTRL、OPT.1 の各キーが押されたままの状態になってしまうことがある (ASK68K.SYS 3.01)
    2. ローマ字入力で L/M/R/V/W/Y を重ねて「っ」を入力できない (ASK68K.SYS 3.01/3.02)
    3. フロントプロセッサを起動すると INS キーの LED が消えてしまう (ASK68K.SYS 3.01/3.02)
    4. 機能名 ZENKAKU の機能がローマ字無変換になっている (ASK68K.SYS 3.01/3.02)
  6. X-BASIC の不具合
    1. 配列変数に定数データ列を代入できない (X-BASIC 2.02)
  7. BIND.X の不具合
    1. バインドファイルの作成に失敗することがある (BIND.X 1.00)
  8. CACHE.X の不具合
    1. キャッシュの状態を設定できないことがある
  9. CV.X の不具合
    1. .X→.R の変換で必要な警告を出さない (CV.X 2.00)
    2. 「メモリが不足です」というメッセージが表示される (CV.X 2.00)
  10. ED.X の不具合
    1. [EOF] が 2 つ表示されることがある (ED.X 1.03)
  11. FASTIO.X の不具合
    1. デバイスドライバとして登録すると正常に動作しない (FASTIO.X 1.00)
    2. デバイスドライバとして登録するとき「バッファーサイズが正しくありません」と表示されて登録できないことがある (FASTIO.X 1.00)
  12. FDDEVICE.X の不具合
    1. BPB が書き込まれていない 2HC と 2HQ の判別を間違える (FDDEVICE.X 1.00)
  13. FLOATn.X の不具合
    1. __STOD で "-#INF" が正の無限大になる (FLOAT2.X 2.02/2.03)
    2. __ECVT に #INF を 3 桁で書かせると "$00" になる (FLOAT2.X 2.02/2.03)
    3. 不適切な丸めで誤差が生じることがある (FLOAT4.X 1.02)
  14. FORMAT.X の不具合
    1. フォーマットしたフロッピーディスクから起動できない (FORMAT.X メニュー 2.30)
    2. フロッピーディスクが 1 トラック余分にフォーマットされる (FORMAT.X コマンドライン 2.20)
    3. SCSI ハードディスクの容量が実際の容量よりも 1 セクタ少なくなる (FORMAT.X メニュー 2.30/2.31)
  15. HISTORY.X の不具合
    1. ファイル名を TAB キーで補完できないことがある (HISTORY.X 1.10)
  16. SPEED.X の不具合
    1. メニュー画面でビット長を設定できないことがある (SPEED.X 2.10)
  17. 辞書メンテ.X の不具合
    1. 辞書変換や辞書マージでハングアップすることがある

1. Human68k の不具合

Human68k 2.15 は X68030 の ROM Human です。

1.1. サブディレクトリ内のファイルが増えたときファイルなどが壊れることがある (Human68k 2.15/3.01/3.02)

症状

MO やハードディスクなどの 64MB 以上のパーティションで、サブディレクトリの中のファイル数が増えたとき、パーティション内のごく一部のファイルやディレクトリが破壊されることがある。

発生条件

サブディレクトリのファイル数が増えてディレクトリ情報を記録するためのセクタを追加するとき、そのサブディレクトリがパーティション内で論理セクタ番号の上位 16 ビットが 0 以外で下位 16 ビットが 0 に近いセクタに配置されていて、直後のセクタが別のファイルやディレクトリで使用中だったとき、直後のセクタを使用していたファイルやディレクトリが破壊される。

再現手順

(0) TwentyOne.x が常駐してない環境であること。

(1) 230MB の MO を FORMAT.X でフォーマットし、217MB の領域を確保する。システムは転送しない。(ここで DRIVE.X で確認すると、「1セクタあたりのバイト数」が 1024、「データ領域の先頭セクタ番号」が 237 になっている)

(2) ルートディレクトリにサイズが 65299KB のファイルを 1 個作る。

(3) ルートディレクトリにサブディレクトリを 1 個作る。

(4) ルートディレクトリに中身が 0 の並びでサイズが 512 バイト程度のファイルを 1 個作る。

(5) (3) で作ったサブディレクトリの中に適当なファイルを 126 個作る。

(6) (3) で作ったサブディレクトリの中に 127 個目のファイルを作ると、(4) で作ったファイルの中身が破壊される。(127 個目のファイルのディレクトリ情報が (4) で作ったファイルの中に書き込まれてしまう)

原因

ディレクトリ内のファイルやサブディレクトリの数が増えてディレクトリ情報が現在使用しているセクタに入り切らなくなると、ディレクトリの延長が行われる。直後のセクタが未使用ならばそこを使うことになるが、直後のセクタが使用中だった場合は未使用のセクタを探してそこに新しいディレクトリ情報を書き込まなければならない。

ルートディレクトリの情報を書き込める領域は個々のパーティションの中で特定の場所に限られているので、ディレクトリを延長するときは必ず直後のセクタが使用される。(ルートディレクトリのための領域が一杯になったらエラー)

Human68k の中のディレクトリの延長を行うルーチンは、新しいディレクトリ情報を書き込むセクタの番号を決定する際に、ルートディレクトリかどうかの判定を「セクタ番号の下位 16 ビットがデータ領域の先頭のセクタ番号未満かどうか」で行っており、上位 16 ビットを無視してしまっている。ところが、例えば論理セクタのサイズが 1 セクタ=1024 バイトならばパーティションの先頭から 64MB 進んだ辺りに「セクタ番号の上位 16 ビットが 0 以外で下位 16 ビットがデータ領域の先頭のセクタ番号 (230MB の MO ならば 237) 未満になっている領域」が存在し、その領域内でサブディレクトリを延長しようとしたときにルートディレクトリの延長と誤認して無条件に直後のセクタに新しいディレクトリ情報を書き込んでしまうのだ。直後のセクタがファイルやディレクトリとして使用中ならば、そのデータが破壊されることになる。

対策

TwentyOne.x Ver 1.21 以降を常駐させる。TwentyOne.x がメモリ上の Human にパッチを当ててルートディレクトリかどうかの判定を「セクタ番号の下位 32 ビットがデータ領域の先頭のセクタ番号未満かどうか」に修正してくれる。

メモ

TwentyOne.x を常駐していればデータが破壊されることはなくなるが、代わりに前述の再現手順で 126 個目のファイルを書いた段階で「サブディレクトリ内の '.' と '..' のエントリが二重に記録される」という症状が出るようだ (TwentyOne.x Ver 1.36c で確認)。実害はないが、サブディレクトリの構造としては間違っていると思われる。

1.2. エラー $000D が発生する (Human68k 2.15/3.01/3.02)

症状

X68030 や Xellent30 の 030 モードで「エラー ($000D) が発生しました」という白帯のエラーメッセージが表示され、プログラムの中止を余儀なくされる。

発生条件

X68030 または Xellent30 で浮動小数点コプロセッサ (拡張ボードを除く) を装着しており、030 モード (使用中の MPU が MC68030) で、CONFIG.SYS に PROCESS= の指定があって、複数のスレッドが動作していて、少なくとも 1 つスレッドがコプロセッサ命令 (浮動小数点命令) を使用している (gcc で -m68881 スイッチを指定してコンパイルしたプログラムなど) とき。

原因

Human68k の Timer-D 割り込みによるスレッド切り替えルーチンでは MC68030 の「コプロセッサ命令途中割り込み」の存在が考慮されておらず、コプロセッサ命令の実行途中にも関わらずスレッドを切り替えてしまうことがある。コプロセッサ命令の実行途中にスレッドが切り替わると、MPU とコプロセッサの間の通信に支障をきたし、コプロセッサプロトコル違反 (エラー $000D) が発生する。

浮動小数点コプロセッサを FLOAT4.X を介してのみ使用している場合は、コプロセッサ命令がすべてスーパーバイザモードで使用されることになるのでコプロセッサ命令の実行中にスレッドが切り替わることはなく、コプロセッサプロトコル違反は発生しない。gcc で -m68881 スイッチを指定してコンパイルされたプログラムではユーザモードでコプロセッサ命令が使用されるため、そのようなプログラムを実行したときに他に動作中のスレッドがあると不具合が露顕する。

対策

ユーザモードでコプロセッサ命令を使用するプログラムを使用するときは複数のスレッドを動作させない。

1.3. リモートデバイスから起動しようとすると暴走する (Human68k 2.15/3.01/3.02)

症状

起動可能なリモートデバイスドライバを作成しても実際に起動しようとすると暴走してしまう。

原因

リクエストヘッダの領域を再利用するとき初期化コマンドを設定し直していないため。

RAM または ROM から起動したとき、Human68k は起動ドライブのデバイスドライバを初期化した後にフロッピーディスクのデバイスドライバ DISK2HD を初期化する。このときリクエストヘッダの領域を再利用するが、初期化コマンドを設定し直していない。DISK2HD などのブロックデバイスの初期化コマンドは $00 だが、リモートデバイスの初期化コマンドは $40 なので、リモートデバイスから起動すると DISK2HD に $40 というブロックデバイスには存在しないコマンドが渡されてしまう。DISK2HD はコマンドの範囲をチェックしておらず、範囲外の $40 が渡されるとジャンプテーブルから外れて暴走する。具体的には、Human68k version 3.02 の場合は $000109a4+$40*4=$00010aa4 にある命令列 MOVE.B (A6),D1;BEQ.S *+4 のコード $12166702 にジャンプする。2MB 以上積んでいれば $00166702 には RAM があり、アドレスも偶数なので即エラーとならず、スーパーバイザモードで突っ走ることになる。

対策

リモートデバイスを起動可能にするときは初期化コマンド $40 の処理でリクエストヘッダのコマンドを $00 に書き換えておく。起動デバイスの初期化コマンドは複数回呼ばれる場合があって最後の 1 回だけ書き換えれば良いのだが、毎回 $40 が設定されてから呼び出されるので毎回 $00 に書き換えても問題ない。最後に呼び出されたときに書き込んだ $00 が DISK2HD デバイスドライバの初期化コマンドとして使用される。

メモ

XEiJ (X68000 Emulator in Java) は起動可能なリモートデバイスドライバを用いてホストマシンの任意のディレクトリを Human68k の起動ドライブにすることができる。

1.4. 仮想ディレクトリの展開に失敗することがある (Human68k 3.02)

原因

仮想ディレクトリを展開して実体のドライブに移るときドライブ管理テーブルのアドレスを変更する命令のオペレーションサイズが間違っている。

1.5. サブのメモリ管理を使用すると暴走することがある (Human68k 2.15/3.01/3.02)

症状

サブのメモリ管理下で常駐したプロセスがサブのメモリ管理を開放した後に破壊されて暴走する。

発生条件

_S_PROCESS を使ってサブのメモリ管理を構築し、その内部でプログラムを常駐させ、_S_MFREE を使ってそのサブのメモリ管理を開放したとき。

原因

_S_MFREE でサブのメモリ管理を開放するとき、サブのメモリ管理下の常駐プロセスはメインのメモリ管理下に移ることになっているが、移行が正しく行われていない。具体的には、メモリ管理ポインタをサブからメインへ出る方向にだけ繋いでおり、メインからサブへ入る方向に繋いでいない。このため、サブのメモリ管理下で常駐したプロセスがメインのメモリ管理に組み込まれず、次回の_EXEC などで常駐部分が破壊される。

1.6. X 形式の実行ファイルのメモリアロケーションモードが一部機能していない (Human68k 2.15/3.01/3.02)

発生条件

メモリアロケーションモードが $01 (必要最小ブロックから確保) の X 形式の実行ファイルを起動したとき。

原因

X 形式実行ファイルのメモリアロケーションモードを確認するビットテスト命令のビット番号が間違っている。

メモ

X 形式の実行ファイルのヘッダ 4 バイト目にあるメモリアロケーションモード

$00 … 最大ブロックから確保
$01 … 必要最小ブロックから確保
$02 … 上位アドレスから確保

この機能は未公開なので不具合と言うとやや語弊があるが、コードがおかしいことは間違いない。

1.7. リモートデバイスの chmod コマンドが機能しない (Human68k 2.15)

原因

リモートデバイスに渡すコマンド番号が間違っている。

メモ

Human68k 3.01/3.02 は問題ない。

1.8. フロッピーディスクに対する IOCTRL(19,0) が正しく動作しない (Human68k 2.15)

原因

BPB のハンドルを BPB のアドレスとして参照しようとしているため。

メモ

Human68k 3.01/3.02 は問題ない。

1.9. フロッピーディスクに対する IOCTRL(19,1) が正しく動作しない (Human68k 2.15/3.01/3.02)

原因

BPB をコピーする長さと PDA とイジェクトフラグを書き込む位置が間違っている。

2. ROM (IPL/IOCS) の不具合

2.1. _MS_PATST が機能しない (ROM 1.1)

原因

パターンを定義する前に行うマウスカーソルを消す処理で、パターンを定義するマウスカーソルの番号が入っている D1 レジスタが破壊されている。D1 レジスタで指定された番号のマウスカーソルのパターンは定義されず、誤ってアドレス $00000D70 に A1 レジスタの値が書き込まれる。$00000D70 は未使用エリアなのでパターンが定義されないこと以外の問題は起こらない。

対策

1 つの IOCS コールの機能が完全に失われていることになるが、IOCS.X で修正されるので IOCS.X を組み込めば問題なく使える。HIOCS.X でも修正されている。

2.2. _CRTMOD が指定された画面モードと異なる色数でグラフィックパレットを初期化する (ROM 1.0/1.1/1.2/1.3)

症状

_CRTMOD の画面モードとグラフィック画面の色数の関係は、モード 0~7 と 16~19 が 16 色、モード 8~11 が 256 色、モード 12~15 が 65536 色と定められている。_CRTMOD を呼び出すとグラフィック画面が非表示になってグラフィックパレットが初期化され、続けて _G_CLR_ON を呼び出すとグラティックパレットが再び初期化されてグラフィック画面が表示される。このとき _CRTMOD が最初に行うグラティックパレットの初期化が間違っている。画面モードと色数が合っておらず、画面サイズが 256×256 ドットのときは 16 色、512×512 ドットのときは 256 色、それ以外は 65536 色の標準のパレットが設定されてしまう。_CRTMOD を呼び出した後 _G_CLR_ON を使わずにグラフィック画面を表示すると不具合が露見する。

原因

_CRTMOD が画面モードに応じて CRTC のレジスタを設定した後、CRTC R20 の下位バイトにある水平解像度を使ってグラフィック画面の色数を判断しようとしているため。上位バイトの同じビット位置にあるメモリモードを使おうとしてオペレーションサイズを間違えたのかも知れない。しかし、この時点ではメモリモードは画面モードに関係なく 65536 色モードになっているので、メモリモードを使っても正しい色数にならないことに変わりはない。

対策

手順通り _CRTMOD に続けて _G_CLR_ON を呼び出す。_CRTMOD が間違った色数で初期化したグラフィックパレットを _G_CLR_ON が正しい色数で初期化し直すので問題ない。

2.3. _GPALET で 65536 色モードのパレットを正しく取得できない (ROM 1.0/1.1/1.2/1.3)

原因

ディスプレースメントの記述ミス。65536 色モードのパレットを取得するとき上位 8 ビットを変換するのに下位 8 ビットのテーブルが参照されている。

対策

HIOCS.X で修正されている。

2.4. _DMAMOVE で転送サイズが $FF00 バイトを超えていると正しく転送できない (ROM 1.0)

原因

$FF00 バイト毎に行うアドレスレジスタの更新が、A1 レジスタはインクリメント、A2 レジスタはカウントしないモードに固定されてしまっているため。

対策

HIOCS.X で修正されている。

2.5. グラフィック関係の IOCS コールがリバースモードになったままになる (ROM 1.3)

発生条件

_DRAWMODE (IOCS $B0、拡張マニュアルに記述されているので未公開ではない) を、現在のモードを知るために -1 を指定して使用したとき。

原因

-1 と比較するレジスタが違う。描画モードをワークエリアに書き込むとき、本来ならば「書き込む値が -1 ならば書き込まない」とすべきところが「読み出した値が -1 ならば書き込まない」になっている。-1 を指定すると -1 が書き込まれてしまい、次回から読み出した値が -1 なので何も書き込まれなくなって、リバースモードを解除できなくなる。

対策

HIOCS.X で修正されている。

2.6. 電卓を使うと実行中のプログラムが誤動作することがある (ROM 1.0/1.1/1.2/1.3)

発生条件

_B_KEYINP/_B_KEYSNS/_DENSNS を跨いで D3 レジスタを使用しているプログラムで、電卓を使用したとき。

原因

電卓の処理で D3 レジスタが破壊されるにも関わらず、_B_KEYINP/_B_KEYSNS/_DENSNS で D3 レジスタが保護されていないため。

対策

KeyWitch.X を組み込む。

メモ

「電脳倶楽部」用テキスト閲覧装置 DSHELL の「電卓を使うとバスエラーが出る」という症状で露見した不具合。月刊電脳倶楽部 102 号 (1996 年 11 月号) の電脳道具箱にある DSHELL 3.20d の添付ドキュメントに経緯が書かれている。

2.7. カーソルが画面の最下行にあると電卓が画面外に表示される (ROM 1.0/1.1/1.2/1.3)

症状

ファンクションキーの表示が OFF でカーソルが画面の最下行にあるとき OPT.1+OPT.2 を押すと電卓が画面外に表示される。カーソルが 64 行目にあるとバスエラーが出る。

原因

電卓をカーソルの下の行に表示するときコンソールの行数を確認していないため。

メモ

060turbo の ROM は電卓がコンソールの範囲内に表示されるように電卓の Y 座標を調整している。

2.8. _VDISPST の 1 回目の割り込みのタイミングがおかしい (ROM 1.0/1.1/1.2/1.3)

症状

_VDISPST で垂直同期信号による割り込みルーチンを設定したとき、1 回目の割り込みだけ設定した割り込み間隔と関係のないタイミングで発生する。特にハードウェアリセットの後で初めて _VDISPST を使用したときは、1 回目の割り込みが発生するまでに 4 秒以上かかることがある。

原因

_VDISPST が Timer-A のカウンタを止めずに Timer-A のカウントを変更しているため。

ハードウェアリセットによって Timer-A のカウンタは 0(=256) に初期化され、IPL ROM のプログラムが Timer-A をイベントカウントモード (垂直同期信号をカウントするモード) で初期化する。つまり、起動直後から Timer-A は垂直同期信号をカウントしており、IOCS レベルで操作している限りは Timer-A のカウンタは止まることがない (割り込みを止めてもカウンタは動き続けている)。Timer-A を含む MFP のタイマは、動作中に新しいカウントを設定しても現在のカウントがオーバーフローするまでは現在のカウントを継続する仕様になっている。_VDISPST は Timer-A のカウンタを止めずに指定されたカウントを Timer-A のカウンタに設定しているので、割り込み間隔を短く設定してもその時点でカウンタが大きな値になっていると 1 回目の割り込みが発生するまでに時間がかかり、最悪の場合 4 秒以上かかることがある。逆に、_VDISPST で割り込み間隔を長く設定してもその時点でカウンタが 0 に近い値になっていると 1 回目の割り込みが早く発生してしまう。

2.9. 起動音を鳴らすと FM 音源ドライバが誤動作することがある (ROM 1.3)

原因

X68030 を $00ED0091=$01 でリセットしたとき起動音を鳴らすコードが YM2151 の TEST レジスタの LFO RESET に 1 を書き込んでそのまま放置しているため、LFO が停止した状態で組み込まれることを想定していない FM 音源ドライバが誤動作する。

対策

起動音を OFF にする。

A:\>db
-mes e8e00d 31
-mes ed0091 00    OFF
-mes e8e00d 00
-q

意図せず起動音が鳴ったときは SRAM のデータが壊れているので SRAM の初期化 を行う。

補足

X68030 の起動時に「ポーン」と響く起動音のスイッチ ($00ED0091) は C COMPILER PRO-68K ver2.1 NEW KIT の拡張マニュアルに書かれているのでいわゆる 未公開機能 ではないが、手軽に ON/OFF する方法が標準で提供されていない。030SYSpatch.x のオプション 'B' で ON にすることだけできる。参考: イカ先生さんのツイート

A:\>db
-mes e8e00d 31
-mes ed0091 01    ON
-mes e8e00d 00
-q
(リセット)

メモ

060turbo の ROM は LFO RESET を 0 に戻している。

2.10. _MS_LIMIT で Y 方向の範囲を 1007 までしか設定できない (ROM 1.0/1.1/1.2/1.3)

2.11. _SYS_STAT のコードが間違っている (ROM 1.3)

原因

X68030 の _SYS_STAT でクロックスピードを補正するために MPU の種類を確認するとき、アドレス $00000CBC の内容をバイトサイズで $01 と比較しなければならないのにワードサイズで $0001 と比較している。

メモ

やっていることは完全に間違っているのだが、$00000CBC に入っているデータが限られているので、いつも正しい結果 (と同じ結果) が返ってくる。

2.12. 起動メッセージの Memory Managiment Unit のスペルが間違っている (ROM 1.3)

メモ

Memory Management Unit。

2.13. メインメモリが 9MB のとき起動時に 19MB と表示される (ROM 1.3)

原因

10 の位の 1 を書く条件が 10MB 以上ではなくて 9MB 以上になっている。

メモ

通常はメインメモリが 9MB になることはない。

2.14. クロック表示ルーチンで A6 レジスタの最上位バイトが破壊される (ROM 1.3)

原因

LINK.W A6,#-4 で 4 バイト確保して 5 バイト書き込んでいるため、UNLK A6 で A6 レジスタの最上位バイトが復元されない。

メモ

実害はない。

2.15. ソフトキーボードの↑キーの袋文字が閉じていない (ROM 1.0/1.1/1.2/1.3)

症状

□□□□□□□□□□□□
□□□□□□□□□□□□
□□□□□■□□□□□□
□□□□■□■□□□□□
□□□■□□□■□□□□
□□■□■□■■■□□□ ←ここ
□□□□■□■□□□□□
□□□□■□■□□□□□
□□□□■□■□□□□□
□□□□■■■□□□□□
□□□□□□□□□□□□
□□□□□□□□□□□□

メモ

何らかの理由または遊び心でわざと欠けさせてあるという可能性もなくはない?

2.16. 特定の SCSI 機器が接続されていると起動できない (ROM 1.3)

原因

X680x0 の SCSI BIOS が起動時に接続されている SCSI 機器に対して起動可能な種類の装置かどうかを判断するために要求する Inquiry コマンドに不適切なパラメータが設定されているため。EVPD が 0 のときは 5 バイト以上でなければならないアロケーション長が 1 バイトになっている。不適切なパラメータを無視して 2 バイト以上のデータを返そうとする SCSI 機器が接続されていると、1 バイト転送した時点で X680x0 側はコマンドの終了待ち、SCSI 機器側は 2 バイト目の受け取り待ちの状態から先に進めなくなり、固まってしまう。

対策

該当する SCSI 機器よりも若い SCSI-ID を割り当てたハードディスクに GOVERHD.x をインストールしておく。

メモ

該当する SCSI 機器としては FDS-120 が知られている。月刊電脳倶楽部 111 号 (1997 年 8 月号) のコネクトコネクションを参照。

060turbo の ROM は _S_INQUIRY と _S_REQUEST をパディング転送にすることでハングアップしないようになっている。

3. ROM デバッガ、デバッガ DB.X、ソースコードデバッガ SCD.X の不具合

ROM デバッガ 2.32 の不具合の一部は XEiJ (X68000 Emulator in Java) で修正されています。

ソースコードデバッガ SCD.X 3.01/3.02 の不具合の多くは SCD060.X で修正されています。

3.1. X68030 で ROM デバッガを有効にすると起動できない (ROM デバッガ 2.32)

症状

X68030 で ROM デバッガ起動しようとするとリセットした直後に「エラーが発生しました。リセットしてください。」と表示されて起動できない。

発生条件

X68030 で OPT.2 キーを押しながらリセットしたとき。SWITCH.X ROMDB=ON で ROM デバッガ起動フラグをセットしてからリセットしたとき。電池切れで SRAM のデータが壊れて ROM デバッガ起動フラグがセットされてしまったとき。

原因

ワークエリアのベースアドレス $1000 を A6 レジスタに設定する前に A6 相対でワークエリアにアクセスしようとしているため。

対策

A6 レジスタに $1000 をセットしてから ROM デバッガを組み込む。あるいは CONFIG.SYS に ROMDB=ON と書いて Human68k に組み込ませる。

ROM デバッガを組み込むコード (Human68k 3.02 より抜粋)

        IOCS    _ROMVER
        cmp.l   #$12920101,d0
        bcc     1f
        jsr     $00FE0000
        bra     2f
1:      movea.l $00FF0008,a0
        cmpa.l  #$01000000,a0
        bcc     2f
        movea.l #$00001000,a6
        jsr     (a0)
2:

メモ

ROM デバッガ 1.0 は問題ない。

3.2. リモートターミナルからの入力が 1 文字置きになる (ROM デバッガ 1.0/2.32、DB.X 3.00、SCD.X 3.00/3.01)

症状

リモートターミナルでコマンドを 1 行分編集してからまとめて転送すると入力が 1 文字置きになる。

原因

デバッガの 1 文字出力ルーチンには $13 (^S) が入力されると次の入力があるまで出力を一時停止する機能があるが、$13 でなくても RS-232C の入力バッファに文字が溜まっていると 1 文字空読みしてしまう。一方、デバッガがコマンドを受け付けるときに使用する 1 行入力ルーチンはエコーバックに 1 文字出力ルーチンを使用しており、入力バッファに文字が溜まっていると 1 文字エコーバックする度に次の 1 文字が空読みされてしまう。1 行入力する間に 1 文字入力して 1 文字表示して 1 文字空読みするという処理が繰り返されるため、入力が 1 文字置きになる。

3.3. MC68030 のとき終了時に例外ベクタ $3D~$3F を復元しない (SCD.X 3.00/3.01)

原因

MC68030 のとき起動時に例外ベクタ $02~$3C を保存し、動作中に $02~$3F を書き換え、終了時に $02~$3C を復元する。例外ベクタ $3D~$3F に「unassigned, reserved」を表示してデバッガのプロンプトに戻る例外処理ルーチンのアドレスを残したままデバッガが終了してしまう。

メモ

DB.X 3.00 は問題ない。

3.4. 例外スタックフレームの内容が正しく表示されない (SCD.X 3.00/3.01)

再現手順

A:\>scd_301
X68k Source Code Debugger v3.01 Copyright 1990,91,92,93 SHARP/Hudson
-l200000 20000d
  00200000      clr.l   -(A7)
  00200002      _SUPER
  00200004      move.l  D0,(A7)
  00200006      illegal
  00200008      _SUPER
  0020000A      addq.l  #$04,A7
  0020000C      _EXIT
-g=200000
Exceptional abort by undefined instruction
Illegal stack format number
PC=00000000 USP=00108A3E ISP=00108A36 MSP=0010A242 SR=0000 X:0  N:0  Z:0  V:0  C:0
SFC=0 DFC=0 VBR=00000000 CACR=00000000 CAAR=00000000
D  00008364 00000000 00000000 00000000  00000000 00000000 00000000 00000000
A  00000000 00000000 00000000 00000000  00000000 00000000 00000000 00108A3E
cmp2.b  $00000203(PC),D0                ;00000203(byte $70)
-q
A:\>scd060
X68k Source Code Debugger v3.01+12 Copyright 1990,91,92,93 SHARP/Hudson
*** Changed for 68040/68060 (1998.11.27) by M.Kamada ***
-l200000 20000d
  00200000      clr.l   -(A7)
  00200002      DOS     _SUPER
  00200004      move.l  D0,(A7)
  00200006      illegal
  00200008      DOS     _SUPER
  0020000A      addq.l  #$04,A7
  0020000C      DOS     _EXIT
-g=200000
Exceptional abort by undefined instruction
 at 00200006, SR=2000
  00200006      illegal

PC=00200006 USP=00112F82 ISP=00112F82 MSP=0010A242 SR=2000 X:0  N:0  Z:0  V:0  C:0
HI:1 LS:0 CC(HS):1 CS(LO):0 NE:1 EQ:0 VC:1 VS:0 PL:1 MI:0 GE:1 LT:0 GT:1 LE:0
SFC=0 DFC=0 VBR=00000000 CACR=00000000 CAAR=00000000
D  00008364 00000000 00000000 00000000  00000000 00000000 00000000 00000000
A  00000000 00000000 00000000 00000000  00000000 00000000 00000000 00112F82
illegal
-q

原因

デバッグ中のプログラムが SCD.X が与えたユーザスタックエリアをそのままスーパーバイザスタックエリアとして使用していると、例外が発生したときにその例外スタックフレームが SCD.X 自身によって破壊されてしまうため。

メモ

DB.X 3.00 は問題ない。

3.5. 実効アドレスの計算で絶対ショートアドレスが符号拡張されない (ROM デバッガ 1.0)

再現手順

ROM debugger Ver 1.0
Copyright Hudson soft 1987

        NMI break at 000A1134
PC=000A1134 USP=0006F1F8 SSP=0000829E SR=2004 X:0  N:0  Z:1  V:0  C:0
D  00000006 00000018 00513800 00000000  00076600 00000000 00000000 00000005
A  000A1134 000756E2 0008A2E2 00089C34  00089533 00088900 000082E0 0000829E
cmpi.b  #$FE,$0001(A6)          ;000082E1(FE)
+b0 85ac
+g

        break at 000085AC
PC=000085AC USP=0006F1F8 SSP=000082C8 SR=2010 X:1  N:0  Z:0  V:0  C:0
D  0000FFFF 00000000 00513800 00000000  00076600 00000000 00000000 00000005
A  00089928 000756E2 0008A2E2 00089C34  00089533 0008934E 000082DA 000082C8
tst.b   $0CBC.w         ;FFFF0CBC(??)
+bc0
+g

原因

絶対ショートアドレスを D0 レジスタに読み出すとき符号拡張しておらず、上位ワードにゴミが入っている。イチ拡張されたように見えるのは PC をシンボル検索したときのエラーコード $FFFFFFFF (ROM デバッガはシンボルテーブルを持っていないのでシンボル検索は常に失敗する) が D0 レジスタに残っていたため。

メモ

ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01 は問題ない。

3.6. 実効アドレスの計算でインデックスレジスタの選択を間違える (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00)

症状

インデックスレジスタが D0.W または D0.L のときは D0.W の値が、D1.W または D1.L のときは D0.L の値が、D2.W または D2.L のときは D1.W の値が、…、A7.W または A7.L のときは D7.L の値が、インデックスレジスタの値として使用される。

原因

拡張ワードからインデックスレジスタの番号だけを取り出して、それを番号とサイズとみなしてジャンプテーブルを参照しているため。

メモ

SCD.X 3.01 で修正されている。ROM デバッガ 1.0 は問題ない。

3.7. 実効アドレスの計算で (d8,Ar,Rn.wl)/(d8,PC,Rn.wl) の d8 が負数のとき Ar/PC がサプレスされる (ROM デバッガ 2.32、DB.X 3.00)

再現手順

A:\>db_300
X68k Debugger version 3.00 Copyright 1987-1993 SHARP/Hudson
Micro Processor Unit:16bit MC68000
Floating Point Co Processor:Softwere emulation.
-xd0,0
-xpc,200004
-mel200000 01234567 4abb00fa
-x
PC:00200004 USP:00100B74 SSP:00008364 SR:0000 X:0 N:0 Z:0 V:0 C:0 
HI:1 LS:0 CC:1 CS:0 NE:1 EQ:0 VC:1 VS:0 PL:1 MI:0 GE:1 LT:0 GT:1 LE:0 HS:1 LO:0 
D  00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000
A  00000000 00000000 00000000 00000000  00000000 00000000 00000000 00100B74
tst.l   $00200000(PC,D0.w)              ;$FFFFFFFA(long $FFFFFFFF)      
-q
A:\>scd_301 -t
X68k Source Code Debugger v3.01 Copyright 1990,91,92,93 SHARP/Hudson
-xd0,0
-xpc,200004
-mel200000 01234567 4abb00fa
-x
PC=00200004 USP=0010AA42 SSP=00008364 SR=0000 X:0  N:0  Z:0  V:0  C:0
D  00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000
A  00000000 00000000 00000000 00000000  00000000 00000000 00000000 0010AA42
tst.l   $00200000(PC,D0.w)              ;00200000(long $01234567)      
-q

原因

フルフォーマット拡張ワードのベースレジスタサプレスを処理するコードがブリーフフォーマット拡張ワードの処理に紛れ込んでいるため。ベースレジスタサプレスのフラグはフルフォーマット拡張ワードのビット 7 にあるので、ブリーフフォーマット拡張ワードの下位バイトにある d8 の符号ビットが 1 すなわち負数のときにベースレジスタがサプレスされてしまう。

メモ

SCD.X 3.00/3.01 は問題ない。

3.8. 実効アドレスの計算でスケールファクタを掛ける代わりにスケールファクタで割る (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00)

再現手順

A:\>scd_300 -t
X68k Source Code Debugger v3.00 Copyright 1990,91,92,93 SHARP/Hudson
-xd0,2
-xpc,200000
-mel200000 4a3b0202 01234567 89abcdef
-x
PC=00200000 USP=0010AA3E SSP=00008364 SR=0000 X:0  N:0  Z:0  V:0  C:0
D  00000002 00000000 00000000 00000000  00000000 00000000 00000000 00000000
A  00000000 00000000 00000000 00000000  00000000 00000000 00000000 0010AA3E
tst.b   $00200004(PC,D0.w*2)            ;00200005(byte $23)     
-q
A:\>scd_301 -t
X68k Source Code Debugger v3.01 Copyright 1990,91,92,93 SHARP/Hudson
-xd0,2
-xpc,200000
-mel200000 4a3b0202 01234567 89abcdef
-x
PC=00200000 USP=0010AA42 SSP=00008364 SR=0000 X:0  N:0  Z:0  V:0  C:0
D  00000002 00000000 00000000 00000000  00000000 00000000 00000000 00000000
A  00000000 00000000 00000000 00000000  00000000 00000000 00000000 0010AA42
tst.b   $00200004(PC,D0.w*2)            ;00200008(byte $89)     
-q

原因

インデックスレジスタの値にスケールファクタを掛けるために左にシフトしなければならないところで右にシフトしているため。

対策

SCD.X 3.01 で修正されている。

3.9. 実効アドレスの計算でオペレーションサイズが .Q/.S/.D/.X/.P のとき -(Ar) のオフセットが違う (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

再現手順

A:\>db_300
X68k Debugger version 3.00 Copyright 1987-1993 SHARP/Hudson
Micro Processor Unit:16bit MC68000
Floating Point Co Processor:Softwere emulation.
-xa0,20000c:xpc,.a0:mel.a0-c 3fff0000 fedcba98 76543210 f2206800 4e754e75
-x
PC:0020000C USP:00100B74 SSP:00008364 SR:0000 X:0 N:0 Z:0 V:0 C:0 
HI:1 LS:0 CC:1 CS:0 NE:1 EQ:0 VC:1 VS:0 PL:1 MI:0 GE:1 LT:0 GT:1 LE:0 HS:1 LO:0 
D  00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000
A  0020000C 00000000 00000000 00000000  00000000 00000000 00000000 00100B74
fmove.x FP0,-(A0)               ;$00200008(extend $76543210F22068004E754E75)    
-q
A:\>db060
X68k Debugger version 3.00 Copyright 1987-1993 SHARP/Hudson
*** Changed for 68040/68060 1996-2015 by M.Kamada ***
Micro Processor Unit:16bit MC68000
Floating Point Co Processor:Softwere emulation.
-xa0,20000c:xpc,.a0:mel.a0-c 3fff0000 fedcba98 7654320 f2206800 4e754e75
-x
PC:0020000C USP:0010556E SSP:00008364 SR:0000 X:0 N:0 Z:0 V:0 C:0 
HI:1 LS:0 CC:1 CS:0 NE:1 EQ:0 VC:1 VS:0 PL:1 MI:0 GE:1 LT:0 GT:1 LE:0 HS:1 LO:0 
D  00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000
A  0020000C 00000000 00000000 00000000  00000000 00000000 00000000 0010556E
fmove.x FP0,-(A0)               ;$00200000(extend $3FFF0000FEDCBA9807654320)    
-q

原因

-(Ar) のオフセットを計算する処理でオペレーションサイズが .Q/.S/.D/.X/.P の場合が考慮されていないため。

3.10. 実効アドレスの計算でベースレジスタサプレスが反映されない (SCD.X 3.00/3.01)

原因

フルフォーマット拡張ワードのベースレジスタサプレスの処理が欠落しているため。

メモ

ROM デバッガ 2.32、DB.X 3.00 は問題ない。

3.11. 実効アドレスの計算でインデックスサプレスが反映されない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

原因

フルフォーマット拡張ワードのインデックスサプレスの処理が欠落しているため。

3.12. FDBcc/PDBcc をアセンブルすると 2 大きいディスプレースメントが出力され、逆アセンブルすると 2 小さいアドレスが表示される (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

原因

FDBcc/PDBcc のディスプレースメントのベースアドレスはディスプレースメントワードの位置すなわち命令の先頭 +4 だが、DBcc と同様に命令の先頭 +2 で計算しているため。

メモ

デバッガで FDBcc/PDBcc をアセンブルして出力されたコードをデバッガで逆アセンブルすると正しいアドレスが表示されるので、コードが間違っていることに気付きにくい。

3.13. FSINCOS.X FPm,FPc:FPs を正しくアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

症状

DB.X と SCD.X の場合は FSINCOS.X FPm,FPc:FPs をアセンブルすると FSINCOS.X FPm,FP0:FPs のコードが出力される。さらに、次に MOVE 命令をアセンブルしようとしたときに undefined instruction in debugger などのエラーが発生する場合がある。ROM デバッガの場合は FSINCOS.X FPm,FPc:FPs をアセンブルしようとした時点で bus error in debugger が発生する。

原因

FPc の c をオペコードバッファに書き込むときに参照するレジスタが間違っている。オペコードバッファではなくアセンブラのニモニックジャンプテーブルを指しているレジスタを参照している。高々 3 ビットの c をニモニックジャンプテーブルの先頭の MOVE 命令の処理アドレスの下から 3 バイト目に OR 命令で書き込むため、0 を書き込もうとしたビットと元から 1 だったビットは変化せず、デバッガが読み込まれたアドレスによっては破壊に至らない場合もある。DB.X と SCD.X の場合と ROM デバッガの場合で症状が異なるのは、ROM デバッガの場合はジャンプテーブルが ROM にあって破壊することができないからである。

3.14. FMOVE.L from/to FPcr をアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

症状

浮動小数点制御レジスタ FPCR/FPSR/FPIAR に対する FMOVE.L 命令で、浮動小数点制御レジスタ名が小文字で書かれているかデスティネーションオペランドにあるとアセンブルできない。

3.15. FTRAPcc/FNOP/FBcc/FSAVE/FRESTORE/FBRA を正しく逆アセンブルできない (SCD.X 3.00)

原因

FTRAPcc の逆アセンブル用の文字列が欠落しているため。ニモニックがずれるので、FTRAPcc を逆アセンブルすると cc の付いた FNOPcc が表示され、FNOP を逆アセンブルすると cc の取れた FB が表示される。

メモ

SCD.X 3.01 で修正されている。ROM デバッガ 2.32、DB.X 3.00 は問題ない。

3.16. ビットフィールドオペランドのデータレジスタの D を小文字で書くとアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

3.17. FScc Dr をアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

3.18. PTRAPcc をアセンブルできない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

3.19. フルスクリーンモードで ST/SF を逆アセンブルするとオペランドの表示位置が左に寄る (SCD.X 3.00/3.01)

3.20. PMOVE.L/PMOVEFD.L from/to TTn を逆アセンブルするとオペレーションサイズがワードになる (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

3.21. PFLUSH/PFLUSHS/PLOADR/PLOADW/PTESTR/PTESTW を逆アセンブルするとイミディエイトオペランドが 2 回ずつ表示される (SCD.X 3.00/3.01)

メモ

ROM デバッガ 2.32、DB.X 3.00 は問題ない。

3.22. STOP.B/STOP.L がエラーにならない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

3.23. NOP.B/NOP.W/NOP.L がエラーにならない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

3.24. DFC の表示が SFC の値になっている (SCD.X 3.00/3.01)

メモ

ROM デバッガ 2.32、DB.X 3.00 は問題ない。

3.25. 拡張子が .SYS の実行ファイルをロードできない (DB.X 3.00、SCD.X 3.00/3.01)

原因

強制的に .X 形式でロードするモードは $03 だが $30 になっている。

3.26. ! コマンドでシェルを呼び出すときコンソールモードでもテキスト画面の使用状態を変更してしまう (SCD.X 3.00/3.01)

原因

フルスクリーンモードで ! コマンドでシェルを呼び出すときその前後でテキスト画面の使用状態を変更するが、これがコンソールモードでも機能してしまっているため。

3.27. 例外発生時に浮動小数点レジスタを保存するとき FSAVE/FRESTORE していない (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00)

メモ

SCD.X 3.01 で修正されている。

3.28. X コマンドで汎用以外のレジスタ名の手前にスペースがあるとエラーになる (SCD.X 3.00/3.01)

メモ

ROM デバッガ 2.32、DB.X 3.00 は問題ない。

3.29. XD0.D0+2 とは書けるのに XPC.PC+2 と書くとエラーになる (SCD.X 3.00/3.01)

3.30. X コマンドで汎用以外のレジスタ名と設定値の区切りの判断の仕方がおかしい (SCD.X 3.00/3.01)

3.31. 環境変数 comspec のファイル名がフルパスでないとシェルを起動できない (DB.X 3.00、SCD.X 3.00/3.01)

3.32. 浮動小数点数の 10 の累乗のテーブルの誤差が大きい (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

3.33. 確保したメモリブロックの末尾のアドレスの計算が間違っている (SCD.X 3.00/3.01)

3.34. CCR の未定義ビットを操作している (ROMデバッガ 2.32、DB.X 3.00、SCD.X 3.00/3.01)

3.35. 「No symbol file」の意味は「シンボルファイルがない」ではなくて「シンボルがないファイル」(SCD.X 3.00/3.01)

4. XC ライブラリの不具合

4.1. IOCTRLFDCTL() が正常に動作しない (XC ライブラリ 2.00)

原因

ライブラリのコードが間違っている。

_IOCTRLFDCTL::
        move.l  12(sp),-(sp)
        move.w  10(sp),-(sp)    ← 14(sp),-(sp) が正しい
        move.w  12(sp),-(sp)
        move.w  #13,-(sp)
        DOS     _IOCTRL
        lea.l   10(sp),sp
        rts

メモ

XC ライブラリ 2.11 (NewKit) で修正されている。

4.2. IOCTRLRTSET() が正常に動作しない (XC ライブラリ 2.00/2.11)

原因

ライブラリのコードが間違っている。

_IOCTRLRTSET::
        move.w  10(sp),-(sp)
        move.w  8(sp),-(sp)
        move.w  #17,-(sp)       ← #11,-(sp) が正しい
        DOS     _IOCTRL
        addq.l  #6,sp
        rts

5. ASK68K.SYS の不具合

5.1. SHIFT、CTRL、OPT.1 の各キーが押されたままの状態になってしまうことがある (ASK68K.SYS 3.01)

発生条件

_B_KEYINP を使用するアプリケーションを実行すると SHIFT、CTRL、OPT.1 のキーが内部でロックされた状態になることがある。

原因

SHIFT、CTRL、OPT.1 の判定方法が、_B_KEYINP を他のアプリケーションが使用しないことを前提にしているため。

対策

ASK68K.SYS 3.02 を使用する。KeyWitch.X でも対策されている。

5.2. ローマ字入力で L/M/R/V/W/Y を重ねて「っ」を入力できない (ASK68K.SYS 3.01/3.02)

発生条件

フロントプロセッサを起動している状態では、ローマ字入力で L/M/R/V/W/Y を重ねても「っ」を入力できない。また、フロントプロセッサを起動していない状態でローマ字入力で L/M/R/V/W/Y を重ねると、その後のローマ字かな変換がおかしくなる。

例えば「ふっるーい」などの伝統的でない口語の日本語を入力しようとした場合。

対策

KeyWitch.X で対策されている。

5.3. フロントプロセッサを起動すると INS キーの LED が消えてしまう (ASK68K.SYS 3.01/3.02)

発生条件

INS キーの LED が点灯している状態でフロントプロセッサを起動したとき。

対策

KeyWitch.X で対策されている。

5.4. 機能名 ZENKAKU の機能がローマ字無変換になっている (ASK68K.SYS 3.01/3.02)

対策

KeyWitch.X で全角変換にすることができる。

6. X-BASIC の不具合

6.1. 配列変数に定数データ列を代入できない (X-BASIC 2.02)

症状

マニュアルには明記されていないが、配列変数に定数データ列をまとめて代入できる場所とできない場所がある。

発生条件

for~next、repeat~until、while~endwhile、switch~endswitch の内側 (func~endfunc のトップレベルを除く) および if~then~else~ でスキップされるほうのブロックで、配列変数に定数データ列をまとめて代入できない。

対策

ぺけ-BASIC を使う。

7. BIND.X の不具合

7.1. バインドファイルの作成に失敗することがある (BIND.X 1.00)

発生条件

仮想ディレクトリを使っているとき、バインドファイルを作るドライブと環境変数 temp の指しているドライブのドライブ名が同じで実体が異なっている場合に、バインドファイルの生成に失敗する。

原因

ドライブ名が同じ場合は _RENAME だけでファイルを移動しようとしているため。

対策

環境変数 temp に別のドライブ名のパスを設定する。

8. CACHE.X の不具合

8.1. キャッシュの状態を設定できないことがある

発生条件

COMMAND.X 上で

>CACHE ON >NUL

のように ON/OFF の直後にスペースを入れて記述したとき、I/D を指定しなければキャッシュの制御が行われない。

対策

ON/OFF の後にスペースを入れずに使うか、I/D でキャッシュの種類を明記する。

9. CV.X の不具合

9.1. .X→.R の変換で必要な警告を出さない (CV.X 2.00)

発生条件

.X→.R の変換で、実行開始位置が先頭でない場合、および、bss+stack セクションのサイズが 0 でない場合。

9.2. 「メモリが不足です」というメッセージが表示される (CV.X 2.00)

発生条件

text+data のサイズが 0 の .X ファイルを処理しようとしたとき。

10. ED.X の不具合

10.1. [EOF] が 2 つ表示されることがある (ED.X 1.03)

発生条件

[EOF] が画面最下行に表示されているとき、[EOF] の位置にカーソルを移動してから CTRL+M、CTRL+Z と入力すると、[EOF] が 2 行表示される。

メモ

実害はない。

11. FASTIO.X の不具合

11.1. デバイスドライバとして登録すると正常に動作しない (FASTIO.X 1.00)

発生条件

FASTIO.X v1.00 をデバイスドライバとして登録したとき。

原因

FASTIO.X v1.00 をデバイスドライバとして登録すると、本来拡張しなければならない IOCS コール (B_WRITE/B_READ/B_FORMAT/B_EJECT) を拡張しない。この結果、IOCS コールに関する拡張機能 (安全対策) が無効になる。

対策

コマンドラインで登録する。

11.2. デバイスドライバとして登録するとき「バッファーサイズが正しくありません」と表示されて登録できないことがある (FASTIO.X 1.00)

発生条件

FASTIO.X v1.00 をデバイスドライバとして登録したとき。FASTIO.X よりも手前にデバイスドライバを多く登録すると発生しやすい。

原因

デバイスドライバの末尾のアドレスが $00200000 を超えないようになっているため。

対策

コマンドラインで登録する。

12. FDDEVICE.X の不具合

12.1. BPB が書き込まれていない 2HC と 2HQ の判別を間違える (FDDEVICE.X 1.00)

症状

ドライブに挿入されたフロッピーディスクが 2HC モードまたは 2HQ モードでフォーマットされているがブートセクタに BPB が書き込まれていないとき、2HC と 2HQ の判別を間違える。

原因

1 トラックあたりのセクタ数は 2HC が 15 セクタで 2HQ が 18 セクタである。BPB がないときは 18 番目のセクタが読めるかどうかで 2HC と 2HQ を判別しようとするが、読めたら 2HQ で読めなければ 2HC とすべきところの条件が逆で、読めなければ 2HQ で読めたら 2HC になっている。

13. FLOATn.X の不具合

XEiJ (X68000 Emulator in Java) で FLOATn.X の不具合を露見させるためには FE ファンション命令を OFF にする必要があります。

13.1. __STOD で "-#INF" が正の無限大になる (FLOAT2.X 2.02/2.03)

再現手順

X-BASIC で確認できる。

print val("-#INF")
 #INF

原因

"-" を負符号として、続く "#INF" を無限大としてそれぞれ解釈しておきながら、最後に符号を付けるのを忘れている。

13.2. __ECVT に #INF を 3 桁で書かせると "$00" になる (FLOAT2.X 2.02/2.03)

再現手順

X-BASIC で確認できる。

int i2,i3
print ecvt(val("#INF"),3,i2,i3)
$00
print ecvt(val("#NAN"),3,i2,i3)
$00

原因

"#INF" や "#NAN" が 3 桁に入り切らないのは仕方がないが、無意味な "$00" という文字列になるのは数字ではない文字を四捨五入しようとしているため。例えば 3 桁のときは 4 桁目の 'F' を四捨五入しようとして '5' 以上なので繰り上げて上の位をインクリメントする。すると 'N'+1='O' は '9' よりも大きいので '0' を上書きして繰り上げて上の位をインクリメントする。'I'+1='J' も '9' よりも大きいので '0' を上書きして繰り上げて上の位をインクリメントする。'#'+1='$' は '9' 以下なので結果は "$00" になる。"#NAN" の場合も同様。

13.3. 不適切な丸めで誤差が生じることがある (FLOAT4.X 1.02)

症状

倍精度 (double precision) で表現できる値の中で 1/(1-1/253) に最も近い値は 1+1/252 だが、これを FLOAT4.X 1.02 の __DDIV で計算すると真の値に 2 番目に近い 1 が返る。

浮動小数点演算をソフトウェアで行う FLOAT2.X ならば高速化のために精度が抑えられていても不思議ではないが、ハードウェアを使って計算する FLOAT4.X の計算結果が不正確というのは腑に落ちない。

再現手順

A:\>type ddiv.s
        .text

        move.l  #$3FF00000,d0           ;1
        move.l  #$00000000,d1
        move.l  #$3FEFFFFF,d2           ;1-1/2^53
        move.l  #$FFFFFFFF,d3
        .dc.w   $FE2E                   ;__DDIV
        bsr     hex8
        bsr     spc
        move.l  d1,d0
        bsr     hex8
        bsr     crlf
        .dc.w   $FF00                   ;_EXIT

hex8:
        swap.w  d0
        bsr     hex4
        swap.w  d0
hex4:
        rol.w   #8,d0
        bsr     hex2
        rol.w   #8,d0
hex2:
        rol.b   #4,d0
        bsr     hex1
        rol.b   #4,d0
hex1:
        move.l  d0,-(sp)
        and.w   #$000F,d0
        move.b  @f(pc,d0.w),d0
        move.w  d0,-(sp)
        .dc.w   $FF02                   ;_PUTCHAR
        addq.l  #2,sp
        move.l  (sp)+,d0
        rts
@@:
        .dc.b   '0123456789ABCDEF'

spc:
        move.w  #' ',-(sp)
        .dc.w   $FF02                   ;_PUTCHAR
        addq.l  #2,sp
        rts

crlf:
        pea.l   @f(pc)
        .dc.w   $FF09                   ;_PRINT
        addq.l  #4,sp
        rts
@@:
        .dc.b   13,10,0,0

        .end

A:\>has ddiv
A:\>hlk ddiv
A:\>ddiv
3FF00000 00000000
A:\>

原因

計算結果を一旦拡張精度 (extended precision) に丸めてから倍精度に丸めるという 2 段階丸めを行っているため。倍精度の結果が必要なときは浮動小数点制御レジスタ (FPCR) の最下位バイトに $80 を設定して最初から倍精度に丸めなければ正しい結果が得られない場合があることが考慮されていない。

1/(1-1/253) = 1 + 1/253 + 1/2106 + 1/2159 + … である。拡張精度で表現できる値の中で 1/(1-1/253) に最も近い値は 1+1/253 であり、この時点で真の値よりもわずかに小さい。この数は 53 ビット目以降が 01000… なので最近接偶数への丸め (round to the nearest even) で倍精度に丸めると端数がさらに切り捨てられて 1 になる。

メモ

有効桁数を減らしながらの 2 段階丸めは禁忌である。例えば 1.45 を四捨五入して整数に丸めると 1 になるが、小数点以下 2 桁目を四捨五入してから小数点以下 1 桁目をもう一度四捨五入して整数に丸めると 1.45 → 1.5 → 2 となって 1.45 に最も近い整数ではなくなってしまう。

14. FORMAT.X の不具合

14.1. フォーマットしたフロッピーディスクから起動できない (FORMAT.X メニュー 2.30)

発生条件

FORMAT.X のメニューモードで画面に「Version 2.30」と表示されるバージョンでフロッピーディスクをフォーマットしたとき。

原因

2HD モードでフォーマットされるが 2HC モードの BPB が書き込まれるため、そのディスクから起動しようとしても HUMAN.SYS の読み込みに失敗して起動できない。

対策

メニューモードではなくコマンドラインモードでドライブ名を指定してフォーマットする。または、メニュー画面に「Version 2.31」と表示される FORMAT.X を使う。

14.2. フロッピーディスクが 1 トラック余分にフォーマットされる (FORMAT.X コマンドライン 2.20)

症状

例えば Human68k における 2HD ディスクは 77 シリンダ 154 トラックだが、FORMAT.X のコマンドラインモードで 2HD ディスクをフォーマットすると 155 番目のトラックすなわち 78 番目のシリンダの片面までフォーマットされる。他の形式でも同様に 1 トラック余分にフォーマットされる。

発生条件

FORMAT.X のコマンドラインモードで画面に「v2.20」と表示されるバージョンでフロッピーディスクをフォーマットしたとき。

原因

ループの終了条件が間違っている。

対策

コマンドラインモードではなくメニューモードでフォーマットする。

メモ

通常は 1 トラックだけならば余分にフォーマットしてもエラーにならない。片面だけ余分にフォーマットされて気持ち悪いが、実害はないと思われる。

電脳倶楽部のインストーラ DINST.X のフォーマットルーチンも FORMAT.X に合わせて作ったため 155 番目のトラックまでフォーマットする。

14.3. SCSI ハードディスクの容量が実際の容量よりも 1 セクタ少なくなる (FORMAT.X メニュー 2.30/2.31)

症状

SCSI ハードディスクを装置初期化するとき、実際の容量よりも 1 セクタ少ない容量で初期化される。領域確保が 1MB 単位なのでパーティションの大きさに影響することはほとんどないが、エミュレータで容量がちょうど 10MB の SCSI ハードディスクイメージを作ろうとして管理領域を含めて 32KB+10MB のファイルを FORMAT.X で装置初期化すると容量が 9MB になってしまいがっかりする。

原因

SCSI ハードディスク (ダイレクトアクセスデバイス) の Read Capacity コマンドの返却値は最終論理ブロックアドレスとブロック長である。論理ブロックアドレスは 0 から始まるので論理ブロック数は最終論理ブロックアドレス +1 に等しい。FORMAT.X は最終論理ブロックアドレスをそのまま論理ブロック数として解釈するため、容量が 1 セクタ少なくなる。

メモ

XEiJ (X68000 Emulator in Java) の SCSI ハードディスクの Read Capacity コマンドは FORMAT.X から呼ばれたときだけ最終論理ブロックアドレスの代わりに論理ブロック数を返すことで FORMAT.X の誤動作を打ち消している。

15. HISTORY.X の不具合

15.1. ファイル名を TAB キーで補完できないことがある (HISTORY.X 1.10)

発生条件

ディレクトリ名に拡張子を付けただけのファイルが存在するとき、そのディレクトリの中にあるファイルのファイル名を TAB キーで補完できない。

16. SPEED.X の不具合

16.1. メニュー画面でビット長を設定できないことがある (SPEED.X 2.10)

発生条件

RSDRV.SYS 2.02 上で SPEED.X 2.10 で確認。メニュー画面で、フロー制御を RTS、ビット長を 5 または 7 に設定すると、ビット長が 6 または 8 になってしまう。

対策

コマンドラインで

>SPEED B7 RTS

のように指定する。

17. 辞書メンテ.X の不具合

17.1. 辞書変換や辞書マージでハングアップすることがある

発生条件

SX-WINDOW 3.1 に付属している「辞書メンテ.X」で、先頭の 4 文字が共通で 5 文字目以降が異なる読みの単語を大量に含んでいる辞書を生成しようとしたとき。

原因

ASK68K.SYS 3.0x の辞書はページの見出しが 4 文字しかなく、「ページ先頭の単語は異なるが見出しが同じ」というページが複数できてしまう場合の辞書メンテの処理がおかしい。ASK68K.SYS 2.xx の辞書のページの見出しは 8 文字なので、ASK68K.SYS 2.xx 用から ASK68K.SYS 3.0x 用への辞書変換に失敗する。

対策

該当する単語を減らす。


更新履歴

2016 年 4 月 23 日

SCSI ハードディスクの容量が実際の容量よりも 1 セクタ少なくなる (FORMAT.X メニュー 2.30/2.31) を追加しました。

── 続きを読む ──── 続きを隠す ──

2015 年 12 月 15 日

_CRTMOD が指定された画面モードと異なる色数でグラフィックパレットを初期化する (ROM 1.0/1.1/1.2/1.3) を追加しました。

2015 年 12 月 2 日

起動音を鳴らすと FM 音源ドライバが誤動作することがある (ROM 1.3) に対策と補足を加えました。

2015 年 11 月 12 日

BPB が書き込まれていない 2HC と 2HQ の判別を間違える (FDDEVICE.X 1.00) を追加しました。

2015 年 6 月 20 日

不適切な丸めで誤差が生じることがある (FLOAT4.X 1.02) を追加しました。

2015 年 6 月 2 日

フロッピーディスクが 1 トラック余分にフォーマットされる (FORMAT.X コマンドライン 2.20) を追加しました。

2015 年 4 月 22 日

特定の SCSI 機器が接続されていると起動できない (ROM 1.3)実効アドレスの計算で絶対ショートアドレスが符号拡張されない (ROM デバッガ 1.0) を追加しました。

2015 年 4 月 19 日

http://stdkmd.com/bugsx68k/ に引っ越しました。XEiJ (X68000 Emulator in Java) を作る過程でわかったことや整理した情報を取り込みました。エミュレータは ROM にパッチを当てることができるので、SCD.X の不具合を ROM デバッガ、デバッガ DB.X、ソースコードデバッガ SCD.X の不具合 として再構成しました。リモートデバイスから起動しようとすると暴走する (Human68k 2.15/3.01/3.02) など、多くの項目を追加しました。

2000 年 10 月 13 日

ローマ字入力で L/M/R/V/W/Y を重ねて「っ」を入力できない (ASK68K.SYS 3.01/3.02)フロントプロセッサを起動すると INS キーの LED が消えてしまう (ASK68K.SYS 3.01/3.02)機能名 ZENKAKU の機能がローマ字無変換になっている (ASK68K.SYS 3.01/3.02) を追加、その他を削除。

配列変数に定数データ列を代入できない (X-BASIC 2.02) を追加。

.X→.R の変換で必要な警告を出さない (CV.X 2.00)「メモリが不足です」というメッセージが表示される (CV.X 2.00) を追加。

2000 年 10 月 11 日

IOCTRLFDCTL() が正常に動作しない (XC ライブラリ 2.00) は XC ライブラリ 2.11 (NewKit) で修正されていることを追記。(報告: LeDA さん)

IOCTRLRTSET() が正常に動作しない (XC ライブラリ 2.00/2.11) を追加。(報告: LeDA さん)

2000 年 10 月 10 日

HTML を更新。

2000 年 10 月 6 日

IOCTRLFDCTL() が正常に動作しない (XC ライブラリ 2.00) を追加。

2000 年 9 月 27 日

HTML を更新。

2000 年 9 月 23 日

HTML を更新。

2000 年 8 月 19 日

HTML 化。

_VDISPST の 1 回目の割り込みのタイミングがおかしい (ROM 1.0/1.1/1.2/1.3) を追加。

1999 年 3 月 10 日

月刊電脳倶楽部 131 号 (1999 年 4 月号) の読み物横町のコーナーに収録。