操作方法
画面構成
画面には以下の操作可能な要素があります。
- Start/Stopボタン — CPUの実行を開始・停止します。
- ステップ実行ボタン — CPU停止中に1命令だけ実行して再び停止します。
- MMUトグルボタン — MMU(仮想メモリ)の有効・無効を切り替えます。
- 外部割り込みボタン — 外部割り込み(IRQ#0)を発生させます。
- ロウハンマートグルボタン — ロウハンマーシミュレーションの有効・無効を切り替えます。
- レジスタエディタ — CPUレジスタの現在値を表示・編集します。
- メモリエディタ — メモリの内容を16進数で表示・編集します。
起動時の状態
起動時、CPUは停止状態です。メモリの先頭にはアドレス0x0000へのジャンプ命令(無限ループ)が配置されています。
また、メモリ上のランダムな場所に秘密データとその複製が配置されています。秘密データの各バイトはメモリエディタ上では「XX」でマスク表示されます。詳細はアーキテクチャ - 秘密データを参照してください。
メモリエディタにフォーカスがある状態で開始します。
フォーカス切り替え
キーボード操作は、フォーカスのあるエディタに対して有効です。
| キー | 動作 |
|---|---|
M | メモリエディタにフォーカスを移動します。 |
R(メモリエディタ非編集モード時) | レジスタエディタにフォーカスを移動します。 |
Start/Stopボタン
画面左上にあるボタンです。マウスクリックでCPUの実行を制御します。
| 状態 | 表示 | クリック時の動作 |
|---|---|---|
| 停止中 | ▶(スタートマーク) | CPUの実行を開始します。 |
| 実行中 | ⏸(一時停止マーク) | CPUの実行を停止します。 |
このボタンによる停止・再開は、HLT命令によるCPU停止とは異なります。HLT命令で停止した場合、割り込みが有効(INTE=1)かつIRQが発生すれば自動的に復帰します。それ以外の場合はページをリロードしてください。
ステップ実行ボタン
Start/Stopボタンの右隣にあるボタンです。CPU停止中にクリックすると、PCレジスタが指す命令を1命令だけ実行し、再び停止状態に戻ります。命令ごとにレジスタやメモリの変化を確認したい場合に便利です。
| 状態 | 表示 | クリック時の動作 |
|---|---|---|
| 停止中 | 緑色(クリッカブル) | 1命令だけ実行して停止状態に戻ります。 |
| 実行中 | 灰色(アンクリッカブル) | 何も起きません。 |
HLT命令で停止中の状態でステップしても命令は実行されません(保留IRQによるHLT復帰がある場合はその処理のみ行われます)。また、ステップ実行でもロウハンマーのアクセスカウントは通常実行と同様に加算されます。
MMUトグルボタン
CPUの絵の上にあるトグルボタンです。CPU停止中にマウスクリックすることで、MMUの有効・無効を切り替えます。
CPU実行中は操作できません。
MMUを有効にする場合は、事前にページテーブルとPTBRを設定してください。詳細はアーキテクチャを参照してください。
外部割り込みボタン
外部割り込み(IRQ#0)を発生させるボタンです。ボタンをマウスでクリックすると、ボタンから指を離した瞬間にIRQ#0が発生します。
そのため、ボタンを押したままマウスをボタンの外に移動させてから指を離すと、割り込みはキャンセルされます。
IRQの受付には、プログラム中でEI命令を実行して割り込みを許可(INTE=1)しておく必要があります。IVTBRレジスタとベクタテーブルの設定も必要です。MMU有効時は、ベクタテーブルが配置されたページのPTEも設定してください。詳細はアーキテクチャを参照してください。
ロウハンマートグルボタン
ロウハンマーシミュレーションの有効・無効を切り替えるトグルボタンです。CPU停止中にマウスクリック(ボタン上でマウスボタンを離した時)することで切り替えます。
CPU実行中は操作できません。
有効化時にアクセスカウンタがリセットされ、クリーンな状態でシミュレーションが開始されます。ロウハンマーの詳細はアーキテクチャを参照してください。
レジスタエディタ
CPUレジスタの現在値を表示し、16進数で編集できます。
表示レイアウト
A:XX F:XX PC :XXXX
B:XX C:XX SP :XXXX
D:XX E:XX PTBR :XXXX
H:XX L:XX IVTBR:XXXX
PFAR :XXXX
A, B, C, D, E, H, L および Fは16進数2桁、PC・SP・PTBR・IVTBR・PFARは16進数4桁で表示されます。PFARはプログラムからは読み取り専用のレジスタです(エディタでの編集は可能です)。
非編集モード
選択中のレジスタが黄色でハイライトされます。
| キー | 動作 |
|---|---|
↑ | 選択レジスタを上へ移動します。 |
↓ | 選択レジスタを下へ移動します。 |
Enter | 編集モードに入ります。 |
M | メモリエディタにフォーカスを移動します。 |
編集モード
ニブル(4ビット)単位で値を入力できます。赤色のカーソルが編集位置を示します。
| キー | 動作 |
|---|---|
0〜9, A〜F | 16進数を入力します。カーソルは自動的に右へ移動します。 |
← | カーソルを左へ移動します。 |
→ | カーソルを右へ移動します。 |
ESC | 編集を確定し、非編集モードに戻ります。 |
ESCキーは変更の「確定」です。変更を破棄する手段はありません。
メモリエディタ
メモリの内容を16進数で表示し、バイト単位で編集できます。全アドレス範囲(0x0000〜0xFFFF)にアクセスできます。
表示形式
####|+3+2 +1+0 -------------- 0000|0000 0000 0004|0000 0000 ...
1行に4バイトを16進数で表示します。リトルエンディアン環境で分かりやすいよう、バイトは逆順(+3+2 +1+0)で表示されます。カーソル移動に応じて表示範囲が自動スクロールします。
ヘッダー行の先頭4桁(上の例で「####」の部分)には、秘密データ(1つ目)の物理アドレスが16進数で表示されます。
秘密データが配置されたアドレスは「XX」でマスク表示され、実際の値は見えません。また、秘密データのアドレスは編集できません。
非編集モード
選択中のバイトが黄色でハイライトされます。ロウハンマーシミュレーションが有効な場合は、フリップしやすいビット位置がストライプ表示でハイライトされます。対象ニブル(16進数1桁)の幅を4等分し、フリップ対象のビット位置に対応するストライプを色分けして表示します(左からビット3→ビット0の順、ビット位置ごとに赤・橙・黄緑・緑)。
| キー | 動作 |
|---|---|
↑ | 1行(4バイト)上へ移動します。長押しで連続スクロールします。 |
↓ | 1行(4バイト)下へ移動します。長押しで連続スクロールします。 |
← | 表示上左へ1バイト移動します(アドレスが大きい方向)。 |
→ | 表示上右へ1バイト移動します(アドレスが小さい方向)。 |
Enter | 編集モードに入ります(秘密データのアドレスでは無効)。 |
G | アドレス入力モードに入ります。 |
編集モード
| キー | 動作 |
|---|---|
0〜9, A〜F | ニブルに16進数を入力します。カーソルは自動的に右へ移動します。 |
← / → | ニブル間でカーソルを移動します。 |
ESC | 編集を確定し、非編集モードに戻ります。 |
ESCキーは変更の「確定」です。変更を破棄する手段はありません。
アドレス入力モード(Go to)
Gキーで開始します。指定したアドレスに直接ジャンプできます。
| キー | 動作 |
|---|---|
0〜9, A〜F | 16進数でアドレスを入力します(最大4桁)。 |
Enter | 入力したアドレスにジャンプします。 |
Backspace | 入力を1文字削除します。 |
ESC | アドレス入力をキャンセルします。 |
プログラムの実行方法
以下の手順で任意の機械語プログラムを実行できます。
手順
- CPUが停止していることを確認します(Start/Stopボタンが「▶」の状態)。
- メモリエディタで、任意のアドレスにプログラムの命令列を配置します。
- レジスタエディタで、PCレジスタにプログラムの先頭アドレスを設定します。
- Start/Stopボタンをクリックして、CPUの実行を開始します。
例: 加算プログラム
AレジスタとBレジスタの値を加算する例です。
- メモリの0x0100番地以降に以下の命令列を配置します。
| アドレス | 値 | 命令 |
|---|---|---|
| 0x0100 | 0x80 | ADD B(A = A + B) |
| 0x0101 | 0x76 | HLT(CPU停止) |
- PCレジスタに
0x0100を設定します。 - Start/Stopボタンをクリックして実行を開始します。
プログラムの最後にはHLT命令やJMP命令による無限ループ等を配置してください。配置しない場合、CPUの実行がプログラムの後のアドレスへも進んでしまいます。
手順の最後でStart/Stopボタンで連続実行する代わりに、ステップ実行ボタンを使うと、1命令ずつ実行して都度停止できます。命令ごとのレジスタ・メモリの変化を追いたい場合に便利です。