12 uint16_t vblperf_color[] = {
13 /* white white grn blue cyan yellow orng red purple d.green white ... */
14 /* 60 30 20 15 12 10 8.5 7.5 6.6 6 5.4 ... */
15 0xffff, 0xffff, 0x3e0, 0xf863, 0xffc0, 0x3ff, 0x1ff, 0x001f, 0xf81f, 0x1e0, 0xffff, 0xffff, 0xffff
18 void vblperf_setcolor(int palidx)
20 vblperf_palptr = gba_bgpal + palidx;
26 uint32_t panic_regs[16];
27 void get_panic_regs(void);
29 void panic(void *pc, const char *fmt, ...)
38 REG_DISPCNT = 4 | DISPCNT_BG2;
41 glyphfb = (void*)VRAM_LFB_FB0_ADDR;
43 set_bg_color(0, 31, 0, 0);
44 set_bg_color(0xff, 31, 31, 31);
46 fillblock_16byte((void*)VRAM_LFB_FB0_ADDR, 0, 240 * 160 / 16);
48 fillblock_16byte((unsigned char*)VRAM_LFB_FB0_ADDR + 240 * 3, 0xffffffff, 240 / 16);
49 dbg_drawstr(44, 0, " Panic at %p ", pc);
52 y = dbg_vdrawstr(0, 12, fmt, ap) + 8;
55 fillblock_16byte((unsigned char*)VRAM_LFB_FB0_ADDR + 240 * (y + 4), 0xffffffff, 240 / 16);
59 y = dbg_drawstr(0, y, " r0 %08x r1 %08x\n r2 %08x r3 %08x\n r4 %08x r5 %08x\n r6 %08x r7 %08x\n",
60 reg[0], reg[1], reg[2], reg[3], reg[4], reg[5], reg[6], reg[7]);
61 y = dbg_drawstr(0, y, " r8 %08x r9 %08x\nr10 %08x r11 %08x\n ip %08x sp %08x\n lr %08x pc %08x\n",
62 reg[8], reg[9], reg[10], reg[11], reg[12], reg[13], reg[14], reg[15]);
64 /* stop any sound/music playback */
65 REG_SOUNDCNT_H = SCNT_DSA_CLRFIFO | SCNT_DSB_CLRFIFO;
66 REG_TMCNT_H(1) &= ~TMCNT_EN;
73 #else /* non-GBA build */
75 void panic(void *pc, const char *fmt, ...)
79 fputs("~~~ PANIC ~~~\n", stderr);
81 vfprintf(stderr, fmt, ap);
90 int glyphcolor = 0xff;
92 void *glyphfb = (void*)VRAM_LFB_FB0_ADDR;
94 void dbg_drawglyph(int x, int y, int c)
99 uint16_t *ptr = (uint16_t*)glyphfb + (y << 7) - (y << 3) + (x >> 1);
100 unsigned char *fnt = font_8x8 + ((c & 0xff) << 3);
104 pp = row & 0x80 ? glyphcolor : glyphbg;
105 *ptr++ = pp | ((row & 0x40 ? glyphcolor : glyphbg) << 8);
106 pp = row & 0x20 ? glyphcolor : glyphbg;
107 *ptr++ = pp | ((row & 0x10 ? glyphcolor : glyphbg) << 8);
108 pp = row & 0x08 ? glyphcolor : glyphbg;
109 *ptr++ = pp | ((row & 0x04 ? glyphcolor : glyphbg) << 8);
110 pp = row & 0x02 ? glyphcolor : glyphbg;
111 *ptr++ = pp | ((row & 0x01 ? glyphcolor : glyphbg) << 8);
116 int dbg_vdrawstr(int x, int y, const char *fmt, va_list ap)
122 vsnprintf(buf, sizeof buf, fmt, ap);
137 dbg_drawglyph(x, y, c);
140 while(*ptr && isspace(*ptr)) ptr++;
150 int dbg_drawstr(int x, int y, const char *fmt, ...)
156 res = dbg_vdrawstr(x, y, fmt, ap);
164 #define REG_DBG_ENABLE REG16(0xfff780)
165 #define REG_DBG_FLAGS REG16(0xfff700)
166 #define REG_DBG_STR REG8(0xfff600)
168 /*__attribute__((target("arm")))*/
169 void emuprint(const char *fmt, ...)
176 REG_DBG_ENABLE = 0xc0de;
177 if(REG_DBG_ENABLE != 0x1dea) {
184 vsnprintf(buf, sizeof buf, fmt, ap);
187 strcpy((char*)0x4fff600, buf);
188 REG_DBG_FLAGS = 0x104; /* debug message */
200 void emuprint(const char *fmt, ...)
205 #else /* non-GBA build */
207 void emuprint(const char *fmt, ...)
212 vfprintf(stdout, fmt, ap);