実行時、バイナリからCOMET II以外の値を読み込んだ場合はエラーが発生するよう変更
authorj8takagi <j8takagi@nifty.com>
Fri, 11 Mar 2011 04:37:30 +0000 (13:37 +0900)
committerj8takagi <j8takagi@nifty.com>
Fri, 11 Mar 2011 04:37:30 +0000 (13:37 +0900)
include/struct.h
src/assemble.c
src/cmd.c
src/exec.c

index 88ceb16..39f874b 100644 (file)
@@ -84,6 +84,10 @@ typedef enum {
      *  オペランドなし
      */
     NONE = 0,
+    /**
+     *  COMET II命令以外
+     */
+    NOTCMD = 077,
 } CMDTYPE;
 
 /**
index 10b9dea..f9d2ea7 100644 (file)
@@ -148,7 +148,7 @@ bool assemblecmd(const CMDLINE *cmdl, PASS pass)
         }
         /* プログラム名の設定 */
         asptr->prog = strdup_chk(cmdl->label, "asptr.prog");
-        /* オペランドがある場合、実行開始番地を設定 */
+        /* オペランドがある場合、実行開始アドレスを設定 */
         if(pass == SECOND && cmdl->opd->opdc == 1) {
             if((execptr->start = getlabel(asptr->prog, cmdl->opd->opdv[0])) == 0xFFFF) {
                 setcerr(103, cmdl->opd->opdv[0]);    /* label not found */
@@ -157,11 +157,11 @@ bool assemblecmd(const CMDLINE *cmdl, PASS pass)
         status = true;
         break;
     case END:
-        /* 1回目のアセンブルの場合は、リテラル領域開始番地を設定 */
+        /* 1回目のアセンブルの場合は、リテラル領域開始アドレスを設定 */
         if(pass == FIRST) {
             asptr->lptr = asptr->ptr;
         }
-        /* 2回目のアセンブルの場合は、リテラル領域終了番地を実行終了番地として設定 */
+        /* 2回目のアセンブルの場合は、リテラル領域終了アドレスを実行終了アドレスとして設定 */
         else if(pass == SECOND) {
             execptr->end = asptr->lptr;
         }
index cc7a207..53d3944 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -208,7 +208,7 @@ CMDTYPE getcmdtype(WORD code)
             return np->cmd->type;
         }
     }
-    return NONE;
+    return NOTCMD;
 }
 
 /**
index 7034e19..8530640 100644 (file)
@@ -17,6 +17,7 @@ static CERR cerr_exec[] = {
     { 206, "Address - out of COMET II memory" },
     { 207, "Stack Pointer (SP) - out of COMET II memory" },
     { 209, "not GR in operand x" },
+    { 210, "not command code of COMET II" },
 };
 
 /**
@@ -380,7 +381,9 @@ bool exec()
         /* 命令の取り出し */
         op = sys->memory[sys->cpu->pr] & 0xFF00;
         /* 命令の解読 */
-        cmdtype = getcmdtype(op);
+        if((cmdtype = getcmdtype(op)) == NOTCMD) {
+            setcerr(210, pr2str(sys->cpu->pr));          /* not command code of COMET II */
+        }
         r_r1 = (sys->memory[sys->cpu->pr] >> 4) & 0xF;
         x_r2 = sys->memory[sys->cpu->pr] & 0xF;
         /* traceオプション指定時、レジスタを出力 */