更新日: 2011 年 11 月 15 日
SCD060.X の説明
説明
SCD060.X の添付ドキュメントです。末尾に記載されている連絡先は無効です。
scd060.doc
──────────────────────────────────── Source Code Debugger ─ 68040/68060 対応版 scd060.x version 3.01+12 1998.11.27 by M.Kamada ──────────────────────────────────── ●はじめに scd060.x は、XC コンパイラに付属している SHARP 純正のソースコードデバッ ガ「SCD.X v3.00/v3.01」を、68040 と 68060 でも動くように改造したものです。 scd060.x は 68040 と 68060 だけでなく 68000 や 68030 でも動作します。 68040 と 68060 への対応以外にも多くの改造や修正が施されているので、68040 や 68060 のユーザでなくても役に立つと思います。 SCD.X については、XC コンパイラに付属しているマニュアルを参照して下さ い。 ●対応している SCD.X のバージョンについて scd060.x は SCD.X v3.00/v3.01 に対するバイナリ差分(.bfd)の形式で配布 しています。scd060.x を生成するには、K.Higashide 氏の bup.x を使い、お手 元の SCD.X のバージョンに対応したバイナリ差分ファイルを適用して下さい。 各バイナリ差分は、以下のバージョンの SCD.X に対応しています。 ┌──────┬─────────────────────┐ │バイナリ差分│ 対応している SCD.X │ ├──────┼─────────────────────┤ │ scd300.bfd │ SCD.X v3.00 131152 93-09-15 12:00:00 │ │ scd301.bfd │ SCD.X v3.01 131156 93-12-25 12:00:00 │ └──────┴─────────────────────┘ 上記よりも新しいバージョンの SCD.X の存在は確認されていませんが、もし 持っているという場合はご連絡下さい。 なお、SCD.X のバージョンは起動時に表示されます。フルスクリーンモードで も表示されますが、すぐに消えてしまうので、「SCD.X -t」としてコンソールモ ードで起動して確認するとよいと思います。 ──────────────────────────────────── DB.X に合わせて変更されたコマンドについて ──────────────────────────────────── SCD.X は DB.X よりも高機能で、DB.X のようなコンソールモードも持ってい るので、「フルスクリーンモードはいらない」という人も SCD.X を DB.X の代 わりとして使うことができます。ただ、SCD.X ではコマンドの「?」の機能が DB.X と異なるという不都合があります。そこで、この scd060.x では、コマン ドの「?」と「P?」の機能を入れ換えてあります。 また、SCD.X のマニュアルには書いてありませんが、SCD.X には元々 「P?? exp」で式の値を 10 進数で表示、「P?P exp」で式の値の最下位バイトを 文字コードと見なして 1 文字表示、という機能があります。DB.X では「??」が 10 進数で表示するコマンドになっていますので、scd060.x ではこれらも同時に 入れ換えてあります。 scd060.x での「?」と「P?」の動作 ┌────────┬────────────────────┐ │? exp │式の値を 16 進数で表示 │ │?? exp │式の値を 10 進数で表示 │ │?P exp │式の値の最下位バイトのコードの文字を表示│ │P? Cexp;[format]│C 言語の式評価 │ └────────┴────────────────────┘ なお、SCD.X や scd060.x では、DB.X のように 1 行に複数のコマンドを「:」 で区切って記述することはできません。 ──────────────────────────────────── 追加された命令 ──────────────────────────────────── scd060.x では、新たに 68040 以上の CPU で新設された命令をアセンブルお よび逆アセンブルできるようになっています。 ● 68040 以上で新設された命令 以下の命令は 68040 以上で新設されたものです。 CINVA CINVL CINVP CPUSHA CPUSHL CPUSHP FDABS FDADD FDDIV FDMOVE FDMUL FDNEG FDSQRT FDSUB FSABS FSADD FSDIV FSMOVE FSMUL FSNEG FSSQRT FSSUB LPSTOP MOVE16 MOVEC PCR,Rn MOVEC BUSCR,Rn MOVEC Rn,PCR MOVEC Rn,BUSCR PFLUSH (An) PFLUSHAN PFLUSHN (An) PLPAR PLPAW PTESTR (An) PTESTW (An) ●アセンブルするときの CPU によってアセンブル結果が異なる命令 以下の命令は、アセンブルするときの CPU が 68030 か 68040 以上かによっ てアセンブル結果が異なるので注意して下さい。 PFLUSHA ──────────────────────────────────── 制御レジスタ ──────────────────────────────────── scd060.x では、X コマンドやコマンドラインの .レジスタ名 の記述において、 新たに以下の制御レジスタ名が使用可能です。 BUSCR DTT0 DTT1 ITT0 ITT1 MMUSR PCR SRP TC URP 上記のレジスタはフルスクリーンモードのレジスタウィンドウには表示されま せんが、X コマンドで参照および変更することができます。ただし、これらの制 御レジスタにはいずれも重要な値が入っているので、一部のビットを除いて無闇 に変更してはいけません。 なお、scd060.x を実行した環境で存在しない制御レジスタは通常は表示され ませんが、それらを X コマンドを使って参照または変更してもエラーにはなら ず、コマンドラインだけで使える単なる変数として値が保持されます。 ──────────────────────────────────── 例外スタックフレーム ──────────────────────────────────── scd060.x は、68040 と 68060 で追加された例外スタックフレーム(format $3/$4/$7)に対応しています。これらの例外が発生すると、バスエラーの状況や 分岐予測エラーの有無などが表示されます。 ● 68060 における例外スタックフレームの表示の例 ・バスエラーの場合 ライトのみでリードできないポートの $00EAFF81 を、リードしようとしてみ ます。 Exceptional abort by access error Access fault or floating-point disabled stack frame Fault or effective address is 00EAFF81 at 002896F8 move.b $00EAFF81,D0 Fault Status Long Word (FSLW) is 01250020 Fault was caused by: RE (Bus Error on Read) Fault occurred on: IO=0,MA=0 (Aligned or misaligned first operand access) LK=0 (Not locked), RW=2 (Read), SIZE=1 (Byte) TT=0 (Normal Access), TM=5 (Supervisor Data Access) PC=002896F8 USP=0025CA9A SSP=0025CA9A 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=3 DFC=3 VBR=00000000 CACR=A0808000 PCR=04300521 BUSCR=00000000 TC=0000C210 URP=11EC8000 SRP=11EC8000 ITT0=00000000 ITT1=00000000 DTT0=00000000 DTT1=00000000 D 00008364 00000000 00000000 00000000 00000000 00000000 00000000 00000000 A 002895F0 00289706 0025CD32 11807CB0 002896F0 00000000 00000000 0025CA9A move.b $00EAFF81,D0 ;00EAFF81(??) - ・スーパーバイザプロテクトの場合 ユーザモードでアドレス $00000000 からリードしようとしてみます。このア ドレスは MMU の設定でスーパーバイザプロテクトされており、ユーザモードで はアクセスできません。Human の白帯ではバスエラーと表示されますが、実際に はバスエラーは発生していません。 Exceptional abort by access error Access fault or floating-point disabled stack frame Fault or effective address is 00000000 at 0028B264 move16 (A0)+,(A1)+ Fault Status Long Word (FSLW) is 01690100 Fault was caused by: SP (Supervisor Protect) Fault occurred on: IO=0,MA=0 (Aligned or misaligned first operand access) LK=0 (Not locked), RW=2 (Read), SIZE=3 (Double Precision or MOVE16) TT=1 (MOVE16 Access), TM=1 (User Data or MOVE16 Access) PC=0028B264 USP=0025E60E SSP=00008364 SR=0000 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=3 DFC=3 VBR=00000000 CACR=A0808000 PCR=04300521 BUSCR=00000000 TC=0000C210 URP=11EC8000 SRP=11EC8000 ITT0=00000000 ITT1=00000000 DTT0=00000000 DTT1=00000000 D 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 A 00000000 00000000 0025E8A2 11807CB0 0028B260 00000000 00000000 0025E60E move16 (A0)+,(A1)+ - ・ライトプロテクトの場合 $00FFFFFF(ROM 領域)にライトしてみようとしてみます。ここで、$00FFFFFF の実体はローカルメモリ(RAM)上にあり、MMU の設定でライトプロテクトされ ています。Human の白帯ではバスエラーと表示されますが、実際にはバスエラー は発生していません。 Exceptional abort by access error Access fault or floating-point disabled stack frame Fault or effective address is 00FFFFFF at 0028C26E clr.b -(A0) Fault Status Long Word (FSLW) is 00A50080 Fault was caused by: WP (Write Protect) Fault occurred on: IO=0,MA=0 (Aligned or misaligned first operand access) LK=0 (Not locked), RW=1 (Write), SIZE=1 (Byte) TT=0 (Normal Access), TM=5 (Supervisor Data Access) PC=0028C26E USP=0025F60A SSP=0025F60A 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=3 DFC=3 VBR=00000000 CACR=A0808000 PCR=04300521 BUSCR=00000000 TC=0000C210 URP=11EC8000 SRP=11EC8000 ITT0=00000000 ITT1=00000000 DTT0=00000000 DTT1=00000000 D 00008364 00000000 00000000 00000000 00000000 00000000 00000000 00000000 A 01000000 0028C278 0025F8A2 11807CB0 0028C260 00000000 00000000 0025F60A clr.b -(A0) ;00FFFFFF(byte $FF) - ・分岐予測エラーの場合 分岐予測エラーは、分岐命令コード以外の場所で分岐キャッシュがヒットして しまった場合に発生するエラーです。これは、68000 用に最適化されたプログラ ムで稀に発生することがあります。これもアクセスフォルトの一種なので Human の白帯ではバスエラーと表示されてしまいますが、実際にはバスエラーは発生し ていません。分岐予測エラーが発生した場合は、分岐キャッシュをフラッシュし てから処理を続行することが推奨されています。 故意に分岐予測エラーを発生させるプログラム: bra.s 2f 1: .dc.w $307C ;movea.w #<data>,a0 2: bra.s 3f .dc.w $FF00 3: bra.s 1b Branch Prediction Error の他に Bus Error on Write が出てしまうのは、バ スエラーを示すビットが立っているからです。これは MPU のバグかも知れませ ん。 アクセスフォルトが発生した時点で scd060.x 自身が分岐キャッシュをフラッ シュしてしまうので、分岐予測エラーが発生してもそのままプログラムを続行す ることができます。 Exceptional abort by access error Access fault or floating-point disabled stack frame Fault or effective address is 0028D262 at 0028D262 movea.w #$6002,A0 Fault Status Long Word (FSLW) is 09428014 Fault was caused by: WE (Bus Error on Write) BPE (Branch Prediction Error) Fault occurred on: IO=1,MA=1 (Extension word fetch access) LK=0 (Not locked), RW=2 (Read), SIZE=2 (Word) TT=0 (Normal Access), TM=2 (User Code Access) PC=0028D262 USP=0026060E SSP=00008364 SR=0000 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=3 DFC=3 VBR=00000000 CACR=A0808000 PCR=04300521 BUSCR=00000000 TC=0000C210 URP=11EC8000 SRP=11EC8000 ITT0=00000000 ITT1=00000000 DTT0=00000000 DTT1=00000000 D 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 A 0028D160 0028D26A 002608A2 11807CB0 0028D260 00000000 00000000 0026060E movea.w #$6002,A0 - ──────────────────────────────────── DOS / FPACK / SXCALL / IOCS ──────────────────────────────────── 従来から DOS コールと FPACK(FE ファンクションコール)が名前で扱えるよ うになっていましたが、scd060.x では新たに SXCALL と IOCS コールも名前で 扱えるようになっています。また、従来は DOS コールなどはコール名がそのま ま命令になっているだけでしたが、DOS/FPACK/SXCALL/IOCS をそれぞれ命令とし て、オペランドにコール名を記述することもできるようになっています。逆アセ ンブルのときも同様に、DOS/FPACK/SXCALL/IOCS とコール名を出力します。特に IOCS コールの部分の逆アセンブル結果が格段に見やすくなっています。 ● DOS コール DOS コールは、以下のフォーマットでアセンブルおよび逆アセンブルします。 DOS _コール名 勿論、従来通り _コール名 だけ書いてもアセンブルできます。また、小文字 で書いてもアセンブルできます。 _OS_PATCH 等の幾つかの DOS コール名が追加されています。また、060turbo の新設 DOS コールのコール名も入っています。 ● FE ファンクションコール FE ファンクションは、以下のフォーマットでアセンブルおよび逆アセンブル します。 FPACK __コール名 勿論、従来通り __コール名 だけ書いてもアセンブルできます。また、小文字 で書いてもアセンブルできます。 __ASIN 等の幾つかの FE ファンクションコール名が追加されています。 ● SX コール 新たに SX コールにも対応しています。 SX コールのアセンブルおよび逆アセンブルのフォーマットは以下の通りです。 SXCALL __コール名 勿論、DOS コールのように __コール名 だけ書いてもアセンブルできます。ま た、小文字で書いてもアセンブルできます。 コール名はなるべく最新のものを使用しましたが、不足があるかもしれません。 不足や間違いを見つけたら報告して下さい。 ● IOCS コール IOCS コールにも対応しています。 IOCS コールのアセンブルおよび逆アセンブルのフォーマットは以下の通りで す。 IOCS _コール名 勿論、DOS コールのように _コール名 だけ書いてもアセンブルできます。ま た、小文字で書いてもアセンブルできます。 IOCS コールのアセンブル結果は以下のようになります。また、この命令の組 み合わせを IOCS コールと判断して逆アセンブルします。 MOVEQ.L #コール番号,D0 TRAP #15 なお、IOCS コールをステップ実行すると、上記の 2 命令をまとめて飛び越え るようにしてあります。 ──────────────────────────────────── その他の拡張や仕様変更 ──────────────────────────────────── 改造者の好みであちこちいじってあります。 ●コンフィグファイルとヘルプファイルの検索方法の変更 従来通り SCD.CNF と SCD.HLP も検索しますが、起動されたデバッガの実行フ ァイルと同じディレクトリにデバッガの拡張子を .cnf と .hlp に変えたファイ ルがあれば、そちらが優先します。例えば、デバッガの実行ファイル名が scd060.x ならば、SCD.CNF と SCD.HLP よりも scd060.cnf と scd060.hlp の方 が優先します。 ●条件の成立状況を表示する X コマンドの表示の中に「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」のような条件の成立状況を加えました。 ● .SR と .CCR で SR と CCR を参照できる ● XCCR の後にパラメータ(設定値)を書ける ● XX、XN、XZ、XV、XC で CCR をビット毎に操作できる 例えば、XC1 で C フラグをセット、XC!.C で C フラグを反転できます。 ● .X、.N、.Z、.V、.C で CCR をビット毎に参照できる この追加のため、X、N、Z、V、C という 1 文字のシンボルを .〜 で参照でき なくなっているので注意して下さい。 ●メニューバーのプルダウンメニューがクリックで操作できる メニューバーのプルダウンメニューの操作にドラッグが必要なのは不便なので、 クリックでも操作できるようになっています。 メニューバーの上でクリックするとプルダウンメニューが出てくるので、選択 したい項目にマウスポインタを合わせてもう一度クリックして下さい。 勿論、従来通りドラッグしても選択できます。 ●オペレーションサイズを常に出力する 逆アセンブルするとき、MOVEQ などのサイズが明確な命令でも unsized でな ければサイズを明記するようにしました。 ● DBF を DBRA と書く 逆アセンブルするとき、DBF を DBRA と表記します。FDBF も FDBRA になりま す。 ●従来から存在した命令で新たに記述が許されることになった別名 以下の命令が新たにアセンブルできます。それぞれ CC や CS の別名です。 BHS BLO DBHS DBLO SHS SLO TRAPHS TRAPLO ● SF/ST の表示を改善 SF/ST のオペランドの位置が左に寄っていたので、他の命令と同じ位置に表示 されるようにしました。 ●文字表示を改善 2 バイトの半角文字や 1/4 角文字を正しく表示できるようにしました。 “□”のフォントが変わってしまわないようにしました。 メッシュ表示を高速化しました。 ●シェルのファイル名は環境変数 SHELL も検索する 従来からシェルのファイル名を環境変数 comspec で指定できましたが、それ が設定されていない場合は環境変数 SHELL も検索するようになっています。ど ちらも設定されていなければ command.x を使用します。 また、環境変数 comspec の内容がフルパスでなくてもシェルを起動できるよ うになっています。 ●メッセージの変更 「No symbol file」の日本語訳を「シンボルファイルがない」から「シンボル がないファイル」に変更しました。 Custom ウィンドウの中の文字も若干変わっています。 ●浮動小数点数の誤差の改善 浮動小数点の 10 のべき乗のテーブルの誤差が大きかったので、正確な値に近 いテーブルで置き換えてみました。 ──────────────────────────────────── デバッグ ──────────────────────────────────── 以下は、SCD.X v3.00/v3.01 にあって scd060.x で修正された不具合です。他 にもいろいろありそうなので、気付いたら報告して下さい。細かい不具合もなる べく修正します。 ●逆アセンブル結果と共にメモリ内容を表示するとき実効アドレスを間違えるバ グ プレデクリメントの実効アドレスの計算が間違っていました。そのため、 FMOVE.X -(An),FPn などの実効アドレスとその内容が正しく表示できていません でした。 フルフォーマットのベースレジスタおよびインデックスのサプレスが処理され ていませんでした。そのため、例えば ($0000.W,ZA0,D0.L) の実効アドレスとそ の内容が ($0000.W,A0,D0.L) と同じになってしまっていました。 インデックスレジスタの値の取得とスケールファクタの計算も間違っていまし た(v3.00 のみ)。 ●逆アセンブルするとき PFLUSH/PLOAD/PTEST のイミディエイトオペランドの表 示を間違える不具合 逆アセンブルするとき、PFLUSH/PFLUSHS の 1 番目および 2 番目のイミディ エイトオペランドと、PLOADR/PLOADW/PTESTR/PTESTW の 1 番目のイミディエイ トオペランドの表示が間違っていました。 ● FNOP/FBcc/FSAVE/FRESTORE/FBRA を正しく逆アセンブルできない不具合 (v3.00 のみ) FTRAPcc の逆アセンブル用の文字列が欠落していたために、FNOP、FBcc、 FSAVE、FRESTORE、FBRA の各命令を正しく逆アセンブルできませんでした。 ● FDBcc/PDBcc のオフセットの計算を間違える不具合 アセンブルするときは正しい値よりも 2 大きいオフセットを出力し、逆アセ ンブルするときは正しい値よりも 2 小さいアドレスを表示していました。 ●逆アセンブルするとき TTn レジスタのサイズがワードになる不具合 PMOVEFD.L (A0),TT0 が PMOVEFD.W (An),TT0 と出力されていました。 ● FScc Dn をアセンブルできない不具合 FScc (An) はアセンブルできるのに、FScc Dn をアセンブルしようとするとエ ラーになってしまっていました。 ●アセンブルするとき PTRAPcc #imm にオペランドサイズを明記しないとオペラ ンドなしのコードを出力する不具合 PTRAPcc #0 を PTRAPcc.W #0 と書かなければなりませんでした。 ●アセンブルのとき STOP 命令のサイズに .B や .L を指定してもアセンブルで きる不具合 ●アセンブルのとき NOP などにサイズを指定してもエラーにならない不具合 ● X コマンドのコマンド名と汎用以外のレジスタ名の間にスペースがあるとエ ラーになる不具合 XD0 は X D0 とも書けるのに、X PC は XPC と書かなければなりませんでした。 ● X コマンドで汎用以外のレジスタに設定する値をコマンドラインに書くとき、 レジスタ名と設定値の区切りの判断の仕方がおかしい不具合 X FPSR 0 を X FPSR,0 と書かなければなりませんでした。 XD0.D0+2 とは書けるのに XPC.PC+2 がエラーになってしまっていました。 ●例外スタックフレームを正しく表示できないことがある不具合 デバッグ中のプログラムが SCD.X が与えたユーザスタックをそのままスーパ ーバイザスタックとして使用していると、例外が発生したときにその例外スタッ クフレームが SCD.X 自身によって破壊されてしまい、例外スタックフレームの 内容が正しく表示されませんでした。 なお、scd060.x がデバッグ中のプログラムに与えるユーザスタックのサイズ は、8KB です。 ●拡張子が .SYS の実行ファイルをロードできない不具合 強制的に .X 形式でロードするためのモードの指定が間違っていました。 ●ベクタ $3D〜$3F を復元しない不具合 ●例外発生時の浮動小数点レジスタの保護を行う部分の FSAVE/FRESTORE がキャ ンセルされたいた不具合(v3.00 のみ) ●レジスタの一覧表示で DFC の表示が SFC の値になっていた不具合 ●コンソールモードでテキスト画面の使用状態を変更してしまう不具合 ! コマンドでシェルを呼び出すとき、その前後でテキスト画面の使用状態を変 更しますが、これがコンソールモードでも機能してしまっていました。そのため、 コンソールモードでシェルを起動するとその後のテキスト画面の操作に支障が出 る場合がありました。 ──────────────────────────────────── SCD.X v3.00 と v3.01 の違いについて(参考) ──────────────────────────────────── SCD.X v3.00 と v3.01 の違いは、以下の 3 つ不具合が修正されたことだけで す。 ● FNOP/FBcc/FSAVE/FRESTORE/FBRA が正しく逆アセンブルできなかった不具合 ●例外発生時の浮動小数点レジスタの保護を行う部分の FSAVE/FRESTORE がキャ ンセルされたいた不具合 ●逆アセンブルのときの実効アドレスのメモリ内容の表示で、インデックスレジ スタを含む実効アドレスを間違える不具合 ──────────────────────────────────── 68040/68060 で動作させるための改造の内容(参考) ──────────────────────────────────── SCD.X v3.00/v3.01 は、そのままでは 68040/68060 上で動かすとハングアッ プしてしまいます。これを 68040/68060 でまともに使えるようにするために施 した改造の内容を幾つか挙げておきます。 ● 68040 以上のとき CAAR 等の未実装レジスタの使用を回避する ●キャッシュフラッシュの手順を CPU によって選択する ●コピーバックモード対策(自己書き換え後のキャッシュフラッシュ) ●ソフトウェアエミュレーションの例外でプログラムを中断しないようにした ● 68040/68060 ではカーソルの点滅が速くなりすぎるので、点滅の間隔を一定 に保つように修正した ●バスエラーの発生が予想される箇所を NOP で囲む ──────────────────────────────────── ●謝辞 SCD.X v3.01 を提供してくれたEPOさん、ありがとうございました。 バグ報告などを寄せて下さった皆さんにも感謝致します。今後も引き続き情報 提供をお願い致します。 ●お約束 正しく動作することを期待して改造しましたが、scd060.x の動作は無保証で す。 ●連絡先 満開ネット: MKSX0109 かまだ E-mail: kamada@mankai.co.jp (EOF)