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
74a6a75
..
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 == '=') {
@@
-82,7
+82,7
@@
WORD getadr(const char *str, PASS pass)
} else if(isdigit(*str) || *str == '-') {
adr = getint(str);
} else {
} 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 */
}
}
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 {
} 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 */
}
}
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) {
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 */
}
}
setcerr(103, cmdl->opd->opdv[0]); /* label not found */
}
}
@@
-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) {