From: j8takagi Date: Thu, 9 Aug 2018 03:47:50 +0000 (+0900) Subject: マシンコードモニターで2回アセンブルすると異常終了する問題を修正 X-Git-Tag: v0.5p1~2 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9f54a56b4d6a4c2e09529a5e71ad0d84afa1ce45;p=YACASL2.git マシンコードモニターで2回アセンブルすると異常終了する問題を修正 --- diff --git a/include/struct.h b/include/struct.h index e36c13f..ed58762 100644 --- a/include/struct.h +++ b/include/struct.h @@ -111,7 +111,7 @@ typedef struct { */ typedef struct _CMDTAB { struct _CMDTAB *next; /**<リスト次項目へのポインタ */ - COMET2CMD *cmd; /**<命令コード表の項目 */ + const COMET2CMD *cmd; /**<命令コード表の項目 */ } CMDTAB; /** diff --git a/src/assemble.c b/src/assemble.c index de255b1..c9dd43b 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -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); } diff --git a/src/casl2.c b/src/casl2.c index fb4290a..36d5703 100644 --- a/src/casl2.c +++ b/src/casl2.c @@ -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; diff --git a/src/comet2monitor.c b/src/comet2monitor.c index 830bd66..b961711 100644 --- a/src/comet2monitor.c +++ b/src/comet2monitor.c @@ -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; diff --git a/src/label.c b/src/label.c index cbb27b8..63b6fe5 100644 --- a/src/label.c +++ b/src/label.c @@ -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); } } diff --git a/src/struct.c b/src/struct.c index 12caf87..4e38f2e 100644 --- a/src/struct.c +++ b/src/struct.c @@ -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 },