#define ULAS_VER "0.0.1"
// args without value
-#define ULAS_OPTS "hvVpd"
+#define ULAS_OPTS "hvVpdA"
// args with value
#define ULAS_OPTS_ARG "o:l:s:i:w:a:"
ULAS_HELP("s=path", "Symbols file");
ULAS_HELP("i=path", "Add include search path");
ULAS_HELP("a=initial-address", "Initial starting address");
+ ULAS_HELP("A", "Print addresses in disassembler mode");
ULAS_HELP("d", "Disassemble a file");
ULAS_HELP("w=warning", "Toggle warnings: a=all, o=overflow");
}
case 'd':
cfg->disas = 1;
break;
+ case 'A':
+ cfg->print_addrs = 1;
+ break;
case '?':
break;
default:
return;
}
- fprintf(dst, "%s ", instr->name);
+ if (ulascfg.print_addrs) {
+ fprintf(dst, "%08x ", ulas.address);
+ }
+ fprintf(dst, " %s ", instr->name);
int bi = 0;
for (int i = 0; instr->tokens[i]; i++) {
int dat = instr->tokens[i];
default: {
const char *reg = ulas_asmregstr(dat);
if (reg) {
- printf("%s", reg);
+ printf("%s", reg);
} else {
- printf("%c", dat);
+ printf("%c", dat);
}
break;
}
fprintf(dst, "\n");
}
+// fallback if no instruction was found
+void ulas_dasm_db_fout(FILE *src, FILE *dst, const char *buf,
+ unsigned long read) {
+ ulas.address++;
+ if (ulas.pass != ULAS_PASS_FINAL) {
+ return;
+ }
+ if (ulascfg.print_addrs) {
+ fprintf(dst, "%08x ", ulas.address);
+ }
+ fprintf(dst, ".db %x\n", buf[0] & 0xFF);
+}
+
// returns > 1 if instruction was found, and 0 if not
// the integer returned is the amount of bytes this instruction consumed
int ulas_dasm_instr_check(FILE *src, FILE *dst, const struct ulas_instr *instr,
case ULAS_E16:
case ULAS_A16:
// need 2 bytes here
- if (bi + 1 >= read) {
+ if (bi + 1 < read) {
goto fail;
}
bi += 2;
break;
default:
- if (buf[bi++] != dat) {
+ if (buf[bi] != dat) {
goto fail;
}
+ bi++;
break;
}
}
ulas_dasm_instr_fout(src, dst, instr, buf, read);
+ ulas.address += i;
return i;
fail:
return 0;
}
}
+ ulas_dasm_db_fout(src, dst, buf, read);
+ fseek(src, srctell + 1, 0);
return 1;
}