// // Created by william on 10/01/24. // #include #include "program_view.h" #include "../cpu/op.h" void decode_operands(DebugOperand *operands, const byte *ram, address start_addr) { int pc = start_addr; for (int i = 0; i < 10; i++) { DebugOperand operand; byte op_code = ram[pc]; operand.addr = pc; operand.op_code = op_code; operand.addr_mode = get_op_addr_mode(op_code); pc += 1; if (operand.addr_mode == ADDR_MODE_ACCUMULATOR || operand.addr_mode == ADDR_MODE_IMPLICIT) { operand.type = OPERAND_TYPE_ACCUMULATOR; operand.value = 0; } else if (operand.addr_mode == ADDR_MODE_IMMEDIATE) { operand.type = OPERAND_TYPE_IMMEDIATE; operand.value = ram[pc]; pc += 1; } else if (operand.addr_mode == ADDR_MODE_RELATIVE) { operand.type = OPERAND_TYPE_ADDRESS; operand.value = ram[pc]; pc += 1; } else { operand.type = OPERAND_TYPE_ADDRESS; operand.value = ram[pc]; operand.value += ram[pc + 1] << 8; pc += 2; } operands[i] = operand; } } char *get_addr_mode_format_str(AddressingMode addr_mode) { switch (addr_mode) { case ADDR_MODE_ABSOLUTE: return "$%04x"; case ADDR_MODE_ABSOLUTE_INDEXED_X: return "$%04x,x"; case ADDR_MODE_ABSOLUTE_INDEXED_Y: return "$%04x,y"; case ADDR_MODE_ACCUMULATOR: return "A"; case ADDR_MODE_IMMEDIATE: return "#$%02x"; case ADDR_MODE_IMPLICIT: return ""; case ADDR_MODE_INDIRECT_X: return "($%04x,x)"; case ADDR_MODE_INDIRECT_JUMP: return "($%04x)"; case ADDR_MODE_INDIRECT_Y: return "($%04x),y"; case ADDR_MODE_RELATIVE: return "$%04x"; case ADDR_MODE_ZERO_PAGE: return "$%02x,y"; case ADDR_MODE_ZERO_PAGE_INDEXED_X: return "$%02x,x"; case ADDR_MODE_ZERO_PAGE_INDEXED_Y: return "$%02x,y"; } } void program_view_write_line(ProgramView *view, int line, DebugOperand *operand) { char *op_name = get_op_code_name(operand->op_code); window_inter_print(view->window, 0, line, "%04x:", operand->addr); window_inter_print(view->window, 6, line, "%s", op_name); char *format = get_addr_mode_format_str(operand->addr_mode); window_inter_print(view->window, 10, line, format, operand->value); } void program_view_print(ProgramView *view, DebugOperand *operands) { for (int line = 0; line < 10; line++) { program_view_write_line(view, line, &operands[line]); } } void program_view_cursor_init(ProgramView *view) { window_inter_cursor_init(view->window, 0, 10); view->window->cursor.width = PROGRAM_VIEW_WIDTH - 2; cursor_enable(&view->window->cursor); } void program_view_handle_cursor_move(InteractWindow *window, int horizontal, int vertical) { cursor_move(&window->cursor, horizontal, vertical); } void program_view_handle_key_down(InteractWindow *window, int keycode) { } void program_view_init(InteractWindow *interact, ram ram, int x, int y) { ProgramView *view = malloc(sizeof(ProgramView)); view->window = interact; view->ram = ram; interact->view = view; interact->handle_cursor_move = &program_view_handle_cursor_move; interact->handle_key_down = &program_view_handle_key_down; window_inter_init(interact, x, y, PROGRAM_VIEW_WIDTH, PROGRAM_VIEW_HEIGHT, "PROGRAM VIEW"); DebugOperand operands[10]; decode_operands(&operands[0], ram, 0xc004); program_view_print(view, &operands[0]); program_view_cursor_init(view); }