Skip to content

Commit

Permalink
Merge pull request #10 from suzukiplan/vgsdrun
Browse files Browse the repository at this point in the history
vgsdrun: debug run command
  • Loading branch information
suzukiplan committed Jul 24, 2016
2 parents 3743673 + 46be0f0 commit 166391f
Show file tree
Hide file tree
Showing 8 changed files with 269 additions and 17 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,5 @@ tp_int
vgsasm
asmtest
tp.bin
vgsdrun

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.0
- `vgsdrun` コマンドを追加

## Version 0.2.0
- cpu
- レジスタが指すアドレス値からの load/store に対応
Expand Down
85 changes: 85 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -279,3 +279,88 @@ negative:

#### operand syntax
[Operands](#operands) を 参照

## Debugger
### vgsdrun command
アセンブリ言語ソース (.asm) ファイルを実際に vgs-cpu で実行した時の流れを表示
```
$ vgsdrun input-source
```

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

#### example
```
$ ./vgsdrun src/test/asm_add_a.asm
assembling: src/test/asm_add_a.asm on memory
starting debug run.
00000000: 08 E8 03 : line#00006 > LD A, 1000
00000003: 5D 00 : line#00007 > ADD A, 0
00000005: A6 E8 03 : line#00008 > CMP A, 1000
00000008: F8 02 01 00 00 : line#00009 > JNE $102
0000000d: F5 02 01 00 00 : line#00010 > JZ $102
00000012: 5D FF : line#00011 > ADD A, 255
00000014: A6 E7 04 : line#00012 > CMP A, 1255
00000017: F8 02 01 00 00 : line#00013 > JNE $102
0000001c: F5 02 01 00 00 : line#00014 > JZ $102
00000021: 5E 00 01 : line#00015 > ADD A, 256
00000024: A6 E7 05 : line#00016 > CMP A, 1511
00000027: F8 02 01 00 00 : line#00017 > JNE $102
0000002c: F5 02 01 00 00 : line#00018 > JZ $102
00000031: 5E FF FF : line#00019 > ADD A, 65535
00000034: A7 E6 05 01 00 : line#00020 > CMP A, 67046
00000039: F8 02 01 00 00 : line#00021 > JNE $102
0000003e: F5 02 01 00 00 : line#00022 > JZ $102
00000043: 5F 00 00 01 00 : line#00023 > ADD A, 65536
00000048: A7 E6 05 02 00 : line#00024 > CMP A, 132582
0000004d: F8 02 01 00 00 : line#00025 > JNE $102
00000052: F5 02 01 00 00 : line#00026 > JZ $102
00000057: 5F 1A FA FD FF : line#00027 > ADD A, -132582
0000005c: F6 02 01 00 00 : line#00028 > JNZ $102
00000061: 09 78 56 34 12 : line#00031 > LD A, $12345678
00000066: 12 00 00 00 00 : line#00032 > ST A, [0]
0000006b: 07 00 : line#00033 > LD A, 0
0000006d: 63 00 00 00 00 : line#00034 > ADD A, [0]O
00000072: A5 78 : line#00035 > CMP A, $78
00000074: F8 02 01 00 00 : line#00036 > JNE $102
00000079: F5 02 01 00 00 : line#00037 > JZ $102
0000007e: 5F 88 FF FF FF : line#00038 > ADD A, -120
00000083: F6 02 01 00 00 : line#00039 > JNZ $102
00000088: 64 00 00 00 00 : line#00040 > ADD A, [0]H
0000008d: A6 78 56 : line#00041 > CMP A, $5678
00000090: F8 02 01 00 00 : line#00042 > JNE $102
00000095: F5 02 01 00 00 : line#00043 > JZ $102
0000009a: 5F 88 A9 FF FF : line#00044 > ADD A, -22136
0000009f: F6 02 01 00 00 : line#00045 > JNZ $102
000000a4: 65 00 00 00 00 : line#00046 > ADD A, [0]
000000a9: A7 78 56 34 12 : line#00047 > CMP A, $12345678
000000ae: F8 02 01 00 00 : line#00048 > JNE $102
000000b3: F5 02 01 00 00 : line#00049 > JZ $102
000000b8: 5F 88 A9 CB ED : line#00050 > ADD A, -305419896
000000bd: F6 02 01 00 00 : line#00051 > JNZ $102
000000c2: 1E 00 00 11 11 : line#00054 > LD B, $11110000
000000c7: 32 11 11 : line#00055 > LD C, $00001111
000000ca: 48 11 11 11 11 : line#00056 > LD D, $11111111
000000cf: 60 : line#00057 > ADD A, B
000000d0: A7 00 00 11 11 : line#00058 > CMP A, $11110000
000000d5: F8 02 01 00 00 : line#00059 > JNE $102
000000da: F5 02 01 00 00 : line#00060 > JZ $102
000000df: 61 : line#00061 > ADD A, C
000000e0: A7 11 11 11 11 : line#00062 > CMP A, $11111111
000000e5: F8 02 01 00 00 : line#00063 > JNE $102
000000ea: F5 02 01 00 00 : line#00064 > JZ $102
000000ef: 62 : line#00065 > ADD A, D
000000f0: A7 22 22 22 22 : line#00066 > CMP A, $22222222
000000f5: F8 02 01 00 00 : line#00067 > JNE $102
000000fa: F5 02 01 00 00 : line#00068 > JZ $102
000000ff: 46 01 : line#00070 > LD D, 1
00000101: 00 : line#00071 > BRK
[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
$
```
12 changes: 10 additions & 2 deletions makefile
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ VGSASM_SRC=\
src/asm/vgsasm_parse_int.c\
src/asm/vgsasm_util.c

VGSDRUN_SRC=\
$(VGSASM_SRC)\
src/cpu/vgscpu.c\
src/asm/vgsdrun.c

all:
@echo usage:
@echo $$ make format : executes clang-format
Expand All @@ -92,7 +97,7 @@ clean:

format:
sh tools/format.sh src/asm/vgsasm.h
sh tools/format.sh src/cpu/vgsapi.c
sh tools/format.sh src/asm/vgsdrun.c
sh tools/format.sh src/cpu/vgscpu.c
sh tools/format.sh src/cpu/vgscpu.h
sh tools/format.sh src/cpu/vgscpu_internal.h
Expand All @@ -108,7 +113,7 @@ format:
format-src:
@sh tools/format.sh $(SRC)

build: vgscpu.a vgsasm
build: vgscpu.a vgsasm vgsdrun

vgscpu.a: vgscpu.o
ar ruv vgscpu.a vgscpu.o
Expand All @@ -119,6 +124,9 @@ vgscpu.o: src/cpu/vgscpu.c src/cpu/vgscpu.h src/cpu/vgscpu_internal.h
vgsasm: src/asm/vgsasm.h src/cpu/vgscpu_internal.h $(VGSASM_SRC)
gcc -O2 -I./src/asm -I./src/cpu $(VGSASM_SRC) -o vgsasm

vgsdrun: src/asm/vgsasm.h src/cpu/vgscpu_internal.h src/cpu/vgscpu.h $(VGSDRUN_SRC)
gcc -O2 -DVGSDRUN -I./src/asm -I./src/cpu $(VGSDRUN_SRC) -o vgsdrun

test: build
for TP in $(TESTCASE); do make run-test-exec TP=$$TP; done
make asm-test
Expand Down
45 changes: 31 additions & 14 deletions src/asm/vgsasm.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,11 @@
#endif
#include "vgsasm.h"

#define NO_ERROR 0
#define PARAM_ERROR 1
#define FILE_READ_ERROR 2
#define FILE_WRITE_ERROR 3
#define SYNTAX_ERROR 4

struct program_table {
char input[1024];
char output[1024];
char* buffer;
struct line_data* line;
int line_number;
} PT;
static struct program_table PT;

#ifdef VGSDRUN
int vgsdrun(struct program_table* pt);
#endif

static int check_arguments(int argc, char* argv[])
{
Expand All @@ -41,6 +33,11 @@ static int check_arguments(int argc, char* argv[])
if (sizeof(PT.output) <= strlen(PT.output) + 4) return -1;
strcat(PT.output, ".bin");
}
#ifdef VGSDRUN
else {
return -1;
}
#endif
return 0;
}

