Skip to content

Commit

Permalink
Merge pull request #11 from suzukiplan/step-exec
Browse files Browse the repository at this point in the history
vgsdrun: ステップ実行に対応
  • Loading branch information
suzukiplan committed Jul 25, 2016
2 parents 432a074 + 1da4efa commit d7ee604
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 7 deletions.
3 changes: 3 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Changes

## Version 0.3.2
- `vgsdrun` にステップ実行機能 ( `-s` オプション ) を追加

## Version 0.3.1
- `vgsdrun` の出力結果にラベル情報を表示するように変更
- `vgsasm` のテストを追加
Expand Down
33 changes: 29 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -282,17 +282,18 @@ negative:

## Debugger
### vgsdrun command
アセンブリ言語ソース (.asm) ファイルを実際に vgs-cpu で実行した時の流れを表示
```
$ vgsdrun input-source
$ vgsdrun [-s] input-source
```
- アセンブリ言語ソース (.asm) ファイルを実際に vgs-cpu で実行した時の流れを表示
- `-s` オプションを指定すればステップ実行

#### record format
```
<address>: opcodes : line#<number> > assembly-source
```

#### example
#### example: run all
```
$ ./vgsdrun src/test/asm_add_a.asm
assembling: src/test/asm_add_a.asm on memory
Expand Down Expand Up @@ -360,8 +361,32 @@ starting debug run.
000000ff: 46 01 : line#00070 > LD D, 1
00000101: 00 : line#00071 > BRK
[registers]
registers:
c->r.a = 22222222, c->r.b = 11110000, c->r.c = 00001111, c->r.d = 00000001
c->r.p = 00000101, c->r.s = 00000000, c->f.z = 00000000, c->f.q = 00000000
$
```

#### example: step execution
```
$ ./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
$
```
5 changes: 5 additions & 0 deletions src/asm/vgsasm.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ static int check_arguments(int argc, char* argv[])
if (argc <= ++i) return -1;
if (sizeof(PT.output) <= strlen(argv[i])) return -1;
strcpy(PT.output, argv[i]);
#ifdef VGSDRUN
} else if (0 == strcmp("-s", argv[i])) {
if (PT.step_exec) return -1;
PT.step_exec = 1;
#endif
} else {
if (PT.input[0]) return -1;
if (sizeof(PT.input) <= strlen(argv[i])) return -1;
Expand Down
1 change: 1 addition & 0 deletions src/asm/vgsasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ struct program_table {
char* buffer;
struct line_data* line;
int line_number;
int step_exec;
};

char* load_file(const char* path);
Expand Down
33 changes: 30 additions & 3 deletions src/asm/vgsdrun.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,13 +115,40 @@ int vgsdrun(struct program_table* pt)
return 0;
}

static void put_registers(struct vgscpu_context* c)
{
printf("registers:\n");
printf("c->r.a = %08X, c->r.b = %08X, c->r.c = %08X, c->r.d = %08X\n", c->r.a, c->r.b, c->r.c, c->r.d);
printf("c->r.p = %08X, c->r.s = %08X, c->f.z = %08X, c->f.q = %08X\n", c->r.p, c->r.s, c->f.z, c->f.z);
}

void vgsdrun_callback(struct vgscpu_context* c)
{
if (show_op(c->r.p)) {
printf("invalid address: $%x\n", c->r.p);
} else if (0x00 == c->p[c->r.p]) {
printf("\n[registers]\n");
printf("c->r.a = %08X, c->r.b = %08X, c->r.c = %08X, c->r.d = %08X\n", c->r.a, c->r.b, c->r.c, c->r.d);
printf("c->r.p = %08X, c->r.s = %08X, c->f.z = %08X, c->f.q = %08X\n", c->r.p, c->r.s, c->f.z, c->f.z);
puts("");
put_registers(c);
} else if (PT.step_exec) {
while (1) {
char buf[1024];
printf("> ");
buf[sizeof(buf) - 1] = '\0';
if (!fgets(buf, sizeof(buf) - 1, stdin)) return;
if (0 == strncmp(buf, "h", 1)) {
puts("command usage:");
puts("- h ... help");
puts("- r ... show registers");
puts("- q ... quit");
puts("- other ... execute next line");
} else if (0 == strncmp(buf, "r", 1)) {
put_registers(c);
} else if (0 == strncmp(buf, "q", 1)) {
exit(0);
} else {
printf("\033[1A");
break;
}
}
}
}

0 comments on commit d7ee604

Please sign in to comment.