From 4a1d361916c660b63611a40520eaf7c78788f123 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Tue, 26 Apr 2011 11:59:02 +0900 Subject: [PATCH] =?utf8?q?=E7=95=B0=E5=B8=B8=E7=B5=82=E4=BA=86=E6=99=82?= =?utf8?q?=E3=81=AE=E8=BF=94=E3=82=8A=E5=80=A4=E3=82=920=E3=81=8B=E3=82=89?= =?utf8?q?1=E3=81=B8=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/Makefile | 1 + src/assemble.c | 102 ++++++++++++++++++++++++------------------------- src/casl2.c | 6 +-- src/cmem.c | 4 +- src/comet2.c | 4 +- src/dumpword.c | 6 +-- src/token.c | 6 +-- 7 files changed, 63 insertions(+), 66 deletions(-) diff --git a/src/Makefile b/src/Makefile index 04d0604..a2c197f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -11,6 +11,7 @@ EXECSRC := exec.c dump.c .PHONY: all clean all: ../casl2 ../comet2 ../dumpword + @rm -f *.o ../casl2: casl2.o $(subst .c,.o,$(COMMONSRC) $(CASL2SRC) $(ASSRC) $(EXECSRC)) $(CC) $(CFLAGS) -o $@ $^ diff --git a/src/assemble.c b/src/assemble.c index 34ac46d..00c395f 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -58,8 +58,6 @@ void assemble_end(const CMDLINE *cmdl, PASS pass); void assemble_dc(const CMDLINE *cmdl, PASS pass); -bool assemble_ascmd(const CMDLINE *cmdl, PASS pass); - void assemble_in(const CMDLINE *cmdl, PASS pass); void assemble_out(const CMDLINE *cmdl, PASS pass); @@ -68,14 +66,36 @@ void assemble_rpush(const CMDLINE *cmdl, PASS pass); void assemble_rpop(const CMDLINE *cmdl, PASS pass); -bool assemble_macrocmd(const CMDLINE *cmdl, PASS pass); +bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass); -bool assemble_cometcmd(const CMDLINE *cmdl, PASS pass); +bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass); bool assembletok(const CMDLINE *cmdl, PASS pass); bool assembleline(const char *line, PASS pass); +/** + * アセンブラ命令 + */ +static CMD ascmd[] = { + { "START", assemble_start }, + { "END", assemble_end }, + { "DS", assemble_ds }, + { "DC", assemble_dc }, + { NULL, NULL } +}; + +/** + * マクロ命令 + */ +static CMD macrocmd[] = { + { "OUT", assemble_out }, + { "IN", assemble_in }, + { "RPUSH", assemble_rpush }, + { "RPOP", assemble_rpop }, + { NULL, NULL } +}; + /** * アセンブルのエラーをエラーリストに追加 */ @@ -127,7 +147,7 @@ WORD getgr(const char *str, bool is_x) assert(str != NULL); WORD r; - /* 「GR[0-7]」以外の文字列では、0xFFFFを返して終了 */ + /* "GR[0-7]" 以外の文字列では、0xFFFFを返して終了 */ if(!(strlen(str) == 3 && strncmp(str, "GR", 2) == 0 && (*(str+2) >= '0' && *(str+2) <= '0' + (GRSIZE - 1)))) { @@ -308,28 +328,7 @@ void assemble_dc(const CMDLINE *cmdl, PASS pass) } /** - * アセンブラ命令を処理 - * アセンブラ命令の場合はtrue、それ以外の場合はfalseを返す - * エラー発生時は、cerrを設定 - */ -bool assemble_ascmd(const CMDLINE *cmdl, PASS pass) -{ - if(strcmp(cmdl->cmd, "START") == 0) { - assemble_start(cmdl, pass); - } else if(strcmp(cmdl->cmd, "END") == 0) { - assemble_end(cmdl, pass); - } else if(strcmp(cmdl->cmd, "DS") == 0) { - assemble_ds(cmdl, pass); - } else if(strcmp(cmdl->cmd, "DC") == 0) { - assemble_dc(cmdl, pass); - } else { - return false; - } - return true; -} - -/** - * マクロ命令「IN IBUF,LEN」をアセンブル + * マクロ命令 "IN IBUF,LEN" をアセンブル * PUSH 0,GR1 * PUSH 0,GR2 * LAD GR1,IBUF @@ -358,7 +357,7 @@ void assemble_in(const CMDLINE *cmdl, PASS pass) } /** - * マクロ命令「OUT OBUF,LEN」をアセンブル + * マクロ命令 "OUT OBUF,LEN" をアセンブル * PUSH 0,GR1 * PUSH 0,GR2 * LAD GR1,OBUF @@ -392,7 +391,7 @@ void assemble_out(const CMDLINE *cmdl, PASS pass) FREE(line); } -/** マクロ命令「RPUSH」をメモリに書き込む +/** マクロ命令 "RPUSH" をメモリに書き込む * PUSH 0,GR1 * PUSH 0,GR2 * PUSH 0,GR3 @@ -443,32 +442,29 @@ void assemble_rpop(const CMDLINE *cmdl, PASS pass) } /** - * assemble_macrocmd - * マクロ命令をアセンブル - * マクロ命令の場合はtrue、それ以外の場合はfalseを返す - * エラー発生時はcerrを設定 + * アセンブラ言語CASL IIの命令を処理 + * 命令が表で定義されている場合はtrue、それ以外の場合はfalseを返す + * エラー発生時は、cerrを設定 */ -bool assemble_macrocmd(const CMDLINE *cmdl, PASS pass) +bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass) { - if(strcmp(cmdl->cmd, "IN") == 0) { - assemble_in(cmdl, pass); - } else if(strcmp(cmdl->cmd, "OUT") == 0) { - assemble_out(cmdl, pass); - } else if(strcmp(cmdl->cmd, "RPUSH") == 0) { - assemble_rpush(cmdl, pass); - } else if(strcmp(cmdl->cmd, "RPOP") == 0) { - assemble_rpop(cmdl, pass); - } else { - return false; + int i; + void (*cmdptr)(); + for(i = 0; cmdtbl[i].name != NULL; i++) { + if(strcmp(cmdl->cmd, cmdtbl[i].name) == 0) { + cmdptr = cmdtbl[i].ptr; + (*cmdptr)(cmdl, pass); + return true; + } } - return true; + return false; } /** - * 機械語命令をアセンブル - * 成功した場合はtrue、失敗した場合はfalseを返す + * システムCOMET IIの命令をアセンブル + * アセンブルに成功した場合はtrue、失敗した場合はfalseを返す */ -bool assemble_cometcmd(const CMDLINE *cmdl, PASS pass) +bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass) { WORD cmd, r_r1, x_r2, adr; @@ -548,7 +544,7 @@ bool assemble_cometcmd(const CMDLINE *cmdl, PASS pass) if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) { adr = getadr(asptr->prog, cmdl->opd->opdv[0], pass); } - /* メモリへの書き込み */ + /* メモリへの書込 */ writememory(cmd, (asptr->ptr)++, pass); writememory(adr, (asptr->ptr)++, pass); } @@ -561,13 +557,13 @@ bool assemble_cometcmd(const CMDLINE *cmdl, PASS pass) bool assembletok(const CMDLINE *cmdl, PASS pass) { /* 命令がない場合 */ - if(cmdl->cmd == NULL){ + if(cmdl->cmd == NULL) { return true; } /* アセンブラ命令またはマクロ命令の書込 */ - if(assemble_ascmd(cmdl, pass) == false && assemble_macrocmd(cmdl, pass) == false) { + if(casl2cmd(ascmd, cmdl, pass) == false && casl2cmd(macrocmd, cmdl, pass) == false) { /* 機械語命令の書込 */ - if(assemble_cometcmd(cmdl, pass) == false) { + if(assemble_comet2cmd(cmdl, pass) == false) { if(cerr->num == 0) { setcerr(113, cmdl->cmd); /* operand too many in COMET II command */ } @@ -650,7 +646,7 @@ void outassemble(const char *file) if((fp = fopen(file, "w")) == NULL) { perror(file); - exit(-1); + exit(1); } fwrite(sys->memory, sizeof(WORD), execptr->end, fp); fclose(fp); diff --git a/src/casl2.c b/src/casl2.c index c40a0a7..d510e9f 100644 --- a/src/casl2.c +++ b/src/casl2.c @@ -162,14 +162,14 @@ int main(int argc, char *argv[]) return 0; case '?': fprintf(stderr, usage, argv[0]); - exit(-1); + exit(1); } } /* ソースファイルが指定されていない場合は終了 */ if(argv[optind] == NULL) { setcerr(126, NULL); /* no source file */ fprintf(stderr, "CASL2 error - %d: %s\n", cerr->num, cerr->msg); - exit(-1); + exit(1); } reset(memsize, clocks); /* 仮想マシンCOMET IIのリセット */ for(i = 0; i < argc - optind; i++) { /* 引数からファイル名配列を取得 */ @@ -190,7 +190,7 @@ int main(int argc, char *argv[]) } casl2fin: shutdown(); /* 仮想マシンCOMET IIのシャットダウン */ - stat = (cerr->num == 0) ? 0 : -1; + stat = (cerr->num == 0) ? 0 : 1; freecerr(); /* エラーの解放 */ return stat; } diff --git a/src/cmem.c b/src/cmem.c index 73ab512..b5f9033 100644 --- a/src/cmem.c +++ b/src/cmem.c @@ -15,7 +15,7 @@ void *malloc_chk(size_t size, char *tag) if((p = malloc(size)) == NULL) { fprintf(stderr, "%s: cannot allocate memory\n", tag); - exit(-1); + exit(1); } return memset(p, 0, size); } @@ -30,7 +30,7 @@ void *calloc_chk(size_t nmemb, size_t size, char *tag) if((p = calloc(nmemb, size)) == NULL) { fprintf(stderr, "%s: cannot allocate memory\n", tag); - exit(-1); + exit(1); } return p; } diff --git a/src/comet2.c b/src/comet2.c index 8d07715..f9eaa4e 100644 --- a/src/comet2.c +++ b/src/comet2.c @@ -58,13 +58,13 @@ int main(int argc, char *argv[]) return 0; case '?': fprintf(stderr, usage, argv[0]); - exit(-1); + exit(1); } } if(argv[optind] == NULL) { setcerr(211, NULL); /* object file not specified */ fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg); - exit(-1); + exit(1); } /* COMET II仮想マシンのリセット */ reset(memsize, clocks); diff --git a/src/dumpword.c b/src/dumpword.c index 9574364..dea7d9b 100644 --- a/src/dumpword.c +++ b/src/dumpword.c @@ -37,19 +37,19 @@ int main(int argc, char *argv[]) return 0; case '?': fprintf(stderr, usage, argv[0]); - exit(-1); + exit(1); } } if(argv[optind] == NULL) { fprintf(stderr, usage, argv[0]); - exit(-1); + exit(1); } /* WORD値に変換 */ word = nh2word(argv[optind]); if(cerr->num > 0) { fprintf(stderr, "Dumpword Error - %d: %s\n", cerr->num, cerr->msg); - exit(-1); + exit(1); } fprintf(stdout, "%6s: ", argv[optind]); print_dumpword(word, logicalmode); diff --git a/src/token.c b/src/token.c index a8e5c8e..de29faf 100644 --- a/src/token.c +++ b/src/token.c @@ -53,7 +53,7 @@ OPD *opdtok(const char *str) setcerr(117, NULL); /* operand is too many */ break; } - /* 先頭が「=」の場合 */ + /* 先頭が等号(=)の場合 */ if(*r == '=') { r++; } @@ -153,8 +153,8 @@ CMDLINE *linetok(const char *line) while(*p == ' ' || *p == '\t') { p++; } - /* 改行かタブまでの文字列を取得。 - 「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */ + /* 改行かタブまでの文字列を取得 */ + /* 「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */ if((sepp = p + strcspn(p, "\t\n")) > p) { *sepp = '\0'; cmdl->opd = opdtok(p); -- 2.18.0