9 uint16_t vblperf_color[] = {
10 /* grn blue cyan yellow orng red purple d.green purple ... */
11 /* 60 30 20 15 12 10 8.5 7.5 ... */
12 0x3e0, 0xf863, 0xffc0, 0x3ff, 0x1ff, 0x001f, 0xf81f, 0x1e0, 0xf81f, 0xf81f, 0xf81f
15 static void vblperf_intr(void)
20 void vblperf_start(int palidx)
22 vblperf_palptr = (uint16_t*)CRAM_BG_ADDR + palidx;
24 REG_DISPSTAT |= DISPSTAT_IEN_VBLANK;
25 interrupt(INTR_VBLANK, vblperf_intr);
30 void vblperf_stop(void)
33 REG_DISPSTAT &= ~DISPSTAT_IEN_VBLANK;
34 interrupt(INTR_VBLANK, 0);
39 uint32_t panic_regs[16];
40 void get_panic_regs(void);
42 void panic(uint32_t pc, const char *fmt, ...)
51 REG_DISPCNT = 4 | DISPCNT_BG2;
53 set_bg_color(0, 31, 0, 0);
54 set_bg_color(0xff, 31, 31, 31);
56 fillblock_16byte((void*)VRAM_LFB_FB0_ADDR, 0, 240 * 160 / 16);
58 fillblock_16byte((unsigned char*)VRAM_LFB_FB0_ADDR + 240 * 3, 0xffffffff, 240 / 16);
59 dbg_drawstr(44, 0, " Panic at %08x ", pc);
62 y = dbg_vdrawstr(0, 12, fmt, ap) + 8;
65 fillblock_16byte((unsigned char*)VRAM_LFB_FB0_ADDR + 240 * (y + 4), 0xffffffff, 240 / 16);
69 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",
70 reg[0], reg[1], reg[2], reg[3], reg[4], reg[5], reg[6], reg[7]);
71 y = dbg_drawstr(0, y, " r8 %08x r9 %08x\nr10 %08x r11 %08x\n ip %08x sp %08x\n lr %08x pc %08x\n",
72 reg[8], reg[9], reg[10], reg[11], reg[12], reg[13], reg[14], reg[15]);
77 void dbg_drawglyph(int x, int y, int c)
82 uint16_t *ptr = (uint16_t*)VRAM_LFB_FB0_ADDR + (y << 7) - (y << 3) + (x >> 1);
83 unsigned char *fnt = font_8x8 + ((c & 0xff) << 3);
87 pp = row & 0x80 ? 0xff : 0;
88 *ptr++ = pp | (row & 0x40 ? 0xff00 : 0);
89 pp = row & 0x20 ? 0xff : 0;
90 *ptr++ = pp | (row & 0x10 ? 0xff00 : 0);
91 pp = row & 0x08 ? 0xff : 0;
92 *ptr++ = pp | (row & 0x04 ? 0xff00 : 0);
93 pp = row & 0x02 ? 0xff : 0;
94 *ptr++ = pp | (row & 0x01 ? 0xff00 : 0);
99 int dbg_vdrawstr(int x, int y, const char *fmt, va_list ap)
105 vsnprintf(buf, sizeof buf, fmt, ap);
120 dbg_drawglyph(x, y, c);
123 while(*ptr && isspace(*ptr)) ptr++;
133 int dbg_drawstr(int x, int y, const char *fmt, ...)
139 res = dbg_vdrawstr(x, y, fmt, ap);
145 __attribute__((target("arm")))
146 void emuprint(const char *fmt, ...)
152 vsnprintf(buf, sizeof buf, fmt, ap);
163 void emuprint(const char *fmt, ...)