2016年7月26日火曜日

vgsdrun で ステップ実行

vgsdrun(vgs-cpu付属のデバッグ実行コマンド)にステップ実行機能を追加してみました。
これは実際に動かしてみると楽しい。
楽しい?
...いや、私だけかもしれません。
ポケモンgoの方が楽しいですね。

インストールから動かすまでの手順は下記の通り。

$ git clone https://github.com/suzukiplan/vgs-cpu.git
$ cd vgs-cpu
$ make build
$ ./vgsdrun src/test/asm_mul.asm  -s
assembling: src/test/asm_mul.asm on memory
starting debug run.
00000000: ----- start-a -----
00000000: 08 E8 03               : line#00006 > LD   A, 1000
00000003: 6F 64                  : line#00007 > MUL  A, 100
00000005: A7 A0 86 01 00         : line#00008 > CMP  A, 100000
0000000a: F8 08 03 00 00         : line#00009 > JNE  $308 (test-failed)
> h
command usage:
- h     ... help
- r     ... show registers
- q     ... quit
- other ... execute next line
> r
registers:
c->r.a = 000186A0, c->r.b = 00000000, c->r.c = 00000000, c->r.d = 00000000
c->r.p = 0000000A, c->r.s = 00000000, c->f.z = 00000000, c->f.q = 00000000
> q
$

vgsdrunを実行すると以下のようにコマンド入力待ちになります。

00000000: ----- start-a -----
00000000: 08 E8 03               : line#00006 > LD   A, 1000

上記は1行上の命令(08 E8 03)をこれから実行するという意味です。
enter キーを押せば実行して以下のように表示されます。

00000000: ----- start-a -----
00000000: 08 E8 03               : line#00006 > LD   A, 1000
00000003: 6F 64                  : line#00007 > MUL  A, 100

ちゃんとエスケープで綺麗に表示してます。
復帰(\r)や改行(\n)とかは割とよく使うかもしれませんが、1行上に戻るという中々普通に生活(プログラミング)していると使わないエスケープを使っています。
printfで書くと以下のような感じ。

printf("\033[1A");

ぐぐっても1発では出てこかなかったけど、C/C++言語で作るコマンドインタフェース(CLI)のプログラムで「1行上の行に戻りたい」みたいなニーズは少ないのだろうか。
なお、WindowsのMS-DOSプロンプトでちゃんと動くかは未確認です。