マシンコードモニターで2回アセンブルすると異常終了する問題を修正
authorj8takagi <j8takagi@nifty.com>
Thu, 9 Aug 2018 03:47:50 +0000 (12:47 +0900)
committerj8takagi <j8takagi@nifty.com>
Thu, 9 Aug 2018 03:47:50 +0000 (12:47 +0900)
include/struct.h
src/assemble.c
src/casl2.c
src/comet2monitor.c
src/label.c
src/struct.c

index e36c13f..ed58762 100644 (file)
@@ -111,7 +111,7 @@ typedef struct {
  */
 typedef struct _CMDTAB {
     struct _CMDTAB *next;       /**<リスト次項目へのポインタ */
-    COMET2CMD *cmd;             /**<命令コード表の項目 */
+    const COMET2CMD *cmd;       /**<命令コード表の項目 */
 } CMDTAB;
 
 /**
index de255b1..c9dd43b 100644 (file)
@@ -753,7 +753,6 @@ void assemble(int filec, char *filev[], WORD adr)
     PASS pass;
     WORD bp[filec];
 
-    create_cmdtype_code();                         /* 命令の名前とタイプがキーのハッシュ表を作成 */
     asptr = malloc_chk(sizeof(ASPTR), "asptr");    /* アセンブル時のプロパティ用の領域確保 */
     asptr->prog = malloc_chk(LABELSIZE + 1, "asptr.prog");
     asptr->ptr = adr;
@@ -785,9 +784,8 @@ void assemble(int filec, char *filev[], WORD adr)
         }
     }
 asfin:
-    freelabel();                                  /* ラベルハッシュ表を解放 */
-    free_cmdtype_code();                          /* 命令の名前とタイプがキーのハッシュ表を解放 */
-    FREE(asptr->prog);                            /* アセンブル時のプロパティを解放 */
+    freelabel();                              /* ラベルハッシュ表を解放 */
+    FREE(asptr->prog);                        /* アセンブル時のプロパティを解放 */
     FREE(asptr);
 }
 
index fb4290a..36d5703 100644 (file)
@@ -145,6 +145,7 @@ int main(int argc, char *argv[])
         freecerr();                                    /* エラーの解放 */
         exit(1);
     }
+    create_cmdtype_code();                         /* 命令の名前とタイプがキーのハッシュ表を作成 */
     reset(memsize, clocks);                        /* 仮想マシンCOMET IIのリセット */
     for(i = 0; i < argc - optind; i++) {           /* 引数からファイル名配列を取得 */
         af[i] = argv[optind + i];
@@ -164,6 +165,7 @@ int main(int argc, char *argv[])
     }
 casl2fin:
     shutdown();                                    /* 仮想マシンCOMET IIのシャットダウン */
+    free_cmdtype_code();
     stat = (cerr->num == 0) ? 0 : 1;
     freecerr();                                    /* エラーの解放 */
     return stat;
index 830bd66..b961711 100644 (file)
@@ -52,11 +52,14 @@ int main(int argc, char *argv[])
     addcerrlist_load();
     addcerrlist_exec();
 
+    create_cmdtype_code();
     reset(memsize, clocks);     /* COMET II仮想マシンのリセット */
     execptr->start = 0;
     execmode.monitor = true;
     exec();                     /* プログラム実行 */
+
     shutdown();
+    free_cmdtype_code();
     stat = (cerr->num == 0) ? 0 : 1;
     freecerr();                 /* エラーの解放 */
     return stat;
index cbb27b8..63b6fe5 100644 (file)
@@ -166,6 +166,9 @@ void freelabel()
             FREE(p->label->prog);
             FREE(p->label->label);
             FREE(p->label);
+            if(p == labels[i]) {
+                labels[i] = NULL;
+            }
             FREE(p);
         }
     }
index 12caf87..4e38f2e 100644 (file)
@@ -14,7 +14,7 @@ EXECPTR *execptr;
 /**
  * システムCOMET IIの命令表
  */
-static COMET2CMD comet2cmd[] = {
+static const COMET2CMD comet2cmd[] = {
     { "NOP", NONE, 0x0, nop },
     { "LD", R_ADR_X, 0x1000, ld_r_adr_x },
     { "ST", R_ADR_X, 0x1100, st },