projects
/
YACASL2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
バージョンアップ
[YACASL2.git]
/
src
/
struct.c
diff --git
a/src/struct.c
b/src/struct.c
index
0f0ae43
..
1058567
100644
(file)
--- a/
src/struct.c
+++ b/
src/struct.c
@@
-4,17
+4,17
@@
/**
* COMET IIの仮想実行マシンシステム
*/
/**
* COMET IIの仮想実行マシンシステム
*/
-SYSTEM *sys;
+SYSTEM *sys
= NULL
;
/**
* プログラム実行時の開始と終了のアドレス
*/
/**
* プログラム実行時の開始と終了のアドレス
*/
-EXECPTR *execptr;
+EXECPTR *execptr
= NULL
;
/**
* システムCOMET IIの命令表
*/
/**
* システムCOMET IIの命令表
*/
-static COMET2CMD comet2cmd[] = {
+static
const
COMET2CMD comet2cmd[] = {
{ "NOP", NONE, 0x0, nop },
{ "LD", R_ADR_X, 0x1000, ld_r_adr_x },
{ "ST", R_ADR_X, 0x1100, st },
{ "NOP", NONE, 0x0, nop },
{ "LD", R_ADR_X, 0x1000, ld_r_adr_x },
{ "ST", R_ADR_X, 0x1100, st },
@@
-64,21
+64,31
@@
static int comet2cmdsize = ARRAYSIZE(comet2cmd);
* ハッシュ表のサイズ
*/
enum {
* ハッシュ表のサイズ
*/
enum {
- CMDTABSIZE =
39
,
+ CMDTABSIZE =
41
,
};
/**
* ハッシュ表
*/
};
/**
* ハッシュ表
*/
-static CMDTAB *cmdtype_code[CMDTABSIZE], *code_cmdtype[CMDTABSIZE];
+static CMDTAB *cmdtab[HASH_MAX][CMDTABSIZE] = {{NULL}};
+
+/**
+ * 命令の名前とタイプからハッシュ値を生成する
+ */
+unsigned hash_cmdtype(const char *cmd, CMDTYPE type);
+
+/**
+ * 命令コードからハッシュ値を生成する
+ */
+unsigned hash_code(WORD code);
/**
* 命令の名前とタイプからハッシュ値を生成する
*/
unsigned hash_cmdtype(const char *cmd, CMDTYPE type)
{
/**
* 命令の名前とタイプからハッシュ値を生成する
*/
unsigned hash_cmdtype(const char *cmd, CMDTYPE type)
{
- HKEY *keys[2];
- unsigned hashval;
+ HKEY *keys[2]
= {NULL}
;
+ unsigned hashval
= 0
;
/* 命令名を設定 */
keys[0] = malloc_chk(sizeof(HKEY), "hash_cmdtype.keys[0]");
/* 命令名を設定 */
keys[0] = malloc_chk(sizeof(HKEY), "hash_cmdtype.keys[0]");
@@
-98,35
+108,55
@@
unsigned hash_cmdtype(const char *cmd, CMDTYPE type)
}
/**
}
/**
- * å
\90
\8d
å
\89
\8d
ã
\81
¨ã
\82
¿ã
\82
¤ã
\83
\97
ã
\81
\8c
ã
\82
ã
\83
¼ã
\81
®å
\91
½ä»¤ã
\83
\8f
ã
\83
\83
ã
\82
·ã
\83
¥è¡¨ã
\82
\92
ä½
\9c
æ
\88
\90
ã
\81
\99
ã
\82
\8b
+ * 命令ハッシュ表を作成する
*/
*/
-bool create_cmdt
ype_code(
)
+bool create_cmdt
able(CMDTAB_HASH hash
)
{
{
- CMDTAB *p;
+ CMDTAB *p
= NULL
;
unsigned hashval;
unsigned hashval;
- int i;
- for(i = 0; i < comet2cmdsize; i++) {
- hashval = hash_cmdtype(comet2cmd[i].name, comet2cmd[i].type); /* ハッシュ値の生成 */
- p = malloc_chk(sizeof(CMDTAB), "cmdtype_code");
+ for(int i = 0; i < comet2cmdsize; i++) {
+ p = malloc_chk(sizeof(CMDTAB), "create_cmdtable.p");
p->cmd = &comet2cmd[i];
p->cmd = &comet2cmd[i];
- p->next = cmdtype_code[hashval]; /* ハッシュ表に値を追加 */
- cmdtype_code[hashval] = p;
+ if(hash == HASH_CMDTYPE) {
+ hashval = hash_cmdtype(comet2cmd[i].name, comet2cmd[i].type);
+ } else if(hash == HASH_CODE) {
+ hashval = hash_code(comet2cmd[i].code);
+ }
+ p->next = cmdtab[hash][hashval];
+ cmdtab[hash][hashval] = p;
}
return true;
}
}
return true;
}
+/**
+ * 命令ハッシュ表を解放する
+ */
+void free_cmdtable(CMDTAB_HASH hash)
+{
+ CMDTAB *p = NULL;
+ CMDTAB *q = NULL;
+
+ for(int i = 0; i < CMDTABSIZE; i++) {
+ for(p = cmdtab[hash][i]; p != NULL; p = q) {
+ q = p->next;
+ FREE(p);
+ }
+ cmdtab[hash][i] = NULL;
+ }
+}
+
/**
* 命令の名前とタイプから、命令コードを返す\n
* 無効な場合は0xFFFFを返す
*/
WORD getcmdcode(const char *cmd, CMDTYPE type)
{
/**
* 命令の名前とタイプから、命令コードを返す\n
* 無効な場合は0xFFFFを返す
*/
WORD getcmdcode(const char *cmd, CMDTYPE type)
{
- CMDTAB *p;
+ CMDTAB *p
= NULL
;
WORD w = 0xFFFF;
assert(cmd != NULL);
WORD w = 0xFFFF;
assert(cmd != NULL);
- for(p = cmdt
ype_code
[hash_cmdtype(cmd, type)]; p != NULL; p = p->next) {
+ for(p = cmdt
ab[HASH_CMDTYPE]
[hash_cmdtype(cmd, type)]; p != NULL; p = p->next) {
if(strcmp(cmd, p->cmd->name) == 0 && type == p->cmd->type) {
w = p->cmd->code;
break;
if(strcmp(cmd, p->cmd->name) == 0 && type == p->cmd->type) {
w = p->cmd->code;
break;
@@
-135,29
+165,13
@@
WORD getcmdcode(const char *cmd, CMDTYPE type)
return w;
}
return w;
}
-/**
- * 名前とタイプがキーの命令ハッシュ表を解放する
- */
-void free_cmdtype_code()
-{
- int i;
- CMDTAB *p, *q;
-
- for(i = 0; i < CMDTABSIZE; i++) {
- for(p = cmdtype_code[i]; p != NULL; p = q) {
- q = p->next;
- FREE(p);
- }
- }
-}
-
/**
* 命令コードからハッシュ値を生成する
*/
unsigned hash_code(WORD code)
{
/**
* 命令コードからハッシュ値を生成する
*/
unsigned hash_code(WORD code)
{
- HKEY *keys[1];
- unsigned h;
+ HKEY *keys[1]
= {NULL}
;
+ unsigned h
= 0
;
/* 命令コードを設定 */
keys[0] = malloc_chk(sizeof(HKEY), "hash_code.key");
/* 命令コードを設定 */
keys[0] = malloc_chk(sizeof(HKEY), "hash_code.key");
@@
-168,34
+182,15
@@
unsigned hash_code(WORD code)
return h;
}
return h;
}
-/**
- * コードがキーの命令ハッシュ表を作成する
- */
-bool create_code_cmdtype()
-{
- CMDTAB *p;
- unsigned hashval;
- int i;
-
- for(i = 0; i < comet2cmdsize; i++) {
- hashval = hash_code((&comet2cmd[i])->code); /* ハッシュ値の生成 */
- p = malloc_chk(sizeof(CMDTAB), "code_cmdtype");
- p->cmd = &comet2cmd[i];
- p->next = code_cmdtype[hashval]; /* ハッシュ表に値を追加 */
- code_cmdtype[hashval] = p;
- }
- return true;
-}
-
/**
* 命令コードから命令の関数ポインタを返す
*/
const void (*getcmdptr(WORD code))
{
/**
* 命令コードから命令の関数ポインタを返す
*/
const void (*getcmdptr(WORD code))
{
- CMDTAB *t;
+ CMDTAB *t
= NULL
;
const void *ptr = NULL;
const void *ptr = NULL;
- for(t = c
ode_cmdtype
[hash_code(code)]; t != NULL; t = t->next) {
+ for(t = c
mdtab[HASH_CODE]
[hash_code(code)]; t != NULL; t = t->next) {
if(code == t->cmd->code) {
ptr = t->cmd->ptr;
break;
if(code == t->cmd->code) {
ptr = t->cmd->ptr;
break;
@@
-209,10
+204,10
@@
const void (*getcmdptr(WORD code))
*/
CMDTYPE getcmdtype(WORD code)
{
*/
CMDTYPE getcmdtype(WORD code)
{
- CMDTAB *t;
- CMDTYPE type =
0
;
+ CMDTAB *t
= NULL
;
+ CMDTYPE type =
NONE
;
- for(t = c
ode_cmdtype
[hash_code(code)]; t != NULL; t = t->next) {
+ for(t = c
mdtab[HASH_CODE]
[hash_code(code)]; t != NULL; t = t->next) {
if(code == t->cmd->code) {
type = t->cmd->type;
break;
if(code == t->cmd->code) {
type = t->cmd->type;
break;
@@
-226,10
+221,10
@@
CMDTYPE getcmdtype(WORD code)
*/
char *getcmdname(WORD code)
{
*/
char *getcmdname(WORD code)
{
- CMDTAB *t;
+ CMDTAB *t
= NULL
;
char *cmd = NULL;
char *cmd = NULL;
- for(t = c
ode_cmdtype
[hash_code(code)]; t != NULL; t = t->next) {
+ for(t = c
mdtab[HASH_CODE]
[hash_code(code)]; t != NULL; t = t->next) {
if(code == t->cmd->code) {
cmd = t->cmd->name;
break;
if(code == t->cmd->code) {
cmd = t->cmd->name;
break;
@@
-239,18
+234,17
@@
char *getcmdname(WORD code)
}
/**
}
/**
- *
コードがキーの命令ハッシュ表を解放する
+ *
汎用レジスタの番号からレジスタを表す文字列を返す
*/
*/
-void free_code_cmdtype()
+
+char *grstr(WORD word)
{
{
- int i;
- CMDTAB *p, *q;
- for(i = 0; i < CMDTABSIZE; i++) {
- for(p = code_cmdtype[i]; p != NULL; p = q) {
- q = p->next;
- FREE(p);
- }
- }
+ assert(word <= 7);
+ char *str = NULL;
+
+ str = malloc_chk(3 + 1, "grstr.str");
+ sprintf(str, "GR%d", word);
+ return str;
}
/**
}
/**
@@
-258,8
+252,6
@@
void free_code_cmdtype()
*/
void reset(int memsize, int clocks)
{
*/
void reset(int memsize, int clocks)
{
- int i;
-
sys = malloc_chk(sizeof(SYSTEM), "sys");
/* メモリサイズを設定 */
sys->memsize = memsize;
sys = malloc_chk(sizeof(SYSTEM), "sys");
/* メモリサイズを設定 */
sys->memsize = memsize;
@@
-269,7
+261,7
@@
void reset(int memsize, int clocks)
sys->memory = calloc_chk(sys->memsize, sizeof(WORD), "memory");
/* CPUを初期化 */
sys->cpu = malloc_chk(sizeof(CPU), "cpu");
sys->memory = calloc_chk(sys->memsize, sizeof(WORD), "memory");
/* CPUを初期化 */
sys->cpu = malloc_chk(sizeof(CPU), "cpu");
- for(i = 0; i < GRSIZE; i++) { /* 汎用レジスタ */
+ for(i
nt i
= 0; i < GRSIZE; i++) { /* 汎用レジスタ */
sys->cpu->gr[i] = 0x0;
}
sys->cpu->sp = sys->memsize; /* スタックポインタ */
sys->cpu->gr[i] = 0x0;
}
sys->cpu->sp = sys->memsize; /* スタックポインタ */