Skip to content

Commit

Permalink
Merge pull request #4 from suzukiplan/create-asm-tests-2
Browse files Browse the repository at this point in the history
Create asm tests 2 & bugfix
  • Loading branch information
suzukiplan committed Jul 18, 2016
2 parents 4994352 + a7a5981 commit 4caa3b1
Show file tree
Hide file tree
Showing 7 changed files with 123 additions and 35 deletions.
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changes

## Version 0.1.1
- `vgsasm` のテストを追加: LD, ST
- bugfix: 引数またはレジスタが指定できる第2オペランドにレジスタBを指定する2進数の0が指定されてしまう

## Version 0.1.0 (破壊的変更)
- `VGS` 命令を廃止
- `INT` 命令を追加
Expand Down
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,6 @@ C/C++言語形式 の コメント に 対応
- ラベルは 1バイト以上 255バイト以下 の 1トークン文字列 とする
- ブランチ命令の飛び先には必ずラベルを用いる (アドレス値の直指定はできない)
```asm
ST A, [$123]
LD B, 100
CMP A, B
JE equal // A = B
JP positive // A > B
Expand Down
1 change: 1 addition & 0 deletions makefile
Original file line number Diff line number Diff line change
Expand Up @@ -138,5 +138,6 @@ asm-test:
./asmtest src/test/asm_push_pop_b.asm
./asmtest src/test/asm_push_pop_c.asm
./asmtest src/test/asm_push_pop_d.asm
./asmtest src/test/asm_ld_st_a.asm
@rm asmtest
@rm tp.bin
64 changes: 32 additions & 32 deletions src/asm/vgsasm_parse_arl.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,7 @@ int _parse_arl(struct line_data* line, int i, int r, int op)
unsigned int v;
unsigned short s;
int m;
if (0 == check_literal(line[i].token[2], &v)) {
if (v < 0x100) {
line[i].op[0] = op;
line[i].op[1] = v & 0xff;
line[i].oplen = 2;
} else if (v < 0x10000) {
s = v & 0xffff;
line[i].op[0] = op + 1;
memcpy(&line[i].op[1], &s, 2);
line[i].oplen = 3;
} else {
line[i].op[0] = op + 2;
memcpy(&line[i].op[1], &v, 4);
line[i].oplen = 5;
}
return 0;
} else if (0 == check_address(line[i].token[2], &v, &m)) {
memcpy(&line[i].op[1], &v, 4);
line[i].oplen = 5;
switch (m) {
case M1:
line[i].op[0] = op + 6;
break;
case M2:
line[i].op[0] = op + 7;
break;
case M4:
line[i].op[0] = op + 8;
break;
}
return 0;
} else {
if (-1 != check_GR(line[i].token[2])) {
line[i].oplen = 1;
switch (r) {
case A4:
Expand Down Expand Up @@ -104,6 +73,37 @@ int _parse_arl(struct line_data* line, int i, int r, int op)
}
return 0;
}
} else if (0 == check_literal(line[i].token[2], &v)) {
if (v < 0x100) {
line[i].op[0] = op;
line[i].op[1] = v & 0xff;
line[i].oplen = 2;
} else if (v < 0x10000) {
s = v & 0xffff;
line[i].op[0] = op + 1;
memcpy(&line[i].op[1], &s, 2);
line[i].oplen = 3;
} else {
line[i].op[0] = op + 2;
memcpy(&line[i].op[1], &v, 4);
line[i].oplen = 5;
}
return 0;
} else if (0 == check_address(line[i].token[2], &v, &m)) {
memcpy(&line[i].op[1], &v, 4);
line[i].oplen = 5;
switch (m) {
case M1:
line[i].op[0] = op + 6;
break;
case M2:
line[i].op[0] = op + 7;
break;
case M4:
line[i].op[0] = op + 8;
break;
}
return 0;
}
sprintf(line[i].error, "syntax error: invalid argument: %s", line[i].token[2]);
return -1;
Expand Down
2 changes: 1 addition & 1 deletion src/asm/vgsasm_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ int check_literal(char* token, unsigned int* result)
int check_address(char* token, unsigned int* result, int* m)
{
char buf[1024];
strcpy(buf, &token[1]);
strcpy(buf, token);
size_t len = strlen(buf);
if (len < 3) return -1;
if ('[' == buf[0] && ']' == buf[len - 1]) {
Expand Down
76 changes: 76 additions & 0 deletions src/test/asm_ld_st_a.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
LD/ST A の テストプログラム
*/

start:
// 4バイト store したものを 1, 2, 4 バイト load するテスト
LD A, $deadbeef
ST A, [0]

LD A, [0]O
CMP A, $ef
JNE test-failed

LD A, [0]H
CMP A, $beef
JNE test-failed

LD A, [0]
CMP A, $deadbeef
JNE test-failed

// 2バイト store したものを 1, 2, 4 バイト load するテスト
LD A, $abcd
ST A, [0]H

LD A, [0]O
CMP A, $cd
JNE test-failed

LD A, [0]H
CMP A, $abcd
JNE test-failed

LD A, [0]
CMP A, $deadabcd
JNE test-failed

// 1バイト store したものを 1, 2, 4 バイト load するテスト
LD A, $10
ST A, [0]O

LD A, [0]O
CMP A, $10
JNE test-failed

LD A, [0]H
CMP A, $ab10
JNE test-failed

LD A, [0]
CMP A, $deadab10
JNE test-failed

// レジスタからのload
LD B, $B001
LD C, $C001
LD D, $D001

LD A, B
CMP A, $B001
JNE test-failed

LD A, C
CMP A, $C001
JNE test-failed

LD A, D
CMP A, $D001
JNE test-failed

LD D, 1
BRK

test-failed:
LD D, -1
BRK
9 changes: 9 additions & 0 deletions src/test/asmtest.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ char* load_bin(const char* path, int* size)
return data;
}

int print_registers(struct vgscpu_context* c)
{
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);
return 0;
}

int main(int argc, char* argv[])
{
char cmd[4096];
Expand Down Expand Up @@ -77,6 +84,8 @@ int main(int argc, char* argv[])
vgscpu_load_program(c, bin, size);
free(bin);

vgscpu_regist_interrupt(c, 0, print_registers);

c->r.d = 0x1;
#ifndef _WIN32
gettimeofday(&tvStart, NULL);
Expand Down

0 comments on commit 4caa3b1

Please sign in to comment.