__assert_func(const char *file, int line, const char *func, const char *failed_expr) { static char buf[4096]; static struct cons cons; static uint16_t blcs_color[] = { 0x80E0 /* Color green */ }; (void)snprintf(buf, 4096, "[2J[HAssertion \"%s\" failed: file \"%s\", line %d%s%s\n", failed_expr, file, line, (func ? ", function: " : ""), (func ? func : "")); /* Reset the VDP2 */ vdp2_init(); vdp2_tvmd_blcs_set(/* lcclmd = */ false, VRAM_ADDR_4MBIT(3, 0x1FFFE), blcs_color, 0); cons_vdp2_init(&cons); cons_write(&cons, buf); abort(); }
static void format(struct cpu_registers *regs, const char *exception_name) { static char buf[1024]; (void)sprintf(buf, "[1;44mException occurred:[m\n\t[1;44m%s[m\n\n" "\t r0 = 0x%08X r11 = 0x%08X\n" "\t r1 = 0x%08X r12 = 0x%08X\n" "\t r2 = 0x%08X r13 = 0x%08X\n" "\t r3 = 0x%08X r14 = 0x%08X\n" "\t r4 = 0x%08X sp = 0x%08X\n" "\t r5 = 0x%08X sr = 0x%08X\n" "\t r6 = 0x%08X gbr = 0x%08X\n" "\t r7 = 0x%08X vbr = 0x%08X\n" "\t r8 = 0x%08X mach = 0x%08X\n" "\t r9 = 0x%08X macl = 0x%08X\n" "\tr10 = 0x%08X pr = 0x%08X\n" " pc = 0x%08X\n", exception_name, (uintptr_t)regs->r[0], (uintptr_t)regs->r[11], (uintptr_t)regs->r[1], (uintptr_t)regs->r[12], (uintptr_t)regs->r[2], (uintptr_t)regs->r[13], (uintptr_t)regs->r[3], (uintptr_t)regs->r[14], (uintptr_t)regs->r[4], (uintptr_t)regs->sp, (uintptr_t)regs->r[5], (uintptr_t)regs->sr, (uintptr_t)regs->r[6], (uintptr_t)regs->gbr, (uintptr_t)regs->r[7], (uintptr_t)regs->vbr, (uintptr_t)regs->r[8], (uintptr_t)regs->mach, (uintptr_t)regs->r[9], (uintptr_t)regs->macl, (uintptr_t)regs->r[10], (uintptr_t)regs->pr, (uintptr_t)regs->pc); /* Reset the VDP1 */ vdp1_init(); /* Reset the VDP2 */ vdp2_init(); vdp2_tvmd_display_res_set(TVMD_INTERLACE_DOUBLE, TVMD_HORZ_HIRESO_A, TVMD_VERT_240); vdp2_scrn_back_screen_color_set(VRAM_ADDR_4MBIT(0, 0x01FFFE), COLOR_RGB555(0, 224, 0)); cons_init(CONS_DRIVER_VDP2, 80, 60); cons_write(buf); }
int main(void) { irq_mux_t *vblank_in; irq_mux_t *vblank_out; static uint16_t back_screen_color = { COLOR_RGB_DATA | COLOR_RGB555(0, 0, 0) }; vdp2_init(); vdp1_init(); smpc_init(); smpc_peripheral_init(); scu_dma_cpu_init(); cpu_intc_disable(); vblank_in = vdp2_tvmd_vblank_in_irq_get(); irq_mux_handle_add(vblank_in, vblank_in_handler, NULL); vblank_out = vdp2_tvmd_vblank_out_irq_get(); irq_mux_handle_add(vblank_out, vblank_out_handler, NULL); cpu_intc_enable(); init(); vdp2_tvmd_display_set(TVMD_INTERLACE_NONE, TVMD_HORZ_NORMAL_A, TVMD_VERT_240); vdp2_scrn_back_screen_color_set(VRAM_ADDR_4MBIT(3, 0x1FFFE), back_screen_color); while (true) { vdp2_tvmd_vblank_in_wait(); read_digital_pad(); vdp2_tvmd_vblank_out_wait(); } return 0; }
int main(void) { uint16_t mask; int level = DMA_LEVEL_0; irq_mux_t *vblank_in; irq_mux_t *vblank_out; irq_mux_t *hblank_out; unsigned int joyR = 0, oldjoyR = 0, joyL = 0, oldjoyL = 0, joyA = 0, oldjoyA = 0, joyB = 0, oldjoyB = 0, joyC = 0, oldjoyC = 0; unsigned int joyLeft = 0, oldjoyLeft = 0, joyRight = 0, oldjoyRight = 0, joyStart = 0, oldjoyStart = 0, joyUp = 0, oldjoyUp = 0, joyDown = 0, oldjoyDown = 0; static uint16_t back_screen_color = { COLOR_RGB_DATA | COLOR_RGB555(0, 7, 7) }; vdp2_init(); vdp1_init(); smpc_init(); smpc_peripheral_init(); scu_dma_cpu_init(); cons_init(CONS_DRIVER_VDP2); consbuf = (char *)malloc(1024); mask = IC_MASK_LEVEL_0_DMA_END | IC_MASK_LEVEL_1_DMA_END | IC_MASK_LEVEL_2_DMA_END | IC_MASK_DMA_ILLEGAL; cpu_intc_disable(); vblank_in = vdp2_tvmd_vblank_in_irq_get(); irq_mux_handle_add(vblank_in, vblank_in_handler, NULL); vblank_out = vdp2_tvmd_vblank_out_irq_get(); irq_mux_handle_add(vblank_out, vblank_out_handler, NULL); hblank_out = vdp2_tvmd_hblank_in_irq_get(); irq_mux_handle_add(hblank_out, hblank_out_handler, NULL); scu_ic_mask_chg(IC_MASK_ALL, mask); scu_ic_interrupt_set(IC_INTERRUPT_LEVEL_0_DMA_END, scu_dma_level_0_end); scu_ic_interrupt_set(IC_INTERRUPT_LEVEL_1_DMA_END, scu_dma_level_1_end); scu_ic_interrupt_set(IC_INTERRUPT_LEVEL_2_DMA_END, scu_dma_level_2_end); scu_ic_interrupt_set(IC_INTERRUPT_DMA_ILLEGAL, scu_dma_illegal); scu_ic_mask_chg(IC_MASK_ALL & ~mask, IC_MASK_NONE); cpu_intc_enable(); vdp2_tvmd_display_set(); vdp2_scrn_back_screen_color_set(VRAM_ADDR_4MBIT(3, 0x1FFFE), back_screen_color); while (true) { (void)sprintf( consbuf, "[01;2H**** SCU DMA from H-RAM to VDP1 ****[04;2HRelease Start to run, Z to quit[05;2HTo configure press:[07;2HA/B/C: SCU DMA Level 0/1/2[08;2HL/R: Mode Direct/Indirect[09;2HDown/Up/Left/Right: VBO/VBI/HBL/Bit[11;2HLevel %d State %d Mode %s Trig %d[14;2HLast exec time: %08lu HBL", level, state.st_status, (state.st_level[level].level_mode==DMA_MODE_DIRECT)?"DIR":"IND", state.st_level[level].level_sf, g_dma_counter); cons_buffer(consbuf); vdp2_tvmd_vblank_in_wait(); cons_flush(); vdp2_tvmd_vblank_out_wait(); switch (state.st_status) { case ST_STATUS_WAIT: cons_buffer("[13;2HStatus wait "); break; case ST_STATUS_ILLEGAL: state.st_begin = false; cons_buffer("[13;2HStatus illegal "); break; case ST_STATUS_END: state.st_begin = false; cons_buffer("[13;2HStatus end "); state.st_status = ST_STATUS_WAIT; break; } if (!state.st_begin) { if (g_digital.connected == 1) { joyL = g_digital.pressed.button.l; joyR = g_digital.pressed.button.r; joyStart = g_digital.released.button.start; joyA = g_digital.pressed.button.a; joyB = g_digital.pressed.button.b; joyC = g_digital.pressed.button.c; joyUp = g_digital.pressed.button.up; joyDown = g_digital.pressed.button.down; joyRight = g_digital.pressed.button.right; joyLeft = g_digital.pressed.button.left; if(joyA & !oldjoyA) level = DMA_LEVEL_0; else if (joyB & !oldjoyB) level = DMA_LEVEL_1; else if (joyC & !oldjoyC) level = DMA_LEVEL_2; else if (joyL & !oldjoyL) state.st_level[level].level_mode = DMA_MODE_DIRECT; else if (joyR & !oldjoyR) state.st_level[level].level_mode = DMA_MODE_INDIRECT; else if (joyUp & !oldjoyUp) state.st_level[level].level_sf = DMA_MODE_START_FACTOR_VBLANK_IN; else if (joyDown & !oldjoyDown) state.st_level[level].level_sf = DMA_MODE_START_FACTOR_VBLANK_OUT; else if (joyLeft & !oldjoyLeft) state.st_level[level].level_sf = DMA_MODE_START_FACTOR_HBLANK_IN; else if (joyRight & !oldjoyRight) state.st_level[level].level_sf = DMA_MODE_START_FACTOR_ENABLE; if (joyStart & !oldjoyStart) { cons_buffer("[12;2HStarted "); scu_dma_level(level); } else { cons_buffer("[12;2HNot Started "); } oldjoyR = joyR; oldjoyL = joyL; oldjoyA = joyA; oldjoyB = joyB; oldjoyC = joyC; oldjoyUp = joyUp; oldjoyDown = joyDown; oldjoyLeft = joyLeft; oldjoyRight = joyRight; oldjoyStart = joyStart; } } // exit if(g_digital.pressed.button.z) abort(); } return 0; }