BMS は、RAM モニタで、以下の機能を持っています。
BMS はデバッグモードでシステムが起動されたときに動作し、 デバッグ用コンソールとの間で入出力を行います。
- BMS は論理アドレスで動作します。
- BMS 内では割り込みは使用していません。 すべての割り込みは禁止状態となります。
BMS はシリアルポート経由で 外部のデバッグ用コンソールと接続して使用します。
通信ポート COM1 (I/O アドレス 0x3F8
固定)通信速度 19200 bps データ長 8 ビット ストップビット 1 ビット パリティ なし 受信行末 CR
(0x0d
)送信行末 CRLF
(0x0d, 0x0a
)使用コード ASCII
モニタはコマンド入力待ちのときに、 プロンプトとして以下の文字列を表示します。
BMS>
モニタのコマンドは以下の形式で入力します。 1 行は最大 256 文字です。
<コマンド名> <パラメータ 1>, <パラメータ 2>, ... <改行>
<コマンド名>の大文字/小文字は区別されません。
<コマンド名>と<パラメータ>は空白またはタブで区切ります。
<パラメータ>は、',' で区切ります。 パラメータの一部を省略するときは、 ',' のみを入力することによって<パラメータ>の対応を示します。
コマンドを ';' で区切って 1 行に複数のコマンドを書くことができます。
'*' で始まる行はコメント行として無視されます。 改行だけの空行も無視されます。
以下の特殊キーが使用できます。
Ctrl-X ( 0x18
), Ctrl-U (0x15
)入力行の取り消し Ctrl-H ( 0x08
), DEL (0x7f
)入力文字の 1 文字の取り消し Ctrl-S ( 0x13
)表示の一時中断 Ctrl-Q ( 0x11
)表示の再開 Ctrl-C ( 0x03
)コマンドの強制終了 Ctrl-F ( 0x06
),ESC [ C
カーソルを右に移動(→) Ctrl-B ( 0x02
),ESC [ D
カーソルを左に移動(←) Ctrl-P ( 0x10
),ESC [ A
前の入力行の呼び出し(↑) Ctrl-N ( 0x0e
),ESC [ B
次の入力行の呼び出し(↓) Ctrl-K ( 0c0b
)カーソル以降を削除
Ctrl-C により、ユーザプログラムの実行を中断することはできません。
数値定数は以下の形式で記述します。
16 進数 H'<16進数字列> h'<16進数字列> '<16進数字列>
0x<16進数字列> <0〜9> <16進数字列>10 進数 D'<数字列> d'<数字列> 8 進数 Q'<8進数字列> q'<8進数字列> 2 進数 B'<2進数字列> b'<2進数字列>
<数字>: '0'〜'9' <2 進数字>: '0','1' <8 進数字>: '0'〜'7' <16 進数字>: '0'〜'9','A'〜'F','a'〜'f'
先頭に何も付けない数字列は 16 進数とみなされますが、 先頭が数字でない場合は、シンボルと判断されますので注意が必要です。
(例) 以下はすべて同じ値となります。 h'b123 'B123 0xb123 0b123 d'45347 Q'130443 b'1011000100100011
※ b123 はシンボルと判断されます。
文字列定数は、'"' で囲まれた任意の文字列で、 特殊なパラメータとして使用されます。
(例) "abcedf"
シンボルは、英字, '_', '$, '@' で始まり、英字, 数字, '_', '$, '@' で 構成される最大 255 文字の文字列です。
任意の名前のシンボルを定義して値を設定することができます。
シンボル名中の大文字/小文字は区別されます。
シンボル '@' はメモリ操作コマンドの開始アドレスを示すシンボルとして
モニタ内で使用されますので、使用することはできません。
定義できるシンボルの最大数はシンボルの文字数に依存しますが、 平均 16 文字として約 2300 個程度まで定義できます。
(例) start @Base $X _main_
式は、数値定数やシンボルを '+', '-', '*', '/' の演算子でつなげたもので、 コマンドのパラメータとして記述できます。 '*', '/' を含む演算も常に左から行われます。 また、式中にレジスタ名を記述すると、 レジスタの値を意味します。
(例) H'8000000 + h'250 @B + 102 data + d'10 a + b * c は (a + b) * c の意味となります。 EAX + 100 は レジスタ EAX の値 + h'100 となります。
'&' は間接参照を示す演算子で、 それまでの式の値のメモリアドレスの内容(ワード)を式の値とします。 '&' を連続して書くことにより多段の間接参照もできます。
(例) H'8000000 + h'250 & H'8000250 のメモリ内容を値とする。 aaaa & + H'8 & シンボル aaaa の値のメモリ内容 + 8 をアドレスとする メモリ内容が式の値となる。
ここでは各コマンドの具体的な説明を行います。
コマンドの説明では以下の表記を使用しています。
[〜 ] 省略可能を示す [〜].. 省略可能の繰り返しを示す {〜|〜} 選択を示す
以下にコマンドの一覧を示します。
<コマンド名> <コマンド説明> D, DB, DC, DH, DW
Dump Memory メモリ内容の表示 M, MB, MH, MW
Modify Memory メモリ内容の変更 F, FB, FH, FW
Fill Memory メモリ内容の埋め込み(フィル) SC, SCB, SCH, SCW
Search Memory メモリ内容のサーチ CMP
Compare Memory メモリ内容の比較 MOV
Move Memory メモリ内容の転送 DA
Disassemble 逆アセンブル R
Register Dump/Modify レジスタの表示/変更 G
Go Program プログラムの実行 B, BC
Set/Clear Break Point プレークポイント設定/クリア T, S, N, TA
Trace Program トレース実行 BTR
Back Trace バックトレース表示 IB, IH, IW
Input I/O ポートからの入力 OB, OH, OW
Output I/O ポートへの出力 LO
Load Program/Data プログラム/データのロード KILL
Kill Process 現在プロセスの強制終了 H, ?
Help Message ヘルプメッセージの表示 VER
Display Monitor Version モニタのバージョンの表示 P
Print Value 値の表示 SYM, SYMC
Set/Clear Symbol シンボルの設定/クリア INIT
Initialize モニタの初期化 PROMPT
Set Prompt プロンプト文字列の設定 SERR
System Error Information システム障害情報の表示 EXIT
Exit Monitor モニタの終了
|
D [<開始アドレス>][, {<終了アドレス>|#<データ数>}] DB [<開始アドレス>][, {<終了アドレス>|#<データ数>}] DH [<開始アドレス>][, {<終了アドレス>|#<データ数>}] DW [<開始アドレス>][, {<終了アドレス>|#<データ数>}]
指定したアドレス範囲のメモリ内容を以下の<単位>で表示します。
D, DB | バイト単位 | <データ数>はバイト数 |
DH | ハーフワード単位 | <データ数>はハーフワード数 |
DW | ワード単位 | <データ数>はワード数 |
対象となるアドレス範囲は以下のいずれかです。
<開始アドレス> 〜 <終了アドレス> + <単位> - 1 <開始アドレス> 〜 <開始アドレス> + <データ数> * <単位> - 1
指定した<開始アドレス>はシンボル "@" に自動的に設定されます。
<開始アドレス>を省略すると、前回の D, DB, DH, DW コマンドの次のアドレスから表示します。
<終了アドレス>を省略すると、<単位>にかかわらず 64 バイト分表示します。
BMS> D 80100000 80100000: 00 09 80 04 45 03 E0 05 E0 09 00 0A 00 0B 56 0C ....E.........V. 80100010: 04 0D 00 0E 03 01 E0 03 E1 05 E8 FF 8E 00 00 00 ................ 80100020: 1B D6 1B D6 1B D6 1B D6 9E 00 00 00 8E 00 01 C0 ................ 80100030: C6 16 D0 0C 00 FF 80 46 80 10 00 00 88 12 22 4C .......F......"L 80100040: FF BF FE F0 1E 4C 80 10 00 00 D0 66 9C 00 8E 10 .....L.....f.... 80100050: 02 B8 AF E5 46 56 D0 0C 00 FF 80 66 9C 00 8C F6 ....FV.....f.... 80100060: 9E 00 03 80 8E 00 00 C0 1A 4C FF BF FE F0 1A 76 .........L.....v 80100070: 1E 4C 80 10 00 1C AA 37 52 D6 00 00 00 01 C2 16 .L.....7R....... BMS> BMS> DH 80100000, 80100010 80100000: 0900 0480 0345 05E0 09E0 0A00 0B00 0C56 ....E.........V. 80100010: 040D .. BMS> BMS> DW 80100000, #9 80100000: 04800900 05E00345 0A0009E0 0C560B00 ....E.........V. 80100010: 0E000D04 03E00103 FFE805E1 0000008E ................ 80100020: D61BD61B ....
|
M [<開始アドレス>][, <設定データ>].. MB [<開始アドレス>][, <設定データ>].. MH [<開始アドレス>][, <設定データ>].. MW [<開始アドレス>][, <設定データ>]..
指定した<開始アドレス>のメモリ内容を以下の<単位>で変更します。
M, MB | バイト単位 |
MH | ハーフワード単位 |
MW | ワード単位 |
指定した<開始アドレス>はシンボル "@" に自動的に設定されます。
<開始アドレス>を省略すると、
前回の M, MB, MH, MW コマンドの次のアドレスから変更します。
<設定データ>には<式>または<文字列>を指定します。
<式>は<単位>バイトのデータとして設定され、
<文字列>は<単位>にかかわらず常にバイトデータ列として設定されます。
<設定データ>は最大 128 バイト分まで続けて指定できます。
<設定データ>を省略すると、対話形式によりメモリ内容を変更します。
対話形式では以下の入力は特別な意味となります。
'.' | コマンドを終了する。 |
'^' | 1 つ前のアドレスに戻る。 |
(改行のみ) | 設定せずに次のアドレスに進む。 |
BMS> MB 80100000 80100000: 00 -> 12 80100001: 09 -> 34 80100002: 80 -> ^ 80100001: 34 -> . BMS> BMS> MH 80100000, "ABCD", 56, 78 BMS> BMS> MW 80100000 80100000: 41424344 -> 80100004: 56007800 -> . BMS>
|
F <開始アドレス>,{<終了アドレス>|#<データ数>},<設定データ>[,<設定データ>].. FB <開始アドレス>,{<終了アドレス>|#<データ数>},<設定データ>[,<設定データ>].. FH <開始アドレス>,{<終了アドレス>|#<データ数>},<設定データ>[,<設定データ>].. FW <開始アドレス>,{<終了アドレス>|#<データ数>},<設定データ>[,<設定データ>]..
指定したアドレス範囲のメモリに<設定データ>列を 以下の<単位>で繰り返して埋め込みます。
F, FB | バイト単位 | <データ数>はバイト数 |
FH | ハーフワード単位 | <データ数>はハーフワード数 |
FW | ワード単位 | <データ数>はワード数 |
対象となるアドレス範囲は以下のいずれかです。
<開始アドレス> 〜 <終了アドレス> + <単位> - 1 <開始アドレス> 〜 <開始アドレス> + <データ数> * <単位> - 1
指定した<開始アドレス>はシンボル "@" に自動的に設定されます。
<設定データ>には<式>または<文字列>を指定します。 <式>は<単位>バイトのデータとして設定され、 <文字列>は<単位>にかかわらず常にバイトデータ列として設定されます。 <設定データ>は最大 128 バイト分まで続けて指定できます。
BMS> F 80101000, #10, 57 BMS> BMS> D 80101000, #12 80101000: 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 WWWWWWWWWWWWWWWW 80101010: 00 00 .. BMS> BMS> FW 80101000, 8010101f, 12, 34 BMS> BMS> D 80101000, #22 80101000: 12 00 00 00 34 00 00 00 12 00 00 00 34 00 00 .......4.......4 80101010: 12 00 00 00 34 00 00 00 12 00 00 00 34 00 00 .......4.......4 80101020: 00 00 .. BMS>
|
SC <開始アドレス>,{<終了アドレス>|#<データ数>},<検索データ>[,<検索データ>].. SCB <開始アドレス>,{<終了アドレス>|#<データ数>},<検索データ>[,<検索データ>].. SCH <開始アドレス>,{<終了アドレス>|#<データ数>},<検索データ>[,<検索データ>].. SCW <開始アドレス>,{<終了アドレス>|#<データ数>},<検索データ>[,<検索データ>]..
指定したアドレス範囲のメモリ内容に<検索データ>列があるかどうかを 以下の<単位>で検索し、 <検索データ>列が見つかったときは、その先頭のアドレスを表示します。 最大 64 個の表示を行った時点で検索を打ち切ります。
SC, SCB | バイト単位 | <データ数>はバイト数 |
SCH | ハーフワード単位 | <データ数>はハーフワード数 |
SCW | ワード単位 | <データ数>はワード数 |
対象となるアドレス範囲は以下のいずれかです。
<開始アドレス> 〜 <終了アドレス> + <単位> - 1 <開始アドレス> 〜 <開始アドレス> + <データ数> * <単位> - 1
指定した<開始アドレス>はシンボル "@" に自動的に設定されます。
<検索データ>には<式>または<文字列>を指定します。 <式>は<単位>バイトのデータとして設定され、 <文字列>は<単位>にかかわらず常にバイトデータ列として設定されます。 <検索データ>は最大 128 バイト分まで続けて指定できます。
BMS> SC 80101000, 8010101f, 12 80101003: 8010100B: 80101013: 8010101B: BMS> BMS> SCW 80101000, #20, 12, 34 80101000: 80101008: 80101010: 80101018: BMS>
|
CMP <開始アドレス>, {<終了アドレス>|#<バイト数>}, <比較先アドレス>
指定したアドレス範囲のメモリ内容を<比較先アドレス>からのメモリ内容と比較し、 内容が異なっているアドレスとメモリ内容をバイト単位で表示します。 最大 64 個の表示を行った時点で比較を打ち切ります。
対象となるアドレス範囲は以下のいずれかです。
<開始アドレス> 〜 <終了アドレス> <開始アドレス> 〜 <開始アドレス> + <バイト数> - 1
指定した<開始アドレス>はシンボル "@" に自動的に設定されます。
BMS> CMP 80100000, 80100fff, 80110000 BMS> BMS> CMP 80100000, 80100fff, 80120000 80100020: 34 -> 80120000: 00 80100021: 56 -> 80120000: 00 : : (More) BMS>
|
MOV <開始アドレス>, {<終了アドレス>|#<バイト数>}, <転送先アドレス>
指定したアドレス範囲のメモリ内容を<転送先アドレス>に転送します。
対象となるアドレス範囲は以下のいずれかです。
<開始アドレス> 〜 <終了アドレス> <開始アドレス> 〜 <開始アドレス> + <バイト数> - 1
指定した<開始アドレス>はシンボル "@" に自動的に設定されます。
BMS> MOV 80100000, #1000, 80110000 BMS>
|
DA [<開始アドレス>][, <ステップ数>]
指定した<開始アドレス>から、 指定した<ステップ数>分を逆アセンブルした結果を表示します。
<開始アドレス>を省略すると、 前回の DA コマンドの次のアドレスから逆アセンブルします。 ただし、ユーザプログラムの実行後にブレークや例外などでモニタに戻ってきた時は、 その時点の EIP レジスタの値が DA コマンドの<開始アドレス>になります。
<ステップ数>を省略すると、16 ステップ分逆アセンブルします。
BMS> DA 801000d8 ... BMS>
|
R [<レジスタ名>[, <設定データ>]]
指定した<レジスタ名>の内容を変更します。 <設定データ>を省略すると、指定した<レジスタ名>の内容を表示します。
指定可能な<レジスタ名>は以下の通りで、大文字/小文字は区別されません。
汎用レジスタ: | EIP, EFLAGS, EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI, CS, DS, ES, FS, GS, SS |
制御レジスタ: | LDTR, TR, CR0, CR2, CR3, GDTR, IDTR |
<レジスタ名>を省略すると、汎用レジスタ全部を表示します。 <レジスタ名>として 'C'を指定すると、制御レジスタ全部を表示します。
Bms≫ R ... Bms> BMS> R C ... BMS> BMS> R EAX, 1234567 BMS> R EAX EAX :01234567 BMS>
|
G [<実行開始アドレス>][, <実行終了アドレス>]
指定した<実行開始アドレス>からプログラムを実行します。 <実行終了アドレス>は一時的なソフトウェアブレークポイントとして設定され、 <実行終了アドレス>に到達した時点でモニタに戻ります。
<実行開始アドレス>を省略すると、現在の EIP レジスタから実行します。
ユーザプログラムからは以下のいずれかの場合にモニタに戻ります。
BMS> G 801000d8, 8010434 Break (S) at 8010434 ※ at XXXX は次に実行される命令の EIP BMS>
|
B [<ブレークアドレス>[,<ブレーク属性>][, <実行コマンド>]] BC [<ブレークアドレス>][, <ブレークアドレス>]..
B コマンドは、指定した<ブレークアドレス>に指定した <ブレーク属性>のブレークポイントを設定します。 パラメータを省略すると、設定されている全てのブレークポイントを表示します。
<ブレーク属性>は以下のいずれかを指定します。省略すると S になります。
S : | ソフトウェアブレークポイント <ブレークアドレス>の命令を実行する直前にブレークする。 |
I : | 命令ブレークポイント <ブレークアドレス>の命令を実行した直後にブレークする。 |
W : | オペランドブレークポイント <ブレークアドレス>のメモリをライトした直後にブレークする。 |
RW : | オペランドブレークポイント <ブレークアドレス>のメモリをリードまたはライトした直後にブレークする。 |
ソフトウェアブレークポイントと命令ブレークポイントは両方で 8 点まで、 オペランドブレークポイントは 4 点まで設定可能です。
<実行コマンド>はブレークしたときに実行するモニタの
コマンド文字列を最大 80 文字で指定します。
<実行コマンド>に G コマンドを入れるとブレーク後に自動的に継続して実行されます。
BC コマンドは、指定した<ブレークアドレス>の設定をクリアします。
パラメータを省略すると、設定されている全てのブレークポイントをクリアします。
BMS> B 80100100, "R EAX; G" ... BMS>
|
T [<開始アドレス>][, <ステップ数>] S [<開始アドレス>][, <ステップ数>] N [<開始アドレス>][, <ステップ数>] TA [<トレース属性> [, <実行コマンド>]]
T コマンドは、指定した<実行終了アドレス>からプログラムを指定した<ステップ数> だけ、TA コマンドで設定したトレース属性に基づいてトレース実行します。 <ステップ数>を省略すると 1 ステップとなります。 <実行開始アドレス>を省略すると、 現在の EIP レジスタからトレース実行します。 トレース実行中はすべてのブレークポイントは無効になります。
S コマンドはトレース属性を全トレース、 N コマンドはステップトレースとしてトレース実行します。
TA コマンドは、トレースの属性を指定します。
パラメータを省略すると、現在設定されているトレース属性を表示します。
<トレース属性>は以下のいずれかを指定します。
トレースの属性のデフォールトはステップトレースです。
S ステップトレース(1 命令実行ごとにトレース。 ただし CALL/INT 命令の時は、 サブルーチン全体を 1 つの命令とみなし、 CALL/INT命令の次の命令でトレースする) A 全トレース(1 命令実行ごとにトレース)
<実行コマンド>はトレースごとに実行するモニタのコマンド 文字列を最大 80 文字で指定します。 <実行コマンド>に G コマンドを入れる必要はありません。
BMS> TA S ... BMS>
|
BTR [フレームポインタ]
BTR コマンドは、現在の EBP レジスタ またはパラメータで指定したフレームポインタの値から スタック内に保存されている関数呼び出しの履歴を表示します。
現在の EIP レジスタからの履歴表示の場合は、 最初に現在の EIP レジスタの値を表示します (フレームポインタを指定した場合には、EIP レジスタは表示されません)。 続いて関数呼び出しのリターンアドレスの履歴をさかのぼって表示します。 シンボルが定義されているときは、シンボルからの相対アドレスも表示します。
この機能は、 ブレークポイントや例外発生によりモニタに制御が戻った時に、 その時の状態を知るために使います。
BMS> BTR EIP = 80101758 [test_func + 52] <-- 80100420 [main + 232] <-- 80100016 [start + 16] BMS>
|
IB <I/Oアドレス> IH <I/Oアドレス> IW <I/Oアドレス>
指定した<I/Oアドレス>からデータを読み込んで表示します。
IB | バイトデータ (8 bits) の読み込み |
IH | ハーフワードデータ (16 bits) の読み込み |
IW | ワードデータ (32 bits) の読み込み |
|
OB <I/Oアドレス>,<バイトデータ> OH <I/Oアドレス>,<ハーフワードデータ> OW <I/Oアドレス>,<ワードデータ>
指定した<I/Oアドレス>にデータを書き込みます。
OB | バイトデータ (8 bits) の書き込み |
OH | ハーフワードデータ (16 bits) の書き込み |
OW | ワードデータ (32 bits) の書き込み |
|
LO <プロトコルデータ形式>[, <ロード開始アドレス>]
コンソールの通信回線からプログラム、 データまたはシンボルテーブルをメモリ上にロードします。
<プロトコルデータ形式>は以下のいずれかを指定します。<プロトコル> | <データ形式> | |
---|---|---|
XS | XMODEM | S-フォーマット(S3) |
S | 無手順 | S-フォーマット(S3) |
XO | XMODEM | オブジェクトプログラム(A.OUT フォーマット) |
XM | XMODEM | メモリイメージデータ(無変換) |
XSYM | XMODEM | シンボルテーブル |
SYM | 無手順 | シンボルテーブル |
<ロード開始アドレス>は、ロードするメモリアドレスを指定します。
XO | 省略可 (省略時はデータに含まれるアドレスが適用される) |
XM | 省略不可 |
XSYM, SYM | 指定可(指定時はシンボルの値に加算される) リンク時の指定と異なる場所にロードしたときは指定する必要があります。 |
シンボルテーブルは、以下の形式のテキストファイルです。
NNNNNNNN T SSSSSSSSSSSSSSSSSSSSSSSS <改行> : :
N: | 8 文字の 16 進数値 |
T: | シンボルタイプ (T, D, B 以外は無視される) |
S: | シンボル文字列 (先頭 32 文字が有効となる) |
無手順のシンボルテーブルのロードの時は、ロード終了後に、Ctrl-C または Ctrl-X を入力してロードを終了させる必要があります。
BMS> LO XO Loaded: 80100000 -> 801023f8 BMS> LO XM, 80120000 Loaded: 80120000 -> 8012FFFF
|
KILL
例外やブレークポイント等で BMS に移行したときに動作していたプロセスを強制終了し、 OS に制御を戻します。この機能は、OS に依存しています。
割込ハンドラ等のプロセス以外から BMS へ移行した場合には、 KILL コマンドを実行したことで OS システムダウンとなることがあります。
BMS> KILL
|
H [<コマンド名>] ? [<コマンド名>]
指定した<コマンド名>のコマンドの使用方法を表示します。
<コマンド名>を省略したとき、 あるいは<コマンド名>が間違っているときは、 コマンドの一覧を表示します。
BMS> ? DB DB [<start_addr>][, {<end_addr>|#<data_cnt>}] BMS>
|
VER
モニタのバージョンを表示します。
BMS> VER BMS Version 1.20 BMS>
|
P <式>
指定した<式>の値を 16, 10, 8, 2 進数、 および<式>の値以下で最も大きな値のシンボル+オフセットの形式で表示します。
BMS> P 1023 H'1023 D'4131 Q'10043 [sample + 23] B'1 0000 0010 0011 BMS>
|
SYM [<シンボル名>[, <式>]] SYMC [<シンボル名>[, <シンボル名>]..]
SYM コマンドは、 指定した<シンボル名>に<式>の値を設定します。 <シンボル名>を省略すると、定義されている全シンボルとその値を表示します。 <式>を省略すると、 指定した<シンボル名>で始まるすべてのシンボルとその値を表示します。
<シンボル名>ではなく<数値>のみを指定すると、 その数値のシンボルからの相対値を表示します。
SYMC コマンドは、指定した<シンボル名>をクリアします。
パラメータを省略すると、定義されているすべてのシンボルをクリアします。
BMS> SYM Base, 1234 BMS> BMS> SYM Base : 1234 BMS> BMS> SYM 1240 [Base + 0C] BMS> BMS> SYMC Base BMS> BMS> SYM BMS>
|
INIT
以下の初期化を行い、モニタを初期起動時の状態に戻します。
BMS> INIT BMS>
|
PROMPT <プロンプト文字列>
指定した<プロンプト文字列>をプロンプトとして表示します。 最大 32 文字まで有効です。
BMS> PROMPT "BB1: " BB1: BB1: PROMPT "BMS> " BMS>
|
SERR
システム障害により CPU が停止した場合に レジスタに保存されていたシステム障害情報を表示します。
システム障害情報の内容は、 システム障害により CPU が停止した後に、 システムスタート(リセット)した場合にのみ意味を持ちます。
BMS> SERR System Error Information ... BMS>
|
EXIT [<パラメータ>]
モニタを終了します。
EXIT 電源オフ EXIT 1 再起動 EXIT -1 リセット
EXIT のとき、ソフトウエアで電源オフできない機種の場合は、画面に電源を切るように促す表示を行って、システムを停止します。
BMS> EXIT
モニタでは、 ユーザプログラムで使用するためのいくつかの システムサービス関数を提供しています。
ユーザプログラムは、 以下の方法でシステムサービス関数を使用できます。 または、それぞれのシステムサービス関数に対応した C ライブラリ関数を使用することもできます。
EAX <-- 機能番号 EDA <-- パラメータへのポインタ(必要な場合のみ) INT 131 EAX --> リターン値(必要な場合のみ)
<機能番号> | <機能> | |
---|---|---|
0x00 | Enter Monitor | モニタへ入る |
0x01 | Power Off | 電源 OFF |
0x0B | Get Machine Information | マシン情報の取り出し |
0x10 | Get Character | コンソールから 1 文字入力(入力を待たない) |
0x11 | Get Character | コンソールから 1 文字入力(入力を待つ) |
0x12 | Put Character | コンソールへ 1 文字出力 |
0x13 | Get Line | コンソールから 1 行入力 |
0x14 | Put String | コンソールへ文字列出力 |
0x1F | Execute Command | モニタコマンドの実行 |
0x40 | Execute APM BIOS | APM BIOS の実行 |
0x41 | System Reset | システムリセット |
0x80 | Clear Symbol | シンボルのクリア |
0x81 | Get Symbol | シンボル取り出し |
0x82 | Set Symbol | シンボル設定 |
システムサービス関数からのエラーコード(負の値)は以下のとおりです。
-1 | パラメータエラー |
-2 | アドレスが不正(範囲外) |
|
MOVL #0x00, %EAX INT 131
void _Monitor(void)
リターンしない
ユーザプログラムからモニタへ入ります。
モニタの G コマンドによりユーザプログラムを再開できます。
|
MOVL #0x01, %EAX INT 131
void _PowerOff(void)
リターンしない
モニタを終了し、電源をオフします。 電源をオフできないときでもリターンしません。
|
PUSH (マシン情報を格納するアドレス) MOVL #0x0B, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*1,%ESP
int _GetMachineInfo(void *info)
EAX: | = 0: 正常終了 < 0: エラーコード |
以下の 256 バイトのマシン情報を取り出します。
<バイトオフセット> | <内容> |
0 〜 63 | コピーライト表記(ASCII コード 64 文字) |
64 〜 95 | BMS バージョン表記(ASCII コード 32文字) |
96 〜 99 | BMS バージョン(1 ワード: 16 進数) |
100 〜 255 | 予約 |
|
MOVL #0x10, %EAX (A:入力を待たない) INT 131
int _GetCharNW(void)
MOVL #0x11, %EAX (B:入力を待つ) INT 131
int _GetChar(void)
EAX: | >= 0: 入力した文字コード = -1: (A)で入力なし |
コンソールから 1 文字を入力します。入力した文字はエコーバックしません。
入力がないときは、(A) では -1 を戻しますが、(B) では入力されるまで待ちます。
|
PUSH (出力する文字コード) MOVL #0x12, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*1,%ESP
int _PutChar(int c) または、int _PutCh(int c)
EAX: | = -1: Ctrl-C が入力された = 0: Ctrl-C は入力されていない |
EAX: | = -1: Ctrl-C が入力された >= 0: 出力した文字コード |
コンソールへ 1 文字を出力します。
Ctrl-S(XOFF
) を入力したときは Ctrl-Q(XON) を入力するまで待ちます。
文字が LFコード(0x0A) の時は、改行(0x0d) と LFコード(0x0A) の 2 文字を出力します。
|
PUSH (入力文字列を格納するメモリの先頭アドレス) MOVL #0x13, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*1,%ESP
int _GetString(char *buff)
EAX: | >= 0: 入力した文字数 = -1: Ctrl-C が入力された |
コンソールから改行(0x0d)、または Ctrl-C(0x03) が入力されるまでの 1 行を入力
して、指定されたメモリアドレスに格納します。
文字列の最後には NULLコード(0) を格納します。改行、Ctrl-C は格納されません。
入力した文字はエコーバックするとともに、以下の特殊キーの処理を行います。
Ctrl-X (0x18 ),Ctrl-U (0x15 ) | 入力行の取り消し |
Ctrl-H (0x08 ),DEL (0x7f ) | 入力文字の 1 文字の取り消し |
Ctrl-F (0x06 ),ESC [ C | カーソルを右に移動(→) |
Ctrl-B (0x02 ),ESC [ D | カーソルを左に移動(←) |
Ctrl-P (0x10 ),ESC [ A | 前の入力行の呼び出し(↑) |
Ctrl-N (0x0e ),ESC [ B | 次の入力行の呼び出し(↓) |
Ctrl-K (0c0b ) | カーソル以降を削除 |
|
PUSH (出力文字列を格納しているメモリの先頭アドレス) MOVL #0x14, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*1,%ESP
int _PutString(char *buff) または、int _PutStr(char *buff)
EAX: | = -1: Ctrl-C が入力された = 0: Ctrl-C は入力されていない |
|
PUSH (モニタコマンド文字列を格納しているメモリの先頭アドレス) MOVL #0x1F, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*1,%ESP
int _ExecCommand(char *buff)
EAX: | = 0: モニタコマンドを実行した リターンしない: モニタへ移行した |
指定されたメモリアドレスに格納されている文字列をモニタコマンドとして実行後、 ユーザプログラムへ戻ります。
文字列が空の場合は、モニタへ移行し、ユーザプログラムへは戻りません。
|
PUSH (パラメータバッファのアドレス) MOVL #0x40, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*1,%ESP
int _APMfunc(int *par)
EAX: | = 0: 正常終了 > 0: APM BIOS エラーコード = -1: APM BIOS 実行不可 |
システムの APM BIOS を実行します。 パラメータバッファは 4 ワードのバッファであり、APM BIOS に渡す EAX, EBX, ECX, EDX の各レジスタの値を設定します。リターン時には、APM BIOS から戻された各レ ジスタの値がパラメータバッファに戻されます。
|
PUSH (パラメータ[予約]) MOVL #0x41, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*1,%ESP
void _SysReset(int par)
リターンしない
システムをリセットして、再起動します。
|
PUSH (シンボル文字数) PUSH (シンボルへのポインタ) MOVL #0x80, %EAX (A:指定シンボルクリア) LEAL 0(%ESP), %EDX INT 131 ADDL #4*2,%ESP
int _ClrSymbol(char *symbol, int nchar)
EAX: | = 0: 正常終了 < 0: エラーコード |
|
PUSH (シンボルの値を格納するポインタ) PUSH (シンボル文字数) PUSH (シンボルへのポインタ) MOVL #0x81, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*3,%ESP
EAX: | = 0:正常終了 < 0: エラーコード |
指定したシンボルの値を取り出します。
|
PUSH (シンボルの値) PUSH (シンボル文字数) PUSH (シンボルへのポインタ) MOVL #0x82, %EAX LEAL 0(%ESP), %EDX INT 131 ADDL #4*3,%ESP
int _SetSymbol(char *symbol, int nchar, int val)
EAX: | = 0:正常終了 < 0: エラーコード |
指定したシンボルを設定します。
BMS で使用しているハードウェアリソースは以下の通りです。
<ベクトル番号> <内容> 1 デバッグ例外 (トレース用) 3 ブレークポイント 8 ダブルフォールト(未定義例外処理用) 14 ページフォールト(未定義例外処理用) 131 システムサービス関数用
<I/O アドレス> <内容> 0x3F8〜0x3FF シリアルポート(COM1)
外部デバッグコンソールとの入出力用0x92, 0x64 システム制御ポート、KB ポート
システムリセット用(システムサービス関数)0x70, 0x71 リアルタイムクロック
LO コマンドでの XMODEM のタイムアウト用
※ BCD 24H モードで動作している前提