From 521d9e5113e112d5a3090c3c15c84d5c77f5de9c Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 8 Jul 2023 15:48:41 +0900 Subject: [PATCH] Print rm values --- src/dasm.c | 3 ++- src/interpretor.c | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/dasm.c b/src/dasm.c index 7b79c06..425f2fe 100644 --- a/src/dasm.c +++ b/src/dasm.c @@ -129,7 +129,8 @@ void print_instruction(unsigned addr, instruction_t inst, unsigned inst_size, u_ } if (last_param) printf("%s", last_param + 2); - printf("\n"); + if (space) + printf("\n"); } unsigned get_inst_size(instruction_t inst, u_int8_t *binary, unsigned bin_size) diff --git a/src/interpretor.c b/src/interpretor.c index 4951935..28984f1 100644 --- a/src/interpretor.c +++ b/src/interpretor.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -163,6 +164,25 @@ void print_state(state_t *state) ); } +void print_rm_value(state_t *state, instruction_t *inst) +{ + unsigned imm = 0; + + for (int i = 0; inst->mode[i] != END; i++) { + if (inst->mode[i] != R_M8 && inst->mode[i] != R_M16) + continue; + + unsigned mod = state->binary[state->pc + 1] >> 6; + if (mod == 0b11) + continue; + + void *ptr = get_rm_operand(state, &imm, inst->mode[i] == R_M16); + uint16_t val = inst->mode[i] == R_M16 ? *(uint16_t *)ptr : *(uint8_t *)ptr; + printf(" ;[%04lx]%04x", (uint8_t *)ptr - state->memory, val); + } + printf("\n"); +} + int interpret(u_int8_t *binary, unsigned long size) { state_t *state = calloc(sizeof(*state), 1); @@ -194,9 +214,10 @@ int interpret(u_int8_t *binary, unsigned long size) if (state->pc + inst_size > size) { return 0; } + state->parse_data.imm_idx = 1 + (inst.extended != -1 || has_reg(&inst)); print_state(state); print_instruction(state->pc, inst, inst_size, state->binary + state->pc, false); - state->parse_data.imm_idx = 1 + (inst.extended != -1 || has_reg(&inst)); + print_rm_value(state, &inst); if (inst.exec) inst.exec(&inst, state); else