From: j8takagi Date: Mon, 22 Jun 2026 15:12:11 +0000 (+0900) Subject: ハッシュテーブルに命令語長を追加し、そのデータを元に次のアドレス決定 X-Git-Tag: v0.5p58~1 X-Git-Url: https://j8takagi.net/gitweb?a=commitdiff_plain;h=9d8bbf982f54d35be3865db1ac90f303d3c752c4;p=yacasl2.git ハッシュテーブルに命令語長を追加し、そのデータを元に次のアドレス決定 --- diff --git a/doc/casl2_spec/img/r_1-01.svg b/doc/casl2_spec/img/r_1-01.svg index d5c8f90..6148a2d 100644 --- a/doc/casl2_spec/img/r_1-01.svg +++ b/doc/casl2_spec/img/r_1-01.svg @@ -80,8 +80,8 @@ 61XORr1,r2exclusive or 402CPAr,adr,xcompare arithmetic 12CPLr,adr,xcompare logical - 42CPAr1,r2compare arithmetic - 52CPLr1,r2compare logical + 41CPAr1,r2compare arithmetic + 51CPLr1,r2compare logical 502SLAr,adr,xshift left arithmetic 12SRAr,adr,xshift right arithmetic 22SLLr,adr,xshift left logical diff --git a/include/struct.h b/include/struct.h index 9495385..36de1be 100644 --- a/include/struct.h +++ b/include/struct.h @@ -116,7 +116,8 @@ typedef struct { char *name; /**<命令名 */ CMDTYPE type; /**<命令タイプ */ WORD code; /**<命令コード */ - void (*ptr); /**<命令の関数ポインタ */ + void (*ptr); /**<命令の関数ポインタ */ + int wordlen; /**<命令語長 */ } COMET2CMD; /** @@ -134,6 +135,7 @@ typedef struct { WORD start; /**<開始アドレス */ WORD end; /**<終了アドレス */ bool stop; /**<終了フラグ */ + bool started; /**<開始済みフラグ */ } EXECPTR; extern EXECPTR *execptr; @@ -215,6 +217,11 @@ void free_cmdtable(CMDTAB_HASH hash); */ WORD getcmdcode(const char *cmd, CMDTYPE type); +/** + * 命令の名前とタイプから、命令語長を返す\n + * 無効な場合は0を返す + */ +WORD getcmdwordlen(const char *cmd, CMDTYPE type); /** * 命令コードから命令の関数ポインタを返す diff --git a/src/comet2.c b/src/comet2.c index 62b91e9..3cd95cd 100644 --- a/src/comet2.c +++ b/src/comet2.c @@ -71,10 +71,10 @@ int main(int argc, char *argv[]) break; case 'v': fprintf(stdout, cmdversion, version); - goto comet2fin; + return 0; case 'h': fprintf(stdout, usage, argv[0]); - goto comet2fin; + return 0; case '?': fprintf(stderr, usage, argv[0]); setcerr(212, ""); /* invalid option */ @@ -86,6 +86,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg); goto comet2fin; } + create_cmdtable(HASH_CMDTYPE); comet2_init(memsize, clocks); /* COMET II仮想マシンの初期化 */ execptr->start = 0; execptr->end = loadassemble(argv[optind++], execptr->start); @@ -98,6 +99,7 @@ int main(int argc, char *argv[]) } comet2_shutdown(); /* COMET II仮想マシンのシャットダウン */ comet2fin: + free_cmdtable(HASH_CMDTYPE); if(cerr->num > 0) { stat = 1; } diff --git a/src/comet2monitor.c b/src/comet2monitor.c index 1ce2398..338a2d0 100644 --- a/src/comet2monitor.c +++ b/src/comet2monitor.c @@ -83,7 +83,7 @@ int main(int argc, char *argv[]) return 0; case 'h': fprintf(stdout, usage, argv[0]); - goto comet2monitorfin; + return 0; case '?': fprintf(stderr, usage, argv[0]); setcerr(212, ""); /* invalid option */ @@ -105,7 +105,6 @@ int main(int argc, char *argv[]) comet2_shutdown(); comet2monitorfin: free_cmdtable(HASH_CMDTYPE); - free_cmdtable(HASH_CODE); if(cerr->num > 0) { stat = 1; } diff --git a/src/exec.c b/src/exec.c index dc77875..e8f2f64 100644 --- a/src/exec.c +++ b/src/exec.c @@ -225,35 +225,35 @@ void addcerrlist_exec() void nop() { - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("NOP", NONE); } void ld_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; setfr(sys->cpu->gr[get_r_r1(w[0])] = get_val_adr_x(w[1], w[0])); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("LD", R_ADR_X); } void ld_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; setfr(sys->cpu->gr[get_r_r1(w[0])] = sys->cpu->gr[get_x_r2(w[0])]); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("LD", R1_R2); } void st() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; sys->memory[get_adr_x(w[1], w[0])] = sys->cpu->gr[get_r_r1(w[0])]; - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("ST", R_ADR_X); } void lad() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; sys->cpu->gr[get_r_r1(w[0])] = get_adr_x(w[1], w[0]); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("LAD", R_ADR_X); } void adda(WORD r, WORD val) @@ -279,28 +279,28 @@ void adda_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; adda(get_r_r1(w[0]), get_val_adr_x(w[1], w[0])); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("ADDA", R_ADR_X); } void adda_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; adda(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("ADDA", R1_R2); } void suba_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; adda(get_r_r1(w[0]), ~(get_val_adr_x(w[1], w[0])) + 1); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("SUBA", R_ADR_X); } void suba_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; adda(get_r_r1(w[0]), ~(sys->cpu->gr[get_x_r2(w[0])]) + 1); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("SUBA", R1_R2); } void addl_gr(WORD r, WORD val, bool add) @@ -339,70 +339,70 @@ void addl_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; addl_gr(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]), true); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("ADDL", R_ADR_X); } void addl_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; addl_gr(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])], true); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("ADDL", R1_R2); } void subl_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; addl_gr(get_r_r1(w[0]), get_val_adr_x(w[1], w[0]), false); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("SUBL", R_ADR_X); } void subl_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; addl_gr(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])], false); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("SUBL", R1_R2); } void and_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; setfr(sys->cpu->gr[get_r_r1(w[0])] &= get_val_adr_x(w[1], w[0])); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("AND", R_ADR_X); } void and_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; setfr(sys->cpu->gr[get_r_r1(w[0])] &= sys->cpu->gr[get_x_r2(w[0])]); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("AND", R1_R2); } void or_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; setfr(sys->cpu->gr[get_r_r1(w[0])] |= get_val_adr_x(w[1], w[0])); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("OR", R_ADR_X); } void or_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; setfr(sys->cpu->gr[get_r_r1(w[0])] |= sys->cpu->gr[get_x_r2(w[0])]); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("OR", R1_R2); } void xor_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; setfr(sys->cpu->gr[get_r_r1(w[0])] ^= get_val_adr_x(w[1], w[0])); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("XOR", R_ADR_X); } void xor_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; setfr(sys->cpu->gr[get_r_r1(w[0])] ^= sys->cpu->gr[get_x_r2(w[0])]); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("XOR", R1_R2); } void cpa(WORD r, WORD val) @@ -419,14 +419,14 @@ void cpa_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; cpa(get_r_r1(w[0]), get_val_adr_x(w[1], w[0])); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("CPA", R_ADR_X); } void cpa_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; cpa(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("CPA", R1_R2); } void cpl(WORD r, WORD val) @@ -443,14 +443,14 @@ void cpl_r_adr_x() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; cpl(get_r_r1(w[0]), get_val_adr_x(w[1], w[0])); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("CPL", R_ADR_X); } void cpl_r1_r2() { WORD w[] = {sys->memory[sys->cpu->pr]}; cpl(get_r_r1(w[0]), sys->cpu->gr[get_x_r2(w[0])]); - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("CPL", R1_R2); } void sla() @@ -479,7 +479,7 @@ void sla() if(sys->cpu->gr[r] == 0x0) { sys->cpu->fr += ZF; } - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("SLA", R_ADR_X); } void sra() @@ -511,7 +511,7 @@ void sra() if(sys->cpu->gr[r] == 0x0) { sys->cpu->fr += ZF; } - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("SRA", R_ADR_X); } void sll() @@ -537,7 +537,7 @@ void sll() if(sys->cpu->gr[r] == 0x0) { sys->cpu->fr += ZF; } - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("SLL", R_ADR_X); } void srl() @@ -563,17 +563,7 @@ void srl() if(sys->cpu->gr[r] == 0x0) { sys->cpu->fr += ZF; } - sys->cpu->pr += 2; -} - -void jpl() -{ - WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; - if((sys->cpu->fr & (SF | ZF)) == 0) { - sys->cpu->pr = get_adr_x(w[1], w[0]); - } else { - sys->cpu->pr += 2; - } + sys->cpu->pr += getcmdwordlen("SRL", R_ADR_X); } void jmi() @@ -582,7 +572,7 @@ void jmi() if((sys->cpu->fr & SF) > 0) { sys->cpu->pr = get_adr_x(w[1], w[0]); } else { - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("JMI", ADR_X); } } @@ -592,7 +582,7 @@ void jnz() if((sys->cpu->fr & ZF) == 0) { sys->cpu->pr = get_adr_x(w[1], w[0]); } else { - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("JNZ", ADR_X); } } @@ -602,24 +592,34 @@ void jze() if((sys->cpu->fr & ZF) > 0) { sys->cpu->pr = get_adr_x(w[1], w[0]); } else { - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("JZE", ADR_X); } } -void jov() +void jump() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; - if((sys->cpu->fr & OF) > 0) { + sys->cpu->pr = get_adr_x(w[1], w[0]); +} + +void jpl() +{ + WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; + if((sys->cpu->fr & (SF | ZF)) == 0) { sys->cpu->pr = get_adr_x(w[1], w[0]); } else { - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("JPL", ADR_X); } } -void jump() +void jov() { WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; - sys->cpu->pr = get_adr_x(w[1], w[0]); + if((sys->cpu->fr & OF) > 0) { + sys->cpu->pr = get_adr_x(w[1], w[0]); + } else { + sys->cpu->pr += getcmdwordlen("JOV", ADR_X); + } } void push() @@ -627,7 +627,7 @@ void push() assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize); WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]}; sys->memory[--(sys->cpu->sp)] = get_adr_x(w[1], w[0]); - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("PUSH", ADR_X); } void pop() @@ -641,7 +641,7 @@ void pop() FREE(s); } else { sys->cpu->gr[get_r_r1(w[0])] = sys->memory[(sys->cpu->sp)++]; - sys->cpu->pr += 1; + sys->cpu->pr += getcmdwordlen("POP", R_); } } @@ -678,7 +678,7 @@ void svc() svcout(); break; } - sys->cpu->pr += 2; + sys->cpu->pr += getcmdwordlen("SVC", ADR_X); } void exec() @@ -697,23 +697,13 @@ void exec() /* 機械語の実行 */ for (sys->cpu->pr = execptr->start; ; ) { clock_begin = clock(); /* クロック周波数設定のため、実行開始時間を格納 */ - if(execmode.dump || execmode.trace) { /* traceまたはdumpオプション指定時、改行を出力 */ - if(execmode.trace) { /* traceオプション指定時、レジスタを出力 */ - fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr); - dspregister(); - } - if(execmode.dump) { /* dumpオプション指定時、メモリを出力 */ - fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr); - dumpmemory(execmode.dump_start, execmode.dump_end); - } - fprintf(stdout, "\n"); - } - /* ステップモードまたはブレークポイントの場合、モニターを起動 */ - if( - (execmode.monitor == true && sys->cpu->pr == execptr->start) || - execmode.step == true || getbps(sys->cpu->pr) == true) + dsp_trace_dump(); + /* モニターモードでCOMET II起動時、またはステップモードかブレークポイントの場合、モニターを起動 */ + if((execmode.monitor == true && execptr->started == false) || execptr->stop == true || execmode.step == true || getbps(sys->cpu->pr) == true) { - if(sys->cpu->pr == execptr->start) { + /* モニターモードでCOMET II起動時、フラグを立て、メッセージを表示 */ + if(execptr->started == false) { + execptr->started = true; fprintf(stdout, "%s", monmsg); } monitor(); @@ -744,7 +734,6 @@ void exec() if(execptr->stop == true) { if(execmode.monitor == true) { fprintf(stdout, "Return to top.\n"); - monitor(); } else { break; }