Exemple #1
0
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");
}
Exemple #2
0
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");
}
Exemple #3
0
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;
}