/* リテラル(=付きの値)を格納するポインタ */
WORD lptr;
+/* 他のプログラムで参照する入口名 */
+char *prog;
+
/* 汎用レジスタを表す文字列「GR[0-7]」をWORD値に変換
is_xがtrueの場合は、指標レジスタとして用いる汎用レジスタ
文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
} else if(isdigit(*str) || *str == '-') {
adr = getint(str);
} else {
- if(pass == SECOND && (adr = getlabel(str)) == 0xFFFF) {
+ if(pass == SECOND && (adr = getlabel(str, prog)) == 0xFFFF) {
setcerr(103, str); /* label not found */
}
}
} else if(isdigit(*str) || *str == '-') {
adr = getint(str);
} else {
- if(pass == SECOND && (adr = getlabel(str)) == 0xFFFF) {
+ if(pass == SECOND && (adr = getlabel(str, prog)) == 0xFFFF) {
setcerr(103, str); /* label not found */
}
}
setcerr(107, NULL); /* no label in START */
return false;
}
+ /* プログラム名の設定 */
+ prog = strdup(cmdl->label);
/* オペランドがある場合、実行開始番地を設定 */
if(pass == SECOND && cmdl->opd->opdc == 1) {
- if((startptr = getlabel(cmdl->opd->opdv[0])) == 0xFFFF) {
+ if((startptr = getlabel(cmdl->opd->opdv[0], prog)) == 0xFFFF) {
setcerr(103, cmdl->opd->opdv[0]); /* label not found */
}
}
else if(pass == SECOND) {
endptr = lptr;
}
+ prog = NULL;
status = true;
break;
case DS:
CMDLINE *cmdl;
char *line;
FILE *fp;
-
+
if(create_cmdtype_code() == false) {
return false;
}
}
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) {
- if(addlabel(cmdl->label, ptr) == false) {
+ if(addlabel(prog, cmdl->label, ptr) == false) {
break;
}
}