void ddbg_disassemble(int start, int difference) { int i = 0; unsigned int ii = 0; bool found = false; struct inst inst; struct dbg_sym* sym; struct dbg_sym_payload_line* payload_line; struct dbg_sym_payload_label* payload_label; if (start < 0 || difference < 0) { printd(LEVEL_DEFAULT, "Invalid parameters provided to 'disassemble'."); return; } if (difference == 0) difference = (flash_size - start); while (i < difference) { // Show symbols. if (symbols != NULL) { for (ii = 0; ii < list_size(symbols); ii++) { sym = list_get_at(symbols, ii); switch (sym->type) { case DBGFMT_SYMBOL_LINE: payload_line = (struct dbg_sym_payload_line*)sym->payload; if (payload_line->address == start + i) { found = true; printd(LEVEL_DEFAULT, "0x%04X (0x%04X) (%s:%d):\n", start + i, vm->ram[start + i], payload_line->path->data, payload_line->lineno); } break; case DBGFMT_SYMBOL_LABEL: payload_label = (struct dbg_sym_payload_label*)sym->payload; if (payload_label->address == start + i) { found = true; printd(LEVEL_DEFAULT, "0x%04X (0x%04X) (%s):\n", start + i, vm->ram[start + i], payload_label->label->data); } break; } } if (!found) printd(LEVEL_DEFAULT, "0x%04X (0x%04X):\n", start + i, vm->ram[start + i]); } else printd(LEVEL_DEFAULT, "0x%04X (0x%04X): ", start + i, vm->ram[start + i]); // Disassemble. inst = vm_disassemble(vm, start + i, true); if (symbols != NULL) printd(LEVEL_DEFAULT, " "); if (vm->pc == start + i) printd(LEVEL_DEFAULT, " >>> "); else printd(LEVEL_DEFAULT, " "); if (inst.original.full == 0x0) printd(LEVEL_DEFAULT, "<null>\n"); else if (inst.pretty.op == NULL) printd(LEVEL_DEFAULT, "???\n"); else if (inst.original.op == OP_NONBASIC) printd(LEVEL_DEFAULT, "%s %s\n", inst.pretty.op->data, inst.pretty.a->data); else printd(LEVEL_DEFAULT, "%s %s, %s\n", inst.pretty.op->data, inst.pretty.b->data, inst.pretty.a->data); i += inst.size; } printd(LEVEL_DEFAULT, "\n"); }
void ddbg_disassemble(int start, int difference) { int i = 0; unsigned int ii = 0; int longest_label = 0; int cur_length; char strbuffer[512]; // 256 is maximum label size char formatbuf[64]; bool found = false; struct inst inst; struct dbg_sym* sym; struct dbg_sym_payload_line* payload_line; struct dbg_sym_payload_label* payload_label; if (start < 0 || difference < 0) { printd(LEVEL_DEFAULT, "Invalid parameters provided to 'disassemble'."); return; } if (difference == 0) difference = (flash_size - start); while (i < difference) { // Show symbols. if (symbols != NULL) { found = false; for (ii = 0; ii < list_size(symbols); ii++) { sym = list_get_at(symbols, ii); switch (sym->type) { case DBGFMT_SYMBOL_LINE: payload_line = (struct dbg_sym_payload_line*)sym->payload; if (payload_line->address == start + i) { cur_length = sprintf(strbuffer, " (%s:%d):", payload_line->path->data, payload_line->lineno); if (cur_length > longest_label) longest_label = cur_length; found = true; } break; case DBGFMT_SYMBOL_LABEL: payload_label = (struct dbg_sym_payload_label*)sym->payload; if (payload_label->address == start + i) { cur_length = sprintf(strbuffer, " (%s):", payload_line->path->data); if (cur_length > longest_label) longest_label = cur_length; found = true; } break; } } } inst = vm_disassemble(vm, start + i, true); i += inst.size; } i = 0; while (i < difference) { // Show symbols. if (symbols != NULL) { found = false; for (ii = 0; ii < list_size(symbols); ii++) { sym = list_get_at(symbols, ii); switch (sym->type) { case DBGFMT_SYMBOL_LINE: payload_line = (struct dbg_sym_payload_line*)sym->payload; if (payload_line->address == start + i) { if (found) // there already was another label printd(LEVEL_DEFAULT, "\n"); sprintf(strbuffer, "0x%04X (0x%04X) (%s:%d):", start + i, vm->ram[start + i], payload_line->path->data, payload_line->lineno); sprintf(formatbuf, "%%-%ds", longest_label+15); printd(LEVEL_DEFAULT, formatbuf, strbuffer); found = true; } break; case DBGFMT_SYMBOL_LABEL: payload_label = (struct dbg_sym_payload_label*)sym->payload; if (payload_label->address == start + i) { if (found) // there already was another label printd(LEVEL_DEFAULT, "\n"); sprintf(strbuffer, "0x%04X (0x%04X) (%s):", start + i, vm->ram[start + i], payload_label->label->data); sprintf(formatbuf, "%%-%ds", longest_label+15); printd(LEVEL_DEFAULT, formatbuf, strbuffer); found = true; } break; } } if (!found) { sprintf(strbuffer, "0x%04X (0x%04X):", start + i, vm->ram[start + i]); sprintf(formatbuf, "%%-%ds", longest_label+15); printd(LEVEL_DEFAULT, formatbuf, strbuffer); } } else // here we have no labels at all, so no padding needed printd(LEVEL_DEFAULT, "0x%04X (0x%04X):", start + i, vm->ram[start + i]); // Disassemble. inst = vm_disassemble(vm, start + i, true); if (vm->pc == start + i) printd(LEVEL_DEFAULT, " >>> "); else printd(LEVEL_DEFAULT, " "); if (inst.original.full == 0x0) printd(LEVEL_DEFAULT, "<null>\n"); else if (inst.pretty.op == NULL) printd(LEVEL_DEFAULT, "???\n"); else if (inst.original.op == OP_NONBASIC) printd(LEVEL_DEFAULT, "%s %s\n", inst.pretty.op->data, inst.pretty.a->data); else printd(LEVEL_DEFAULT, "%s %s, %s\n", inst.pretty.op->data, inst.pretty.b->data, inst.pretty.a->data); i += inst.size; } printd(LEVEL_DEFAULT, "\n"); }
int vm_hw_lua_cpu_disassemble(lua_State* L) { vm_t* vm = vm_hw_lua_cpu_extract_cpu(L, 1); struct inst inst = vm_disassemble(vm, (uint16_t)luaL_checknumber(L, 2), true); lua_newtable(L); lua_newtable(L); lua_pushnumber(L, inst.original.full); lua_setfield(L, -2, "full"); lua_pushnumber(L, inst.original.op); lua_setfield(L, -2, "op"); lua_pushnumber(L, inst.original.a); lua_setfield(L, -2, "a"); lua_pushnumber(L, inst.original.b); lua_setfield(L, -2, "b"); lua_setfield(L, -2, "original"); lua_newtable(L); if (inst.pretty.op != NULL) lua_pushstring(L, inst.pretty.op->data); else lua_pushnil(L); lua_setfield(L, -2, "op"); if (inst.pretty.a != NULL) lua_pushstring(L, inst.pretty.a->data); else lua_pushnil(L); lua_setfield(L, -2, "a"); if (inst.pretty.b != NULL) lua_pushstring(L, inst.pretty.b->data); else lua_pushnil(L); lua_setfield(L, -2, "b"); lua_setfield(L, -2, "pretty"); lua_pushnumber(L, inst.op); lua_setfield(L, -2, "op"); lua_pushnumber(L, inst.a); lua_setfield(L, -2, "a"); lua_pushnumber(L, inst.b); lua_setfield(L, -2, "b"); lua_pushnumber(L, inst.size); lua_setfield(L, -2, "size"); lua_newtable(L); if (inst.size >= 1) { lua_pushnumber(L, inst.extra[0]); lua_rawseti(L, -2, 1); } if (inst.size >= 2) { lua_pushnumber(L, inst.extra[1]); lua_rawseti(L, -2, 2); } lua_setfield(L, -2, "extra"); lua_newtable(L); if (inst.used[0]) lua_pushnumber(L, inst.next[0]); else lua_pushnil(L); lua_rawseti(L, -2, 1); if (inst.used[1]) lua_pushnumber(L, inst.next[1]); else lua_pushnil(L); lua_rawseti(L, -2, 2); lua_setfield(L, -2, "next"); bdestroy(inst.pretty.op); bdestroy(inst.pretty.a); bdestroy(inst.pretty.b); return 1; }