From 7d04e3eb3c24468be7d17640503243478e9a9822 Mon Sep 17 00:00:00 2001 From: FyloZ Date: Thu, 11 Jan 2024 16:02:53 -0500 Subject: [PATCH] Blah 2 --- .idea/workspace.xml | 101 ++++++++------- cpu/op.c | 278 +++++++++++++++++++++++++++++++++++++++- cpu/op.h | 3 + debugger/CMakeLists.txt | 4 +- debugger/debugger.c | 21 +-- debugger/memory_view.c | 9 +- debugger/memory_view.h | 2 +- debugger/program_view.c | 43 +++++++ debugger/program_view.h | 28 ++++ 9 files changed, 428 insertions(+), 61 deletions(-) create mode 100644 debugger/program_view.c create mode 100644 debugger/program_view.h diff --git a/.idea/workspace.xml b/.idea/workspace.xml index cbc4b33..89f703e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -25,15 +25,13 @@ - - - + + + - - - + @@ -76,32 +74,34 @@ - { + "keyToString": { + "ASKED_ADD_EXTERNAL_FILES": "true", + "CMake Application.NESEmulator (Term).executor": "Run", + "CMake Application.NESEmulator.executor": "Run", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.cidr.known.project.marker": "true", + "RunOnceActivity.readMode.enableVisualFormatting": "true", + "WebServerToolWindowFactoryState": "false", + "cf.first.check.clang-format": "false", + "cidr.known.project.marker": "true", + "com.jfrog.conanplugin.addconansupport": "true", + "com.jfrog.conanplugin.automanage.cmake.advanced.settings": "true", + "com.jfrog.conanplugin.conanexecutable": "conan", + "com.jfrog.conanplugin.hasbeensetup": "true", + "git-widget-placeholder": "master", + "last_opened_file_path": "/home/william/Dev/ETS/LOG710/Lab2/CMakeLists.txt", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "settings.editor.selected.configurable": "configurable.group.editor", + "structure.view.defaults.are.configured": "true", + "vue.rearranger.settings.migration": "true" } -}]]> +} @@ -114,6 +114,7 @@ + + + + + + + + - - - - @@ -423,15 +426,15 @@ + + + + - - - - @@ -471,6 +474,8 @@ + + - - - + diff --git a/cpu/op.c b/cpu/op.c index 38c321f..76b502a 100644 --- a/cpu/op.c +++ b/cpu/op.c @@ -1,6 +1,5 @@ #include #include -#include #include "op.h" #include "cpu.h" @@ -960,7 +959,7 @@ void process_op_code(System *system, byte op) { IS_OP_CODE_MODE(JSR, 0x20, ABSOLUTE) IS_OP_CODE_MODE(BIT, 0x24, ZERO_PAGE) IS_OP_CODE_MODE(BIT, 0x2c, ABSOLUTE) - IS_OP_CODE_MODE(JMP, 0x4c, ABSOLUTE_JUMP) + IS_OP_CODE_MODE(JMP, 0x4c, ABSOLUTE) IS_OP_CODE_MODE(JMP, 0x6c, INDIRECT_JUMP) IS_OP_CODE_MODE(STY, 0x84, ZERO_PAGE) IS_OP_CODE_MODE(STY, 0x8c, ABSOLUTE) @@ -1106,4 +1105,279 @@ void process_op_code(System *system, byte op) { default: assert(false); } +} + +AddressingMode get_op_addr_mode(byte op_code) { + switch (op_code) { + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + case 0x20: + case 0x2c: + case 0x2d: + case 0x2e: + case 0x2f: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + case 0x6d: + case 0x6e: + case 0x6f: + case 0x8c: + case 0x8d: + case 0x8e: + case 0x8f: + case 0xac: + case 0xad: + case 0xae: + case 0xaf: + case 0xcc: + case 0xcd: + case 0xce: + case 0xcf: + case 0xec: + case 0xed: + case 0xee: + case 0xef: + return ADDR_MODE_ABSOLUTE; + case 0x1c: + case 0x1d: + case 0x1e: + case 0x1f: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + case 0x7c: + case 0x7d: + case 0x7e: + case 0x7f: + case 0x9c: + case 0x9d: + case 0xbc: + case 0xbd: + case 0xdc: + case 0xdd: + case 0xde: + case 0xdf: + case 0xfc: + case 0xfd: + case 0xfe: + case 0xff: + return ADDR_MODE_ABSOLUTE_INDEXED_X; + case 0x19: + case 0x1b: + case 0x39: + case 0x3b: + case 0x59: + case 0x5b: + case 0x79: + case 0x7b: + case 0x99: + case 0x9b: + case 0x9e: + case 0x9f: + case 0xb9: + case 0xbb: + case 0xbe: + case 0xbf: + case 0xd9: + case 0xdb: + case 0xf9: + case 0xfb: + return ADDR_MODE_ABSOLUTE_INDEXED_Y; + case 0x0a: + case 0x2a: + case 0x4a: + case 0x6a: + return ADDR_MODE_ACCUMULATOR; + case 0x09: + case 0x0b: + case 0x29: + case 0x2b: + case 0x49: + case 0x4b: + case 0x69: + case 0x6b: + case 0x80: + case 0x82: + case 0x89: + case 0x8b: + case 0xa0: + case 0xa2: + case 0xa9: + case 0xab: + case 0xc0: + case 0xc2: + case 0xc9: + case 0xcb: + case 0xe0: + case 0xe2: + case 0xe9: + case 0xeb: + return ADDR_MODE_IMMEDIATE; + case 0x00: + case 0x02: + case 0x08: + case 0x12: + case 0x18: + case 0x1a: + case 0x22: + case 0x28: + case 0x32: + case 0x3a: + case 0x40: + case 0x42: + case 0x48: + case 0x52: + case 0x58: + case 0x5a: + case 0x60: + case 0x62: + case 0x68: + case 0x72: + case 0x78: + case 0x7a: + case 0x88: + case 0x8a: + case 0x92: + case 0x98: + case 0x9a: + case 0xa8: + case 0xaa: + case 0xb2: + case 0xb8: + case 0xba: + case 0xc8: + case 0xca: + case 0xd2: + case 0xd8: + case 0xda: + case 0xe8: + case 0xea: + case 0xf2: + case 0xf8: + case 0xfa: + return ADDR_MODE_IMPLICIT; + case 0x01: + case 0x03: + case 0x21: + case 0x23: + case 0x41: + case 0x43: + case 0x61: + case 0x63: + case 0x81: + case 0x83: + case 0xa1: + case 0xa3: + case 0xc1: + case 0xc3: + case 0xe1: + case 0xe3: + return ADDR_MODE_INDIRECT_X; + case 0x6c: + return ADDR_MODE_INDIRECT_JUMP; + case 0x11: + case 0x13: + case 0x31: + case 0x33: + case 0x51: + case 0x53: + case 0x71: + case 0x73: + case 0x91: + case 0x93: + case 0xb1: + case 0xb3: + case 0xd1: + case 0xd3: + case 0xf1: + case 0xf3: + return ADDR_MODE_INDIRECT_Y; + case 0x10: + case 0x30: + case 0x50: + case 0x70: + case 0x90: + case 0xb0: + case 0xd0: + case 0xf0: + return ADDR_MODE_RELATIVE; + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0xa4: + case 0xa5: + case 0xa6: + case 0xa7: + case 0xc4: + case 0xc5: + case 0xc6: + case 0xc7: + case 0xe4: + case 0xe5: + case 0xe6: + case 0xe7: + return ADDR_MODE_ZERO_PAGE; + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x94: + case 0x95: + case 0xb4: + case 0xb5: + case 0xd4: + case 0xd5: + case 0xd6: + case 0xd7: + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: + return ADDR_MODE_ZERO_PAGE_INDEXED_X; + case 0x96: + case 0x97: + case 0xb6: + case 0xb7: + return ADDR_MODE_ZERO_PAGE_INDEXED_Y; + default: + assert(false); + } } \ No newline at end of file diff --git a/cpu/op.h b/cpu/op.h index f2fcd12..97af987 100644 --- a/cpu/op.h +++ b/cpu/op.h @@ -1,4 +1,5 @@ #include "../include/cpu.h" +#include "decoding.h" #ifndef CPU_OP_H #define CPU_OP_H @@ -18,4 +19,6 @@ enum op_code_base { void process_op_code(System *system, byte op); +AddressingMode get_op_addr_mode(byte op_code); + #endif \ No newline at end of file diff --git a/debugger/CMakeLists.txt b/debugger/CMakeLists.txt index 896d677..ecd1038 100644 --- a/debugger/CMakeLists.txt +++ b/debugger/CMakeLists.txt @@ -1,7 +1,9 @@ add_library(DEBUG debugger.c memory_view.c - dialog.c) + dialog.c + program_view.c + program_view.h) find_package(Curses) diff --git a/debugger/debugger.c b/debugger/debugger.c index cf738cc..3d079fc 100644 --- a/debugger/debugger.c +++ b/debugger/debugger.c @@ -8,12 +8,11 @@ #include "debugger.h" #include "memory_view.h" #include "dialog.h" +#include "program_view.h" #define CTRL_KEY_EXIT 3 #define CTRL_KEY_G 103 -MemoryView view; - void create_window() { setenv("TERMINFO", "/usr/share/terminfo", 1); setenv("TERM", "xterm", 1); @@ -26,9 +25,13 @@ void create_window() { } void start_debugger(System *system) { + MemoryView m_view; + ProgramView p_view; + create_window(); - memory_view_init(&view, system->ram); + memory_view_init(&m_view, system->ram, 0, 0); + program_view_init(&p_view, MEMORY_VIEW_WIDTH, 0); update_panels(); doupdate(); @@ -36,19 +39,19 @@ void start_debugger(System *system) { int keycode; while ((keycode = getch()) != CTRL_KEY_EXIT) { if (keycode == KEY_UP) { - memory_view_move_cursor(&view, 0, MEMORY_VIEW_DIRECTION_DOWN); + memory_view_move_cursor(&m_view, 0, MEMORY_VIEW_DIRECTION_DOWN); } if (keycode == KEY_DOWN) { - memory_view_move_cursor(&view, 0, MEMORY_VIEW_DIRECTION_UP); + memory_view_move_cursor(&m_view, 0, MEMORY_VIEW_DIRECTION_UP); } if (keycode == KEY_LEFT) { - memory_view_move_cursor(&view, MEMORY_VIEW_DIRECTION_LEFT, 0); + memory_view_move_cursor(&m_view, MEMORY_VIEW_DIRECTION_LEFT, 0); } if (keycode == KEY_RIGHT) { - memory_view_move_cursor(&view, MEMORY_VIEW_DIRECTION_RIGHT, 0); + memory_view_move_cursor(&m_view, MEMORY_VIEW_DIRECTION_RIGHT, 0); } if (keycode == CTRL_KEY_G) { @@ -59,8 +62,8 @@ void start_debugger(System *system) { dialog_remove(&dialog); if (!cancelled) { - memory_view_goto(&view, input); - memory_view_set_cursor_addr(&view, input); + memory_view_goto(&m_view, input); + memory_view_set_cursor_addr(&m_view, input); } } diff --git a/debugger/memory_view.c b/debugger/memory_view.c index 0262774..2d7247e 100644 --- a/debugger/memory_view.c +++ b/debugger/memory_view.c @@ -30,7 +30,7 @@ void memory_view_set_cursor_pos(MemoryView *view, int x, int y) { memory_view_highlight_cursor(view); } -void write_line(WINDOW *window, int line, address base_address, byte *data) { +void memory_view_write_line(WINDOW *window, int line, address base_address, byte *data) { mvwprintw(window, line + 2, 1, "[%04x]", base_address); for (int i = 0; i <= MEMORY_VIEW_LINE_BYTE_COUNT; i++) { @@ -38,8 +38,8 @@ void write_line(WINDOW *window, int line, address base_address, byte *data) { } } -void memory_view_init(MemoryView *view, ram ram) { - WINDOW *window = newwin(MEMORY_VIEW_HEIGHT, MEMORY_VIEW_WIDTH, 0, 0); +void memory_view_init(MemoryView *view, ram ram, int x, int y) { + WINDOW *window = newwin(MEMORY_VIEW_HEIGHT, MEMORY_VIEW_WIDTH, y, x); box(window, 0, 0); mvwprintw(window, 0, 1, " MEMORY VIEW "); @@ -60,7 +60,7 @@ void memory_view_print(MemoryView *view) { address line_address = view->base_address + line * (MEMORY_VIEW_LINE_BYTE_COUNT + 1); byte *data = &view->ram[line_address]; - write_line(view->panel->win, line, line_address, data); + memory_view_write_line(view->panel->win, line, line_address, data); } } @@ -101,6 +101,7 @@ void memory_view_move_cursor(MemoryView *view, char horizontal, char vertical) { if (vertical == MEMORY_VIEW_DIRECTION_RIGHT && view->cursor_y == 0xf || vertical == MEMORY_VIEW_DIRECTION_LEFT && view->cursor_y == 0) { memory_view_scroll(view, vertical); + memory_view_highlight_cursor(view); return; } diff --git a/debugger/memory_view.h b/debugger/memory_view.h index 0842e83..0e01c07 100644 --- a/debugger/memory_view.h +++ b/debugger/memory_view.h @@ -34,7 +34,7 @@ typedef struct memory_view { * @param view A pointer to the view to initialize * @param ram A pointer to the RAM */ -void memory_view_init(MemoryView *view, ram ram); +void memory_view_init(MemoryView *view, ram ram, int x, int y); /** * Prints the RAM content from the viewer base address. diff --git a/debugger/program_view.c b/debugger/program_view.c new file mode 100644 index 0000000..4872295 --- /dev/null +++ b/debugger/program_view.c @@ -0,0 +1,43 @@ +// +// Created by william on 10/01/24. +// + +#include "program_view.h" +#include "../cpu/op.h" + +void decode_operands(byte *ram, address start_addr) { + int pc = start_addr; + + for (int i = 0; i < 10; i++) { + DebugOperand operand; + byte op_code = ram[pc]; + + operand.op_code = op_code; + operand.addr_mode = get_op_addr_mode(op_code); + } +} + +void program_view_write_line(WINDOW *window, int line, address addr) { + mvwprintw(window, line + 1, 1, "%04x:", addr); + mvwprintw(window, line + 1, 7, "%s", "BRK"); +} + +void program_view_print(ProgramView *view) { + for (int line = 0; line <= 0xf; line++) { + address addr = 0x8000 + line; + + program_view_write_line(view->panel->win, line, addr); + } +} + +void program_view_init(ProgramView *view, ram ram, int x, int y) { + WINDOW *window = newwin(PROGRAM_VIEW_HEIGHT, PROGRAM_VIEW_WIDTH, y, x); + box(window, 0, 0); + + mvwprintw(window, 0, 1, " PROGRAM VIEW "); + + view->panel = new_panel(window); + view->ram = ram; + + program_view_print(view); +} \ No newline at end of file diff --git a/debugger/program_view.h b/debugger/program_view.h new file mode 100644 index 0000000..def6742 --- /dev/null +++ b/debugger/program_view.h @@ -0,0 +1,28 @@ +// +// Created by william on 10/01/24. +// + +#include +#include "../include/types.h" +#include "../cpu/decoding.h" + +#ifndef NESEMULATOR_PROGRAM_VIEW_H +#define NESEMULATOR_PROGRAM_VIEW_H + +#define PROGRAM_VIEW_HEIGHT 19 +#define PROGRAM_VIEW_WIDTH 42 + +typedef struct program_view { + PANEL *panel; + byte *ram; + address base_address; +} ProgramView; + +typedef struct debug_operand { + byte op_code; + AddressingMode addr_mode; +} DebugOperand; + +void program_view_init(ProgramView *view, ram ram, int x, int y); + +#endif //NESEMULATOR_PROGRAM_VIEW_H \ No newline at end of file