X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fassemble.c;h=bfd15e1feed986bf89c1ad8125e2f0b3b53c7e15;hp=25762c32822ea815c7a3cd3bf5ac67fd07e7f50e;hb=fda1563ea37180835e0b9c6e7a9c7ae607895446;hpb=0423c8cffe1e1a480222b0a80ecd31957edec06d diff --git a/src/assemble.c b/src/assemble.c index 25762c3..bfd15e1 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -72,7 +72,7 @@ WORD gethex(const char *str) /* アドレスを返す アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */ -WORD getadr(const char *str, PASS pass) +WORD getadr(const char *prog, const char *str, PASS pass) { WORD adr = 0x0; if(*str == '=') { @@ -82,7 +82,7 @@ WORD getadr(const char *str, PASS pass) } else if(isdigit(*str) || *str == '-') { adr = getint(str); } else { - if(pass == SECOND && (adr = getlabel(str, prog)) == 0xFFFF) { + if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) { setcerr(103, str); /* label not found */ } } @@ -164,7 +164,7 @@ void writeDC(const char *str, PASS pass) } else if(isdigit(*str) || *str == '-') { adr = getint(str); } else { - if(pass == SECOND && (adr = getlabel(str, prog)) == 0xFFFF) { + if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) { setcerr(103, str); /* label not found */ } } @@ -209,7 +209,7 @@ bool assemblecmd(const CMDLINE *cmdl, PASS pass) prog = strdup(cmdl->label); /* オペランドがある場合、実行開始番地を設定 */ if(pass == SECOND && cmdl->opd->opdc == 1) { - if((startptr = getlabel(cmdl->opd->opdv[0], prog)) == 0xFFFF) { + if((startptr = getlabel(prog, cmdl->opd->opdv[0])) == 0xFFFF) { setcerr(103, cmdl->opd->opdv[0]); /* label not found */ } } @@ -359,7 +359,7 @@ bool cometcmd(const CMDLINE *cmdl, PASS pass) } cmd |= x; } - adr = getadr(cmdl->opd->opdv[1], pass); + adr = getadr(prog, cmdl->opd->opdv[1], pass); writememory(cmd, ptr++, pass); writememory(adr, ptr++, pass); if(cerrno == 0) { @@ -384,7 +384,13 @@ bool cometcmd(const CMDLINE *cmdl, PASS pass) } cmd |= x; } - adr = getadr(cmdl->opd->opdv[0], pass); + /* CALLの場合はプログラムの入口名を表すラベル、 + それ以外の場合は同一プログラム内のラベルを取得 */ + if(cmd == 0x8000) { /* CALL命令 */ + adr = getadr(NULL, cmdl->opd->opdv[0], pass); + } else { + adr = getadr(prog, cmdl->opd->opdv[0], pass); + } writememory(cmd, ptr++, pass); writememory(adr, ptr++, pass); if(cerrno == 0) { @@ -452,7 +458,7 @@ bool assemble(const char *file, PASS pass) } lineno++; if((pass == FIRST && srcmode == true) || (pass == SECOND && asdetailmode == true)) { - fprintf(stdout, "%s:%d:%s", file, lineno, line); + fprintf(stdout, "%s:%5d:%s", file, lineno, line); } if((cmdl = linetok(line)) != NULL) { if(pass == FIRST && cmdl->label != NULL) {