blob: 201fdae5c16c9e51c82bac3279057c8bafafcdca [file] [log] [blame]
swissChilidbbd5402020-08-07 15:07:39 -07001#include "gui.h"
2
3#include <GL/glew.h>
4#include <SDL2/SDL.h>
5#include <SDL2/SDL_opengl.h>
6
7#define NK_INCLUDE_FIXED_TYPES
8#define NK_INCLUDE_STANDARD_IO
9#define NK_INCLUDE_STANDARD_VARARGS
10#define NK_INCLUDE_DEFAULT_ALLOCATOR
11#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
12#define NK_INCLUDE_FONT_BAKING
13#define NK_INCLUDE_DEFAULT_FONT
14#define NK_IMPLEMENTATION
15#define NK_SDL_GL3_IMPLEMENTATION
16#include "nuklear/nuklear.h"
17#include "nuklear/demo/sdl_opengl3/nuklear_sdl_gl3.h"
swissChili94ba1f52020-08-08 11:39:10 -070018#undef SCREEN_ONLY_SDL
swissChilibb478f12020-08-07 20:45:07 -070019#include "screen.h"
swissChilidbbd5402020-08-07 15:07:39 -070020
21#define WINDOW_WIDTH 720
22#define WINDOW_HEIGHT 640
23#define MAX_VERTEX_MEMORY 512 * 1024
24#define MAX_ELEMENT_MEMORY 128 * 1024
25
26void gui(cpu_t *cpu)
27{
28 SDL_Window *win;
29 SDL_GLContext glContext;
30 int win_width, win_height;
31 bool running = true;
32 bool cpu_running = false;
33
34 struct nk_context *ctx;
swissChilic51e9222020-08-07 16:09:14 -070035 struct nk_colorf bg =
36 {
37 .r = 0.29f,
38 .g = 0.28f,
39 .b = 0.50f,
40 .a = 1.0f,
41 };
42 struct nk_color selected =
43 {
44 .r = 28,
45 .g = 234,
46 .b = 79,
47 .a = 255,
48 };
49
swissChilibb478f12020-08-07 20:45:07 -070050 uint16_t disas_start = 0x600,
51 disas_end = 0x600 + 32;
52
53 uint8_t screen_scale = 4;
swissChilidbbd5402020-08-07 15:07:39 -070054
55 SDL_SetHint(SDL_HINT_VIDEO_HIGHDPI_DISABLED, "0");
56 SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_EVENTS);
57 SDL_GL_SetAttribute (SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
58 SDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
59 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
60 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
61 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
62 win = SDL_CreateWindow("6502",
63 SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
64 WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN|SDL_WINDOW_ALLOW_HIGHDPI);
65 glContext = SDL_GL_CreateContext(win);
66 SDL_GetWindowSize(win, &win_width, &win_height);
67
68 /* OpenGL setup */
69 glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
70 glewExperimental = 1;
71 if (glewInit() != GLEW_OK) {
72 fprintf(stderr, "Failed to setup GLEW\n");
73 exit(1);
74 }
75
76 ctx = nk_sdl_init(win);
77
78 struct nk_font_atlas *atlas;
79 nk_sdl_font_stash_begin(&atlas);
80 struct nk_font *font = nk_font_atlas_add_default(atlas, 16, NULL);
81 nk_sdl_font_stash_end();
82 //nk_style_load_all_cursors(ctx, atlas->cursors);
83 nk_style_set_font(ctx, &font->handle);
84
swissChilidbbd5402020-08-07 15:07:39 -070085 while (running)
86 {
87 SDL_Event evt;
88 nk_input_begin(ctx);
89 while (SDL_PollEvent(&evt))
90 {
91 if (evt.type == SDL_QUIT) goto cleanup;
92 nk_sdl_handle_event(&evt);
93 }
94 nk_input_end(ctx);
95
96 if (cpu_running && cpu->running)
97 step(cpu);
98
99 if (!cpu->running)
100 cpu_running = false;
101
swissChilibb478f12020-08-07 20:45:07 -0700102 if (nk_begin(ctx, "Registers", nk_rect(50, 300, 500, 90),
swissChilidbbd5402020-08-07 15:07:39 -0700103 NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
104 NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
105 {
106 nk_layout_row_dynamic(ctx, 30, 4);
swissChilidbbd5402020-08-07 15:07:39 -0700107 cpu->pc = nk_propertyi(ctx, "PC", 0, cpu->pc, 0xFFFF, 1, 20.0f);
108 cpu->regs[A] = nk_propertyi(ctx, "A", 0, cpu->regs[A], 0xFF, 1, 20.0f);
109 cpu->regs[X] = nk_propertyi(ctx, "X", 0, cpu->regs[X], 0xFF, 1, 20.0f);
110 cpu->regs[Y] = nk_propertyi(ctx, "Y", 0, cpu->regs[Y], 0xFF, 1, 20.0f);
111 }
112 nk_end(ctx);
113
swissChilibb478f12020-08-07 20:45:07 -0700114 if (nk_begin(ctx, "Screen", nk_rect(50, 400, 150, 220),
115 NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
116 NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
117 {
118 nk_layout_row_dynamic(ctx, 24, 1);
119 screen_scale = nk_propertyi(ctx, "Scale", 1, screen_scale, 8, 1, 1);
swissChili94ba1f52020-08-08 11:39:10 -0700120
swissChilibb478f12020-08-07 20:45:07 -0700121 nk_layout_row_static(ctx, screen_scale * 32, screen_scale * 32, 1);
122 screen(ctx, cpu->mem + CPU_FB_ADDR, screen_scale);
123 }
124 nk_end(ctx);
125
126 if (nk_begin(ctx, "Disassembler", nk_rect(330, 50, 300, 200),
swissChilic51e9222020-08-07 16:09:14 -0700127 NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
128 NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
129 {
130 nk_layout_row_dynamic(ctx, 30, 2);
131 disas_start = nk_propertyi(ctx, "Start", 0, disas_start, 0xFFFF, 1, 20.0f);
132 disas_end = nk_propertyi(ctx, "End", 0, disas_end, 0xFFFF, 1, 20.0f);
133
134 uint16_t pc = cpu->pc;
135
136 for (cpu->pc = disas_start; cpu->pc < disas_end;)
137 {
138 nk_layout_row_begin(ctx, NK_STATIC, 24, 2);
139
140 uint16_t this_pc = cpu->pc;
141
142 char addr[6];
143 sprintf(addr, "$%x", this_pc);
144
145 nk_layout_row_push(ctx, 48);
146 nk_label(ctx, addr, NK_TEXT_LEFT);
147
148 nk_layout_row_push(ctx, 120);
149 char *line = disas_step(cpu);
150 if (pc == this_pc)
151 {
152 nk_label_colored(ctx, line, NK_TEXT_LEFT, selected);
153 }
154 else
155 {
156 nk_label(ctx, line, NK_TEXT_LEFT);
157 }
158 free(line);
159 }
160
161 cpu->pc = pc;
162 }
163 nk_end(ctx);
164
swissChilidbbd5402020-08-07 15:07:39 -0700165 if (nk_begin(ctx, "Debugger", nk_rect(50, 50, 230, 150),
166 NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
167 NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
168 {
169 nk_layout_row_dynamic(ctx, 30, 2);
170 nk_label(ctx, cpu->running ? "CPU Running" : "CPU Halted", NK_TEXT_LEFT);
171 if (nk_button_label(ctx, "Reset"))
172 {
173 puts("cpu reset");
174 reset(cpu);
175 }
176
177 nk_layout_row_dynamic(ctx, 30, 2);
178 if (nk_button_label(ctx, "Step"))
179 {
180 printf("step pressed!\n");
181 step(cpu);
182 }
183
184 if (nk_button_label(ctx, cpu_running ? "Stop" : "Run"))
185 {
186 cpu_running = !cpu_running;
187 puts(cpu_running ? "cpu running" : "cpu stopped");
188 }
189 }
190 nk_end(ctx);
191
192 SDL_GetWindowSize(win, &win_width, &win_height);
193 glViewport(0, 0, win_width, win_height);
194 glClear(GL_COLOR_BUFFER_BIT);
195 glClearColor(bg.r, bg.g, bg.b, bg.a);
196 nk_sdl_render(NK_ANTI_ALIASING_ON, MAX_VERTEX_MEMORY, MAX_ELEMENT_MEMORY);
197 SDL_GL_SwapWindow(win);
198 }
199
200cleanup:
201 nk_sdl_shutdown();
202 SDL_GL_DeleteContext(glContext);
203 SDL_DestroyWindow(win);
204 SDL_Quit();
205}