debug menu unified, more debug tools
[picodrive.git] / platform / common / menu.c
index 359517a..2775859 100644 (file)
 #include "fonts.h"\r
 #include "readpng.h"\r
 #include "lprintf.h"\r
+#include "common.h"\r
+#include "emu.h"\r
 \r
-#if   defined(__GP2X__)\r
- #include "../gp2x/gp2x.h"\r
- #define SCREEN_WIDTH 320\r
- #define SCREEN_BUFFER gp2x_screen\r
-#elif defined(__GIZ__)\r
- //#include "../gizmondo/giz.h"\r
- #define SCREEN_WIDTH 321\r
- #define SCREEN_BUFFER menu_screen\r
- extern unsigned char *menu_screen;\r
-#elif defined(PSP)\r
- #include "../psp/psp.h"\r
- #define SCREEN_WIDTH 512\r
- #define SCREEN_BUFFER psp_screen\r
-#endif\r
 \r
 char menuErrorMsg[64] = { 0, };\r
 \r
@@ -362,3 +350,111 @@ const char *me_region_name(unsigned int code, int auto_order)
        }\r
 }\r
 \r
+// ------------ debug menu ------------\r
+\r
+#include <sys/stat.h>\r
+#include <sys/types.h>\r
+\r
+#include <Pico/Pico.h>\r
+#include <Pico/Debug.h>\r
+\r
+void SekStepM68k(void);\r
+\r
+static void draw_text_debug(const char *str, int skip, int from)\r
+{\r
+       const char *p;\r
+       int len, line;\r
+\r
+       p = str;\r
+       while (skip-- > 0)\r
+       {\r
+               while (*p && *p != '\n') p++;\r
+               if (*p == 0 || p[1] == 0) return;\r
+               p++;\r
+       }\r
+\r
+       str = p;\r
+       for (line = from; line < SCREEN_HEIGHT/10; line++)\r
+       {\r
+               while (*p && *p != '\n') p++;\r
+               len = p - str;\r
+               if (len > 55) len = 55;\r
+               smalltext_out16_lim(1, line*10, str, 0xffff, len);\r
+               if (*p == 0) break;\r
+               p++; str = p;\r
+       }\r
+}\r
+\r
+static void draw_frame_debug(void)\r
+{\r
+       char layer_str[48] = "layers:             ";\r
+       if (PicoDrawMask & PDRAW_LAYERB_ON)      memcpy(layer_str +  8, "B", 1);\r
+       if (PicoDrawMask & PDRAW_LAYERA_ON)      memcpy(layer_str + 10, "A", 1);\r
+       if (PicoDrawMask & PDRAW_SPRITES_LOW_ON) memcpy(layer_str + 12, "spr_lo", 6);\r
+       if (PicoDrawMask & PDRAW_SPRITES_HI_ON)  memcpy(layer_str + 19, "spr_hi", 6);\r
+\r
+       clear_screen();\r
+       emu_forcedFrame(0);\r
+       smalltext_out16(4, SCREEN_HEIGHT-8, layer_str, 0xffff);\r
+}\r
+\r
+void debug_menu_loop(void)\r
+{\r
+       int inp, mode = 0;\r
+       int spr_offs = 0, dumped = 0;\r
+\r
+       while (1)\r
+       {\r
+               switch (mode)\r
+               {\r
+                       case 0: menu_draw_begin();\r
+                               draw_text_debug(PDebugMain(), 0, 0);\r
+                               if (dumped) {\r
+                                       smalltext_out16(SCREEN_WIDTH-6*10, SCREEN_HEIGHT-8, "dumped", 0xffff);\r
+                                       dumped = 0;\r
+                               }\r
+                               break;\r
+                       case 1: draw_frame_debug(); break;\r
+                       case 2: clear_screen();\r
+                               emu_forcedFrame(0);\r
+                               darken_screen();\r
+                               PDebugShowSpriteStats(SCREEN_BUFFER, SCREEN_WIDTH); break;\r
+                       case 3: clear_screen();\r
+                               PDebugShowPalette(SCREEN_BUFFER, SCREEN_WIDTH);\r
+                               PDebugShowSprite((unsigned short *)SCREEN_BUFFER + SCREEN_WIDTH*120+SCREEN_WIDTH/2+16,\r
+                                       SCREEN_WIDTH, spr_offs);\r
+                               draw_text_debug(PDebugSpriteList(), spr_offs, 6);\r
+                               break;\r
+               }\r
+               menu_draw_end();\r
+\r
+               inp = read_buttons(BTN_EAST|BTN_SOUTH|BTN_WEST|BTN_L|BTN_R|BTN_UP|BTN_DOWN|BTN_LEFT|BTN_RIGHT);\r
+               if (inp & BTN_SOUTH) return;\r
+               if (inp & BTN_L) { mode--; if (mode < 0) mode = 3; }\r
+               if (inp & BTN_R) { mode++; if (mode > 3) mode = 0; }\r
+               switch (mode)\r
+               {\r
+                       case 0:\r
+                               if (inp & BTN_EAST) SekStepM68k();\r
+                               if ((inp & (BTN_WEST|BTN_LEFT)) == (BTN_WEST|BTN_LEFT)) {\r
+                                       mkdir("dumps", 0777);\r
+                                       PDebugDumpMem();\r
+                                       dumped = 1;\r
+                               }\r
+                               break;\r
+                       case 1:\r
+                               if (inp & BTN_LEFT)  PicoDrawMask ^= PDRAW_LAYERB_ON;\r
+                               if (inp & BTN_RIGHT) PicoDrawMask ^= PDRAW_LAYERA_ON;\r
+                               if (inp & BTN_DOWN)  PicoDrawMask ^= PDRAW_SPRITES_LOW_ON;\r
+                               if (inp & BTN_UP)    PicoDrawMask ^= PDRAW_SPRITES_HI_ON;\r
+                               break;\r
+                       case 3:\r
+                               if (inp & BTN_DOWN)  spr_offs++;\r
+                               if (inp & BTN_UP)    spr_offs--;\r
+                               if (spr_offs < 0) spr_offs = 0;\r
+                               break;\r
+               }\r
+       }\r
+}\r
+\r
+\r