Memory debugger
This commit is contained in:
parent
cebee66076
commit
084cbed0f4
101
.idea/workspace.xml
generated
101
.idea/workspace.xml
generated
@ -12,6 +12,7 @@
|
||||
<component name="CMakeRunConfigurationManager">
|
||||
<generated>
|
||||
<config projectName="NESEmulator" targetName="NESEmulator" />
|
||||
<config projectName="NESEmulator" targetName="DEBUG" />
|
||||
<config projectName="NESEmulator" targetName="ROM" />
|
||||
<config projectName="NESEmulator" targetName="Mappers" />
|
||||
<config projectName="NESEmulator" targetName="PPU" />
|
||||
@ -24,59 +25,18 @@
|
||||
</configurations>
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="0c3b231e-0637-4ac1-8964-c60fc9e9e691" name="Changes" comment="Added logging for operand decoding">
|
||||
<change afterPath="$PROJECT_DIR$/include/ppu.h" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/include/system.h" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/include/types.h" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/ppu/CMakeLists.txt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/ppu/ppu.c" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/system.c" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/test_roms/nestest.fdb" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/test_roms/nestest.nes" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/test_roms/smb.fdb" afterDir="false" />
|
||||
<list default="true" id="0c3b231e-0637-4ac1-8964-c60fc9e9e691" name="Changes" comment="Things">
|
||||
<change afterPath="$PROJECT_DIR$/debugger/CMakeLists.txt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/debugger/debugger.c" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/debugger/debugger.h" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/debugger/dialog.c" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/debugger/dialog.h" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/debugger/memory_view.c" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/debugger/memory_view.h" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/CMakeLists.txt" beforeDir="false" afterPath="$PROJECT_DIR$/CMakeLists.txt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/conandata.yml" beforeDir="false" afterPath="$PROJECT_DIR$/conandata.yml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/CMakeLists.txt" beforeDir="false" afterPath="$PROJECT_DIR$/cpu/CMakeLists.txt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/cpu.c" beforeDir="false" afterPath="$PROJECT_DIR$/cpu/cpu.c" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/cpu.h" beforeDir="false" afterPath="$PROJECT_DIR$/cpu/cpu.h" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/memory.c" beforeDir="false" afterPath="$PROJECT_DIR$/cpu/memory.c" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/memory.h" beforeDir="false" afterPath="$PROJECT_DIR$/cpu/memory.h" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/op.c" beforeDir="false" afterPath="$PROJECT_DIR$/cpu/op.c" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/op.h" beforeDir="false" afterPath="$PROJECT_DIR$/cpu/op.h" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/ram.c" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/cpu/ram.h" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/include/cpu.h" beforeDir="false" afterPath="$PROJECT_DIR$/include/cpu.h" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/include/mapper.h" beforeDir="false" afterPath="$PROJECT_DIR$/include/mapper.h" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/include/rom.h" beforeDir="false" afterPath="$PROJECT_DIR$/include/rom.h" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/main.c" beforeDir="false" afterPath="$PROJECT_DIR$/main.c" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/mappers/simple_mapper.c" beforeDir="false" afterPath="$PROJECT_DIR$/mappers/simple_mapper.c" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/rom/ines.c" beforeDir="false" afterPath="$PROJECT_DIR$/rom/ines.c" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/rom/rom.c" beforeDir="false" afterPath="$PROJECT_DIR$/rom/rom.c" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/readme.txt" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/readme.txt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/ascii_1.chr" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/ascii_1.chr" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/ascii_2.chr" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/ascii_2.chr" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/ascii_3.chr" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/ascii_3.chr" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/build_rom.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/build_rom.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/colors.inc" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/colors.inc" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/console.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/console.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/crc.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/crc.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/delay.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/delay.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/devcart.bin" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/devcart.bin" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/macros.inc" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/macros.inc" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/neshw.inc" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/neshw.inc" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/ppu.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/ppu.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/print.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/print.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/shell.inc" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/shell.inc" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/shell.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/shell.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/testing.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/testing.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/common/text_out.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/common/text_out.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/readme.txt" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/readme.txt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/test_cpu_exec_space_apu.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/test_cpu_exec_space_apu.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/source/test_cpu_exec_space_ppuio.s" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/source/test_cpu_exec_space_ppuio.s" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/test_cpu_exec_space_apu.nes" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/test_cpu_exec_space_apu.nes" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/cpu_exec_space/test_cpu_exec_space_ppuio.nes" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/cpu_exec_space/test_cpu_exec_space_ppuio.nes" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/smb.nes" beforeDir="false" afterPath="$PROJECT_DIR$/test_roms/smb.nes" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@ -274,6 +234,11 @@
|
||||
<option name="_new_targetType" value=""PATH"" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration default="true" type="CLionExternalRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true">
|
||||
<method v="2">
|
||||
<option name="CLION.EXTERNAL.BUILD" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="NESEmulator" type="CMakeListConfigurationType" factoryName="CMakeListConfigurationFactory" temporary="true">
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
@ -285,7 +250,7 @@
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="CPU" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="NESEmulator" TARGET_NAME="CPU" CONFIG_NAME="Debug">
|
||||
<configuration name="DEBUG" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="NESEmulator" TARGET_NAME="DEBUG" CONFIG_NAME="Debug">
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
@ -295,12 +260,17 @@
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="Mappers" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="NESEmulator" TARGET_NAME="Mappers" CONFIG_NAME="Debug">
|
||||
<configuration name="NESEmulator (GDB Server)" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="-- /usr/bin/gdbserver localhost:1234 $CMakeCurrentBuildDir$/NESEmulator" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="NESEmulator" TARGET_NAME="NESEmulator" CONFIG_NAME="Debug" RUN_PATH="/usr/bin/gnome-terminal">
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="NESEmulator" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="NESEmulator" TARGET_NAME="NESEmulator" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="NESEmulator" RUN_TARGET_NAME="NESEmulator">
|
||||
<configuration name="NESEmulator (Term)" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="-- $CMakeCurrentBuildDir$/NESEmulator" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="true" PASS_PARENT_ENVS_2="true" PROJECT_NAME="NESEmulator" TARGET_NAME="NESEmulator" CONFIG_NAME="Debug" RUN_PATH="/usr/bin/gnome-terminal">
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="NESEmulator" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="true" PASS_PARENT_ENVS_2="true" PROJECT_NAME="NESEmulator" TARGET_NAME="NESEmulator" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="NESEmulator" RUN_TARGET_NAME="NESEmulator">
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
@ -320,11 +290,6 @@
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="ROM" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="NESEmulator" TARGET_NAME="ROM" CONFIG_NAME="Debug">
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="true" type="PythonConfigurationType" factoryName="Python">
|
||||
<module name="nesemu" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
@ -449,11 +414,14 @@
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<list>
|
||||
<item itemvalue="CMake Application.NESEmulator" />
|
||||
<item itemvalue="CMake Application.CPU" />
|
||||
<item itemvalue="CMake Application.DEBUG" />
|
||||
<item itemvalue="CMake Application.Mappers" />
|
||||
<item itemvalue="CMake Application.PPU" />
|
||||
<item itemvalue="CMake Application.ROM" />
|
||||
<item itemvalue="CMake Application.NESEmulator (GDB Server)" />
|
||||
<item itemvalue="CMake Application.NESEmulator" />
|
||||
<item itemvalue="CMake Application.NESEmulator (Term)" />
|
||||
<item itemvalue="CMake Debug.NESEmulator" />
|
||||
</list>
|
||||
<recent_temporary>
|
||||
@ -491,7 +459,9 @@
|
||||
<workItem from="1704429138262" duration="2629000" />
|
||||
<workItem from="1704484992884" duration="2000" />
|
||||
<workItem from="1704501418104" duration="8204000" />
|
||||
<workItem from="1704569084127" duration="3000" />
|
||||
<workItem from="1704569084127" duration="8903000" />
|
||||
<workItem from="1704582152049" duration="7863000" />
|
||||
<workItem from="1704660072645" duration="2354000" />
|
||||
</task>
|
||||
<task id="LOCAL-00001" summary="Cpu opcodes implementation">
|
||||
<option name="closed" value="true" />
|
||||
@ -517,7 +487,15 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1703369431911</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="4" />
|
||||
<task id="LOCAL-00004" summary="Things">
|
||||
<option name="closed" value="true" />
|
||||
<created>1704569231622</created>
|
||||
<option name="number" value="00004" />
|
||||
<option name="presentableId" value="LOCAL-00004" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1704569231622</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="5" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
@ -534,7 +512,8 @@
|
||||
<MESSAGE value="Cpu opcodes implementation" />
|
||||
<MESSAGE value="Gitignore" />
|
||||
<MESSAGE value="Added logging for operand decoding" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="Added logging for operand decoding" />
|
||||
<MESSAGE value="Things" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="Things" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<breakpoint-manager>
|
||||
|
@ -5,12 +5,14 @@ add_subdirectory(cpu)
|
||||
add_subdirectory(ppu)
|
||||
add_subdirectory(mappers)
|
||||
add_subdirectory(rom)
|
||||
add_subdirectory(debugger)
|
||||
|
||||
list(APPEND EXTRA_INCLUDES
|
||||
"${PROJECT_SOURCE_DIR}/cpu"
|
||||
"${PROJECT_SOURCE_DIR}/ppu"
|
||||
"${PROJECT_SOURCE_DIR}/mappers"
|
||||
"${PROJECT_SOURCE_DIR}/rom")
|
||||
"${PROJECT_SOURCE_DIR}/rom"
|
||||
"${PROJECT_SOURCE_DIR}/debugger")
|
||||
|
||||
add_executable(NESEmulator main.c
|
||||
system.c
|
||||
@ -19,7 +21,7 @@ add_executable(NESEmulator main.c
|
||||
|
||||
find_package(log.c)
|
||||
|
||||
target_link_libraries(NESEmulator CPU PPU Mappers ROM log.c::log.c)
|
||||
target_link_libraries(NESEmulator CPU PPU Mappers ROM DEBUG log.c::log.c)
|
||||
target_include_directories(NESEmulator PUBLIC
|
||||
"${PROJECT_BINARY_DIR}"
|
||||
${EXTRA_INCLUDES})
|
||||
|
@ -2,5 +2,6 @@
|
||||
# To keep your changes, remove these comment lines, but the plugin won't be able to modify your requirements
|
||||
|
||||
requirements:
|
||||
- "ncurses/6.4"
|
||||
- "libcheck/0.15.2"
|
||||
- "log.c/cci.20200620"
|
8
debugger/CMakeLists.txt
Normal file
8
debugger/CMakeLists.txt
Normal file
@ -0,0 +1,8 @@
|
||||
add_library(DEBUG
|
||||
debugger.c
|
||||
memory_view.c
|
||||
dialog.c)
|
||||
|
||||
find_package(Curses)
|
||||
|
||||
target_link_libraries(DEBUG Curses::Curses)
|
63
debugger/debugger.c
Normal file
63
debugger/debugger.c
Normal file
@ -0,0 +1,63 @@
|
||||
//
|
||||
// Created by william on 1/6/24.
|
||||
//
|
||||
|
||||
#include <curses.h>
|
||||
#include <panel.h>
|
||||
#include <stdlib.h>
|
||||
#include "debugger.h"
|
||||
#include "memory_view.h"
|
||||
#include "dialog.h"
|
||||
|
||||
#define CTRL_KEY_EXIT 3
|
||||
#define CTRL_KEY_UP 65
|
||||
#define CTRL_KEY_DOWN 66
|
||||
#define CTRL_KEY_G 103
|
||||
|
||||
MemoryView view;
|
||||
|
||||
void create_window() {
|
||||
setenv("TERMINFO", "/usr/share/terminfo", 1);
|
||||
setenv("TERM", "xterm", 1);
|
||||
|
||||
initscr();
|
||||
raw();
|
||||
noecho();
|
||||
// wborder(window, '|', '|', '-', '-', '+', '+', '+', '+');
|
||||
}
|
||||
|
||||
void destroy_window() {
|
||||
endwin();
|
||||
}
|
||||
|
||||
void some_func(char* user_input) {
|
||||
}
|
||||
|
||||
void start_debugger(System *system) {
|
||||
create_window();
|
||||
|
||||
memory_view_init(&view, system->ram);
|
||||
|
||||
update_panels();
|
||||
doupdate();
|
||||
|
||||
int keycode;
|
||||
while ((keycode = getch()) != CTRL_KEY_EXIT) {
|
||||
if (keycode == CTRL_KEY_UP) {
|
||||
memory_view_scroll(&view, -1, system->ram);
|
||||
}
|
||||
|
||||
if (keycode == CTRL_KEY_DOWN) {
|
||||
memory_view_scroll(&view, 1, system->ram);
|
||||
}
|
||||
|
||||
if (keycode == CTRL_KEY_G) {
|
||||
Dialog dialog = dialog_create("Goto Address", &some_func);
|
||||
}
|
||||
|
||||
update_panels();
|
||||
doupdate();
|
||||
}
|
||||
|
||||
endwin();
|
||||
}
|
12
debugger/debugger.h
Normal file
12
debugger/debugger.h
Normal file
@ -0,0 +1,12 @@
|
||||
//
|
||||
// Created by william on 1/6/24.
|
||||
//
|
||||
|
||||
#include "../include/system.h"
|
||||
|
||||
#ifndef NESEMULATOR_DEBUGGER_H
|
||||
#define NESEMULATOR_DEBUGGER_H
|
||||
|
||||
void start_debugger(System *system);
|
||||
|
||||
#endif //NESEMULATOR_DEBUGGER_H
|
21
debugger/dialog.c
Normal file
21
debugger/dialog.c
Normal file
@ -0,0 +1,21 @@
|
||||
//
|
||||
// Created by william on 1/7/24.
|
||||
//
|
||||
|
||||
#include <string.h>
|
||||
#include "dialog.h"
|
||||
|
||||
Dialog dialog_create(char *message, void (*callback)(char *user_input)) {
|
||||
Dialog dialog;
|
||||
int width = (int) strlen(message) + 2;
|
||||
|
||||
WINDOW *window = newwin(3, width, 2, 2);
|
||||
box(window, 0, 0);
|
||||
|
||||
mvwprintw(window, 0, 1, "%s", message);
|
||||
|
||||
dialog.panel = new_panel(window);
|
||||
dialog.callback = callback;
|
||||
|
||||
return dialog;
|
||||
}
|
18
debugger/dialog.h
Normal file
18
debugger/dialog.h
Normal file
@ -0,0 +1,18 @@
|
||||
//
|
||||
// Created by william on 1/7/24.
|
||||
//
|
||||
|
||||
#ifndef NESEMULATOR_DIALOG_H
|
||||
#define NESEMULATOR_DIALOG_H
|
||||
|
||||
#include <panel.h>
|
||||
|
||||
typedef struct dialog {
|
||||
PANEL *panel;
|
||||
|
||||
void (*callback)(char *user_input);
|
||||
} Dialog;
|
||||
|
||||
Dialog dialog_create(char *message, void (*callback)(char *user_input));
|
||||
|
||||
#endif //NESEMULATOR_DIALOG_H
|
65
debugger/memory_view.c
Normal file
65
debugger/memory_view.c
Normal file
@ -0,0 +1,65 @@
|
||||
#include <curses.h>
|
||||
#include <panel.h>
|
||||
#include <assert.h>
|
||||
#include "memory_view.h"
|
||||
|
||||
//
|
||||
// Created by william on 1/6/24.
|
||||
//
|
||||
|
||||
void 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++) {
|
||||
mvwprintw(window, line + 2, 8 + i * 3, "%02x", data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void memory_view_init(MemoryView *view, ram ram) {
|
||||
WINDOW *window = newwin(MEMORY_VIEW_HEIGHT, MEMORY_VIEW_WIDTH, 0, 0);
|
||||
box(window, 0, 0);
|
||||
|
||||
mvwprintw(window, 0, 1, " MEMORY VIEW ");
|
||||
mvwprintw(window, 1, 1, " +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f");
|
||||
|
||||
view->panel = new_panel(window);
|
||||
view->base_address = 0xfc00;
|
||||
|
||||
memory_view_print(view, ram);
|
||||
}
|
||||
|
||||
void memory_view_print(MemoryView *view, ram ram) {
|
||||
for (int line = 0; line <= MEMORY_VIEW_LINE_COUNT; line++) {
|
||||
address line_address = view->base_address + line * (MEMORY_VIEW_LINE_BYTE_COUNT + 1);
|
||||
byte *data = &ram[line_address];
|
||||
|
||||
write_line(view->panel->win, line, line_address, data);
|
||||
}
|
||||
}
|
||||
|
||||
void memory_view_goto(MemoryView *view, address target, ram ram) {
|
||||
assert(target < RAM_SIZE);
|
||||
|
||||
address max_base_address = RAM_SIZE - MEMORY_VIEW_BYTE_COUNT;
|
||||
if (target > max_base_address) {
|
||||
target = max_base_address;
|
||||
}
|
||||
|
||||
view->base_address = target;
|
||||
memory_view_print(view, ram);
|
||||
}
|
||||
|
||||
void memory_view_scroll(MemoryView *view, char direction, ram ram) {
|
||||
assert(direction == MEMORY_VIEW_DIRECTION_DOWN || direction == MEMORY_VIEW_DIRECTION_UP);
|
||||
|
||||
int offset = 0;
|
||||
if (direction == MEMORY_VIEW_DIRECTION_DOWN && view->base_address > MEMORY_VIEW_LINE_BYTE_COUNT) {
|
||||
offset -= MEMORY_VIEW_LINE_BYTE_COUNT + 1;
|
||||
}
|
||||
if (direction == MEMORY_VIEW_DIRECTION_UP && view->base_address < RAM_SIZE - MEMORY_VIEW_BYTE_COUNT) {
|
||||
offset += MEMORY_VIEW_LINE_BYTE_COUNT + 1;
|
||||
}
|
||||
|
||||
address target = view->base_address + offset;
|
||||
memory_view_goto(view, target, ram);
|
||||
}
|
33
debugger/memory_view.h
Normal file
33
debugger/memory_view.h
Normal file
@ -0,0 +1,33 @@
|
||||
//
|
||||
// Created by william on 1/6/24.
|
||||
//
|
||||
|
||||
#ifndef NESEMULATOR_MEMORY_VIEW_H
|
||||
#define NESEMULATOR_MEMORY_VIEW_H
|
||||
|
||||
#include <panel.h>
|
||||
#include "../include/types.h"
|
||||
|
||||
#define MEMORY_VIEW_HEIGHT 19
|
||||
#define MEMORY_VIEW_WIDTH 56
|
||||
#define MEMORY_VIEW_LINE_COUNT 0xf
|
||||
#define MEMORY_VIEW_LINE_BYTE_COUNT 0xf
|
||||
#define MEMORY_VIEW_BYTE_COUNT 0xff
|
||||
|
||||
#define MEMORY_VIEW_DIRECTION_UP 1
|
||||
#define MEMORY_VIEW_DIRECTION_DOWN -1
|
||||
|
||||
typedef struct memory_view {
|
||||
PANEL *panel;
|
||||
address base_address;
|
||||
} MemoryView;
|
||||
|
||||
void memory_view_init(MemoryView *view, ram ram);
|
||||
|
||||
void memory_view_print(MemoryView *view, ram ram);
|
||||
|
||||
void memory_view_goto(MemoryView *view, address target, ram ram);
|
||||
|
||||
void memory_view_scroll(MemoryView *view, char direction, ram ram);
|
||||
|
||||
#endif //NESEMULATOR_MEMORY_VIEW_H
|
38
main.c
38
main.c
@ -17,26 +17,50 @@
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <log.h>
|
||||
#include "debugger/debugger.h"
|
||||
|
||||
#include "include/rom.h"
|
||||
#include "include/system.h"
|
||||
|
||||
int main() {
|
||||
log_set_level(LOG_INFO);
|
||||
//int win() {
|
||||
// printf("NCURSES\n");
|
||||
//
|
||||
// setlocale(LC_ALL, "");
|
||||
// setenv("TERM", "xterm-256color", 1);
|
||||
// setenv("TERMINFO", "/usr/share/terminfo", 1);
|
||||
//
|
||||
// initscr();
|
||||
// printw("Hello World !!!");
|
||||
// refresh();
|
||||
// getch();
|
||||
// endwin();
|
||||
//
|
||||
// return EXIT_SUCCESS;
|
||||
//}
|
||||
|
||||
char *rom_path = "../test_roms/nestest.nes";
|
||||
int main() {
|
||||
System system;
|
||||
|
||||
log_set_level(LOG_INFO);
|
||||
system_init(&system);
|
||||
|
||||
char *rom_path = "../test_roms/nestest.nes";
|
||||
|
||||
if (!rom_load(rom_path, &system)) {
|
||||
system_uninit(&system);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
system_start(&system);
|
||||
system_loop(&system);
|
||||
system_uninit(&system);
|
||||
start_debugger(&system);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
system_uninit(&system);
|
||||
return 0;
|
||||
//
|
||||
// system_start(&system);
|
||||
// system_loop(&system);
|
||||
// system_uninit(&system);
|
||||
|
||||
// return EXIT_SUCCESS;
|
||||
|
||||
// return win();
|
||||
}
|
Loading…
Reference in New Issue
Block a user