/* アドレスを返す
アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
-WORD getadr(const char *str, PASS pass)
+WORD getadr(const char *prog, const char *str, PASS pass)
{
WORD adr = 0x0;
if(*str == '=') {
} else if(isdigit(*str) || *str == '-') {
adr = getint(str);
} else {
- if(pass == SECOND && (adr = getlabel(str, prog)) == 0xFFFF) {
- setcerr(103, str); /* label not found */
+ if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
+ if(prog != NULL) {
+ setcerr(103, str); /* label not found */
+ }
}
}
return adr;
} 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 */
}
}
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 */
}
}
return status;
}
-
/* 機械語命令の書込
書込に成功した場合はtrue、それ以外の場合はfalseを返す */
bool cometcmd(const CMDLINE *cmdl, PASS pass)
if((cmd = getcmdcode(cmdl->cmd, R1_R2)) == 0xFFFF) {
setcerr(109, cmdl->cmd); /* not command of operand "r1,r2" */
return false;
- }
+ }
cmd |= ((r1 << 4) | r2);
if(cerrno == 0 && writememory(cmd, ptr++, pass) == true) {
status = true;
}
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) {
}
cmd |= x;
}
- adr = getadr(cmdl->opd->opdv[0], pass);
+ /* CALLの場合はプログラムの入口名を表すラベル、
+ それ以外の場合は同一プログラム内のラベルを取得 */
+ if(cmd == 0x8000) { /* CALL命令 */
+ adr = getadr(NULL, cmdl->opd->opdv[0], pass);
+ }
+ if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) {
+ adr = getadr(prog, cmdl->opd->opdv[0], pass);
+ }
writememory(cmd, ptr++, pass);
writememory(adr, ptr++, pass);
if(cerrno == 0) {
}
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) {