exec.cを一部変更
[YACASL2.git] / src / exec.c
index ecf6045..5dc4eb1 100644 (file)
@@ -529,7 +529,7 @@ void svc(const WORD r, const WORD adr)
 bool exec()
 {
     WORD op, r_r1, x_r2, val;
-    CMDTYPE cmdtype;
+    CMD *cmd;
     void (*cmdptr)();
     clock_t clock_begin, clock_end;
 
@@ -545,49 +545,45 @@ bool exec()
     /* 機械語の実行 */
     for (sys->cpu->pr = execptr->start; ; ) {
         clock_begin = clock();
-        /* traceオプション指定時、レジスタを出力 */
-        if(execmode.trace){
-            fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr);
-            dspregister();
-        }
-        /* dumpオプション指定時、メモリを出力 */
-        if(execmode.dump){
-            fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr);
-            dumpmemory();
-        }
         /* traceまたはdumpオプション指定時、改行を出力 */
         if(execmode.dump || execmode.trace) {
+            /* traceオプション指定時、レジスタを出力 */
+            if(execmode.trace){
+                fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr);
+                dspregister();
+            }
+            /* dumpオプション指定時、メモリを出力 */
+            if(execmode.dump){
+                fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr);
+                dumpmemory();
+            }
             fprintf(stdout, "\n");
         }
-        /* プログラムレジスタのアドレスが主記憶の範囲外の場合はエラー終了 */
-        if(sys->cpu->pr >= sys->memsize) {
-            setcerr(204, pr2str(sys->cpu->pr));    /* Program Register (PR) - out of COMET II memory */
-            goto execerr;
-        }
-        /* スタック領域を確保できない場合はエラー終了 */
-        else if(sys->cpu->sp <= execptr->end) {
-            setcerr(205, pr2str(sys->cpu->pr));    /* Stack Pointer (SP) - cannot allocate stack buffer */
-            goto execerr;
-        }
-        /* スタック領域のアドレスが主記憶の範囲外の場合はエラー終了 */
-        else if(sys->cpu->sp > sys->memsize) {
-            setcerr(207, pr2str(sys->cpu->pr));    /* Stack Pointer (SP) - out of COMET II memory */
+        /* プログラムレジスタとスタックポインタをチェック */
+        if(sys->cpu->pr >= sys->memsize || sys->cpu->sp <= execptr->end || sys->cpu->sp > sys->memsize) {
+            if(sys->cpu->pr >= sys->memsize) {
+                setcerr(204, pr2str(sys->cpu->pr));    /* Program Register (PR) - out of COMET II memory */
+            } else if(sys->cpu->sp <= execptr->end) {
+                setcerr(205, pr2str(sys->cpu->pr));    /* Stack Pointer (SP) - cannot allocate stack buffer */
+            } else if(sys->cpu->sp > sys->memsize) {
+                setcerr(207, pr2str(sys->cpu->pr));    /* Stack Pointer (SP) - out of COMET II memory */
+            }
             goto execerr;
         }
         /* 命令の取り出し */
         op = sys->memory[sys->cpu->pr] & 0xFF00;
         /* 命令の解読 */
         /* 命令がCOMET II命令ではない場合はエラー終了 */
-        if((cmdtype = getcmdtype(op)) == NOTCMD) {
+        if((cmd = getcmd(op)) == NULL) {
             setcerr(210, pr2str(sys->cpu->pr));          /* not command code of COMET II */
             goto execerr;
         }
-        cmdptr = getcmdptr(op);
+        cmdptr = cmd->ptr;
         r_r1 = (sys->memory[sys->cpu->pr] >> 4) & 0xF;
         x_r2 = sys->memory[sys->cpu->pr] & 0xF;
         sys->cpu->pr++;
         /* オペランドの取り出し */
-        if(cmdtype == R1_R2) {
+        if(cmd->type == R1_R2) {
             /* オペランドの数値が汎用レジスタの範囲外の場合はエラー */
             if(x_r2 > GRSIZE - 1) {
                 setcerr(209, pr2str(sys->cpu->pr-1));    /* not GR in operand x */
@@ -595,7 +591,7 @@ bool exec()
             }
             val = sys->cpu->gr[x_r2];
         }
-        else if(cmdtype ==  R_ADR_X || cmdtype == R_ADR_X_ || cmdtype == ADR_X) {
+        else if(cmd->type ==  R_ADR_X || cmd->type == R_ADR_X_ || cmd->type == ADR_X) {
             /* オペランドの数値が汎用レジスタの範囲外の場合はエラー */
             if(x_r2 > GRSIZE - 1) {
                 setcerr(209, pr2str(sys->cpu->pr-1));    /* not GR in operand x */
@@ -608,7 +604,7 @@ bool exec()
                 val += sys->cpu->gr[x_r2];
             }
             /* ロード/算術論理演算命令/比較演算命令では、アドレスに格納されている内容を取得 */
-            if(cmdtype == R_ADR_X_) {
+            if(cmd->type == R_ADR_X_) {
                 if(val >= sys->memsize) {
                     setcerr(206, pr2str(sys->cpu->pr-1));    /* Address - out of COMET II memory */
                     goto execerr;