]> j8takagi.net git repositories - yacasl2.git/commitdiff
ハッシュテーブルに命令語長を追加し、そのデータを元に次のアドレス決定
authorj8takagi <j8takagi@nifty.com>
Mon, 22 Jun 2026 15:12:11 +0000 (00:12 +0900)
committerj8takagi <j8takagi@nifty.com>
Mon, 22 Jun 2026 15:12:11 +0000 (00:12 +0900)
doc/casl2_spec/img/r_1-01.svg
include/struct.h
src/comet2.c
src/comet2monitor.c
src/exec.c

index d5c8f909d5d226caaf02aaddc86552b3962a7681..6148a2dfa99d2b8364473641b1e5ff344ce03438 100644 (file)
@@ -80,8 +80,8 @@
     <text x="65" y="475">6</text><text x="245" y="475">&#x2014;</text><text x="345" y="475">1</text><text x="380" y="475" font-family="monospace">XOR</text><text x="440" y="475" font-family="monospace">r1,r2</text><text x="555" y="475">exclusive or</text>
     <text x="25" y="495">4</text><text x="65" y="495">0</text><text x="345" y="495">2</text><text x="380" y="495" font-family="monospace">CPA</text><text x="440" y="495" font-family="monospace">r,adr,x</text><text x="555" y="495">compare arithmetic</text>
     <text x="65" y="515">1</text><text x="345" y="515">2</text><text x="380" y="515" font-family="monospace">CPL</text><text x="440" y="515" font-family="monospace">r,adr,x</text><text x="555" y="515">compare logical</text>
-    <text x="65" y="535">4</text><text x="245" y="535">&#x2014;</text><text x="345" y="535">2</text><text x="380" y="535" font-family="monospace">CPA</text><text x="440" y="535" font-family="monospace">r1,r2</text><text x="555" y="535">compare arithmetic</text>
-    <text x="65" y="555">5</text><text x="245" y="555">&#x2014;</text><text x="345" y="555">2</text><text x="380" y="555" font-family="monospace">CPL</text><text x="440" y="555" font-family="monospace">r1,r2</text><text x="555" y="555">compare logical</text>
+    <text x="65" y="535">4</text><text x="245" y="535">&#x2014;</text><text x="345" y="535">1</text><text x="380" y="535" font-family="monospace">CPA</text><text x="440" y="535" font-family="monospace">r1,r2</text><text x="555" y="535">compare arithmetic</text>
+    <text x="65" y="555">5</text><text x="245" y="555">&#x2014;</text><text x="345" y="555">1</text><text x="380" y="555" font-family="monospace">CPL</text><text x="440" y="555" font-family="monospace">r1,r2</text><text x="555" y="555">compare logical</text>
     <text x="25" y="575">5</text><text x="65" y="575">0</text><text x="345" y="575">2</text><text x="380" y="575" font-family="monospace">SLA</text><text x="440" y="575" font-family="monospace">r,adr,x</text><text x="555" y="575">shift left arithmetic</text>
     <text x="65" y="595">1</text><text x="345" y="595">2</text><text x="380" y="595" font-family="monospace">SRA</text><text x="440" y="595" font-family="monospace">r,adr,x</text><text x="555" y="595">shift right arithmetic</text>
     <text x="65" y="615">2</text><text x="345" y="615">2</text><text x="380" y="615" font-family="monospace">SLL</text><text x="440" y="615" font-family="monospace">r,adr,x</text><text x="555" y="615">shift left logical</text>
index 949538548a9221718c4e468246283410b71e17c9..36de1be5c7680563c9e0e6ab21caf6e6e9185734 100644 (file)
@@ -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);
 
 /**
  * 命令コードから命令の関数ポインタを返す
index 62b91e9492f56379a468faa1a26a771e1e241b97..3cd95cd5ff65ba9c7b0f9a2acc9494c2c45f5959 100644 (file)
@@ -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;
     }
index 1ce23986b559f6deea55c4995c153a3c9bdf61db..338a2d061f1fc4a3b4847618da589aa7c509bd58 100644 (file)
@@ -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;
     }
index dc778758df968c618de1fab90f7a0ffe130f81e7..e8f2f64754d4bcb2a9546b288ad9301690e3a66c 100644 (file)
@@ -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;
             }