X680x0 のメーカー純正のソフトウェアの不具合について、症状、発生条件、再現手順、原因、対策などをまとめました。環境を構築するときやプログラミングなどで参考になると思います。
Human68k 2.15 は X68030 の ROM Human です。
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 で確認)。実害はないが、サブディレクトリの構造としては間違っていると思われる。
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 スイッチを指定してコンパイルされたプログラムではユーザモードでコプロセッサ命令が使用されるため、そのようなプログラムを実行したときに他に動作中のスレッドがあると不具合が露顕する。
ユーザモードでコプロセッサ命令を使用するプログラムを使用するときは複数のスレッドを動作させない。
起動可能なリモートデバイスドライバを作成しても実際に起動しようとすると暴走してしまう。
リクエストヘッダの領域を再利用するとき初期化コマンドを設定し直していないため。
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 の起動ドライブにすることができる。
仮想ディレクトリを展開して実体のドライブに移るときドライブ管理テーブルのアドレスを変更する命令のオペレーションサイズが間違っている。
サブのメモリ管理下で常駐したプロセスがサブのメモリ管理を開放した後に破壊されて暴走する。
_S_PROCESS を使ってサブのメモリ管理を構築し、その内部でプログラムを常駐させ、_S_MFREE を使ってそのサブのメモリ管理を開放したとき。
_S_MFREE でサブのメモリ管理を開放するとき、サブのメモリ管理下の常駐プロセスはメインのメモリ管理下に移ることになっているが、移行が正しく行われていない。具体的には、メモリ管理ポインタをサブからメインへ出る方向にだけ繋いでおり、メインからサブへ入る方向に繋いでいない。このため、サブのメモリ管理下で常駐したプロセスがメインのメモリ管理に組み込まれず、次回の _EXEC などで常駐部分が破壊される。
メモリアロケーションモードが $01 (必要最小ブロックから確保) の X 形式の実行ファイルを起動したとき。
X 形式実行ファイルのメモリアロケーションモードを確認するビットテスト命令のビット番号が間違っている。
X 形式の実行ファイルのヘッダ 4 バイト目にあるメモリアロケーションモード
$00 … 最大ブロックから確保 $01 … 必要最小ブロックから確保 $02 … 上位アドレスから確保
この機能は未公開なので不具合と言うとやや語弊があるが、コードがおかしいことは間違いない。
リモートデバイスに渡すコマンド番号が間違っている。
Human68k 3.01/3.02 は問題ない。
BPB のハンドルを BPB のアドレスとして参照しようとしているため。
Human68k 3.01/3.02 は問題ない。
BPB をコピーする長さと PDA とイジェクトフラグを書き込む位置が間違っている。
CRTMOD(18) などでコンソールの幅を 128 桁にしてから echo ^[[100C^[[6n を実行すると ^[[2;101R ではなく ^[[2;11R が入力される。
カーソルの座標を文字列に変換するとき 100 の位をゼロサプレスしたかどうかに関係なく 10 の位をゼロサプレスしている。
ESC [6n は Human68k のマニュアルに書かれているが ASK68K.SYS が対応していないので ASK68K.SYS を外さないと動作しない。X68000 のときは IOCS.X を組み込まないと動作しない。
hiocs.x 1.10+16 を組み込むと ESC [6n が動作しなくなるのは hiocs.x のコードのバグが原因。hiocs-plus-16.14 では修正されている。
CONFIG.SYS の USKCG= に登録可能なすべての外字を含む外字登録用データファイルを指定すると最後の外字にゴミが混ざる。
外字登録用データファイルを読み込むときヘッダを含めて読み込んでいるが、読み込む最大サイズにヘッダのサイズが含まれていない。
パターンを定義する前に行うマウスカーソルを消す処理で、パターンを定義するマウスカーソルの番号が入っている D1 レジスタが破壊されている。D1 レジスタで指定された番号のマウスカーソルのパターンは定義されず、誤ってアドレス $00000D70 に A1 レジスタの値が書き込まれる。$00000D70 は未使用エリアなのでパターンが定義されないこと以外の問題は起こらない。
1 つの IOCS コールの機能が完全に失われていることになるが、IOCS.X で修正されるので IOCS.X を組み込めば問題なく使える。HIOCS.X でも修正されている。
_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 が正しい色数で初期化し直すので問題ない。
ディスプレースメントの記述ミス。65536 色モードのパレットを取得するとき上位 8 ビットを変換するのに下位 8 ビットのテーブルが参照されている。
HIOCS.X で修正されている。
$FF00 バイト毎に行うアドレスレジスタの更新が、A1 レジスタはインクリメント、A2 レジスタはカウントしないモードに固定されてしまっているため。
HIOCS.X で修正されている。
_DRAWMODE (IOCS $B0、拡張マニュアルに記述されているので未公開ではない) を、現在のモードを知るために -1 を指定して使用したとき。
-1 と比較するレジスタが違う。描画モードをワークエリアに書き込むとき、本来ならば「書き込む値が -1 ならば書き込まない」とすべきところが「読み出した値が -1 ならば書き込まない」になっている。-1 を指定すると -1 が書き込まれてしまい、次回から読み出した値が -1 なので何も書き込まれなくなって、リバースモードを解除できなくなる。
HIOCS.X で修正されている。
_B_KEYINP/_B_KEYSNS/_DENSNS を跨いで D3 レジスタを使用しているプログラムで、電卓を使用したとき。
電卓の処理で D3 レジスタが破壊されるにも関わらず、_B_KEYINP/_B_KEYSNS/_DENSNS で D3 レジスタが保護されていないため。
KeyWitch.X を組み込む。
「電脳倶楽部」用テキスト閲覧装置 DSHELL の「電卓を使うとバスエラーが出る」という症状で露見した不具合。月刊電脳倶楽部 102 号 (1996 年 11 月号) の電脳道具箱にある DSHELL 3.20d の添付ドキュメントに経緯が書かれている。
ファンクションキーの表示が OFF でカーソルが画面の最下行にあるとき OPT.1+OPT.2 を押すと電卓が画面外に表示される。カーソルが 64 行目にあるとバスエラーが出る。
電卓をカーソルの下の行に表示するときコンソールの行数を確認していないため。
060turbo の ROM は電卓がコンソールの範囲内に表示されるように電卓の Y 座標を調整している。
_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 回目の割り込みが早く発生してしまう。
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 する方法が標準で提供されていない。
A:\>db
-mes e8e00d 31
-mes ed0091 01 ←ON
-mes e8e00d 00
-q
(リセット)
030SYSpatch.x のオプション 'B' で ON にすることだけできる。参考 : イカ先生さんのツイート。
060turbo の ROM は LFO RESET を 0 に戻している。
X68030 の _SYS_STAT でクロックスピードを補正するために MPU の種類を確認するとき、アドレス $00000CBC の内容をバイトサイズで $01 と比較しなければならないのにワードサイズで $0001 と比較している。
やっていることは完全に間違っているのだが、$00000CBC に入っているデータが限られているので、いつも正しい結果 (と同じ結果) が返ってくる。
Memory Management Unit。
10 の位の 1 を書く条件が 10MB 以上ではなくて 9MB 以上になっている。
通常はメインメモリが 9MB になることはない。
LINK.W A6,#-4 で 4 バイト確保して 5 バイト書き込んでいるため、UNLK A6 で A6 レジスタの最上位バイトが復元されない。
実害はない。
□□□□□□□□□□□□
□□□□□□□□□□□□
□□□□□■□□□□□□
□□□□■□■□□□□□
□□□■□□□■□□□□
□□■□■□■■■□□□ ←ここ
□□□□■□■□□□□□
□□□□■□■□□□□□
□□□□■□■□□□□□
□□□□■■■□□□□□
□□□□□□□□□□□□
□□□□□□□□□□□□
何らかの理由または遊び心でわざと欠けさせてあるという可能性もなくはない?
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 をパディング転送にすることでハングアップしないようになっている。
X68000 は起動可能なデバイスが見付からないとき FD の挿入を促す絵が表示されるが、X68000 SUPER までの機種 (ROM 1.0) でメモリを 12MB に増設するとそれが表示されなくなることがある。代わりに「エラーが発生しました。リセットしてください。」と表示されて停止する場合が多い。
SRAM の初期化で $00ED000C に書き込まれるダミーの ROM 起動ハンドルが $00BFFFFC という不可解な値になっているため。10MB まではそこに RAM がないので ROM 起動アドレスの読み出しがバスエラーで失敗してスルーされるが、12MB に増設すると読み出しに成功してしまい無意味なアドレスにジャンプして暴走する。
内蔵 SCSI または拡張 SCSI から起動できるときは switch コマンドで SCSI 起動に設定する。
起動できる SCSI ポートがないときは $00ED000C の内容を確実にバスエラーが発生するアドレスに書き換える。下の例は SRAM の直後の空き領域の $00ED4000 に書き換えている。SRAM を増設している場合は他のアドレスを選ぶこと。
A:\>db -mes e8e00d 31 -mel ed000c ed4000 -mes e8e00d 00 -q
メモリを増設しただけでエラーが出るようになったら普通はハードウェアの不具合を疑うでしょう。X68000 の増設 RAM ボードを売買するときは「この症状はハードウェアの不具合ではない」ということを確認し合った上で取り引きをするとよいかも知れません。
X68030 の ROM は X68000 でも動きそうに見えるが、そのままでは起動できない。
X68030 の ROM を X68000 に載せたとき。
IPLROM が行うエリアセット (スーパーバイザ領域設定) のポートの初期化は、ROM 1.2 まで MOVE.B #$00,$00E86001 だったが、ROM 1.3 で CLR.B $00E86001 に変更された。MC68EC030 の CLR.B は実効アドレスに $00 をライトする命令だが、MC68000 の CLR.B は実効アドレスをリードしてから $00 をライトする命令である。エリアセットのポート $00E86001 は真にライトオンリーで、リードしようとするとバスエラーになる。X68030 の ROM を X68000 に載せてもエリアセットのポートの初期化でバスエラーが発生して起動できない。
X68030 の ROM を X68000 に載せても起動できない理由は他に SASI と SCSI の違いなどがある。
CLR.B $00E86001 の直前にあるアラーム起動の処理の名残で、A0 レジスタが RTC のアドレス $00E8A000 を指しているので、これを使って命令を変更する。参考 : ふってぃさんの一連の考察。
変更前 00FF01B2 423900E86001 CLR.B $00E86001 変更後 00FF01B2 117C0000C001 MOVE.B #$00,$00E86001-$00E8A000(A0)
MC68000 の SF.B は CLR.B と同様に実効アドレスをリードしてから $00 をライトする命令なので、CLR.B を SF.B に変更しても意味がない。
スプライトを表示できないとき _SP_INIT が -1 を返さずバスエラーで止まることがある。
画面モード 18 (1024x848) または画面モード 19 (640x480; VGA モード) で _SP_INIT を呼び出したとき。
ハードウェアの制約で、CRTC の R20 ($00E80028) の下位 5 ビットが %1??1? のときスプライトを表示できない。スプライトを表示できないときスプライトスクロールレジスタ ($00EB0000~$00EB07FF) とスプライト PCG・テキストエリア ($00EB8000~$00EBFFFF) にアクセスするとバスエラーが発生する。
スプライト関連の IOCS コールは画面モード 16 (768x512) と画面モード 17 (1024x424) の %10110 のときだけスプライトを表示できないと判断する。画面モード 18 の %11010 と画面モード 19 の %10111 を含む %1001? と %10111 と %11?1? はスプライトを表示できると誤って判断され、_SP_INIT がアクセスできないスプライトスクロールレジスタを初期化しようとしてバスエラーが発生する。
画面モード 17 (1024x424) と画面モード 18 (1024x848) は ROM 1.0 からあるが未公開。
画面モード 19 (640x480; VGA モード) は X68000 Compact の ROM 1.2 で追加された。
このバスエラーはエミュレータでは再現されないことがある。
ROM デバッガ 2.32 の不具合の一部は XEiJ (X68000 Emulator in Java) で修正されています。
ソースコードデバッガ SCD.X 3.01/3.02 の不具合の多くは SCD060.X で修正されています。
X68030 で ROM デバッガを有効にするとリセットした直後に「エラーが発生しました。リセットしてください。」と表示されて起動できない。
X68030 で OPT.2 キーを押しながらリセットしたとき。SWITCH.X DEBUG=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 は問題ない。
リモートターミナルでコマンドを 1 行分編集してからまとめて転送すると入力が 1 文字置きになる。
デバッガの 1 文字出力ルーチンには $13 (^S) が入力されると次の入力があるまで出力を一時停止する機能があるが、$13 でなくても RS-232C の入力バッファに文字が溜まっていると 1 文字空読みしてしまう。一方、デバッガがコマンドを受け付けるときに使用する 1 行入力ルーチンはエコーバックに 1 文字出力ルーチンを使用しており、入力バッファに文字が溜まっていると 1 文字エコーバックする度に次の 1 文字が空読みされてしまう。1 行入力する間に 1 文字入力して 1 文字表示して 1 文字空読みするという処理が繰り返されるため、入力が 1 文字置きになる。
MC68030 のとき起動時に例外ベクタ $02~$3C を保存し、動作中に $02~$3F を書き換え、終了時に $02~$3C を復元する。例外ベクタ $3D~$3F に「unassigned, reserved」を表示してデバッガのプロンプトに戻る例外処理ルーチンのアドレスを残したままデバッガが終了してしまう。
DB.X 3.00/3.02 は問題ない。
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.02 は問題ない。
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/3.02、SCD.X 3.00/3.01 は問題ない。
インデックスレジスタが D0.W または D0.L のときは D0.W の値が、D1.W または D1.L のときは D0.L の値が、D2.W または D2.L のときは D1.W の値が、…、A7.W または A7.L のときは D7.L の値が、インデックスレジスタの値として使用される。
D:>db300 X68k Debugger version 3.00 Copyright 1987-1993 SHARP/Hudson Micro Processor Unit:16bit MC68000 Floating Point Co Processor:Softwere emulation. -l100000 lc 00100000 lea $00100000,A0 00100006 moveq #$00,D0 00100008 moveq #$01,D1 0010000A tst.b (A0,D1.l) -g=100000 10000a break at 0010000A PC:0010000A USP:000BCD14 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 00000001 00000000 00000000 00000000 00000000 00000000 00000000 A 00100000 00000000 00000000 00000000 00000000 00000000 00000000 000BCD14 tst.b (A0,D1.l) ;$00100000(byte $41) 誤 -q D:>db302 X68k Debugger version 3.02 Copyright 1987-1994 SHARP/Hudson Micro Processor Unit:16bit MC68000 Floating Point Co Processor:Softwere emulation. -l100000 lc 00100000 lea $00100000,A0 00100006 moveq #$00,D0 00100008 moveq #$01,D1 0010000A tst.b (A0,D1.l) -g=100000 10000a break at 0010000A PC:0010000A USP:000BCD14 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 00000001 00000000 00000000 00000000 00000000 00000000 00000000 A 00100000 00000000 00000000 00000000 00000000 00000000 00000000 000BCD14 tst.b (A0,D1.l) ;$00100001(byte $F9) 正 -q
拡張ワードからインデックスレジスタの番号だけを取り出して、それを番号とサイズとみなしてジャンプテーブルを参照しているため。
DB.X 3.02/SCD.X 3.01 で修正されている。ROM デバッガ 1.0 は問題ない。
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 は問題ない。
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
インデックスレジスタの値にスケールファクタを掛けるために左にシフトしなければならないところで右にシフトしているため。
DB.X 3.02/SCD.X 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 の場合が考慮されていないため。
フルフォーマット拡張ワードのベースレジスタサプレスの処理が欠落しているため。
ROM デバッガ 2.32、DB.X 3.00/3.02 は問題ない。
フルフォーマット拡張ワードのインデックスサプレスの処理が欠落しているため。
FDBcc/PDBcc のディスプレースメントのベースアドレスはディスプレースメントワードの位置すなわち命令の先頭 +4 だが、DBcc と同様に命令の先頭 +2 で計算しているため。
デバッガで FDBcc/PDBcc をアセンブルして出力されたコードをデバッガで逆アセンブルすると正しいアドレスが表示されるので、コードが間違っていることに気付きにくい。
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 にあって破壊することができないからである。
浮動小数点制御レジスタ FPCR/FPSR/FPIAR に対する FMOVE.L 命令で、浮動小数点制御レジスタ名が小文字で書かれているかデスティネーションオペランドにあるとアセンブルできない。
FTRAPcc の逆アセンブル用の文字列が欠落しているため。ニモニックがずれるので、FTRAPcc を逆アセンブルすると cc の付いた FNOPcc が表示され、FNOP を逆アセンブルすると cc の取れた FB が表示される。
SCD.X 3.01 で修正されている。ROM デバッガ 2.32、DB.X 3.00/3.02 は問題ない。
ROM デバッガ 2.32、DB.X 3.00/3.02 は問題ない。
ROM デバッガ 2.32、DB.X 3.00/3.02 は問題ない。
強制的に .X 形式でロードするモードは $03 だが $30 になっている。
フルスクリーンモードで ! コマンドでシェルを呼び出すときその前後でテキスト画面の使用状態を変更するが、これがコンソールモードでも機能してしまっているため。
SCD.X 3.01 で修正されている。
ROM デバッガ 2.32、DB.X 3.00/3.02 は問題ない。
A:\>db
X68k Debugger version 3.00 Copyright 1987-1993 SHARP/Hudson
Micro Processor Unit:16bit MC68000
Floating Point Co Processor:Softwere emulation. ←ここ
-q
例えば、
sprite_pattern:: .dcb.l 32,$00000000
で定義されたシンボル sprite_pattern で始まるスプライトパターンを $F で塗り潰そうとして、
-fl .sprite_pattern .sprite_pattern+4*20-1 ffffffff
と書くと、.sprite_pattern がシンボル sprite_pattern ではなくレジスタ sp の値を返すので、
-fl .sp .sp+4*20-1 ffffffff
と書いたのと同じことになって、スタックエリアを塗り潰してしまう。
.~ の ~ をレジスタ名またはシンボルと見なして値に変換するとき、レジスタ名で始まっていたらレジスタ名で終わっているかどうか確認せずにレジスタの値を返している。
SCD.X 3.00/3.01 は問題ない。
D:>db300 X68k Debugger version 3.00 Copyright 1987-1993 SHARP/Hudson Micro Processor Unit:16bit MC68000 Floating Point Co Processor:Softwere emulation. -an100000 000BB0BC .end 誤 -q D:>db302 X68k Debugger version 3.02 Copyright 1987-1994 SHARP/Hudson Micro Processor Unit:16bit MC68000 Floating Point Co Processor:Softwere emulation. -an100000 00100000 .end 正 -q
アドレスが入っていないレジスタを表示している。
DB.X 3.02 で修正されている。SCD.X 3.00/3.01 は問題ない。
ライブラリのコードが間違っている。
_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) で修正されている。
ライブラリのコードが間違っている。
_IOCTRLRTSET::
move.w 10(sp),-(sp)
move.w 8(sp),-(sp)
move.w #17,-(sp) ← #11,-(sp) が正しい
DOS _IOCTRL
addq.l #6,sp
rts
_B_KEYINP を使用するアプリケーションを実行すると SHIFT、CTRL、OPT.1 のキーが内部でロックされた状態になることがある。
SHIFT、CTRL、OPT.1 の判定方法が、_B_KEYINP を他のアプリケーションが使用しないことを前提にしているため。
ASK68K.SYS 3.02 を使用する。KeyWitch.X でも対策されている。
フロントプロセッサを起動している状態では、ローマ字入力で L/M/R/V/W/Y を重ねても「っ」を入力できない。また、フロントプロセッサを起動していない状態でローマ字入力で L/M/R/V/W/Y を重ねると、その後のローマ字かな変換がおかしくなる。
例えば「ふっるーい」などの伝統的でない口語の日本語を入力しようとした場合。
KeyWitch.X で対策されている。
INS キーの LED が点灯している状態でフロントプロセッサを起動したとき。
KeyWitch.X で対策されている。
KeyWitch.X で全角変換にすることができる。
マニュアルには明記されていないが、配列変数に定数データ列をまとめて代入できる場所とできない場所がある。
for~next、repeat~until、while~endwhile、switch~endswitch の内側 (func~endfunc のトップレベルを除く) および if~then~else~ でスキップされるほうのブロックで、配列変数に定数データ列をまとめて代入できない。
ぺけ -BASIC を使う。
仮想ディレクトリを使っているとき、バインドファイルを作るドライブと環境変数 temp の指しているドライブのドライブ名が同じで実体が異なっている場合に、バインドファイルの生成に失敗する。
ドライブ名が同じ場合は _RENAME だけでファイルを移動しようとしているため。
環境変数 temp に別のドライブ名のパスを設定する。
COMMAND.X 上で
>CACHE ON >NUL
のように ON/OFF の直後にスペースを入れて記述したとき、I/D を指定しなければキャッシュの制御が行われない。
ON/OFF の後にスペースを入れずに使うか、I/D でキャッシュの種類を明記する。
.X→.R の変換で、実行開始位置が先頭でない場合、および、bss+stack セクションのサイズが 0 でない場合。
text+data のサイズが 0 の .X ファイルを処理しようとしたとき。
[EOF] が画面最下行に表示されているとき、[EOF] の位置にカーソルを移動してから CTRL+M、CTRL+Z と入力すると、[EOF] が 2 行表示される。
実害はない。
FASTIO.X v1.00 をデバイスドライバとして登録したとき。
FASTIO.X v1.00 をデバイスドライバとして登録すると、本来拡張しなければならない IOCS コール (B_WRITE/B_READ/B_FORMAT/B_EJECT) を拡張しない。この結果、IOCS コールに関する拡張機能 (安全対策) が無効になる。
コマンドラインで登録する。
FASTIO.X v1.00 をデバイスドライバとして登録したとき。FASTIO.X よりも手前にデバイスドライバを多く登録すると発生しやすい。
デバイスドライバの末尾のアドレスが $00200000 を超えないようになっているため。
コマンドラインで登録する。
ドライブに挿入されたフロッピーディスクが 2HC モードまたは 2HQ モードでフォーマットされているがブートセクタに BPB が書き込まれていないとき、2HC と 2HQ の判別を間違える。
1 トラックあたりのセクタ数は 2HC が 15 セクタで 2HQ が 18 セクタである。BPB がないときは 18 番目のセクタが読めるかどうかで 2HC と 2HQ を判別しようとするが、読めたら 2HQ で読めなければ 2HC とすべきところの条件が逆で、読めなければ 2HQ で読めたら 2HC になっている。
XEiJ (X68000 Emulator in Java) で FLOATn.X の不具合を露見させるためには FE ファンション命令を OFF にする必要があります。
X-BASIC で確認できる。
print val("-#INF") #INF
"-" を負符号として、続く "#INF" を無限大としてそれぞれ解釈しておきながら、最後に符号を付けるのを忘れている。
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" の場合も同様。
倍精度 (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 に最も近い整数ではなくなってしまう。
FLOAT4.X 1.02 の __POWER で ∞-∞ (無限大のマイナス無限大乗) を計算しようとすると白窓が出る。
コプロを搭載した X68030 などで FLOAT4.X を組み込んで X-BASIC を起動して以下を実行する。
print pow(val("#INF"),-val("#INF"))
レジスタ名の書き間違い。
FORMAT.X のメニューモードで画面に「Version 2.30」と表示されるバージョンでフロッピーディスクをフォーマットしたとき。
2HD モードでフォーマットされるが 2HC モードの BPB が書き込まれるため、そのディスクから起動しようとしても HUMAN.SYS の読み込みに失敗して起動できない。
メニューモードではなくコマンドラインモードでドライブ名を指定してフォーマットする。または、メニュー画面に「Version 2.31」と表示される FORMAT.X を使う。
例えば Human68k における 2HD ディスクは 77 シリンダ 154 トラックだが、FORMAT.X のコマンドラインモードで 2HD ディスクをフォーマットすると 155 番目のトラックすなわち 78 番目のシリンダの片面までフォーマットされる。他の形式でも同様に 1 トラック余分にフォーマットされる。
FORMAT.X のコマンドラインモードで画面に「v2.20」と表示されるバージョンでフロッピーディスクをフォーマットしたとき。
ループの終了条件が間違っている。
コマンドラインモードではなくメニューモードでフォーマットする。
通常は 1 トラックだけならば余分にフォーマットしてもエラーにならない。片面だけ余分にフォーマットされて気持ち悪いが、実害はないと思われる。
電脳倶楽部のインストーラ DINST.X のフォーマットルーチンも FORMAT.X に合わせて作ったため 155 番目のトラックまでフォーマットする。
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 の誤動作を打ち消している。
ディレクトリ名に拡張子を付けただけのファイルが存在するとき、そのディレクトリの中にあるファイルのファイル名を TAB キーで補完できない。
RSDRV.SYS 2.02 上で SPEED.X 2.10 で確認。メニュー画面で、フロー制御を RTS、ビット長を 5 または 7 に設定すると、ビット長が 6 または 8 になってしまう。
コマンドラインで
>SPEED B7 RTS
のように指定する。
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 用への辞書変換に失敗する。
該当する単語を減らす。
登録可能なすべての外字を登録しようとすると最後の外字にゴミが混ざる (Human68k 2.15/3.01/3.02) を追加しました。
ROM デバッガ、デバッガ DB.X、ソースコードデバッガ SCD.X の不具合 の対象に DB.X 3.02 を追加しました。
AN コマンドで正しいアドレスが表示されない (ROM デバッガ 2.32、DB.X 3.00) を追加しました。
実効アドレスの計算でインデックスレジスタの選択を間違える (ROM デバッガ 2.32、DB.X 3.00、SCD.X 3.00) に再現手順を追加しました。
エスケープシーケンス ESC [6n を表示したとき入力される文字列が間違っていることがある (Human68k 2.15/3.01/3.02) を追加しました。
ライトオンリーのポートをリードしようとする (ROM 1.3) の対策を修正しました。
__POWER で白窓が出る (FLOAT4.X 1.02) を追加しました。
シンボルがレジスタ名で始まっているとき .シンボル がレジスタの値を返す (DB.X 3.00) を追加しました。
_SP_INIT でバスエラーが発生する (ROM 1.0/1.1/1.2/1.3) を追加しました。
ライトオンリーのポートをリードしようとする (ROM 1.3) と 「software emulation」のスペルが間違っている (ROM デバッガ 2.32、DB.X 3.00) を追加しました。
https://stdkmd.net/bugsx68k/ に引っ越しました。
メモリを 12MB に増設すると起動時に FD の挿入を促す絵が表示されなくなる (ROM 1.0) を追加しました。
SCSI ハードディスクの容量が実際の容量よりも 1 セクタ少なくなる (FORMAT.X メニュー 2.30/2.31) を追加しました。
_CRTMOD が指定された画面モードと異なる色数でグラフィックパレットを初期化する (ROM 1.0/1.1/1.2/1.3) を追加しました。
起動音を鳴らすと FM 音源ドライバが誤動作することがある (ROM 1.3) に対策と補足を加えました。
BPB が書き込まれていない 2HC と 2HQ の判別を間違える (FDDEVICE.X 1.00) を追加しました。
不適切な丸めで誤差が生じることがある (FLOAT4.X 1.02) を追加しました。
フロッピーディスクが 1 トラック余分にフォーマットされる (FORMAT.X コマンドライン 2.20) を追加しました。
特定の SCSI 機器が接続されていると起動できない (ROM 1.3)、実効アドレスの計算で絶対ショートアドレスが符号拡張されない (ROM デバッガ 1.0) を追加しました。
http://stdkmd.com/bugsx68k/ に引っ越しました。XEiJ (X68000 Emulator in Java) を作る過程でわかったことや整理した情報を取り込みました。エミュレータは ROM にパッチを当てることができるので、SCD.X の不具合を ROM デバッガ、デバッガ DB.X、ソースコードデバッガ SCD.X の不具合 として再構成しました。リモートデバイスから起動しようとすると暴走する (Human68k 2.15/3.01/3.02) など、多くの項目を追加しました。
ローマ字入力で 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) を追加。
IOCTRLFDCTL() が正常に動作しない (XC ライブラリ 2.00) は XC ライブラリ 2.11 (NewKit) で修正されていることを追記。(報告 : LeDA さん)
IOCTRLRTSET() が正常に動作しない (XC ライブラリ 2.00/2.11) を追加。(報告 : LeDA さん)
HTML を更新。
IOCTRLFDCTL() が正常に動作しない (XC ライブラリ 2.00) を追加。
HTML を更新。
HTML を更新。
HTML 化。
_VDISPST の 1 回目の割り込みのタイミングがおかしい (ROM 1.0/1.1/1.2/1.3) を追加。
月刊電脳倶楽部 131 号 (1999 年 4 月号) の読み物横町のコーナーに収録。