projects
/
YACASL2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
CALL命令で、ローカルレベルも読み込めるように仕様変更
[YACASL2.git]
/
src
/
assemble.c
diff --git
a/src/assemble.c
b/src/assemble.c
index
bfd15e1
..
15d991a
100644
(file)
--- a/
src/assemble.c
+++ b/
src/assemble.c
@@
-83,7
+83,9
@@
WORD getadr(const char *prog, const char *str, PASS pass)
adr = getint(str);
} else {
if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
adr = getint(str);
} else {
if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
- setcerr(103, str); /* label not found */
+ if(prog != NULL) {
+ setcerr(103, str); /* label not found */
+ }
}
}
return adr;
}
}
return adr;
@@
-299,7
+301,6
@@
bool macrocmd(const CMDLINE *cmdl, PASS pass)
return status;
}
return status;
}
-
/* 機械語命令の書込
書込に成功した場合はtrue、それ以外の場合はfalseを返す */
bool cometcmd(const CMDLINE *cmdl, PASS pass)
/* 機械語命令の書込
書込に成功した場合はtrue、それ以外の場合はfalseを返す */
bool cometcmd(const CMDLINE *cmdl, PASS pass)
@@
-335,7
+336,7
@@
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;
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 |= ((r1 << 4) | r2);
if(cerrno == 0 && writememory(cmd, ptr++, pass) == true) {
status = true;
@@
-388,7
+389,8
@@
bool cometcmd(const CMDLINE *cmdl, PASS pass)
それ以外の場合は同一プログラム内のラベルを取得 */
if(cmd == 0x8000) { /* CALL命令 */
adr = getadr(NULL, cmdl->opd->opdv[0], pass);
それ以外の場合は同一プログラム内のラベルを取得 */
if(cmd == 0x8000) { /* CALL命令 */
adr = getadr(NULL, cmdl->opd->opdv[0], pass);
- } else {
+ }
+ if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) {
adr = getadr(prog, cmdl->opd->opdv[0], pass);
}
writememory(cmd, ptr++, pass);
adr = getadr(prog, cmdl->opd->opdv[0], pass);
}
writememory(cmd, ptr++, pass);