extern CMDCODETAB **cmdtype_code;
extern CMDCODETAB **code_type;
+extern int cmdtabsize;
/* 命令と命令タイプがキーのハッシュ表を作成する */
bool create_cmdtype_code();
#ifndef YACASL2_HASH_INCLUDED
#define YACASL2_HASH_INCLUDED
+#ifndef ARRAYSIZE
+#define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0]))
+#endif
+
/* ハッシュ共用体の型 */
typedef enum {
CHARS = 0,
} val;
} HKEY;
+/* ハッシュ表のサイズを決めるため、引数の数値未満で最大の素数を返す */
+int hashtabsize(int size);
+
/* ハッシュ値を取得する */
unsigned hash(int keyc, HKEY *keyv[], int tabsize);
};
int cmdcodesize = ARRAYSIZE(cmdcodearray);
-int hashtabsize;
+int cmdtabsize;
CMDCODETAB **cmdtype_code, **code_type;
/* 命令と命令タイプからハッシュ値を生成する */
keys[1]->type = INT;
keys[1]->val.i = (int)(type & 070);
/* ハッシュ値を返す */
- return hash(2, keys, cmdcodesize);
+ return hash(2, keys, cmdtabsize);
}
/* 命令と命令タイプがキーのハッシュ表を作成する */
unsigned hashval;
int i;
- hashtabsize = cmdcodesize;
- cmdtype_code = malloc(cmdcodesize * sizeof(CMDCODETAB *));
+ cmdtabsize = cmdcodesize;
+ cmdtype_code = malloc(cmdtabsize * sizeof(CMDCODETAB *));
for(i = 0; i < cmdcodesize; i++) {
np = malloc(sizeof(CMDCODETAB));
if(np == NULL) {
{
int i;
CMDCODETAB *np, *nq;
- for(i = 0; i < cmdcodesize; i++){
+ for(i = 0; i < cmdtabsize; i++){
np = cmdtype_code[i];
while(np != NULL) {
nq = np->next;
keys[0]->type = INT;
keys[0]->val.i = (int)(code >> 8);
/* ハッシュ値を返す */
- return hash(1, keys, cmdcodesize);
+ return hash(1, keys, cmdtabsize);
}
/* 命令コードがキーのハッシュ表を作成する */
unsigned hashval;
int i;
- hashtabsize = cmdcodesize;
- code_type = malloc(cmdcodesize * sizeof(CMDCODETAB *));
+ cmdtabsize = hashtabsize(cmdcodesize);
+ code_type = malloc(cmdtabsize * sizeof(CMDCODETAB *));
for(i = 0; i < cmdcodesize; i++) {
if((np = malloc(sizeof(CMDCODETAB))) == NULL) {
setcerr(122, NULL); /* cannot create hash table */
{
int i;
CMDCODETAB *np, *nq;
- for(i = 0; i < cmdcodesize; i++){
+ for(i = 0; i < cmdtabsize; i++){
np = code_type[i];
while(np != NULL) {
nq = np->next;
}
}
-/* コードの実行 */
+/* 仮想マシンCOMET IIでの実行 */
void exec()
{
WORD op, r_r1, x_r2, val;
char *errpr = malloc(CERRSTRSIZE + 1);
clock_t clock_begin, clock_end;
- if((&execmode)->trace) {
+ if(execmode.trace) {
fprintf(stdout, "\nExecuting machine codes\n");
}
/* フラグレジスタの初期値設定 */
sprintf(errpr, "PR:#%04X", PR);
setcerr(205, errpr); /* Stack Pointer (SP) - cannot allocate stack buffer */
}
+ /* 命令の取り出し */
op = memory[PR] & 0xFF00;
+ /* 命令の解読 */
cmdtype = getcmdtype(op);
r_r1 = (memory[PR] >> 4) & 0xF;
x_r2 = memory[PR] & 0xF;
if(cerrno > 0) {
goto execerr;
}
- if((&execmode)->trace){
+ if(execmode.trace){
fprintf(stdout, "#%04X: Register::::\n", PR);
dspregister();
}
- if((&execmode)->dump){
+ if(execmode.dump){
fprintf(stdout, "#%04X: Memory::::\n", PR);
dumpmemory();
}
- if((&execmode)->dump || (&execmode)->trace) {
+ if(execmode.dump || execmode.trace) {
fprintf(stdout, "\n");
}
PR++;
- /* å\87¦ç\90\86対象ã\81®å\80¤ã\82\92å\8f\96å¾\97 */
+ /* ã\82ªã\83\9aã\83©ã\83³ã\83\89ã\81®å\8f\96ã\82\8aå\87ºã\81\97 */
if(cmdtype == R1_R2) {
assert(x_r2 < REGSIZE);
val = GR[x_r2];
if(op >= 0x1000 && op <= 0x4FFF) {
op &= 0xFB00;
}
- /* å\91½ä»¤ã\81\94ã\81¨ã\81®å\87¦ç\90\86ã\82\92実行 */
+ /* å\91½ä»¤ã\81®実行 */
switch(op)
{
case 0x0: /* NOP */
#include "hash.h"
+/* ハッシュ表のサイズを決めるため、引数の数値より大きい最小の素数を返す */
+int hashtabsize(int size)
+{
+ int i;
+ const int prime[] =
+ {2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
+ 31, 37, 41, 43, 47, 53, 59, 61, 67,
+ 71, 73, 79, 83, 89, 97,
+ };
+ for(i = 0; i < ARRAYSIZE(prime); i++) {
+ if(i > 0 && prime[i] >= size) {
+ break;
+ }
+ }
+ return prime[i];
+}
+
/* ハッシュ値を取得する */
unsigned hash(int keyc, HKEY *keyv[], int tabsize)
{
HASH VALUE: 20
HASH VALUE: 11
-HASH VALUE: 1
+HASH VALUE: 2
CMDCODETAB *np;
CMDCODEARRAY **ar;
ar = malloc(sizeof(*ar) * cmdcodesize);
- for(i = 0; i < cmdcodesize; i++) {
+ for(i = 0; i < cmdtabsize; i++) {
np = cmdtype_code[i];
while(np != NULL) {
ar[j++] = np->cca;
{
int i;
CMDCODETAB *np;
- for(i = 0; i < cmdcodesize; i++){
+ for(i = 0; i < cmdtabsize; i++){
np = cmdtype_code[i];
while(np != NULL) {
fprintf(stdout, "(%2d) - %s\t0%02o\t#%04X\n",
CMDCODETAB *np;
CMDCODEARRAY **ar;
ar = malloc(sizeof(*ar) * cmdcodesize);
- for(i = 0; i < cmdcodesize; i++) {
+ for(i = 0; i < cmdtabsize; i++) {
np = code_type[i];
while(np != NULL) {
ar[j++] = np->cca;
{
int i;
CMDCODETAB *np;
- for(i = 0; i < cmdcodesize; i++){
+ for(i = 0; i < cmdtabsize; i++){
for(np = code_type[i]; np != NULL; np = np->next) {
fprintf(stdout, "(%2d) - #%04X\t0%02o\t%s\n", i, np->cca->code, np->cca->type, np->cca->cmd);
}