From 2bd4f4750daa38ea100b0e4f12be628335a8afa3 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Thu, 21 Jul 2016 01:15:23 +0900 Subject: [PATCH 01/23] described support info --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e56f951..c67dbba 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,15 @@ # VGS CPU [![Build Status](https://travis-ci.org/suzukiplan/vgs-cpu.svg?branch=master)](https://travis-ci.org/suzukiplan/vgs-cpu) - SUZUKI PLAN - Video Game System - Central Processing Unit -- VGS-CPU is a 32bit cpu that spacialized for creating games of VGS. +- VGS-CPU is a 32bit CPU that spacialized for creating games of VGS. - This repository also provides assember for VGS-CPU. ## License [2-clause BSD](https://github.com/suzukiplan/vgs-cpu/blob/master/LICENSE.txt) +## Support environment +- `make test` を実行して全ての項目が success になる環境であれば動作できます +- big-endian の環境には対応していません + ## How to use - UNIX系OS全般(mac/Linuxを含む) の ターミナル で `make` を実行すれば, できることが書いてあります - `make build` を実行すればアセンブラ (vgsasmコマンド) をビルドできます From 29cd6434f862adf08816bf04b0cb570c389be017 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Thu, 21 Jul 2016 01:19:47 +0900 Subject: [PATCH 02/23] described specification --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index c67dbba..ce45c14 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,11 @@ void vgscpu_release_context(void *ctx); - `[n]H` : 通常, アドレスが指す 16bit の領域を意味する - `[n]O` : 通常, アドレスが指す 8bit の領域を意味する - 例外的にアドレスの先頭を単純に指し示す場合は単に `[n]` と表記 +- `[GR]` : general register address + - `[GR]` : 通常, アドレス (GR値) が指す 32bit の領域を意味する + - `[GR]H` : 通常, アドレス (GR値) が指す 16bit の領域を意味する + - `[GR]O` : 通常, アドレス (GR値) が指す 8bit の領域を意味する + - 例外的にアドレスの先頭を単純に指し示す場合は単に `[n]` と表記 ### memory operations |operand|z|q|outline| @@ -128,7 +133,9 @@ void vgscpu_release_context(void *ctx); |`LD GR, n`|-|-|汎用レジスタ `<-` 定数| |`LD GR, [n]`|-|-|汎用レジスタ `<-` 主記憶のn番地の内容| |`LD GR1, GR2`|-|-|汎用レジスタ1 に 汎用レジスタ2 の内容をロード| +|`LD GR1, [GR2]`|-|-|汎用レジスタ1 に 主記憶の 汎用レジスタ2 が指す番地の内容をロード| |`ST GR, [n]`|-|-|汎用レジスタ の 値 `->` 主記憶のn番地| +|`ST GR, [GR2]`|-|-|汎用レジスタ の 値 `->` 主記憶の 汎用レジスタ2 が指す番地| ### arithmetic calculation |operand|z|q|outline| From cbcfa289f9f34040a582c3443ac8731510de1c34 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Thu, 21 Jul 2016 01:24:04 +0900 Subject: [PATCH 03/23] implemented: load/store from register specified address --- src/cpu/vgscpu.c | 397 ++++++++++++++++++++++++++++++++++++++++++++ src/cpu/vgscpu_op.h | 10 ++ 2 files changed, 407 insertions(+) diff --git a/src/cpu/vgscpu.c b/src/cpu/vgscpu.c index c56349b..1ec0804 100644 --- a/src/cpu/vgscpu.c +++ b/src/cpu/vgscpu.c @@ -744,6 +744,403 @@ int vgscpu_run(void *ctx) c->r.d = ~c->r.d; c->f.z = (0 == c->r.d) ? 1 : 0; break; + /* + *---------------------------------------------------------------- + * load/store from register specified address + *---------------------------------------------------------------- + */ + case VGSCPU_OP_LD_A_RM: + ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); + c->r.p++; + switch (c->p[c->r.p++]) { + case 0x11: /* B1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); + c->r.a = c->m[c->r.b]; + break; + case 0x12: /* B2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 2); + memcpy(&s, &c->m[c->r.b], 2); + c->r.a = s; + break; + case 0x14: /* B4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); + memcpy(&c->r.a, &c->m[c->r.b], 4); + break; + case 0x21: /* C1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); + c->r.a = c->m[c->r.c]; + break; + case 0x22: /* C2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 2); + memcpy(&s, &c->m[c->r.c], 2); + c->r.a = s; + break; + case 0x24: /* C4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); + memcpy(&c->r.a, &c->m[c->r.c], 4); + break; + case 0x31: /* D1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); + c->r.a = c->m[c->r.d]; + break; + case 0x32: /* D2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 2); + memcpy(&s, &c->m[c->r.d], 2); + c->r.a = s; + break; + case 0x34: /* D4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); + memcpy(&c->r.a, &c->m[c->r.d], 4); + break; + default: + sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); + loop_flag = 0; + ret = -1; + } + break; + case VGSCPU_OP_LD_B_RM: + ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); + c->r.p++; + switch (c->p[c->r.p++]) { + case 0x01: /* A1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 1); + c->r.b = c->m[c->r.a]; + break; + case 0x02: /* A2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 2); + memcpy(&s, &c->m[c->r.a], 2); + c->r.b = s; + break; + case 0x04: /* A4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); + memcpy(&c->r.b, &c->m[c->r.a], 4); + break; + case 0x21: /* C1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); + c->r.b = c->m[c->r.c]; + break; + case 0x22: /* C2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 2); + memcpy(&s, &c->m[c->r.c], 2); + c->r.b = s; + break; + case 0x24: /* C4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); + memcpy(&c->r.b, &c->m[c->r.c], 4); + break; + case 0x31: /* D1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); + c->r.b = c->m[c->r.d]; + break; + case 0x32: /* D2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 2); + memcpy(&s, &c->m[c->r.d], 2); + c->r.b = s; + break; + case 0x34: /* D4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); + memcpy(&c->r.b, &c->m[c->r.d], 4); + break; + default: + sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); + loop_flag = 0; + ret = -1; + } + break; + case VGSCPU_OP_LD_C_RM: + ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); + c->r.p++; + switch (c->p[c->r.p++]) { + case 0x01: /* A1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 1); + c->r.c = c->m[c->r.a]; + break; + case 0x02: /* A2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 2); + memcpy(&s, &c->m[c->r.a], 2); + c->r.c = s; + break; + case 0x04: /* A4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); + memcpy(&c->r.c, &c->m[c->r.a], 4); + break; + case 0x11: /* B1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); + c->r.c = c->m[c->r.b]; + break; + case 0x12: /* B2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 2); + memcpy(&s, &c->m[c->r.b], 2); + c->r.c = s; + break; + case 0x14: /* B4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); + memcpy(&c->r.c, &c->m[c->r.b], 4); + break; + case 0x31: /* D1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); + c->r.c = c->m[c->r.d]; + break; + case 0x32: /* D2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 2); + memcpy(&s, &c->m[c->r.d], 2); + c->r.c = s; + break; + case 0x34: /* D4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); + memcpy(&c->r.c, &c->m[c->r.d], 4); + break; + default: + sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); + loop_flag = 0; + ret = -1; + } + break; + case VGSCPU_OP_LD_D_RM: + ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); + c->r.p++; + switch (c->p[c->r.p++]) { + case 0x01: /* A1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 1); + c->r.d = c->m[c->r.a]; + break; + case 0x02: /* A2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 2); + memcpy(&s, &c->m[c->r.a], 2); + c->r.d = s; + break; + case 0x04: /* A4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); + memcpy(&c->r.d, &c->m[c->r.a], 4); + break; + case 0x11: /* B1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); + c->r.d = c->m[c->r.b]; + break; + case 0x12: /* B2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 2); + memcpy(&s, &c->m[c->r.b], 2); + c->r.d = s; + break; + case 0x14: /* B4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); + memcpy(&c->r.d, &c->m[c->r.b], 4); + break; + case 0x21: /* C1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); + c->r.d = c->m[c->r.c]; + break; + case 0x22: /* C2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 2); + memcpy(&s, &c->m[c->r.c], 2); + c->r.d = s; + break; + case 0x24: /* C4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); + memcpy(&c->r.d, &c->m[c->r.c], 4); + break; + default: + sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); + loop_flag = 0; + ret = -1; + } + break; + case VGSCPU_OP_ST_A_RM: + ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); + c->r.p++; + switch (c->p[c->r.p++]) { + case 0x11: /* B1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); + c->m[c->r.b] = c->r.a & 0xff; + break; + case 0x12: /* B2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 2); + s = c->r.a & 0xffff; + memcpy(&c->m[c->r.b], &s, 2); + break; + case 0x14: /* B4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); + memcpy(&c->m[c->r.b], &c->r.a, 4); + break; + case 0x21: /* C1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); + c->m[c->r.c] = c->r.a & 0xff; + break; + case 0x22: /* C2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 2); + s = c->r.a & 0xffff; + memcpy(&c->m[c->r.c], &s, 2); + break; + case 0x24: /* C4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); + memcpy(&c->m[c->r.c], &c->r.a, 4); + break; + case 0x31: /* D1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); + c->m[c->r.d] = c->r.a & 0xff; + break; + case 0x32: /* D2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 2); + s = c->r.a & 0xffff; + memcpy(&c->m[c->r.d], &s, 2); + break; + case 0x44: /* D4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); + memcpy(&c->m[c->r.d], &c->r.a, 4); + break; + default: + sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); + loop_flag = 0; + ret = -1; + } + break; + case VGSCPU_OP_ST_B_RM: + ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); + c->r.p++; + switch (c->p[c->r.p++]) { + case 0x01: /* A1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 1); + c->m[c->r.a] = c->r.b & 0xff; + break; + case 0x02: /* A2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 2); + s = c->r.b & 0xffff; + memcpy(&c->m[c->r.a], &s, 2); + break; + case 0x04: /* A4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); + memcpy(&c->m[c->r.a], &c->r.b, 4); + break; + case 0x21: /* C1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); + c->m[c->r.c] = c->r.b & 0xff; + break; + case 0x22: /* C2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 2); + s = c->r.b & 0xffff; + memcpy(&c->m[c->r.c], &s, 2); + break; + case 0x24: /* C4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); + memcpy(&c->m[c->r.c], &c->r.b, 4); + break; + case 0x31: /* D1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); + c->m[c->r.d] = c->r.b & 0xff; + break; + case 0x32: /* D2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 2); + s = c->r.b & 0xffff; + memcpy(&c->m[c->r.d], &s, 2); + break; + case 0x44: /* D4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); + memcpy(&c->m[c->r.d], &c->r.b, 4); + break; + default: + sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); + loop_flag = 0; + ret = -1; + } + break; + case VGSCPU_OP_ST_C_RM: + ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); + c->r.p++; + switch (c->p[c->r.p++]) { + case 0x01: /* A1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 1); + c->m[c->r.a] = c->r.c & 0xff; + break; + case 0x02: /* A2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 2); + s = c->r.c & 0xffff; + memcpy(&c->m[c->r.a], &s, 2); + break; + case 0x04: /* A4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); + memcpy(&c->m[c->r.a], &c->r.c, 4); + break; + case 0x11: /* B1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); + c->m[c->r.b] = c->r.c & 0xff; + break; + case 0x12: /* B2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 2); + s = c->r.c & 0xffff; + memcpy(&c->m[c->r.b], &s, 2); + break; + case 0x14: /* B4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); + memcpy(&c->m[c->r.b], &c->r.c, 4); + break; + case 0x31: /* D1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); + c->m[c->r.d] = c->r.c & 0xff; + break; + case 0x32: /* D2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 2); + s = c->r.c & 0xffff; + memcpy(&c->m[c->r.d], &s, 2); + break; + case 0x44: /* D4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); + memcpy(&c->m[c->r.d], &c->r.c, 4); + break; + default: + sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); + loop_flag = 0; + ret = -1; + } + break; + case VGSCPU_OP_ST_D_RM: + ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); + c->r.p++; + switch (c->p[c->r.p++]) { + case 0x01: /* A1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 1); + c->m[c->r.a] = c->r.d & 0xff; + break; + case 0x02: /* A2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 2); + s = c->r.d & 0xffff; + memcpy(&c->m[c->r.a], &s, 2); + break; + case 0x04: /* A4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); + memcpy(&c->m[c->r.a], &c->r.d, 4); + break; + case 0x11: /* B1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); + c->m[c->r.b] = c->r.d & 0xff; + break; + case 0x12: /* B2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 2); + s = c->r.d & 0xffff; + memcpy(&c->m[c->r.b], &s, 2); + break; + case 0x14: /* B4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); + memcpy(&c->m[c->r.b], &c->r.d, 4); + break; + case 0x21: /* C1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); + c->m[c->r.c] = c->r.d & 0xff; + break; + case 0x22: /* C2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 2); + s = c->r.d & 0xffff; + memcpy(&c->m[c->r.c], &s, 2); + break; + case 0x24: /* C4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); + memcpy(&c->m[c->r.c], &c->r.d, 4); + break; + default: + sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); + loop_flag = 0; + ret = -1; + } + break; /* *---------------------------------------------------------------- * shift diff --git a/src/cpu/vgscpu_op.h b/src/cpu/vgscpu_op.h index 0191fb6..178590b 100644 --- a/src/cpu/vgscpu_op.h +++ b/src/cpu/vgscpu_op.h @@ -212,6 +212,16 @@ #define VGSCPU_OP_CMP2_A_M2 0xb5 /* cmp: a and &memory[ptr](2byte) */ #define VGSCPU_OP_CMP2_A_M4 0xb6 /* cmp: a and &memory[ptr](4byte) */ +/* load/store from register memory */ +#define VGSCPU_OP_LD_A_RM 0xb7 +#define VGSCPU_OP_LD_B_RM 0xb8 +#define VGSCPU_OP_LD_C_RM 0xb9 +#define VGSCPU_OP_LD_D_RM 0xba +#define VGSCPU_OP_ST_A_RM 0xbb +#define VGSCPU_OP_ST_B_RM 0xbc +#define VGSCPU_OP_ST_C_RM 0xbd +#define VGSCPU_OP_ST_D_RM 0xbe + /* accumulator (exclude A) */ #define VGSCPU_OP_ACU_B 0xdd #define VGSCPU_OP_ACU_C 0xde From 3d73887a2cb97deef1e781a2e28db801b9991e60 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Thu, 21 Jul 2016 01:28:43 +0900 Subject: [PATCH 04/23] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ce45c14..1e24e0a 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ void vgscpu_release_context(void *ctx); - `[GR]` : 通常, アドレス (GR値) が指す 32bit の領域を意味する - `[GR]H` : 通常, アドレス (GR値) が指す 16bit の領域を意味する - `[GR]O` : 通常, アドレス (GR値) が指す 8bit の領域を意味する - - 例外的にアドレスの先頭を単純に指し示す場合は単に `[n]` と表記 + - 例外的にアドレスの先頭を単純に指し示す場合は単に `[GR]` と表記 ### memory operations |operand|z|q|outline| From ad56a865f81f57f440fe780bf456bb7993380176 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Thu, 21 Jul 2016 01:28:51 +0900 Subject: [PATCH 05/23] updated CHANGES.md --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index fca4d04..a490871 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,8 @@ # Changes +## version 0.2.0 +- レジスタが指すアドレス値からの load/store に対応 + ## version 0.1.2 - license の修正(不要文言削除のみ) - `vgsasm` のテストを追加 From f8d796b10e773bc84738e47325fe42a88f897097 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Thu, 21 Jul 2016 01:51:13 +0900 Subject: [PATCH 06/23] added test case (1) --- src/test/tp_ldst_a.c | 86 ++++++++++++++++++++++++++++++++++++++++++++ src/test/tp_ldst_b.c | 86 ++++++++++++++++++++++++++++++++++++++++++++ src/test/tp_ldst_c.c | 86 ++++++++++++++++++++++++++++++++++++++++++++ src/test/tp_ldst_d.c | 86 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 344 insertions(+) diff --git a/src/test/tp_ldst_a.c b/src/test/tp_ldst_a.c index 96761cc..d467a3c 100644 --- a/src/test/tp_ldst_a.c +++ b/src/test/tp_ldst_a.c @@ -11,6 +11,24 @@ int test_program_memory(struct vgscpu_context *c) unsigned char op7[] = {VGSCPU_OP_ST_A_M1, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; unsigned char op8[] = {VGSCPU_OP_ST_A_M2, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; unsigned char op9[] = {VGSCPU_OP_ST_A_M4, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; + unsigned char op10[] = {VGSCPU_OP_LD_A_RM, VGSCPU_OP_BRK}; + unsigned char op11[] = {VGSCPU_OP_LD_A_RM, 0x00, VGSCPU_OP_BRK}; + unsigned char op12[] = {VGSCPU_OP_LD_A_RM, 0x01, VGSCPU_OP_BRK}; + unsigned char op13[] = {VGSCPU_OP_LD_A_RM, 0x02, VGSCPU_OP_BRK}; + unsigned char op14[] = {VGSCPU_OP_LD_A_RM, 0x03, VGSCPU_OP_BRK}; + unsigned char op15[] = {VGSCPU_OP_LD_A_RM, 0x04, VGSCPU_OP_BRK}; + unsigned char op16[] = {VGSCPU_OP_LD_A_RM, 0x11, VGSCPU_OP_BRK}; + unsigned char op17[] = {VGSCPU_OP_LD_A_RM, 0x12, VGSCPU_OP_BRK}; + unsigned char op18[] = {VGSCPU_OP_LD_A_RM, 0x13, VGSCPU_OP_BRK}; + unsigned char op19[] = {VGSCPU_OP_LD_A_RM, 0x14, VGSCPU_OP_BRK}; + unsigned char op20[] = {VGSCPU_OP_LD_A_RM, 0x21, VGSCPU_OP_BRK}; + unsigned char op21[] = {VGSCPU_OP_LD_A_RM, 0x22, VGSCPU_OP_BRK}; + unsigned char op22[] = {VGSCPU_OP_LD_A_RM, 0x23, VGSCPU_OP_BRK}; + unsigned char op23[] = {VGSCPU_OP_LD_A_RM, 0x24, VGSCPU_OP_BRK}; + unsigned char op24[] = {VGSCPU_OP_LD_A_RM, 0x31, VGSCPU_OP_BRK}; + unsigned char op25[] = {VGSCPU_OP_LD_A_RM, 0x32, VGSCPU_OP_BRK}; + unsigned char op26[] = {VGSCPU_OP_LD_A_RM, 0x33, VGSCPU_OP_BRK}; + unsigned char op27[] = {VGSCPU_OP_LD_A_RM, 0x34, VGSCPU_OP_BRK}; vgscpu_load_program(c, op1, sizeof(op1)); TEST(__FILE__, __LINE__, vgscpu_run(c), 0); @@ -65,6 +83,74 @@ int test_program_memory(struct vgscpu_context *c) vgscpu_load_program(c, op9, sizeof(op9) - 1); TEST(__FILE__, __LINE__, vgscpu_run(c), -1); TEST(__FILE__, __LINE__, strcmp(c->error, "OUT OF PROGRAM MEMORY: $00000005"), 0); + + c->r.a = 0; + c->r.b = 0; + c->r.c = 0; + c->r.d = 0; + + vgscpu_load_program(c, op10, sizeof(op10)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "OUT OF PROGRAM MEMORY: $00000002"), 0); + + vgscpu_load_program(c, op11, sizeof(op11)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($00)"), 0); + + vgscpu_load_program(c, op12, sizeof(op12)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($01)"), 0); + + vgscpu_load_program(c, op13, sizeof(op13)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($02)"), 0); + + vgscpu_load_program(c, op14, sizeof(op14)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($03)"), 0); + + vgscpu_load_program(c, op15, sizeof(op15)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($04)"), 0); + + vgscpu_load_program(c, op16, sizeof(op16)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op17, sizeof(op17)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op18, sizeof(op18)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($13)"), 0); + + vgscpu_load_program(c, op19, sizeof(op19)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op20, sizeof(op20)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op21, sizeof(op21)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op22, sizeof(op22)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($23)"), 0); + + vgscpu_load_program(c, op23, sizeof(op23)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op24, sizeof(op24)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op25, sizeof(op25)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op26, sizeof(op26)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($33)"), 0); + + vgscpu_load_program(c, op27, sizeof(op27)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); return 0; } diff --git a/src/test/tp_ldst_b.c b/src/test/tp_ldst_b.c index 4e82cd4..f8c565d 100644 --- a/src/test/tp_ldst_b.c +++ b/src/test/tp_ldst_b.c @@ -11,6 +11,24 @@ int test_program_memory(struct vgscpu_context *c) unsigned char op7[] = {VGSCPU_OP_ST_B_M1, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; unsigned char op8[] = {VGSCPU_OP_ST_B_M2, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; unsigned char op9[] = {VGSCPU_OP_ST_B_M4, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; + unsigned char op10[] = {VGSCPU_OP_LD_B_RM, VGSCPU_OP_BRK}; + unsigned char op11[] = {VGSCPU_OP_LD_B_RM, 0x00, VGSCPU_OP_BRK}; + unsigned char op12[] = {VGSCPU_OP_LD_B_RM, 0x01, VGSCPU_OP_BRK}; + unsigned char op13[] = {VGSCPU_OP_LD_B_RM, 0x02, VGSCPU_OP_BRK}; + unsigned char op14[] = {VGSCPU_OP_LD_B_RM, 0x03, VGSCPU_OP_BRK}; + unsigned char op15[] = {VGSCPU_OP_LD_B_RM, 0x04, VGSCPU_OP_BRK}; + unsigned char op16[] = {VGSCPU_OP_LD_B_RM, 0x11, VGSCPU_OP_BRK}; + unsigned char op17[] = {VGSCPU_OP_LD_B_RM, 0x12, VGSCPU_OP_BRK}; + unsigned char op18[] = {VGSCPU_OP_LD_B_RM, 0x13, VGSCPU_OP_BRK}; + unsigned char op19[] = {VGSCPU_OP_LD_B_RM, 0x14, VGSCPU_OP_BRK}; + unsigned char op20[] = {VGSCPU_OP_LD_B_RM, 0x21, VGSCPU_OP_BRK}; + unsigned char op21[] = {VGSCPU_OP_LD_B_RM, 0x22, VGSCPU_OP_BRK}; + unsigned char op22[] = {VGSCPU_OP_LD_B_RM, 0x23, VGSCPU_OP_BRK}; + unsigned char op23[] = {VGSCPU_OP_LD_B_RM, 0x24, VGSCPU_OP_BRK}; + unsigned char op24[] = {VGSCPU_OP_LD_B_RM, 0x31, VGSCPU_OP_BRK}; + unsigned char op25[] = {VGSCPU_OP_LD_B_RM, 0x32, VGSCPU_OP_BRK}; + unsigned char op26[] = {VGSCPU_OP_LD_B_RM, 0x33, VGSCPU_OP_BRK}; + unsigned char op27[] = {VGSCPU_OP_LD_B_RM, 0x34, VGSCPU_OP_BRK}; vgscpu_load_program(c, op1, sizeof(op1)); TEST(__FILE__, __LINE__, vgscpu_run(c), 0); @@ -65,6 +83,74 @@ int test_program_memory(struct vgscpu_context *c) vgscpu_load_program(c, op9, sizeof(op9) - 1); TEST(__FILE__, __LINE__, vgscpu_run(c), -1); TEST(__FILE__, __LINE__, strcmp(c->error, "OUT OF PROGRAM MEMORY: $00000005"), 0); + + c->r.a = 0; + c->r.b = 0; + c->r.c = 0; + c->r.d = 0; + + vgscpu_load_program(c, op10, sizeof(op10)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "OUT OF PROGRAM MEMORY: $00000002"), 0); + + vgscpu_load_program(c, op11, sizeof(op11)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($00)"), 0); + + vgscpu_load_program(c, op12, sizeof(op12)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op13, sizeof(op13)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op14, sizeof(op14)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($03)"), 0); + + vgscpu_load_program(c, op15, sizeof(op15)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op16, sizeof(op16)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($11)"), 0); + + vgscpu_load_program(c, op17, sizeof(op17)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($12)"), 0); + + vgscpu_load_program(c, op18, sizeof(op18)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($13)"), 0); + + vgscpu_load_program(c, op19, sizeof(op19)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($14)"), 0); + + vgscpu_load_program(c, op20, sizeof(op20)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op21, sizeof(op21)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op22, sizeof(op22)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($23)"), 0); + + vgscpu_load_program(c, op23, sizeof(op23)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op24, sizeof(op24)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op25, sizeof(op25)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op26, sizeof(op26)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($33)"), 0); + + vgscpu_load_program(c, op27, sizeof(op27)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); return 0; } diff --git a/src/test/tp_ldst_c.c b/src/test/tp_ldst_c.c index 08da1a2..a975700 100644 --- a/src/test/tp_ldst_c.c +++ b/src/test/tp_ldst_c.c @@ -11,6 +11,24 @@ int test_program_memory(struct vgscpu_context *c) unsigned char op7[] = {VGSCPU_OP_ST_C_M1, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; unsigned char op8[] = {VGSCPU_OP_ST_C_M2, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; unsigned char op9[] = {VGSCPU_OP_ST_C_M4, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; + unsigned char op10[] = {VGSCPU_OP_LD_C_RM, VGSCPU_OP_BRK}; + unsigned char op11[] = {VGSCPU_OP_LD_C_RM, 0x00, VGSCPU_OP_BRK}; + unsigned char op12[] = {VGSCPU_OP_LD_C_RM, 0x01, VGSCPU_OP_BRK}; + unsigned char op13[] = {VGSCPU_OP_LD_C_RM, 0x02, VGSCPU_OP_BRK}; + unsigned char op14[] = {VGSCPU_OP_LD_C_RM, 0x03, VGSCPU_OP_BRK}; + unsigned char op15[] = {VGSCPU_OP_LD_C_RM, 0x04, VGSCPU_OP_BRK}; + unsigned char op16[] = {VGSCPU_OP_LD_C_RM, 0x11, VGSCPU_OP_BRK}; + unsigned char op17[] = {VGSCPU_OP_LD_C_RM, 0x12, VGSCPU_OP_BRK}; + unsigned char op18[] = {VGSCPU_OP_LD_C_RM, 0x13, VGSCPU_OP_BRK}; + unsigned char op19[] = {VGSCPU_OP_LD_C_RM, 0x14, VGSCPU_OP_BRK}; + unsigned char op20[] = {VGSCPU_OP_LD_C_RM, 0x21, VGSCPU_OP_BRK}; + unsigned char op21[] = {VGSCPU_OP_LD_C_RM, 0x22, VGSCPU_OP_BRK}; + unsigned char op22[] = {VGSCPU_OP_LD_C_RM, 0x23, VGSCPU_OP_BRK}; + unsigned char op23[] = {VGSCPU_OP_LD_C_RM, 0x24, VGSCPU_OP_BRK}; + unsigned char op24[] = {VGSCPU_OP_LD_C_RM, 0x31, VGSCPU_OP_BRK}; + unsigned char op25[] = {VGSCPU_OP_LD_C_RM, 0x32, VGSCPU_OP_BRK}; + unsigned char op26[] = {VGSCPU_OP_LD_C_RM, 0x33, VGSCPU_OP_BRK}; + unsigned char op27[] = {VGSCPU_OP_LD_C_RM, 0x34, VGSCPU_OP_BRK}; vgscpu_load_program(c, op1, sizeof(op1)); TEST(__FILE__, __LINE__, vgscpu_run(c), 0); @@ -65,6 +83,74 @@ int test_program_memory(struct vgscpu_context *c) vgscpu_load_program(c, op9, sizeof(op9) - 1); TEST(__FILE__, __LINE__, vgscpu_run(c), -1); TEST(__FILE__, __LINE__, strcmp(c->error, "OUT OF PROGRAM MEMORY: $00000005"), 0); + + c->r.a = 0; + c->r.b = 0; + c->r.c = 0; + c->r.d = 0; + + vgscpu_load_program(c, op10, sizeof(op10)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "OUT OF PROGRAM MEMORY: $00000002"), 0); + + vgscpu_load_program(c, op11, sizeof(op11)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($00)"), 0); + + vgscpu_load_program(c, op12, sizeof(op12)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op13, sizeof(op13)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op14, sizeof(op14)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($03)"), 0); + + vgscpu_load_program(c, op15, sizeof(op15)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op16, sizeof(op16)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op17, sizeof(op17)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op18, sizeof(op18)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($13)"), 0); + + vgscpu_load_program(c, op19, sizeof(op19)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op20, sizeof(op20)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($21)"), 0); + + vgscpu_load_program(c, op21, sizeof(op21)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($22)"), 0); + + vgscpu_load_program(c, op22, sizeof(op22)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($23)"), 0); + + vgscpu_load_program(c, op23, sizeof(op23)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($24)"), 0); + + vgscpu_load_program(c, op24, sizeof(op24)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op25, sizeof(op25)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op26, sizeof(op26)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($33)"), 0); + + vgscpu_load_program(c, op27, sizeof(op27)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); return 0; } diff --git a/src/test/tp_ldst_d.c b/src/test/tp_ldst_d.c index bc84ef1..0ad75a5 100644 --- a/src/test/tp_ldst_d.c +++ b/src/test/tp_ldst_d.c @@ -11,6 +11,24 @@ int test_program_memory(struct vgscpu_context *c) unsigned char op7[] = {VGSCPU_OP_ST_D_M1, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; unsigned char op8[] = {VGSCPU_OP_ST_D_M2, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; unsigned char op9[] = {VGSCPU_OP_ST_D_M4, 0x08, 0x00, 0x00, 0x00, VGSCPU_OP_BRK}; + unsigned char op10[] = {VGSCPU_OP_LD_D_RM, VGSCPU_OP_BRK}; + unsigned char op11[] = {VGSCPU_OP_LD_D_RM, 0x00, VGSCPU_OP_BRK}; + unsigned char op12[] = {VGSCPU_OP_LD_D_RM, 0x01, VGSCPU_OP_BRK}; + unsigned char op13[] = {VGSCPU_OP_LD_D_RM, 0x02, VGSCPU_OP_BRK}; + unsigned char op14[] = {VGSCPU_OP_LD_D_RM, 0x03, VGSCPU_OP_BRK}; + unsigned char op15[] = {VGSCPU_OP_LD_D_RM, 0x04, VGSCPU_OP_BRK}; + unsigned char op16[] = {VGSCPU_OP_LD_D_RM, 0x11, VGSCPU_OP_BRK}; + unsigned char op17[] = {VGSCPU_OP_LD_D_RM, 0x12, VGSCPU_OP_BRK}; + unsigned char op18[] = {VGSCPU_OP_LD_D_RM, 0x13, VGSCPU_OP_BRK}; + unsigned char op19[] = {VGSCPU_OP_LD_D_RM, 0x14, VGSCPU_OP_BRK}; + unsigned char op20[] = {VGSCPU_OP_LD_D_RM, 0x21, VGSCPU_OP_BRK}; + unsigned char op21[] = {VGSCPU_OP_LD_D_RM, 0x22, VGSCPU_OP_BRK}; + unsigned char op22[] = {VGSCPU_OP_LD_D_RM, 0x23, VGSCPU_OP_BRK}; + unsigned char op23[] = {VGSCPU_OP_LD_D_RM, 0x24, VGSCPU_OP_BRK}; + unsigned char op24[] = {VGSCPU_OP_LD_D_RM, 0x31, VGSCPU_OP_BRK}; + unsigned char op25[] = {VGSCPU_OP_LD_D_RM, 0x32, VGSCPU_OP_BRK}; + unsigned char op26[] = {VGSCPU_OP_LD_D_RM, 0x33, VGSCPU_OP_BRK}; + unsigned char op27[] = {VGSCPU_OP_LD_D_RM, 0x34, VGSCPU_OP_BRK}; vgscpu_load_program(c, op1, sizeof(op1)); TEST(__FILE__, __LINE__, vgscpu_run(c), 0); @@ -65,6 +83,74 @@ int test_program_memory(struct vgscpu_context *c) vgscpu_load_program(c, op9, sizeof(op9) - 1); TEST(__FILE__, __LINE__, vgscpu_run(c), -1); TEST(__FILE__, __LINE__, strcmp(c->error, "OUT OF PROGRAM MEMORY: $00000005"), 0); + + c->r.a = 0; + c->r.b = 0; + c->r.c = 0; + c->r.d = 0; + + vgscpu_load_program(c, op10, sizeof(op10)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "OUT OF PROGRAM MEMORY: $00000002"), 0); + + vgscpu_load_program(c, op11, sizeof(op11)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($00)"), 0); + + vgscpu_load_program(c, op12, sizeof(op12)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op13, sizeof(op13)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op14, sizeof(op14)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($03)"), 0); + + vgscpu_load_program(c, op15, sizeof(op15)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op16, sizeof(op16)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op17, sizeof(op17)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op18, sizeof(op18)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($13)"), 0); + + vgscpu_load_program(c, op19, sizeof(op19)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op20, sizeof(op20)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op21, sizeof(op21)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op22, sizeof(op22)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($23)"), 0); + + vgscpu_load_program(c, op23, sizeof(op23)); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); + + vgscpu_load_program(c, op24, sizeof(op24)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($31)"), 0); + + vgscpu_load_program(c, op25, sizeof(op25)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($32)"), 0); + + vgscpu_load_program(c, op26, sizeof(op26)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($33)"), 0); + + vgscpu_load_program(c, op27, sizeof(op27)); + TEST(__FILE__, __LINE__, vgscpu_run(c), -1); + TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($34)"), 0); return 0; } From 98f11c9fee40c60ae0ef2fe72dd4fd900d11a24d Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Thu, 21 Jul 2016 10:21:01 +0900 Subject: [PATCH 07/23] =?UTF-8?q?=E8=AA=A4=E6=A4=8D=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index a490871..b91e7fe 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,16 +1,16 @@ # Changes -## version 0.2.0 +## Version 0.2.0 - レジスタが指すアドレス値からの load/store に対応 -## version 0.1.2 +## Version 0.1.2 - license の修正(不要文言削除のみ) - `vgsasm` のテストを追加 - bugfix: SHL, SHR の結果が ゼロフラグ に反映されない ## Version 0.1.1 - `vgsasm` のテストを追加: LD, ST -- bugfix: 引数またはレジスタが指定できる第2オペランドにレジスタBを指定する2進数の0が指定されてしまう +- bugfix: 引数またはレジスタが指定できる第2オペランドにレジスタBを指定すると2進数の0が指定されたものとみなされる ## Version 0.1.0 (破壊的変更) - `VGS` 命令を廃止 From ea57ac8afed11978e0cc13aae874772fd936aec0 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Fri, 22 Jul 2016 00:50:28 +0900 Subject: [PATCH 08/23] =?UTF-8?q?vgsasm=20=E3=81=AE=E6=A7=8B=E6=96=87?= =?UTF-8?q?=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E7=AD=89=E3=82=92=E8=8B=A5?= =?UTF-8?q?=E5=B9=B2=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 6 +++++- src/asm/vgsasm.c | 30 ++++++++++++++++++++---------- src/asm/vgsasm.h | 3 ++- src/asm/vgsasm_parse.c | 20 +++++++++++++++++++- src/asm/vgsasm_util.c | 9 +++++++++ src/test/asm_add_a.asm | 4 ++-- 6 files changed, 57 insertions(+), 15 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b91e7fe..716e482 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,11 @@ # Changes ## Version 0.2.0 -- レジスタが指すアドレス値からの load/store に対応 +- cpu + - レジスタが指すアドレス値からの load/store に対応 +- `vgsasm` + - ブラケット `[` に対応する `]` が無い場合を syntax error にする + - エラー時のコマンド戻り値の仕様を変更 ## Version 0.1.2 - license の修正(不要文言削除のみ) diff --git a/src/asm/vgsasm.c b/src/asm/vgsasm.c index c573d50..3e45fb4 100644 --- a/src/asm/vgsasm.c +++ b/src/asm/vgsasm.c @@ -3,6 +3,12 @@ #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]; @@ -66,48 +72,52 @@ int main(int argc, char* argv[]) if (check_arguments(argc, argv)) { puts("usage: vgsasm [-o output.bin] input.asm"); - return 1; + return PARAM_ERROR; } LOGV("assembling: %s -> %s\n", PT.input, PT.output); PT.buffer = load_file(PT.input); if (NULL == PT.buffer) { fprintf(stderr, "file load error.\n"); - return 2; + return FILE_READ_ERROR; } PT.line = parse_lines(PT.buffer, &PT.line_number); if (NULL == PT.line) { - return 3; + return SYNTAX_ERROR; } remove_empty_line(PT.line, &PT.line_number); if (0 == PT.line_number) { fprintf(stderr, "empty source file.\n"); - return 4; + return SYNTAX_ERROR; + } + + if (parse_token(PT.line, PT.line_number)) { + show_errors(PT.line, PT.line_number); + return SYNTAX_ERROR; } - parse_token(PT.line, PT.line_number); if (parse_operation(PT.line, PT.line_number)) { show_errors(PT.line, PT.line_number); - return 5; + return SYNTAX_ERROR; } if (check_label(PT.line, PT.line_number)) { show_errors(PT.line, PT.line_number); - return 6; + return SYNTAX_ERROR; } if (NULL == (fp = fopen(PT.output, "wb"))) { fprintf(stderr, "file open error.\n"); - return 7; + return FILE_WRITE_ERROR; } for (i = 0; i < PT.line_number; i++) { if (PT.line[i].oplen) { if (PT.line[i].oplen != fwrite(PT.line[i].op, 1, PT.line[i].oplen, fp)) { fprintf(stderr, "file write error.\n"); - return 8; + return FILE_WRITE_ERROR; } } } @@ -127,5 +137,5 @@ int main(int argc, char* argv[]) printf("success (%fsec)\n", sec); #endif - return 0; + return NO_ERROR; } \ No newline at end of file diff --git a/src/asm/vgsasm.h b/src/asm/vgsasm.h index 6e919d0..d385302 100644 --- a/src/asm/vgsasm.h +++ b/src/asm/vgsasm.h @@ -49,6 +49,7 @@ struct line_data { char* load_file(const char* path); void trimstring(char* src); +void back_space(char* ln); int check_GR(char* token); int getHex(char c); int getDec(char c); @@ -59,7 +60,7 @@ int check_address(char* token, unsigned int* result, int* m); struct line_data* parse_lines(char* buf, int* line); void remove_empty_line(struct line_data* line, int* len); -void parse_token(struct line_data* line, int len); +int parse_token(struct line_data* line, int len); int parse_operation(struct line_data* line, int len); int parse_push(struct line_data* line, int i); int parse_pop(struct line_data* line, int i); diff --git a/src/asm/vgsasm_parse.c b/src/asm/vgsasm_parse.c index ac24032..8300efb 100644 --- a/src/asm/vgsasm_parse.c +++ b/src/asm/vgsasm_parse.c @@ -109,14 +109,31 @@ void remove_empty_line(struct line_data* line, int* len) } } -void parse_token(struct line_data* line, int len) +int parse_token(struct line_data* line, int len) { + int error_count = 0; int i; char* w; + char* bs; for (i = 0; i < len; i++) { w = line[i].buffer; while (*w) { line[i].token[line[i].toknum++] = w; + if ('[' == *w) { + bs = w; + while (*w && ']' != *w) { + if (' ' == *w) + back_space(w); + else + w++; + } + if (']' != *w) { + sprintf(line[i].error, "syntax error: there is no corresponding bracket: %s", bs); + error_count++; + } else { + w++; + } + } while (*w && ' ' != *w) { w++; } @@ -129,6 +146,7 @@ void parse_token(struct line_data* line, int len) } } } + return error_count; } int parse_operation(struct line_data* line, int len) diff --git a/src/asm/vgsasm_util.c b/src/asm/vgsasm_util.c index 9986a19..2ec8b67 100644 --- a/src/asm/vgsasm_util.c +++ b/src/asm/vgsasm_util.c @@ -55,6 +55,15 @@ void trimstring(char* src) } } +void back_space(char* ln) +{ + if (!*ln) return; + do { + *ln = *(ln + 1); + ln++; + } while (*(ln - 1)); +} + int check_GR(char* token) { if (0 == strcasecmp(token, "A")) { diff --git a/src/test/asm_add_a.asm b/src/test/asm_add_a.asm index 3e86b5d..da0e330 100644 --- a/src/test/asm_add_a.asm +++ b/src/test/asm_add_a.asm @@ -29,7 +29,7 @@ start: // アドレス格納領域の加算テスト LD A, $12345678 - ST A, [0] + ST A, [ 0 ] LD A, 0 ADD A, [0]O // A = A + $78(120) (1byte) CMP A, $78 @@ -37,7 +37,7 @@ start: JZ test-failed ADD A, -120 // A = A - 120 (4byte) JNZ test-failed - ADD A, [0]H // A = A + $5678(22136) (2byte) + ADD A, [ 0 ]H // A = A + $5678(22136) (2byte) CMP A, $5678 JNE test-failed JZ test-failed From 9f1a0d73c9d8b855b04c3d5e321a8acb727e554b Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Fri, 22 Jul 2016 01:12:55 +0900 Subject: [PATCH 09/23] =?UTF-8?q?=E3=83=AC=E3=82=B8=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=82=A2=E3=83=89=E3=83=AC=E3=82=B9=E3=81=8B=E3=82=89=E5=90=8C?= =?UTF-8?q?=E3=83=AC=E3=82=B8=E3=82=B9=E3=82=BF=E3=81=B8=E3=81=AE=20ld/st?= =?UTF-8?q?=20=E3=82=92=E8=A8=B1=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cpu/vgscpu.c | 104 +++++++++++++++++++++++++++++++++++++++++++ src/test/tp_ldst_a.c | 9 ++-- src/test/tp_ldst_b.c | 9 ++-- src/test/tp_ldst_c.c | 9 ++-- src/test/tp_ldst_d.c | 9 ++-- 5 files changed, 116 insertions(+), 24 deletions(-) diff --git a/src/cpu/vgscpu.c b/src/cpu/vgscpu.c index 1ec0804..5359432 100644 --- a/src/cpu/vgscpu.c +++ b/src/cpu/vgscpu.c @@ -753,6 +753,19 @@ int vgscpu_run(void *ctx) ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); c->r.p++; switch (c->p[c->r.p++]) { + case 0x01: /* A1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 1); + c->r.a = c->m[c->r.a]; + break; + case 0x02: /* A2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 2); + memcpy(&s, &c->m[c->r.a], 2); + c->r.a = s; + break; + case 0x04: /* A4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); + memcpy(&c->r.a, &c->m[c->r.a], 4); + break; case 0x11: /* B1 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); c->r.a = c->m[c->r.b]; @@ -815,6 +828,19 @@ int vgscpu_run(void *ctx) ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); memcpy(&c->r.b, &c->m[c->r.a], 4); break; + case 0x11: /* B1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); + c->r.b = c->m[c->r.b]; + break; + case 0x12: /* B2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 2); + memcpy(&s, &c->m[c->r.b], 2); + c->r.b = s; + break; + case 0x14: /* B4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); + memcpy(&c->r.b, &c->m[c->r.b], 4); + break; case 0x21: /* C1 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); c->r.b = c->m[c->r.c]; @@ -877,6 +903,19 @@ int vgscpu_run(void *ctx) ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); memcpy(&c->r.c, &c->m[c->r.b], 4); break; + case 0x21: /* C1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); + c->r.c = c->m[c->r.c]; + break; + case 0x22: /* C2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 2); + memcpy(&s, &c->m[c->r.c], 2); + c->r.c = s; + break; + case 0x24: /* C4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); + memcpy(&c->r.c, &c->m[c->r.c], 4); + break; case 0x31: /* D1 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); c->r.c = c->m[c->r.d]; @@ -939,6 +978,19 @@ int vgscpu_run(void *ctx) ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); memcpy(&c->r.d, &c->m[c->r.c], 4); break; + case 0x31: /* D1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); + c->r.d = c->m[c->r.d]; + break; + case 0x32: /* D2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 2); + memcpy(&s, &c->m[c->r.d], 2); + c->r.d = s; + break; + case 0x34: /* D4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); + memcpy(&c->r.d, &c->m[c->r.d], 4); + break; default: sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); loop_flag = 0; @@ -949,6 +1001,19 @@ int vgscpu_run(void *ctx) ASSERT_IF_OUT_OF_PROGRAM_MEMORY(2); c->r.p++; switch (c->p[c->r.p++]) { + case 0x01: /* A1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 1); + c->m[c->r.a] = c->r.a & 0xff; + break; + case 0x02: /* A2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 2); + s = c->r.a & 0xffff; + memcpy(&c->m[c->r.a], &s, 2); + break; + case 0x04: /* A4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); + memcpy(&c->m[c->r.a], &c->r.a, 4); + break; case 0x11: /* B1 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); c->m[c->r.b] = c->r.a & 0xff; @@ -1011,6 +1076,19 @@ int vgscpu_run(void *ctx) ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.a, 4); memcpy(&c->m[c->r.a], &c->r.b, 4); break; + case 0x11: /* B1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 1); + c->m[c->r.b] = c->r.b & 0xff; + break; + case 0x12: /* B2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 2); + s = c->r.b & 0xffff; + memcpy(&c->m[c->r.b], &s, 2); + break; + case 0x14: /* B4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); + memcpy(&c->m[c->r.b], &c->r.b, 4); + break; case 0x21: /* C1 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); c->m[c->r.c] = c->r.b & 0xff; @@ -1073,6 +1151,19 @@ int vgscpu_run(void *ctx) ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.b, 4); memcpy(&c->m[c->r.b], &c->r.c, 4); break; + case 0x21: /* C1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 1); + c->m[c->r.c] = c->r.c & 0xff; + break; + case 0x22: /* C2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 2); + s = c->r.c & 0xffff; + memcpy(&c->m[c->r.c], &s, 2); + break; + case 0x24: /* C4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); + memcpy(&c->m[c->r.c], &c->r.c, 4); + break; case 0x31: /* D1 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); c->m[c->r.d] = c->r.c & 0xff; @@ -1135,6 +1226,19 @@ int vgscpu_run(void *ctx) ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.c, 4); memcpy(&c->m[c->r.c], &c->r.d, 4); break; + case 0x31: /* D1 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 1); + c->m[c->r.d] = c->r.d & 0xff; + break; + case 0x32: /* D2 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 2); + s = c->r.d & 0xffff; + memcpy(&c->m[c->r.d], &s, 2); + break; + case 0x44: /* D4 */ + ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); + memcpy(&c->m[c->r.d], &c->r.d, 4); + break; default: sprintf(c->error, "INVALID ARGUMENT($%02X)", (int)c->p[c->r.p - 1]); loop_flag = 0; diff --git a/src/test/tp_ldst_a.c b/src/test/tp_ldst_a.c index d467a3c..21b3093 100644 --- a/src/test/tp_ldst_a.c +++ b/src/test/tp_ldst_a.c @@ -98,20 +98,17 @@ int test_program_memory(struct vgscpu_context *c) TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($00)"), 0); vgscpu_load_program(c, op12, sizeof(op12)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($01)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op13, sizeof(op13)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($02)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op14, sizeof(op14)); TEST(__FILE__, __LINE__, vgscpu_run(c), -1); TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($03)"), 0); vgscpu_load_program(c, op15, sizeof(op15)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($04)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op16, sizeof(op16)); TEST(__FILE__, __LINE__, vgscpu_run(c), 0); diff --git a/src/test/tp_ldst_b.c b/src/test/tp_ldst_b.c index f8c565d..d5639a9 100644 --- a/src/test/tp_ldst_b.c +++ b/src/test/tp_ldst_b.c @@ -111,20 +111,17 @@ int test_program_memory(struct vgscpu_context *c) TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op16, sizeof(op16)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($11)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op17, sizeof(op17)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($12)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op18, sizeof(op18)); TEST(__FILE__, __LINE__, vgscpu_run(c), -1); TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($13)"), 0); vgscpu_load_program(c, op19, sizeof(op19)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($14)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op20, sizeof(op20)); TEST(__FILE__, __LINE__, vgscpu_run(c), 0); diff --git a/src/test/tp_ldst_c.c b/src/test/tp_ldst_c.c index a975700..c2d6450 100644 --- a/src/test/tp_ldst_c.c +++ b/src/test/tp_ldst_c.c @@ -124,20 +124,17 @@ int test_program_memory(struct vgscpu_context *c) TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op20, sizeof(op20)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($21)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op21, sizeof(op21)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($22)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op22, sizeof(op22)); TEST(__FILE__, __LINE__, vgscpu_run(c), -1); TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($23)"), 0); vgscpu_load_program(c, op23, sizeof(op23)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($24)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op24, sizeof(op24)); TEST(__FILE__, __LINE__, vgscpu_run(c), 0); diff --git a/src/test/tp_ldst_d.c b/src/test/tp_ldst_d.c index 0ad75a5..aae3b29 100644 --- a/src/test/tp_ldst_d.c +++ b/src/test/tp_ldst_d.c @@ -137,20 +137,17 @@ int test_program_memory(struct vgscpu_context *c) TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op24, sizeof(op24)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($31)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op25, sizeof(op25)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($32)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); vgscpu_load_program(c, op26, sizeof(op26)); TEST(__FILE__, __LINE__, vgscpu_run(c), -1); TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($33)"), 0); vgscpu_load_program(c, op27, sizeof(op27)); - TEST(__FILE__, __LINE__, vgscpu_run(c), -1); - TEST(__FILE__, __LINE__, strcmp(c->error, "INVALID ARGUMENT($34)"), 0); + TEST(__FILE__, __LINE__, vgscpu_run(c), 0); return 0; } From 651a97385f7c864dbde05327603d63b5588b5f0d Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Fri, 22 Jul 2016 01:20:54 +0900 Subject: [PATCH 10/23] =?UTF-8?q?vgsasm:=20LD/ST=20=E3=81=AE=20=E5=BC=95?= =?UTF-8?q?=E6=95=B0=20=E3=81=AB=20=E3=83=AC=E3=82=B8=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=82=A2=E3=83=89=E3=83=AC=E3=82=B9=20`[GR]`=20=E3=82=92?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 1 + src/asm/vgsasm.h | 14 +++++++++ src/asm/vgsasm_parse_arl.c | 18 +++++++++++ src/asm/vgsasm_util.c | 64 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 716e482..09eb961 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - cpu - レジスタが指すアドレス値からの load/store に対応 - `vgsasm` + - LD/ST の 引数 に レジスタアドレス `[GR]` を指定できるようにする - ブラケット `[` に対応する `]` が無い場合を syntax error にする - エラー時のコマンド戻り値の仕様を変更 diff --git a/src/asm/vgsasm.h b/src/asm/vgsasm.h index d385302..eb6aaca 100644 --- a/src/asm/vgsasm.h +++ b/src/asm/vgsasm.h @@ -21,6 +21,19 @@ #define M2 2 #define M4 4 +#define RA1 0x01 +#define RA2 0x02 +#define RA4 0x04 +#define RB1 0x11 +#define RB2 0x12 +#define RB4 0x14 +#define RC1 0x21 +#define RC2 0x22 +#define RC4 0x24 +#define RD1 0x31 +#define RD2 0x32 +#define RD4 0x34 + #define ACU_ADD 0 #define ACU_SUB 1 #define ACU_MUL 2 @@ -57,6 +70,7 @@ int getOct(char c); int getBin(char c); int check_literal(char* token, unsigned int* result); int check_address(char* token, unsigned int* result, int* m); +int check_register_address(char* token, int* r); struct line_data* parse_lines(char* buf, int* line); void remove_empty_line(struct line_data* line, int* len); diff --git a/src/asm/vgsasm_parse_arl.c b/src/asm/vgsasm_parse_arl.c index f9990ee..28346e7 100644 --- a/src/asm/vgsasm_parse_arl.c +++ b/src/asm/vgsasm_parse_arl.c @@ -89,6 +89,24 @@ int _parse_arl(struct line_data* line, int i, int r, int op) line[i].oplen = 5; } return 0; + } else if (0 == check_register_address(line[i].token[2], &m)) { + switch (op) { + case VGSCPU_OP_LD_A_RM: + case VGSCPU_OP_LD_B_RM: + case VGSCPU_OP_LD_C_RM: + case VGSCPU_OP_LD_D_RM: + case VGSCPU_OP_ST_A_RM: + case VGSCPU_OP_ST_B_RM: + case VGSCPU_OP_ST_C_RM: + case VGSCPU_OP_ST_D_RM: + break; + default: + sprintf(line[i].error, "syntax error: cannot specify register address argument to the %s operand", line[i].token[1]); + return -1; + } + line[i].op[0] = op; + line[i].op[1] = m & 0xff; + line[i].oplen = 2; } else if (0 == check_address(line[i].token[2], &v, &m)) { memcpy(&line[i].op[1], &v, 4); line[i].oplen = 5; diff --git a/src/asm/vgsasm_util.c b/src/asm/vgsasm_util.c index 2ec8b67..4bb7f7c 100644 --- a/src/asm/vgsasm_util.c +++ b/src/asm/vgsasm_util.c @@ -280,3 +280,67 @@ int check_address(char* token, unsigned int* result, int* m) } return -1; } + +int check_register_address(char* token, int* r) +{ + char buf[1024]; + strcpy(buf, token); + size_t len = strlen(buf); + if (len < 3) return -1; + if ('[' == buf[0] && ']' == buf[len - 1]) { + buf[len - 1] = '\0'; + switch (check_GR(buf + 1)) { + case A4: + *r = RA4; + return 0; + case B4: + *r = RB4; + return 0; + case C4: + *r = RC4; + return 0; + case D4: + *r = RD4; + return 0; + default: + return -1; + } + } else if ('[' == buf[0] && ']' == buf[len - 2] && ('H' == buf[len - 1] || 'h' == buf[len - 1])) { + buf[len - 2] = '\0'; + switch (check_GR(buf + 1)) { + case A4: + *r = RA2; + return 0; + case B4: + *r = RB2; + return 0; + case C4: + *r = RC2; + return 0; + case D4: + *r = RD2; + return 0; + default: + return -1; + } + } else if ('[' == buf[0] && ']' == buf[len - 2] && ('O' == buf[len - 1] || 'o' == buf[len - 1])) { + buf[len - 2] = '\0'; + switch (check_GR(buf + 1)) { + case A4: + *r = RA1; + return 0; + case B4: + *r = RB1; + return 0; + case C4: + *r = RC1; + return 0; + case D4: + *r = RD1; + return 0; + default: + return -1; + } + } + return -1; +} From e13a8c2b5445aea4f3f637f55fc5ac1c57a895f7 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 02:36:53 +0900 Subject: [PATCH 11/23] added test: LD A from register address (ASM) --- src/asm/vgsasm_parse_arl.c | 32 +++++++++++++++++------ src/test/asm_ld_st_a.asm | 52 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/src/asm/vgsasm_parse_arl.c b/src/asm/vgsasm_parse_arl.c index 28346e7..35446ba 100644 --- a/src/asm/vgsasm_parse_arl.c +++ b/src/asm/vgsasm_parse_arl.c @@ -91,14 +91,29 @@ int _parse_arl(struct line_data* line, int i, int r, int op) return 0; } else if (0 == check_register_address(line[i].token[2], &m)) { switch (op) { - case VGSCPU_OP_LD_A_RM: - case VGSCPU_OP_LD_B_RM: - case VGSCPU_OP_LD_C_RM: - case VGSCPU_OP_LD_D_RM: - case VGSCPU_OP_ST_A_RM: - case VGSCPU_OP_ST_B_RM: - case VGSCPU_OP_ST_C_RM: - case VGSCPU_OP_ST_D_RM: + case VGSCPU_OP_LD_A_1: + op = VGSCPU_OP_LD_A_RM; + break; + case VGSCPU_OP_LD_B_1: + op = VGSCPU_OP_LD_B_RM; + break; + case VGSCPU_OP_LD_C_1: + op = VGSCPU_OP_LD_C_RM; + break; + case VGSCPU_OP_LD_D_1: + op = VGSCPU_OP_LD_D_RM; + break; + case VGSCPU_OP_ST_A_M1: + op = VGSCPU_OP_ST_A_RM; + break; + case VGSCPU_OP_ST_B_M1: + op = VGSCPU_OP_ST_B_RM; + break; + case VGSCPU_OP_ST_C_M1: + op = VGSCPU_OP_ST_C_RM; + break; + case VGSCPU_OP_ST_D_M1: + op = VGSCPU_OP_ST_D_RM; break; default: sprintf(line[i].error, "syntax error: cannot specify register address argument to the %s operand", line[i].token[1]); @@ -107,6 +122,7 @@ int _parse_arl(struct line_data* line, int i, int r, int op) line[i].op[0] = op; line[i].op[1] = m & 0xff; line[i].oplen = 2; + return 0; } else if (0 == check_address(line[i].token[2], &v, &m)) { memcpy(&line[i].op[1], &v, 4); line[i].oplen = 5; diff --git a/src/test/asm_ld_st_a.asm b/src/test/asm_ld_st_a.asm index e90f94a..e483a02 100644 --- a/src/test/asm_ld_st_a.asm +++ b/src/test/asm_ld_st_a.asm @@ -68,6 +68,58 @@ start: CMP A, $D001 JNE test-failed + // レジスタ指定アドレスからのload + LD A, $12345678 + ST A, [0] + LD A, $90abcdef + ST A, [4] + + LD A, 4 + LD A, [A]O + CMP A, $ef + JNE test-failed + LD A, 4 + LD A, [A]H + CMP A, $cdef + JNE test-failed + LD A, 4 + LD A, [A] + CMP A, $90abcdef + JNE test-failed + + LD B, 4 + LD A, [B]O + CMP A, $ef + JNE test-failed + LD A, [B]H + CMP A, $cdef + JNE test-failed + LD A, [B] + CMP A, $90abcdef + JNE test-failed + + LD C, 4 + LD A, [C]O + CMP A, $ef + JNE test-failed + LD A, [C]H + CMP A, $cdef + JNE test-failed + LD A, [C] + CMP A, $90abcdef + JNE test-failed + + LD D, 4 + LD A, [D]O + CMP A, $ef + JNE test-failed + LD A, [D]H + CMP A, $cdef + JNE test-failed + LD A, [D] + CMP A, $90abcdef + JNE test-failed + LD D, 1 BRK From f534d37f44cc2bc9bc08bfc677258b02f0141dfe Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:11:33 +0900 Subject: [PATCH 12/23] added test: LD B from register address (ASM) --- src/test/asm_ld_st_b.asm | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/test/asm_ld_st_b.asm b/src/test/asm_ld_st_b.asm index 8525c5c..5697a7d 100644 --- a/src/test/asm_ld_st_b.asm +++ b/src/test/asm_ld_st_b.asm @@ -68,6 +68,58 @@ start: CMP B, $D001 JNE test-failed + // レジスタ指定アドレスからのload + LD A, $12345678 + ST A, [0] + LD A, $90abcdef + ST A, [4] + + LD A, 4 + LD B, [A]O + CMP B, $ef + JNE test-failed + LD B, [A]H + CMP B, $cdef + JNE test-failed + LD B, [A] + CMP B, $90abcdef + JNE test-failed + + LD B, 4 + LD B, [B]O + CMP B, $ef + JNE test-failed + LD B, 4 + LD B, [B]H + CMP B, $cdef + JNE test-failed + LD B, 4 + LD B, [B] + CMP B, $90abcdef + JNE test-failed + + LD C, 4 + LD B, [C]O + CMP B, $ef + JNE test-failed + LD B, [C]H + CMP B, $cdef + JNE test-failed + LD B, [C] + CMP B, $90abcdef + JNE test-failed + + LD D, 4 + LD B, [D]O + CMP B, $ef + JNE test-failed + LD B, [D]H + CMP B, $cdef + JNE test-failed + LD B, [D] + CMP B, $90abcdef + JNE test-failed + LD D, 1 BRK From cfd187c358b86b447bdee9b67b8cc34931b653ee Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:13:41 +0900 Subject: [PATCH 13/23] added test: LD C from register address (ASM) --- src/test/asm_ld_st_c.asm | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/test/asm_ld_st_c.asm b/src/test/asm_ld_st_c.asm index 9503591..c51368a 100644 --- a/src/test/asm_ld_st_c.asm +++ b/src/test/asm_ld_st_c.asm @@ -68,6 +68,58 @@ start: CMP C, $D001 JNE test-failed + // レジスタ指定アドレスからのload + LD A, $12345678 + ST A, [0] + LD A, $90abcdef + ST A, [4] + + LD A, 4 + LD C, [A]O + CMP C, $ef + JNE test-failed + LD C, [A]H + CMP C, $cdef + JNE test-failed + LD C, [A] + CMP C, $90abcdef + JNE test-failed + + LD B, 4 + LD C, [B]O + CMP C, $ef + JNE test-failed + LD C, [B]H + CMP C, $cdef + JNE test-failed + LD C, [B] + CMP C, $90abcdef + JNE test-failed + + LD C, 4 + LD C, [C]O + CMP C, $ef + JNE test-failed + LD C, 4 + LD C, [C]H + CMP C, $cdef + JNE test-failed + LD C, 4 + LD C, [C] + CMP C, $90abcdef + JNE test-failed + + LD D, 4 + LD C, [D]O + CMP C, $ef + JNE test-failed + LD C, [D]H + CMP C, $cdef + JNE test-failed + LD C, [D] + CMP C, $90abcdef + JNE test-failed + LD D, 1 BRK From 86d0584841df12c4eb4561520609f18a3535a215 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:15:29 +0900 Subject: [PATCH 14/23] added test: LD D from register address (ASM) --- src/test/asm_ld_st_d.asm | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/test/asm_ld_st_d.asm b/src/test/asm_ld_st_d.asm index 6568090..8065ac3 100644 --- a/src/test/asm_ld_st_d.asm +++ b/src/test/asm_ld_st_d.asm @@ -68,6 +68,58 @@ start: CMP D, $C001 JNE test-failed + // レジスタ指定アドレスからのload + LD A, $12345678 + ST A, [0] + LD A, $90abcdef + ST A, [4] + + LD A, 4 + LD D, [A]O + CMP D, $ef + JNE test-failed + LD D, [A]H + CMP D, $cdef + JNE test-failed + LD D, [A] + CMP D, $90abcdef + JNE test-failed + + LD B, 4 + LD D, [B]O + CMP D, $ef + JNE test-failed + LD D, [B]H + CMP D, $cdef + JNE test-failed + LD D, [B] + CMP D, $90abcdef + JNE test-failed + + LD C, 4 + LD D, [C]O + CMP D, $ef + JNE test-failed + LD D, [C]H + CMP D, $cdef + JNE test-failed + LD D, [C] + CMP D, $90abcdef + JNE test-failed + + LD D, 4 + LD D, [D]O + CMP D, $ef + JNE test-failed + LD D, 4 + LD D, [D]H + CMP D, $cdef + JNE test-failed + LD D, 4 + LD D, [D] + CMP D, $90abcdef + JNE test-failed + LD D, 1 BRK From 5724be4cb974f64abf5f3a3e19e8f0f87fe6e15d Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:27:11 +0900 Subject: [PATCH 15/23] =?UTF-8?q?st=E3=81=AEparse=E7=AE=87=E6=89=80?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/asm/vgsasm_parse_arl.c | 12 ------------ src/asm/vgsasm_parse_st.c | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/asm/vgsasm_parse_arl.c b/src/asm/vgsasm_parse_arl.c index 35446ba..5840ed9 100644 --- a/src/asm/vgsasm_parse_arl.c +++ b/src/asm/vgsasm_parse_arl.c @@ -103,18 +103,6 @@ int _parse_arl(struct line_data* line, int i, int r, int op) case VGSCPU_OP_LD_D_1: op = VGSCPU_OP_LD_D_RM; break; - case VGSCPU_OP_ST_A_M1: - op = VGSCPU_OP_ST_A_RM; - break; - case VGSCPU_OP_ST_B_M1: - op = VGSCPU_OP_ST_B_RM; - break; - case VGSCPU_OP_ST_C_M1: - op = VGSCPU_OP_ST_C_RM; - break; - case VGSCPU_OP_ST_D_M1: - op = VGSCPU_OP_ST_D_RM; - break; default: sprintf(line[i].error, "syntax error: cannot specify register address argument to the %s operand", line[i].token[1]); return -1; diff --git a/src/asm/vgsasm_parse_st.c b/src/asm/vgsasm_parse_st.c index 8353d2e..f95acad 100644 --- a/src/asm/vgsasm_parse_st.c +++ b/src/asm/vgsasm_parse_st.c @@ -5,6 +5,26 @@ static int parse_st_internal(struct line_data* line, int i, int op) unsigned int v; unsigned short s; int m; + if (0 == check_register_address(line[i].token[2], &m)) { + switch (op) { + case VGSCPU_OP_ST_A_M1: + op = VGSCPU_OP_ST_A_RM; + break; + case VGSCPU_OP_ST_B_M1: + op = VGSCPU_OP_ST_B_RM; + break; + case VGSCPU_OP_ST_C_M1: + op = VGSCPU_OP_ST_C_RM; + break; + case VGSCPU_OP_ST_D_M1: + op = VGSCPU_OP_ST_D_RM; + break; + } + line[i].op[0] = op; + line[i].op[1] = m & 0xff; + line[i].oplen = 2; + return 0; + } if (0 == check_address(line[i].token[2], &v, &m)) { memcpy(&line[i].op[1], &v, 4); line[i].oplen = 5; From 4af5e2f443f52ac077a7e3db8359b607173cf3b7 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:32:07 +0900 Subject: [PATCH 16/23] bugfix: D4 = $34 --- src/cpu/vgscpu.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cpu/vgscpu.c b/src/cpu/vgscpu.c index 5359432..42cb63b 100644 --- a/src/cpu/vgscpu.c +++ b/src/cpu/vgscpu.c @@ -1049,7 +1049,7 @@ int vgscpu_run(void *ctx) s = c->r.a & 0xffff; memcpy(&c->m[c->r.d], &s, 2); break; - case 0x44: /* D4 */ + case 0x34: /* D4 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); memcpy(&c->m[c->r.d], &c->r.a, 4); break; @@ -1111,7 +1111,7 @@ int vgscpu_run(void *ctx) s = c->r.b & 0xffff; memcpy(&c->m[c->r.d], &s, 2); break; - case 0x44: /* D4 */ + case 0x34: /* D4 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); memcpy(&c->m[c->r.d], &c->r.b, 4); break; @@ -1173,7 +1173,7 @@ int vgscpu_run(void *ctx) s = c->r.c & 0xffff; memcpy(&c->m[c->r.d], &s, 2); break; - case 0x44: /* D4 */ + case 0x34: /* D4 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); memcpy(&c->m[c->r.d], &c->r.c, 4); break; @@ -1235,7 +1235,7 @@ int vgscpu_run(void *ctx) s = c->r.d & 0xffff; memcpy(&c->m[c->r.d], &s, 2); break; - case 0x44: /* D4 */ + case 0x34: /* D4 */ ASSERT_IF_OUT_OF_MAIN_MEMORY(c->r.d, 4); memcpy(&c->m[c->r.d], &c->r.d, 4); break; From d3cfcc9f1d6a7a2dfd08bfa463d210672469dbf5 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:33:02 +0900 Subject: [PATCH 17/23] added test: ST A to register address (ASM) --- src/test/asm_ld_st_a.asm | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/test/asm_ld_st_a.asm b/src/test/asm_ld_st_a.asm index e483a02..e8132b6 100644 --- a/src/test/asm_ld_st_a.asm +++ b/src/test/asm_ld_st_a.asm @@ -120,6 +120,67 @@ start: CMP A, $90abcdef JNE test-failed + // レジスタ指定アドレスへのstore + LD A, $55555555 + ST A, [16] + LD A, 16 + ST A, [A]o + LD A, [16] + CMP A, $55555510 + JNE test-failed + LD A, 16 + ST A, [A]h + LD A, [16] + CMP A, $55550010 + JNE test-failed + LD A, 16 + ST A, [A] + LD A, [16] + CMP A, $00000010 + JNE test-failed + + LD A, $55555555 + ST A, [16] + LD A, 16 + LD B, 16 + ST A, [B]o + LD A, [16] + CMP A, $55555510 + JNE test-failed + LD A, 16 + LD B, 16 + ST A, [B]h + LD A, [16] + CMP A, $55550010 + JNE test-failed + LD A, 16 + LD B, 16 + ST A, [B] + LD A, [16] + CMP A, $00000010 + JNE test-failed + + LD A, $55555555 + ST A, [16] + LD A, 16 + LD C, 16 + ST A, [C]o + LD A, [16] + CMP A, $55555510 + JNE test-failed + LD A, 16 + LD C, 16 + ST A, [C]h + LD A, [16] + CMP A, $55550010 + JNE test-failed + LD A, 16 + LD D, 16 + ST A, [D] + LD A, [16] + CMP A, $00000010 + JNE test-failed + LD D, 1 BRK From 30526ed8ead8ad12a85a9a83fa6246ee57f37706 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:47:02 +0900 Subject: [PATCH 18/23] =?UTF-8?q?bugfix:=20=E4=B8=80=E5=88=86=E7=92=B0?= =?UTF-8?q?=E5=A2=83=E3=81=A7asmtest=E3=81=8Ccoredump?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/asmtest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/asmtest.c b/src/test/asmtest.c index fa7e5bc..4c51bd1 100644 --- a/src/test/asmtest.c +++ b/src/test/asmtest.c @@ -28,7 +28,7 @@ char* load_bin(const char* path, int* size) fclose(fp); return NULL; } - data = malloc(*size); + data = malloc(1 + *size); if (NULL == data) { fclose(fp); return NULL; From 79142f1b08d97fc5ae1941137bc38b478302c8f0 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:51:39 +0900 Subject: [PATCH 19/23] =?UTF-8?q?asmtest=20=E3=81=A8=20tp.bin=20=E3=81=AF?= =?UTF-8?q?=20asm-test=20=E5=BE=8C=E3=81=AB=E6=AE=8B=E3=81=99=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=A6=E3=81=8A=E3=81=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/makefile b/makefile index 120e13e..4787033 100644 --- a/makefile +++ b/makefile @@ -147,5 +147,3 @@ asm-test: ./asmtest src/test/asm_add_c.asm ./asmtest src/test/asm_add_d.asm ./asmtest src/test/asm_shift.asm - @rm asmtest - @rm tp.bin From 1225f0c362dcf2cd9664d4f2be470499b507b4c6 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:56:21 +0900 Subject: [PATCH 20/23] added test: ST B to register address (ASM) --- src/test/asm_ld_st_b.asm | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/test/asm_ld_st_b.asm b/src/test/asm_ld_st_b.asm index 5697a7d..0ce52fc 100644 --- a/src/test/asm_ld_st_b.asm +++ b/src/test/asm_ld_st_b.asm @@ -120,6 +120,67 @@ start: CMP B, $90abcdef JNE test-failed + // レジスタ指定アドレスへのstore + LD B, $55555555 + ST B, [16] + LD B, 16 + LD A, 16 + ST B, [A]o + LD B, [16] + CMP B, $55555510 + JNE test-failed + LD B, 16 + LD A, 16 + ST B, [A]h + LD B, [16] + CMP B, $55550010 + JNE test-failed + LD B, 16 + LD A, 16 + ST B, [A] + LD B, [16] + CMP B, $00000010 + JNE test-failed + + LD B, $55555555 + ST B, [16] + LD B, 16 + ST B, [B]o + LD B, [16] + CMP B, $55555510 + JNE test-failed + LD B, 16 + ST B, [B]h + LD B, [16] + CMP B, $55550010 + JNE test-failed + LD B, 16 + ST B, [B] + LD B, [16] + CMP B, $00000010 + JNE test-failed + + LD B, $55555555 + ST B, [16] + LD B, 16 + LD C, 16 + ST B, [C]o + LD B, [16] + CMP B, $55555510 + JNE test-failed + LD B, 16 + LD C, 16 + ST B, [C]h + LD B, [16] + CMP B, $55550010 + JNE test-failed + LD B, 16 + LD D, 16 + ST B, [D] + LD B, [16] + CMP B, $00000010 + JNE test-failed + LD D, 1 BRK From e2b02f2b351f43da14ccf538c7bcf4b325b43a62 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 13:58:31 +0900 Subject: [PATCH 21/23] =?UTF-8?q?test=20case=20=E3=83=91=E3=82=BF=E3=83=BC?= =?UTF-8?q?=E3=83=B3=E6=BC=8F=E3=82=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/asm_ld_st_a.asm | 21 +++++++++++++++++++++ src/test/asm_ld_st_b.asm | 21 +++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/test/asm_ld_st_a.asm b/src/test/asm_ld_st_a.asm index e8132b6..3f950bb 100644 --- a/src/test/asm_ld_st_a.asm +++ b/src/test/asm_ld_st_a.asm @@ -175,6 +175,27 @@ start: CMP A, $55550010 JNE test-failed LD A, 16 + LD C, 16 + ST A, [C] + LD A, [16] + CMP A, $00000010 + JNE test-failed + + LD A, $55555555 + ST A, [16] + LD A, 16 + LD D, 16 + ST A, [D]o + LD A, [16] + CMP A, $55555510 + JNE test-failed + LD A, 16 + LD D, 16 + ST A, [D]h + LD A, [16] + CMP A, $55550010 + JNE test-failed + LD A, 16 LD D, 16 ST A, [D] LD A, [16] diff --git a/src/test/asm_ld_st_b.asm b/src/test/asm_ld_st_b.asm index 0ce52fc..270894c 100644 --- a/src/test/asm_ld_st_b.asm +++ b/src/test/asm_ld_st_b.asm @@ -181,6 +181,27 @@ start: CMP B, $00000010 JNE test-failed + LD B, $55555555 + ST B, [16] + LD B, 16 + LD D, 16 + ST B, [D]o + LD B, [16] + CMP B, $55555510 + JNE test-failed + LD B, 16 + LD D, 16 + ST B, [D]h + LD B, [16] + CMP B, $55550010 + JNE test-failed + LD B, 16 + LD D, 16 + ST B, [D] + LD B, [16] + CMP B, $00000010 + JNE test-failed + LD D, 1 BRK From b21bd92d0f3ff22ee176894545fb7ac217d41de4 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 14:01:49 +0900 Subject: [PATCH 22/23] added test: ST C to register address (ASM) --- src/test/asm_ld_st_c.asm | 82 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/test/asm_ld_st_c.asm b/src/test/asm_ld_st_c.asm index c51368a..afeacaf 100644 --- a/src/test/asm_ld_st_c.asm +++ b/src/test/asm_ld_st_c.asm @@ -120,6 +120,88 @@ start: CMP C, $90abcdef JNE test-failed + // レジスタ指定アドレスへのstore + LD C, $55555555 + ST C, [16] + LD C, 16 + LD A, 16 + ST C, [A]o + LD C, [16] + CMP C, $55555510 + JNE test-failed + LD C, 16 + LD A, 16 + ST C, [A]h + LD C, [16] + CMP C, $55550010 + JNE test-failed + LD C, 16 + LD A, 16 + ST C, [A] + LD C, [16] + CMP C, $00000010 + JNE test-failed + + LD C, $55555555 + ST C, [16] + LD C, 16 + LD B, 16 + ST C, [B]o + LD C, [16] + CMP C, $55555510 + JNE test-failed + LD C, 16 + LD B, 16 + ST C, [B]h + LD C, [16] + CMP C, $55550010 + JNE test-failed + LD C, 16 + LD B, 16 + ST C, [B] + LD C, [16] + CMP C, $00000010 + JNE test-failed + + LD C, $55555555 + ST C, [16] + LD C, 16 + ST C, [C]o + LD C, [16] + CMP C, $55555510 + JNE test-failed + LD C, 16 + ST C, [C]h + LD C, [16] + CMP C, $55550010 + JNE test-failed + LD C, 16 + ST C, [C] + LD C, [16] + CMP C, $00000010 + JNE test-failed + + LD C, $55555555 + ST C, [16] + LD C, 16 + LD D, 16 + ST C, [D]o + LD C, [16] + CMP C, $55555510 + JNE test-failed + LD C, 16 + LD D, 16 + ST C, [D]h + LD C, [16] + CMP C, $55550010 + JNE test-failed + LD C, 16 + LD D, 16 + ST C, [D] + LD C, [16] + CMP C, $00000010 + JNE test-failed + LD D, 1 BRK From f7cc47740ded013a28d474411384443078226b22 Mon Sep 17 00:00:00 2001 From: suzukiplan Date: Sat, 23 Jul 2016 14:04:45 +0900 Subject: [PATCH 23/23] added test: ST D to register address (ASM) --- src/test/asm_ld_st_d.asm | 82 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/test/asm_ld_st_d.asm b/src/test/asm_ld_st_d.asm index 8065ac3..c143fd5 100644 --- a/src/test/asm_ld_st_d.asm +++ b/src/test/asm_ld_st_d.asm @@ -120,6 +120,88 @@ start: CMP D, $90abcdef JNE test-failed + // レジスタ指定アドレスへのstore + LD D, $55555555 + ST D, [16] + LD D, 16 + LD A, 16 + ST D, [A]o + LD D, [16] + CMP D, $55555510 + JNE test-failed + LD D, 16 + LD A, 16 + ST D, [A]h + LD D, [16] + CMP D, $55550010 + JNE test-failed + LD D, 16 + LD A, 16 + ST D, [A] + LD D, [16] + CMP D, $00000010 + JNE test-failed + + LD D, $55555555 + ST D, [16] + LD D, 16 + LD B, 16 + ST D, [B]o + LD D, [16] + CMP D, $55555510 + JNE test-failed + LD D, 16 + LD B, 16 + ST D, [B]h + LD D, [16] + CMP D, $55550010 + JNE test-failed + LD D, 16 + LD B, 16 + ST D, [B] + LD D, [16] + CMP D, $00000010 + JNE test-failed + + LD D, $55555555 + ST D, [16] + LD D, 16 + LD C, 16 + ST D, [C]o + LD D, [16] + CMP D, $55555510 + JNE test-failed + LD D, 16 + LD C, 16 + ST D, [C]h + LD D, [16] + CMP D, $55550010 + JNE test-failed + LD D, 16 + LD D, 16 + ST D, [D] + LD D, [16] + CMP D, $00000010 + JNE test-failed + + LD D, $55555555 + ST D, [16] + LD D, 16 + ST D, [D]o + LD D, [16] + CMP D, $55555510 + JNE test-failed + LD D, 16 + ST D, [D]h + LD D, [16] + CMP D, $55550010 + JNE test-failed + LD D, 16 + ST D, [D] + LD D, [16] + CMP D, $00000010 + JNE test-failed + LD D, 1 BRK