メモリ確保時のサイズを修正
[YACASL2.git] / src / exec.c
index 17ac66b..2cd6d8a 100644 (file)
@@ -1,6 +1,21 @@
 #include "casl2.h"
 #include "exec.h"
 
+/* 実行のエラー定義 */
+CERRARRAY cerr_exec[] = {
+    { 202, "SVC input - out of Input memory" },
+    { 203, "SVC output - out of COMET II memory" },
+    { 204, "Program Register (PR) - out of COMET II memory" },
+    { 205, "Stack Pointer (SP) - cannot allocate stack buffer" },
+    { 206, "Address - out of COMET II memory" },
+    { 207, "Stack Pointer (SP) - out of COMET II memory" },
+};
+
+bool addcerrlist_exec()
+{
+    return addcerrlist(ARRAYSIZE(cerr_exec), cerr_exec);
+}
+
 /* 実行モード: trace, logical, dump */
 EXECMODE execmode = {false, false, false};
 
@@ -250,20 +265,6 @@ WORD srl(WORD val0, WORD val1)
     return res;
 }
 
-/* COMET II仮想マシンのリセット */
-void reset()
-{
-    int i;
-    for(i = 0; i < REGSIZE; i++) {
-        GR[i] = 0x0;
-    }
-    SP = PR = FR = 0x0;
-    memory = malloc(memsize);
-    for(i = 0; i < memsize; i++) {
-        memory[i] = 0x0;
-    }
-}
-
 /* 仮想マシンCOMET IIでの実行 */
 void exec()
 {
@@ -272,6 +273,7 @@ void exec()
     char *errpr = malloc(CERRSTRSIZE + 1);
     clock_t clock_begin, clock_end;
 
+    addcerrlist_exec();
     if(execmode.trace) {
         fprintf(stdout, "\nExecuting machine codes\n");
     }
@@ -310,14 +312,17 @@ void exec()
         if(cerrno > 0) {
             goto execerr;
         }
+        /* traceオプション指定時、レジスタを出力 */
         if(execmode.trace){
             fprintf(stdout, "#%04X: Register::::\n", PR);
             dspregister();
         }
+        /* dumpオプション指定時、メモリを出力 */
         if(execmode.dump){
             fprintf(stdout, "#%04X: Memory::::\n", PR);
             dumpmemory();
         }
+        /* どちらかのオプション指定時、改行を出力 */
         if(execmode.dump || execmode.trace) {
             fprintf(stdout, "\n");
         }
@@ -328,6 +333,7 @@ void exec()
             val = GR[x_r2];
         }
         else if(cmdtype ==  R_ADR_X || cmdtype == R_ADR_X_ || cmdtype == ADR_X) {
+            assert(x_r2 < REGSIZE);
             /* 実効アドレス(値または値が示す番地)を取得  */
             val = memory[PR++];
             /* 指標アドレスを加算  */
@@ -351,7 +357,7 @@ void exec()
         /* 命令の実行 */
         switch(op)
         {
-        case 0x0:  /* NOP */
+        case 0x0:       /* NOP */
             break;
         case 0x1000:    /* LD */
             setfr(GR[r_r1] = val);
@@ -362,87 +368,87 @@ void exec()
         case 0x1200:    /* LAD */
             GR[r_r1] = val;
             break;
-        case 0x2000:  /* ADDA */
+        case 0x2000:    /* ADDA */
             GR[r_r1] = adda(GR[r_r1], val);
             break;
-        case 0x2100:  /* SUBA */
+        case 0x2100:    /* SUBA */
             GR[r_r1] = suba(GR[r_r1], val);
             break;
-        case 0x2200:  /* ADDL */
+        case 0x2200:    /* ADDL */
             GR[r_r1] = addl(GR[r_r1], val);
             break;
-        case 0x2300:  /* SUBL */
+        case 0x2300:    /* SUBL */
             GR[r_r1] = subl(GR[r_r1], val);
             break;
-        case 0x3000:  /* AND */
+        case 0x3000:    /* AND */
             setfr(GR[r_r1] &= val);
             break;
-        case 0x3100:  /* OR */
+        case 0x3100:    /* OR */
             setfr(GR[r_r1] |= val);
             break;
-        case 0x3200:  /* XOR */
+        case 0x3200:    /* XOR */
             setfr(GR[r_r1] ^= val);
             break;
-        case 0x4000:  /* CPA */
+        case 0x4000:    /* CPA */
             cpa(GR[r_r1], val);
             break;
-        case 0x4100:  /* CPL */
+        case 0x4100:    /* CPL */
             cpl(GR[r_r1], val);
             break;
-        case 0x5000:  /* SLA */
+        case 0x5000:    /* SLA */
             GR[r_r1] = sla(GR[r_r1], val);
             break;
-        case 0x5100:  /* SRA */
+        case 0x5100:    /* SRA */
             GR[r_r1] = sra(GR[r_r1], val);
             break;
-        case 0x5200:  /* SLL */
+        case 0x5200:    /* SLL */
             GR[r_r1] = sll(GR[r_r1], val);
             break;
-        case 0x5300:  /* SRL */
+        case 0x5300:    /* SRL */
             GR[r_r1] = srl(GR[r_r1], val);
             break;
-        case 0x6100:  /* JMI */
+        case 0x6100:    /* JMI */
             if((FR & SF) > 0) {
                 PR = val;
             }
             break;
-        case 0x6200:  /* JNZ */
+        case 0x6200:    /* JNZ */
             if((FR & ZF) == 0) {
                 PR = val;
             }
             break;
-        case 0x6300:  /* JZE */
+        case 0x6300:    /* JZE */
             if((FR & ZF) > 0) {
                 PR = val;
             }
             break;
-        case 0x6400:  /* JUMP */
+        case 0x6400:    /* JUMP */
             PR = val;
             break;
-        case 0x6500:  /* JPL */
+        case 0x6500:    /* JPL */
             if((FR & (SF | ZF)) == 0) {
                 PR = val;
             }
             break;
-        case 0x6600:  /* JOV */
+        case 0x6600:    /* JOV */
             if((FR & OF) > 0) {
                 PR = val;
             }
             break;
-        case 0x7000:  /* PUSH */
+        case 0x7000:    /* PUSH */
             assert(SP > endptr && SP <= memsize);
             memory[--SP] = val;
             break;
-        case 0x7100:  /* POP */
+        case 0x7100:    /* POP */
             assert(SP > endptr && SP <= memsize);
             GR[r_r1] = memory[SP++];
             break;
-        case 0x8000:  /* CALL */
+        case 0x8000:    /* CALL */
             assert(SP > endptr && SP <= memsize);
             memory[--SP] = PR;
             PR = val;
             break;
-        case 0x8100:  /* RET */
+        case 0x8100:    /* RET */
             assert(SP > endptr && SP <= memsize);
             if(SP == memsize) {
                 return;
@@ -450,7 +456,7 @@ void exec()
                 PR = memory[SP++];
                 break;
             }
-        case 0xf000:  /* SVC */
+        case 0xF000:    /* SVC */
             switch(val)
             {
             case 0x0: /* EXIT */