if(*str == '=') {
adr = getliteral(str, pass);
} else if((*str == '#') || isdigit(*str) || *str == '-') {
- adr = a2word(str);
+ adr = nh2word(str);
} else {
if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
if(prog != NULL) {
}
if(cerrno == 0) {
memory[adr] = word;
- if(pass == SECOND && asdetailmode == true) {
+ if(pass == SECOND && (&asmode)->asdetailmode == true) {
fprintf(stdout, "\t#%04X\t#%04X\n", adr, word);
}
status = true;
{
WORD adr = lptr;
assert(*str == '=');
- str++;
- if(*str == '\'') { /* 文字定数 */
+ if(*(++str) == '\'') { /* 文字定数 */
writestr(str, true, pass);
} else {
- writememory(a2word(str), lptr++, pass);
+ writememory(nh2word(str), lptr++, pass);
}
return adr;
}
/* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */
void writestr(const char *str, bool literal, PASS pass)
{
- assert(cerrno == 0);
- assert(*str == '\'');
- str++;
- while(*str != '\0') {
- if(*str == '\'') {
- if(*(str+1) != '\'') {
- break;
- }
- str++;
+ assert(cerrno == 0 && *str == '\'');
+ const char *p = str + 1;
+ bool lw = false;
+
+ for(; ;) {
+ /* 閉じ「'」がないまま文字列が終了した場合 */
+ if(*p == '\0') {
+ setcerr(123, str); /* illegal string */
+ break;
+ }
+ /* 「'」の場合、次の文字が「'」でない場合は正常終了 */
+ if(*p == '\'' && *(++p) != '\'') {
+ break;
+ } else if(literal == true && lw == true) {
+ setcerr(124, str); /* more than one character in literal */
+ break;
}
/*リテラルの場合はリテラル領域に書込 */
if(literal == true) {
- writememory(*(str++), lptr++, pass);
+ writememory(*(p++), lptr++, pass);
+ lw = true;
} else {
- writememory(*(str++), ptr++, pass);
+ writememory(*(p++), ptr++, pass);
}
}
}
writestr(str, false, pass);
} else {
if(*str == '#' || isdigit(*str) || *str == '-') {
- adr = a2word(str);
+ adr = nh2word(str);
} else {
if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
setcerr(103, str); /* label not found */
}
cmd |= x;
}
- /* CALLの場合はプログラムの入口名を表すラベル、
- それ以外の場合は同一プログラム内のラベルを取得 */
- if(cmd == 0x8000) { /* CALL命令 */
- adr = getadr(NULL, cmdl->opd->opdv[0], pass);
+ /* CALLの場合はプログラムの入口名を表すラベルを取得 */
+ /* CALL以外の命令の場合と、プログラムの入口名を取得できない場合は、 */
+ /* 同一プログラム内のラベルを取得 */
+ if(pass == SECOND && cmd == 0x8000) { /* CALL命令 */
+ adr = getlabel(NULL, cmdl->opd->opdv[0]);
}
if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) {
adr = getadr(prog, cmdl->opd->opdv[0], pass);
break;
}
lineno++;
- if((pass == FIRST && srcmode == true) || (pass == SECOND && asdetailmode == true)) {
+ if((pass == FIRST && (&asmode)->srcmode == true) ||
+ (pass == SECOND && (&asmode)->asdetailmode == true))
+ {
fprintf(stdout, "%s:%5d:%s", file, lineno, line);
}
if((cmdl = linetok(line)) != NULL) {