summaryrefslogtreecommitdiff
path: root/disasm.c
diff options
context:
space:
mode:
Diffstat (limited to 'disasm.c')
-rw-r--r--disasm.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/disasm.c b/disasm.c
index b79d55b..1982c17 100644
--- a/disasm.c
+++ b/disasm.c
@@ -59,6 +59,7 @@ static void sub_dbg(struct sux *cpu, WINDOW *w, uint64_t address, uint64_t *orth
adr = read_value(cpu, 0, tmpad, 7, 0, 0);
tmpad += 8;
wmove(w, 1, 0);
+ wclrtoeol(w);
wprintw(w, "scr_row: %02u, scr_col: %02u, scr_str: %02u, scr_end: %02u", addr[0], addr[1], addr[2], addr[3]);
wmove(w, 2, 0);
wprintw(w, "bitabl: ");
@@ -173,11 +174,10 @@ static uint64_t get_offset(uint64_t value, uint8_t size, char **sign) {
size = (size > 8) ? 8 : size;
uint8_t msb = size*8;
uint64_t mask = (-(uint64_t)1 >> ((8 - size) * 8));
- mask &= (1 << (msb-1));
+ mask &= ~(1 << (msb-1));
*sign = ((value >> (msb-1)) & 1) ? "-" : "+";
- if (*sign[0] == '-') {
- value &= mask;
- value = -(value+1);
+ if (*sign[0] == '-' && value != (1 << (msb-1))) {
+ value = (-value) & mask;
}
return value;
}
@@ -301,10 +301,6 @@ static void disasm_ortho(struct sux *cpu, WINDOW *w, uint8_t opcode, uint8_t pre
uint64_t val = 0;
if (op[i].type) {
uint8_t addr_size = get_ortho_addrsize(prefix, op[i].id);
- if (addr_size != 0xFF) {
- uint64_t value = get_offset(op[i].value, addr_size+1, &sign[i]);
- sprintf(address[i], "$%0*"PRIX64, (addr_size+1)*2, value);
- }
if (op[i].id == MEM_SIB) {
sprintf(scale[i], "%u*", op[i].scale+1);
} else if (op[i].id == MEM_IMM) {
@@ -321,6 +317,10 @@ static void disasm_ortho(struct sux *cpu, WINDOW *w, uint8_t opcode, uint8_t pre
case MEM_SIB :
case MEM_RIND : is_rind = 1; break;
}
+ if (addr_size != 0xFF) {
+ uint64_t value = (is_rind) ? get_offset(op[i].value, addr_size+1, &sign[i]) : op[i].value;
+ sprintf(address[i], "$%0*"PRIX64, (addr_size+1)*2, value);
+ }
if (is_rind) {
for (int j = 0; j < 2 && op[i].rind[j] != 0xFF; j++) {
switch (op[i].rind[j]) {