nesemu/debugger/program_view.c

119 lines
3.7 KiB
C
Raw Normal View History

2024-01-11 16:02:53 -05:00
//
// Created by william on 10/01/24.
//
2024-01-14 21:59:13 -05:00
#include <stdlib.h>
2024-01-11 16:02:53 -05:00
#include "program_view.h"
#include "../cpu/op.h"
2024-01-14 21:59:13 -05:00
void decode_operands(DebugOperand *operands, const byte *ram, address start_addr) {
2024-01-11 16:02:53 -05:00
int pc = start_addr;
for (int i = 0; i < 10; i++) {
DebugOperand operand;
byte op_code = ram[pc];
2024-01-14 21:59:13 -05:00
operand.addr = pc;
2024-01-11 16:02:53 -05:00
operand.op_code = op_code;
operand.addr_mode = get_op_addr_mode(op_code);
2024-01-14 21:59:13 -05:00
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;
2024-01-11 16:02:53 -05:00
}
}
2024-01-14 21:59:13 -05:00
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";
}
2024-01-11 16:02:53 -05:00
}
2024-01-14 21:59:13 -05:00
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);
}
2024-01-11 16:02:53 -05:00
2024-01-14 21:59:13 -05:00
void program_view_print(ProgramView *view, DebugOperand *operands) {
for (int line = 0; line < 10; line++) {
program_view_write_line(view, line, &operands[line]);
2024-01-11 16:02:53 -05:00
}
}
2024-01-14 21:59:13 -05:00
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);
}
2024-01-11 16:02:53 -05:00
2024-01-14 21:59:13 -05:00
void program_view_handle_key_down(InteractWindow *window, int keycode) {
2024-01-11 16:02:53 -05:00
2024-01-14 21:59:13 -05:00
}
void program_view_init(InteractWindow *interact, ram ram, int x, int y) {
ProgramView *view = malloc(sizeof(ProgramView));
view->window = interact;
2024-01-11 16:02:53 -05:00
view->ram = ram;
2024-01-14 21:59:13 -05:00
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);
2024-01-11 16:02:53 -05:00
}