// // Created by william on 1/6/24. // #include #include #include #include "debugger.h" #include "memory_view.h" #include "program_view.h" #include "keys.h" #include "cpu_view.h" #include "ppu_view.h" void debugger_create_window() { setenv("TERMINFO", "/usr/share/terminfo", 1); setenv("TERM", "xterm", 1); initscr(); raw(); noecho(); curs_set(0); keypad(stdscr, true); } LinkedList debugger_create_interactive_windows() { LinkedList interactive_windows; InteractWindow *window; interactive_windows = linked_list_init(true); window = malloc(sizeof(InteractWindow)); mv_init(window, 0, 0); linked_list_add(&interactive_windows, window); window = malloc(sizeof(InteractWindow)); pv_init(window, MEMORY_VIEW_WIDTH, 0); linked_list_add(&interactive_windows, window); return interactive_windows; } void debugger_uninit_interactive_windows(LinkedList *windows) { linked_list_cursor_reset(windows); InteractWindow *window = windows->current->data; for (int i = 0; i < windows->size; i++) { window_inter_deinit(window); window = linked_list_next(windows)->data; } linked_list_uninit(windows); } void start_debugger(System *system) { CpuView *cpu_view; PpuView *ppu_view; LinkedList interactive_windows; InteractWindow *current_window; debugger_create_window(); interactive_windows = debugger_create_interactive_windows(system); current_window = interactive_windows.current->data; cpu_view = cv_init(0, MEMORY_VIEW_HEIGHT); ppu_view = ppv_init(CPU_VIEW_WIDTH, MEMORY_VIEW_HEIGHT); cursor_enable(¤t_window->cursor); update_panels(); doupdate(); int keycode; while ((keycode = getch()) != KEY_EXIT_DEBUGGER) { if (keycode == KEY_NEXT_VIEW) { cursor_disable(¤t_window->cursor); current_window = linked_list_next(&interactive_windows)->data; cursor_enable(¤t_window->cursor); } else if (keycode == KEY_VIEW_UP) { current_window->handle_cursor_move(current_window, 0, CURSOR_OFFSET_UP); } else if (keycode == KEY_VIEW_DOWN) { current_window->handle_cursor_move(current_window, 0, CURSOR_OFFSET_DOWN); } else if (keycode == KEY_VIEW_LEFT) { current_window->handle_cursor_move(current_window, CURSOR_OFFSET_LEFT, 0); } else if (keycode == KEY_VIEW_RIGHT) { current_window->handle_cursor_move(current_window, CURSOR_OFFSET_RIGHT, 0); } else { current_window->handle_key_down(current_window, keycode); } update_panels(); doupdate(); } debugger_uninit_interactive_windows(&interactive_windows); cv_uninit(cpu_view); ppv_uninit(ppu_view); endwin(); }