X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fassemble.c;h=23ce8ac82ba34a22f0de38ff8236183488a07192;hp=00c395f2ac5e22eb04c7aefd5bdc37fef393ad13;hb=9a48fd93fe01972f0de42c6349e2e8a8160ec5df;hpb=4a1d361916c660b63611a40520eaf7c78788f123 diff --git a/src/assemble.c b/src/assemble.c index 00c395f..23ce8ac 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -21,7 +21,7 @@ ASPTR *asptr; * アセンブルのエラー定義 */ static CERR cerr_assemble[] = { - { 106, "operand mismatch in assemble command" }, + { 106, "operand mismatch in CASL II command" }, { 107, "no label in START" }, { 108, "not command of operand \"r\"" }, { 109, "not command of operand \"r1,r2\"" }, @@ -82,7 +82,7 @@ static CMD ascmd[] = { { "END", assemble_end }, { "DS", assemble_ds }, { "DC", assemble_dc }, - { NULL, NULL } + { "", NULL } }; /** @@ -93,7 +93,7 @@ static CMD macrocmd[] = { { "IN", assemble_in }, { "RPUSH", assemble_rpush }, { "RPOP", assemble_rpop }, - { NULL, NULL } + { "", NULL } }; /** @@ -116,7 +116,7 @@ void printline(FILE *stream, const char *filename, int lineno, char *line) } /** - * アドレスを返す + * アドレスを返す\n * アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */ WORD getadr(const char *prog, const char *str, PASS pass) @@ -128,8 +128,8 @@ WORD getadr(const char *prog, const char *str, PASS pass) } else if(isdigit(*str) || *str == '-' || *str == '#') { adr = nh2word(str); } else { - if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) { - if(prog != NULL) { + if(pass == SECOND) { + if((adr = getlabel(prog, str)) == 0xFFFF) { setcerr(103, str); /* label not found */ } } @@ -138,13 +138,12 @@ WORD getadr(const char *prog, const char *str, PASS pass) } /** - * 汎用レジスタを表す文字列 "GR[0-7]" から、レジスタ番号 [0-7] をWORD値で返す - * 文字列が汎用レジスタを表さない場合は、0xFFFFを返す + * 汎用レジスタを表す文字列 "GR[0-7]" から、レジスタ番号 [0-7] をWORD値で返す\n + * 文字列が汎用レジスタを表さない場合は、0xFFFFを返す\n * is_xがtrueの場合は指標レジスタ。GR0が指定された場合は、COMET IIの仕様によりエラー発生 */ WORD getgr(const char *str, bool is_x) { - assert(str != NULL); WORD r; /* "GR[0-7]" 以外の文字列では、0xFFFFを返して終了 */ @@ -156,14 +155,14 @@ WORD getgr(const char *str, bool is_x) r = (WORD)(*(str+2) - '0'); /* GR0は指標レジスタとして用いることができない */ if(is_x == true && r == 0x0) { - setcerr(120, NULL); /* GR0 in operand x */ + setcerr(120, ""); /* GR0 in operand x */ return 0x0; } return r; } /** - * 定数の前に等号(=)をつけて記述されるリテラルを返す + * 定数の前に等号(=)をつけて記述されるリテラルを返す\n * リテラルには、10進定数/16進定数/文字定数が含まれる */ WORD getliteral(const char *str, PASS pass) @@ -250,19 +249,20 @@ void writedc(const char *str, PASS pass) /** * アセンブラ命令STARTの処理 + * \relates casl2cmd */ void assemble_start(const CMDLINE *cmdl, PASS pass) { if(cmdl->opd->opdc > 1) { - setcerr(106, NULL); /* operand count mismatch */ + setcerr(106, ""); /* operand count mismatch */ return; } - if(cmdl->label == NULL) { - setcerr(107, NULL); /* no label in START */ + if(cmdl->label == '\0') { + setcerr(107, ""); /* no label in START */ return; } /* プログラム名の設定 */ - asptr->prog = strdup_chk(cmdl->label, "asptr.prog"); + strcpy(asptr->prog, cmdl->label); /* オペランドがある場合、実行開始アドレスを設定 */ if(pass == SECOND && cmdl->opd->opdv[0] != NULL) { if((execptr->start = getlabel(asptr->prog, cmdl->opd->opdv[0])) == 0xFFFF) { @@ -273,11 +273,12 @@ void assemble_start(const CMDLINE *cmdl, PASS pass) /** * アセンブラ命令ENDの処理 + * \relates casl2cmd */ void assemble_end(const CMDLINE *cmdl, PASS pass) { if(cmdl->opd->opdc > 0) { - setcerr(106, NULL); /* operand count mismatch */ + setcerr(106, ""); /* operand count mismatch */ return; } /* 1回目のアセンブルの場合は、リテラル領域開始アドレスを設定 */ @@ -288,17 +289,18 @@ void assemble_end(const CMDLINE *cmdl, PASS pass) else if(pass == SECOND) { execptr->end = asptr->lptr; } - FREE(asptr->prog); + *(asptr->prog) = '\0'; } /** * アセンブラ命令DSの処理 + * \relates casl2cmd */ void assemble_ds(const CMDLINE *cmdl, PASS pass) { int i; if(cmdl->opd->opdc != 1) { - setcerr(106, NULL); /* operand count mismatch */ + setcerr(106, ""); /* operand count mismatch */ return; } for(i = 0; i < atoi(cmdl->opd->opdv[0]); i++) { @@ -311,12 +313,13 @@ void assemble_ds(const CMDLINE *cmdl, PASS pass) /** * アセンブラ命令DCの処理 + * \relates casl2cmd */ void assemble_dc(const CMDLINE *cmdl, PASS pass) { int i; if(cmdl->opd->opdc == 0 || cmdl->opd->opdc >= OPDSIZE) { - setcerr(106, NULL); /* operand count mismatch */ + setcerr(106, ""); /* operand count mismatch */ return; } for(i = 0; i < cmdl->opd->opdc; i++) { @@ -328,7 +331,8 @@ void assemble_dc(const CMDLINE *cmdl, PASS pass) } /** - * マクロ命令 "IN IBUF,LEN" をアセンブル + * マクロ命令 "IN IBUF,LEN" をアセンブル\n + * \code * PUSH 0,GR1 * PUSH 0,GR2 * LAD GR1,IBUF @@ -336,12 +340,14 @@ void assemble_dc(const CMDLINE *cmdl, PASS pass) * SVC 1 * POP GR2 * POP GR1 + * \endcode + * \relates casl2cmd */ void assemble_in(const CMDLINE *cmdl, PASS pass) { char *line = malloc_chk(LINESIZE + 1, "assemble_in.line"); if(cmdl->opd->opdc == 0 || cmdl->opd->opdc > 2) { - setcerr(106, NULL); /* operand count mismatch */ + setcerr(106, ""); /* operand count mismatch */ return; } assembleline(" PUSH 0,GR1", pass); @@ -357,7 +363,8 @@ void assemble_in(const CMDLINE *cmdl, PASS pass) } /** - * マクロ命令 "OUT OBUF,LEN" をアセンブル + * マクロ命令 "OUT OBUF,LEN" をアセンブル\n + * \code * PUSH 0,GR1 * PUSH 0,GR2 * LAD GR1,OBUF @@ -368,12 +375,14 @@ void assemble_in(const CMDLINE *cmdl, PASS pass) * SVC 2 * POP GR2 * POP GR1 + * \endcode + * \relates casl2cmd */ void assemble_out(const CMDLINE *cmdl, PASS pass) { char *line = malloc_chk(LINESIZE + 1, "assemble_out.line"); if(cmdl->opd->opdc == 0 || cmdl->opd->opdc > 2) { - setcerr(106, NULL); /* operand count mismatch */ + setcerr(106, ""); /* operand count mismatch */ return; } assembleline(" PUSH 0,GR1", pass); @@ -391,7 +400,9 @@ void assemble_out(const CMDLINE *cmdl, PASS pass) FREE(line); } -/** マクロ命令 "RPUSH" をメモリに書き込む +/** + * マクロ命令 "RPUSH" をメモリに書き込む + * \code * PUSH 0,GR1 * PUSH 0,GR2 * PUSH 0,GR3 @@ -399,13 +410,15 @@ void assemble_out(const CMDLINE *cmdl, PASS pass) * PUSH 0,GR5 * PUSH 0,GR6 * PUSH 0,GR7 + * \endcode + * \relates casl2cmd */ void assemble_rpush(const CMDLINE *cmdl, PASS pass) { int i; char *line = malloc_chk(LINESIZE + 1, "assemble_rpush.line"); if(cmdl->opd->opdc > 0) { - setcerr(106, NULL); /* operand count mismatch */ + setcerr(106, ""); /* operand count mismatch */ return; } for(i = 1; i <= GRSIZE-1; i++) { @@ -416,7 +429,8 @@ void assemble_rpush(const CMDLINE *cmdl, PASS pass) } /** - * マクロ命令 "RPOP" をメモリに書き込む + * マクロ命令 "RPOP" をメモリに書き込む\n + * \code * POP GR7 * POP GR6 * POP GR5 @@ -425,13 +439,15 @@ void assemble_rpush(const CMDLINE *cmdl, PASS pass) * POP GR3 * POP GR2 * POP GR1 + * \endcode + * \relates casl2cmd */ void assemble_rpop(const CMDLINE *cmdl, PASS pass) { int i; char *line = malloc_chk(LINESIZE + 1, "assemble_rpop.line"); if(cmdl->opd->opdc > 0) { - setcerr(106, NULL); /* operand count mismatch */ + setcerr(106, ""); /* operand count mismatch */ return; } for(i = GRSIZE-1; i >= 1; i--) { @@ -442,15 +458,17 @@ void assemble_rpop(const CMDLINE *cmdl, PASS pass) } /** - * アセンブラ言語CASL IIの命令を処理 - * 命令が表で定義されている場合はtrue、それ以外の場合はfalseを返す - * エラー発生時は、cerrを設定 + * アセンブラ言語CASL IIの命令を処理\n + * 命令が表で定義されている場合はtrue、それ以外の場合はfalseを返す\n + * エラー発生時は、cerrを設定\n + * 関数へのポインタで呼び出す関数は、Class Reference 参照 + * \class casl2cmd */ bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass) { int i; void (*cmdptr)(); - for(i = 0; cmdtbl[i].name != NULL; i++) { + for(i = 0; *(cmdtbl[i].name) != '\0'; i++) { if(strcmp(cmdl->cmd, cmdtbl[i].name) == 0) { cmdptr = cmdtbl[i].ptr; (*cmdptr)(cmdl, pass); @@ -461,7 +479,7 @@ bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass) } /** - * システムCOMET IIの命令をアセンブル + * システムCOMET IIの命令をアセンブル\n * アセンブルに成功した場合はtrue、失敗した場合はfalseを返す */ bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass) @@ -539,7 +557,7 @@ bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass) /* CALL以外の命令の場合と、プログラムの入口名を取得できない場合は、 */ /* 同一プログラム内のラベルを取得 */ if(pass == SECOND && cmd == 0x8000) { /* CALL命令 */ - adr = getlabel(NULL, cmdl->opd->opdv[0]); + adr = getlabel("", cmdl->opd->opdv[0]); } if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) { adr = getadr(asptr->prog, cmdl->opd->opdv[0], pass); @@ -557,7 +575,7 @@ bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass) bool assembletok(const CMDLINE *cmdl, PASS pass) { /* 命令がない場合 */ - if(cmdl->cmd == NULL) { + if(*(cmdl->cmd) == '\0') { return true; } /* アセンブラ命令またはマクロ命令の書込 */ @@ -573,7 +591,7 @@ bool assembletok(const CMDLINE *cmdl, PASS pass) } /** - * 1行をアセンブル + * 1行をアセンブル\n * passが1の場合はラベルを登録し、2の場合はラベルからアドレスを読み込む */ bool assembleline(const char *line, PASS pass) @@ -586,14 +604,14 @@ bool assembleline(const char *line, PASS pass) stat = (cerr->num == 0) ? true : false; if(cmdl != NULL) { if(stat == true) { - if(pass == FIRST && cmdl->label != NULL) { + if(pass == FIRST && cmdl->label != '\0') { stat = addlabel(asptr->prog, cmdl->label, asptr->ptr); } - if(stat == true) { - stat = assembletok(cmdl, pass); - } - FREE(cmdl->label); } + if(stat == true) { + stat = assembletok(cmdl, pass); + } + FREE(cmdl->label); if(cmdl->opd != NULL) { for(i = 0; i < cmdl->opd->opdc; i++) { FREE(cmdl->opd->opdv[i]); @@ -607,7 +625,7 @@ bool assembleline(const char *line, PASS pass) } /** - * 指定された名前のファイルをアセンブル + * 指定された名前のファイルをアセンブル\n * アセンブル完了時はtrue、エラー発生時はfalseを返す */ bool assemblefile(const char *file, PASS pass)