static void updateRegisters(CPUState* cpuState, PDReader* reader) { PDReaderIterator it; if (PDRead_findArray(reader, &it, "registers", 0) == PDReadStatus_notFound) return; while (PDRead_getNextEntry(reader, &it)) { const char* name = ""; uint16_t regValue; PDRead_findString(reader, &name, "name", it); PDRead_findU16(reader, ®Value, "register", it); if (!strcmp(name, "pc")) cpuState->pc = (uint16_t)regValue; else if (!strcmp(name, "sp")) cpuState->sp = (uint8_t)regValue; else if (!strcmp(name, "a")) cpuState->a = (uint8_t)regValue; else if (!strcmp(name, "x")) cpuState->x = (uint8_t)regValue; else if (!strcmp(name, "y")) cpuState->y = (uint8_t)regValue; } }
static void showInUI(LocalsData* data, PDReader* reader, PDUI* uiFuncs) { PDReaderIterator it; (void)data; if (PDRead_findArray(reader, &it, "locals", 0) == PDReadStatus_notFound) return; uiFuncs->text(""); uiFuncs->columns(3, "callstack", true); uiFuncs->text("Name"); uiFuncs->nextColumn(); uiFuncs->text("Value"); uiFuncs->nextColumn(); uiFuncs->text("Type"); uiFuncs->nextColumn(); while (PDRead_getNextEntry(reader, &it)) { const char* name = ""; const char* value = ""; const char* type = ""; PDRead_findString(reader, &name, "name", it); PDRead_findString(reader, &value, "value", it); PDRead_findString(reader, &type, "type", it); uiFuncs->text(name); uiFuncs->nextColumn(); uiFuncs->text(value); uiFuncs->nextColumn(); uiFuncs->text(type); uiFuncs->nextColumn(); } }
void test_c64_vice_get_disassembly(void**) { static Assembly assembly[] = { { 0x080e, "A9 22 LDA #$22" }, { 0x0810, "A2 32 LDX #$32" }, { 0x0812, "C8 INY" }, { 0x0813, "EE 20 D0 INC $D020" }, { 0x0816, "EE 21 D0 INC $D021" }, { 0x0819, "4C 0E 08 JMP $080E" }, { 0, 0 }, }; PDWriter* writer = s_session->currentWriter; PDWrite_eventBegin(writer, PDEventType_getDisassembly); PDWrite_u64(writer, "address_start", 0x80e); PDWrite_u32(writer, "instruction_count", (uint32_t)4); PDWrite_eventEnd(writer); PDBinaryWriter_finalize(writer); Session_update(s_session); PDReader* reader = s_session->reader; PDBinaryReader_initStream(reader, PDBinaryWriter_getData(s_session->currentWriter), PDBinaryWriter_getSize(s_session->currentWriter)); uint32_t event; while ((event = PDRead_getEvent(reader)) != 0) { if (event != PDEventType_setDisassembly) continue; PDReaderIterator it; assert_false(PDRead_findArray(reader, &it, "disassembly", 0) == PDReadStatus_notFound); int i = 0; while (PDRead_getNextEntry(reader, &it)) { uint64_t address; const char* text; PDRead_findU64(reader, &address, "address", it); PDRead_findString(reader, &text, "line", it); assert_non_null(assembly[i].text); assert_int_equal((int)assembly[i].address, (int)address); assert_string_equal(assembly[i].text, text); i++; } return; } }
void test_c64_vice_callstack(void**) { uint32_t event; PDReaderIterator it; uint16_t refCallstack[] = { 0xe112 + 2, // (2) e112 0xa562 + 4, // (4) a562 0xa483 + 6, // (6) a483 0xa677 + 8, // (8) a677 0xe39a + 10, // (10) e39a }; PDWriter* writer = s_session->currentWriter; PDWrite_eventBegin(writer, PDEventType_getCallstack); PDWrite_eventEnd(writer); PDBinaryWriter_finalize(writer); Session_update(s_session); PDReader* reader = s_session->reader; PDBinaryReader_initStream(reader, PDBinaryWriter_getData(s_session->currentWriter), PDBinaryWriter_getSize(s_session->currentWriter)); while ((event = PDRead_getEvent(reader)) != 0) { switch (event) { case PDEventType_setCallstack: { if (PDRead_findArray(reader, &it, "callstack", 0) == PDReadStatus_notFound) return; int callstackSize = sizeof_array(refCallstack); int count = 0; while (PDRead_getNextEntry(reader, &it)) { uint16_t address; PDRead_findU16(reader, &address, "address", it); assert_true(count < callstackSize); assert_int_equal(refCallstack[count], address); count++; } return; } } } fail(); }
static void setDisassemblyCode(DissassemblyData* data, PDReader* reader) { PDReaderIterator it; if (PDRead_findArray(reader, &it, "disassembly", 0) == PDReadStatus_notFound) return; while (PDRead_getNextEntry(reader, &it)) { uint64_t address; const char* text; PDRead_findU64(reader, &address, "address", it); PDRead_findString(reader, &text, "line", it); insertLine(data, address, text); } }
static void updateRegisters(DissassemblyData* data, PDReader* reader) { PDReaderIterator it; if (PDRead_findArray(reader, &it, "registers", 0) == PDReadStatus_notFound) return; while (PDRead_getNextEntry(reader, &it)) { const char* name = ""; PDRead_findString(reader, &name, "name", it); if (!strcmp(name, "pc")) { PDRead_findU64(reader, &data->pc, "register", it); } } }