高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technote 1136

MicroBug: The ROM Debugger

目次

MicroBugについて

MicroBugのコマンド

MicroBugの秘伝

要約

のテクノートではMicroBugの機能について説明します。MicroBugはROMデバッガで、Mac Plus以降の全てのMacintoshに装備されています。

ハードなプログラミング作業の一日が終り帰宅する電車で、面白い歴史物語として退屈しのぎにこのテクノートを読んでもらいたいと思います。またMacsBugをインストールすると再現しない問題のデバッグをするときに、読んで頂きたいと思います。

MicroBugについて

MicroBugはMac Plusで最初に導入され、それ以降の全てのMacintoshのROMの標準のコンポーネントとなっています。MicroBugはシステムがマスク不可割り込み(Non-Maskable Interrupt,NMI)を受け取り、他のデバッガ(すなわちMacsBug)がインストールされていないときに呼ばれます。

MicroBugはMacintosh 128,Macintosh 512とMacintosh XLには装備されていません。

環境

MicroBugは、そのユーザインタフェースを操作するのに標準のシステムサービスを使います。特に、MicroBugはウインドウを描くためにQuickDrawを使い、キーボードイベントを得るためにイベントマネージャ(Event Manager)を使います。内部的なことですが、MicroBugはシステムエラーハンドラ(System Error Handler)と多くのコードを共有しています。MicroBugとMacsBugは対照的で、MacsBugでは描画と入力の処理の為に独自の低レベルルーチンを使います。結論としてはシステムが"損傷"している場合にはMacsBugの方がMicroBugよりも機能する場合が多いと言うことです。

MicorBugの式は以下から構成されています:

16進数(先頭に$がついてもつかなくてもよい)
16進数の値となります。
"."
ドットアドレスとなります。このアドレスは初期には0にセットされていて引き続くDMとSMコマンドで設定されます。
@<expr>
<expr>にあるメモリの値となります。
RAx
680x0のアドレスレジスタAxの内容となります。
RDx
680x0のデータレジスタDxの内容となります。
PC
680x0のプログラムカウンタレジスタの内容となります。
-<expr>
<expr>に-1を掛けたものとなります。
<expr>+<expr>
2つの式の和となります。
<expr>-<expr>
2つの式に差となります。

全ての式はそれぞれ固有のサイズを持ち、それが式が返す有効なバイトの数となります。16進数のサイズは、数の中にある16進数字の数によって決まります。16進数字が1つあるいは2つの場合、そのサイズは1バイトであり、16進数字が3あるいは4つの場合、そのサイズは2バイトとなり、5あるいはそれ以上の場合、サイズは4バイトとなります。

"."、間接式(indirect)、そして全てのレジスタ式のサイズは4バイトです。

算術式のサイズはその要素のサイズの最大値となります。

MicroBugのコマンド

ダンプメモリ(Dump Memory)

DM addr

DM

引数付きの場合、ダンプメモリコマンドはaddrで指定されたアドレスからのメモリの内容を表示します。引数無しの場合、ダンプメモリコマンドは、直前のダンプメモリコマンドが表示したメモリの、次からのメモリを引き続けて表示します。

両者ともドットアドレスを、表示を開始した位置に設定します。

このコマンドを入力したあとにリターンキーをタイプすると、引き続くメモリを表示します。

セットメモリー(Set Memory)

SM addr expr

セットメモリーコマンドはaddrで指定されるアドレスから始まるメモリの内容を、expr式で指定される値に設定します。このコマンドは、式のサイズに従ってバイト(byte)、ワード(word)、ロング(long)の値を設定します。設定が完了すると、このコマンドは、値を設定した場所からのメモリの内容を表示します。

このコマンドはドットアドレスを、開始した位置に設定します。

このコマンドを入力したあとにリターンキーをタイプすると、引き続くメモリを表示します。

ゴー(Go)

G addr

G

引数付きの場合、ゴーコマンドはaddrで指定されたアドレスから実行を開始します。引数無しの場合、ゴーコマンドはMacroBugに入った時点からの実行を再開します。

全表示(Total Display)

TD

MicorBugに入る時にレジスタを保存したメモリを表示することで、全ての標準680x0レジスタを表示します。下のテーブルのそれぞれのレジスタのメモリ位置を示します。

アドレス

サイズ

説明

名前

$0C30

16 x 4 bytes

680x0レジスタd0-d7とa0-a7(この順)

SEVarBase

$0C6C

4 bytes

680x0 SPレジスタ

MacsBugSP

$0C70

4 bytes

680x0 PCレジスタ

MacsBugPC

$0C74

2 bytes

680x0 SRレジスタ

MacsBugSR

コマンドを入力した後、すぐにリターンキーをタイプすると、コマンドが繰り返されます。

レジスタの設定と表示

Ax expr
Ax

Dx expr
Dx

PC expr
PC

SR expr
SR

引数付きの場合、これらのコマンドは、それぞれのレジスタにexprを設定します。引数無しの場合、これらのコマンドは、それぞれのレジスタの値を表示します。xはアドレスレジスタあるいはデータレジスタの番号を示し、0から7までの数字です。

コマンドを入力した後、すぐにリターンキーをタイプすると、コマンドが繰り返されます。

MicroBugの秘伝

  • 次のようにタイプして、現在のプロセスを強制的に終了させることができます:
    SM 0 A9F4
    G 0
    これは_ExitToShellトラップをアドレス0に設定し、引き続きそのトラップを実行することです。もちろん、現在ではMacOSがコマンド-オプション-エスケープのキー操作を提供しているので、この仕掛けは、ほとんど意味はありません。
  • もしデバッガに入ってシステムがハングしたら、モデムのスィッチを切ってみてください。
    注:
    私にはこの助言が今でも有効かどうか分かりませんが、この神秘的なコメントをテクノートから削除するとはできませんでした。
  • もしあなたがMicroBugを使って問題をデバッグしているのなら、悪いことは言いません、もう一台MacsBugをインストールしているマシンをとなりに置いてください。そうするとデバッグをしやすくするためMacsBugのコマンドが使えます。dh(16進語の逆アセンブル),mcdとwh(低メモリグローバルを見つける)、そしてdm 0 <template>(構造体のフィールドのオフセットを探す)などは大変に便利です。

要約

MacsBugはあたたの友人です。MicroBugはたいした友人ではないと思いますが、もしあなたがマックのプログラマで、MacsBugをインストールすると消えてしまうようなバグを持っているとしたら、とにかく助けとなる友人が必要です。

参考文献

  • MacsBug Reference and Debugging Guide, for MacsBug version 6.2 , Apple Computer, Inc.,Addison-Wesley, 1990

変更履歴

  • 新規作成 1986年6月:Technote 38 "ROM Debugger"
  • 更新 1998年3月:Technote PT 33 "The ROM Debugger"
  • 更新 1998年8月:Technote 1137 "MicroBug: The ROM Debugger" この版では、デバッガコマンドについてより完全に説明しています。

更新日: 1998 年 8 月 31 日