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をインストールすると消えてしまうようなバグを持っているとしたら、とにかく助けとなる友人が必要です。
|