Expand All @@ -59,22 +56,34 @@ static void show_errors(struct line_data* line, int len)

int main(int argc, char* argv[])
{
#ifndef VGSDRUN
FILE* fp;
#endif
int i;

#ifndef _WIN32
#ifndef VGSDRUN
long usec;
double sec;
struct timeval tvStart;
struct timeval tvEnd;
gettimeofday(&tvStart, NULL);
#endif
#endif

#ifdef VGSDRUN
if (check_arguments(argc, argv)) {
puts("usage: vgsdrun input.asm");
return PARAM_ERROR;
}
printf("assembling: %s on memory\n", PT.input);
#else
if (check_arguments(argc, argv)) {
puts("usage: vgsasm [-o output.bin] input.asm");
return PARAM_ERROR;
}
LOGV("assembling: %s -> %s\n", PT.input, PT.output);
printf("assembling: %s -> %s\n", PT.input, PT.output);
#endif

PT.buffer = load_file(PT.input);
if (NULL == PT.buffer) {
Expand Down Expand Up @@ -108,6 +117,13 @@ int main(int argc, char* argv[])
return SYNTAX_ERROR;
}

#ifdef VGSDRUN
puts("starting debug run.");
i = vgsdrun(&PT);
free(PT.line);
free(PT.buffer);
return i;
#else
if (NULL == (fp = fopen(PT.output, "wb"))) {
fprintf(stderr, "file open error.\n");
return FILE_WRITE_ERROR;
Expand Down Expand Up @@ -138,4 +154,5 @@ int main(int argc, char* argv[])
#endif

return NO_ERROR;
#endif
}
15 changes: 14 additions & 1 deletion src/asm/vgsasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include <string.h>
#include "vgscpu_internal.h"

#define LOGV printf
#define A1 0
#define A2 1
#define A4 2
Expand Down Expand Up @@ -48,6 +47,12 @@
#define SHIFT_LEFT 0
#define SHIFT_RIGHT 1

#define NO_ERROR 0
#define PARAM_ERROR 1
#define FILE_READ_ERROR 2
#define FILE_WRITE_ERROR 3
#define SYNTAX_ERROR 4

struct line_data {
char error[1024];
char* buffer;
Expand All @@ -60,6 +65,14 @@ struct line_data {
int label_resolved;
};

struct program_table {
char input[1024];
char output[1024];
char* buffer;
struct line_data* line;
int line_number;
};

char* load_file(const char* path);
void trimstring(char* src);
void back_space(char* ln);
Expand Down
118 changes: 118 additions & 0 deletions src/asm/vgsdrun.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
#include "vgsasm.h"
#include "vgscpu.h"

static struct program_table PT;

static int show_op(unsigned int rp)
{
int i, j, l;
unsigned int addr;

for (addr = 0, i = 0; i < PT.line_number; i++) {
if (PT.line[i].oplen) {
if (addr == rp) {
printf("%08x:", addr);
for (j = 0; j < PT.line[i].oplen; j++) {
printf(" %02X", (int)PT.line[i].op[j]);
}
for (; j < 8; j++) {
printf(" ");
}
printf(":");
for (j = 0; j < PT.line[i].toknum; j++) {
switch (j) {
case 0:
printf(" line#%05d > %-4s", PT.line[i].number, PT.line[i].token[j]);
break;
case 1:
if (PT.line[i].branch_label[0]) {
memcpy(&l, &PT.line[i].op[1], 4);
printf(" $%x", l);
} else {
printf(" %s", PT.line[i].token[j]);
}
break;
case 2:
printf(", %s", PT.line[i].token[j]);
break;
default:
printf(" %s", PT.line[i].token[j]);
break;
}
}
printf("\n");
return 0;
}
addr += PT.line[i].oplen;
}
}
return -1;
}

int vgsdrun(struct program_table* pt)
{
void* ctx;
void* pg;
int psize;
int i;

memcpy(&PT, pt, sizeof(PT));

for (psize = 0, i = 0; i < PT.line_number; i++) {
if (PT.line[i].oplen) {
psize += PT.line[i].oplen;
}
}

if (0 == psize) {
puts("empty");
return -1;
}

pg = malloc(psize);
if (NULL == pg) {
puts("no memory");
return -1;
}

for (psize = 0, i = 0; i < PT.line_number; i++) {
if (PT.line[i].oplen) {
memcpy(&((char*)pg)[psize], PT.line[i].op, PT.line[i].oplen);
psize += PT.line[i].oplen;
}
}

ctx = vgscpu_create_context();
if (NULL == ctx) {
puts("could not create context");
free(pg);
return -1;
}

if (vgscpu_load_program(ctx, pg, psize)) {
puts("could not load program");
free(pg);
vgscpu_release_context(ctx);
return -1;
}
free(pg);

if (vgscpu_run(ctx)) {
printf("CPU error detected: %s\n", vgscpu_get_last_error(ctx));
return -1;
}

vgscpu_release_context(ctx);
return 0;
}

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);
}
}
Loading

0 comments on commit 166391f

Please sign in to comment.