projects
/
YACASL2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ハッシュ関数を共用体版にし、ラベルの範囲をプログラム内だけで有効に
[YACASL2.git]
/
src
/
assemble.c
diff --git
a/src/assemble.c
b/src/assemble.c
index
0bfc551
..
bfd15e1
100644
(file)
--- a/
src/assemble.c
+++ b/
src/assemble.c
@@
-72,7
+72,7
@@
WORD gethex(const char *str)
/* アドレスを返す
アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
/* アドレスを返す
アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
-WORD getadr(const char *str, PASS pass)
+WORD getadr(const char *
prog, const char *
str, PASS pass)
{
WORD adr = 0x0;
if(*str == '=') {
{
WORD adr = 0x0;
if(*str == '=') {
@@
-359,7
+359,7
@@
bool cometcmd(const CMDLINE *cmdl, PASS pass)
}
cmd |= x;
}
}
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) {
writememory(cmd, ptr++, pass);
writememory(adr, ptr++, pass);
if(cerrno == 0) {
@@
-384,7
+384,13
@@
bool cometcmd(const CMDLINE *cmdl, PASS pass)
}
cmd |= x;
}
}
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) {
writememory(cmd, ptr++, pass);
writememory(adr, ptr++, pass);
if(cerrno == 0) {