Browse code

Returned the on-screen debugger

neauoire authored on 08/08/2023 17:27:41
Showing 3 changed files
... ...
@@ -24,7 +24,7 @@ static Uint8 blending[4][16] = {
24 24
 	{1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1},
25 25
 	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2}};
26 26
 
27
-static void
27
+void
28 28
 screen_change(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2)
29 29
 {
30 30
 	if(x1 > uxn_screen.width && x2 > x1) return;
... ...
@@ -129,6 +129,41 @@ screen_redraw(void)
129 129
 	uxn_screen.x1 = uxn_screen.y1 = uxn_screen.x2 = uxn_screen.y2 = 0;
130 130
 }
131 131
 
132
+/* clang-format off */
133
+
134
+Uint8 icons[] = {
135
+	0x00, 0x7c, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 
136
+	0x10, 0x00, 0x7c, 0x82, 0x02, 0x7c, 0x80, 0x80, 0xfe, 0x00, 0x7c, 0x82, 0x02, 0x1c, 0x02, 
137
+	0x82, 0x7c, 0x00, 0x0c, 0x14, 0x24, 0x44, 0x84, 0xfe, 0x04, 0x00, 0xfe, 0x80, 0x80, 0x7c, 
138
+	0x02, 0x82, 0x7c, 0x00, 0x7c, 0x82, 0x80, 0xfc, 0x82, 0x82, 0x7c, 0x00, 0x7c, 0x82, 0x02, 
139
+	0x1e, 0x02, 0x02, 0x02, 0x00, 0x7c, 0x82, 0x82, 0x7c, 0x82, 0x82, 0x7c, 0x00, 0x7c, 0x82, 
140
+	0x82, 0x7e, 0x02, 0x82, 0x7c, 0x00, 0x7c, 0x82, 0x02, 0x7e, 0x82, 0x82, 0x7e, 0x00, 0xfc, 
141
+	0x82, 0x82, 0xfc, 0x82, 0x82, 0xfc, 0x00, 0x7c, 0x82, 0x80, 0x80, 0x80, 0x82, 0x7c, 0x00, 
142
+	0xfc, 0x82, 0x82, 0x82, 0x82, 0x82, 0xfc, 0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x82, 0x7c,
143
+	0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x80, 0x80};
144
+
145
+/* clang-format on */
146
+
147
+void
148
+draw_byte(Uint8 v, Uint16 x, Uint16 y, Uint8 color)
149
+{
150
+	screen_blit(uxn_screen.fg, icons, v >> 4 << 3, x, y, color, 0, 0, 0);
151
+	screen_blit(uxn_screen.fg, icons, (v & 0xf) << 3, x + 8, y, color, 0, 0, 0);
152
+}
153
+
154
+void
155
+screen_debugger(Uxn *u)
156
+{
157
+	int i;
158
+	for(i = 0; i < u->wst.ptr + 1; i++)
159
+		draw_byte(u->wst.dat[i], i * 0x18 + 0x8, uxn_screen.height - 0x18, 0x2);
160
+	for(i = 0; i < u->rst.ptr + 1; i++)
161
+		draw_byte(u->rst.dat[i], i * 0x18 + 0x8, uxn_screen.height - 0x10, 0x3);
162
+	for(i = 0; i < 0x40; i++) {
163
+		draw_byte(u->ram[i], (i & 0x7) * 0x18 + 0x8, ((i >> 3) << 3) + 0x8, 0x2 + !!u->ram[i]);
164
+	}
165
+}
166
+
132 167
 Uint8
133 168
 screen_dei(Uxn *u, Uint8 addr)
134 169
 {
... ...
@@ -21,6 +21,8 @@ extern int emu_resize(int width, int height);
21 21
 
22 22
 void screen_palette(Uint8 *addr);
23 23
 void screen_resize(Uint16 width, Uint16 height);
24
+void screen_change(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2);
24 25
 void screen_redraw(void);
26
+void screen_debugger(Uxn *u);
25 27
 Uint8 screen_dei(Uxn *u, Uint8 addr);
26 28
 void screen_deo(Uint8 *ram, Uint8 *d, Uint8 port);
... ...
@@ -208,9 +208,14 @@ emu_resize(int width, int height)
208 208
 }
209 209
 
210 210
 static void
211
-emu_redraw(void)
211
+emu_redraw(Uxn *u)
212 212
 {
213
-	screen_redraw();
213
+	if(u->dev[0x0e]) {
214
+		screen_change(0, 0, uxn_screen.width, uxn_screen.height);
215
+		screen_redraw();
216
+		screen_debugger(u);
217
+	} else
218
+		screen_redraw();
214 219
 	if(SDL_UpdateTexture(emu_texture, NULL, uxn_screen.pixels, uxn_screen.width * sizeof(Uint32)) != 0)
215 220
 		system_error("SDL_UpdateTexture", SDL_GetError());
216 221
 	SDL_RenderClear(emu_renderer);
... ...
@@ -362,7 +367,7 @@ handle_events(Uxn *u)
362 367
 		if(event.type == SDL_QUIT)
363 368
 			return 0;
364 369
 		else if(event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_EXPOSED)
365
-			emu_redraw();
370
+			emu_redraw(u);
366 371
 		else if(event.type == SDL_DROPFILE) {
367 372
 			screen_resize(WIDTH, HEIGHT);
368 373
 			emu_start(u, event.drop.file, 0);
... ...
@@ -392,7 +397,7 @@ handle_events(Uxn *u)
392 397
 			else if(event.key.keysym.sym == SDLK_F1)
393 398
 				set_zoom(zoom == 3 ? 1 : zoom + 1, 1);
394 399
 			else if(event.key.keysym.sym == SDLK_F2)
395
-				system_inspect(u);
400
+				u->dev[0x0e] = !u->dev[0x0e];
396 401
 			else if(event.key.keysym.sym == SDLK_F3)
397 402
 				capture_screen();
398 403
 			else if(event.key.keysym.sym == SDLK_F4)
... ...
@@ -484,7 +489,7 @@ run(Uxn *u, char *rom)
484 489
 			next_refresh = now + frame_interval;
485 490
 			uxn_eval(u, screen_vector);
486 491
 			if(uxn_screen.x2)
487
-				emu_redraw();
492
+				emu_redraw(u);
488 493
 		}
489 494
 		if(screen_vector || uxn_screen.x2) {
490 495
 			Uint64 delay_ms = (next_refresh - now) / ms_interval;