exec.cを一部変更
authorj8takagi <j8takagi@nifty.com>
Fri, 1 Apr 2011 14:02:32 +0000 (23:02 +0900)
committerj8takagi <j8takagi@nifty.com>
Fri, 1 Apr 2011 14:02:32 +0000 (23:02 +0900)
include/struct.h
src/cmd.c
src/exec.c

index ec4f52b..0825ac1 100644 (file)
@@ -151,10 +151,10 @@ void free_cmdtype_code();
 bool create_code_type();
 
 /**
- * å\91½ä»¤ã\82³ã\83¼ã\83\89ã\81\8bã\82\89å\91½ä»¤ã\82¿ã\82¤ã\83\97ã\82\92è¿\94ã\81\99
- * 無効な場合はNONEを返す
+ * 命令コードから命令を返す
+ * 命令コードでない場合はNULLを返す
  */
-CMDTYPE getcmdtype(WORD code);
+CMD *getcmd(WORD code);
 
 /**
  * 命令コードから命令の関数ポインタを返す
index aa435b9..ecd5fdb 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -183,21 +183,21 @@ bool create_code_type()
 }
 
 /**
- * å\91½ä»¤ã\82³ã\83¼ã\83\89ã\81\8bã\82\89å\91½ä»¤ã\82¿ã\82¤ã\83\97ã\82\92è¿\94ã\81\99
- * 無効な場合はNOTCMDを返す
+ * 命令コードから命令を返す
+ * 命令コードでない場合はNULLを返す
  */
-CMDTYPE getcmdtype(WORD code)
+CMD *getcmd(WORD code)
 {
     CMDTAB *p;
-    CMDTYPE t = NOTCMD;
+    CMD *c = NULL;
 
     for(p = code_type[hash_code(code)]; p != NULL; p = p->next) {
         if(code == p->cmd->code) {
-            t = p->cmd->type;
+            c = p->cmd;
             break;
         }
     }
-    return t;
+    return c;
 }
 
 /**
index ab0a133..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;
 
@@ -574,16 +574,16 @@ bool exec()
         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 */
@@ -591,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 */
@@ -604,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;