diff --git a/include/arm11/console.h b/include/arm11/console.h index d956ee7..cc51c2d 100644 --- a/include/arm11/console.h +++ b/include/arm11/console.h @@ -28,9 +28,6 @@ extern "C" { #endif -#define SCREEN_TOP 1 -#define SCREEN_LOW 0 - #define CONSOLE_ESC(x) "\x1b[" #x #define CONSOLE_RESET CONSOLE_ESC(0m) #define CONSOLE_BLACK CONSOLE_ESC(30m) diff --git a/include/hardware/gfx.h b/include/hardware/gfx.h index f6bd186..4eb62c0 100644 --- a/include/hardware/gfx.h +++ b/include/hardware/gfx.h @@ -22,6 +22,9 @@ #include "types.h" +#define SCREEN_TOP (1) +#define SCREEN_SUB (0) + #define SCREEN_HEIGHT_TOP (240) #define SCREEN_WIDTH_TOP (400) #define SCREEN_SIZE_TOP (SCREEN_HEIGHT_TOP * SCREEN_WIDTH_TOP * 2) @@ -43,6 +46,17 @@ #define RGB8_to_565(r,g,b) (((b)>>3)&0x1f)|((((g)>>2)&0x3f)<<5)|((((r)>>3)&0x1f)<<11) +typedef enum +{ + GFX_EVENT_PSC0 = 0, + GFX_EVENT_PSC1 = 1, + GFX_EVENT_PDC0 = 2, + GFX_EVENT_PDC1 = 3, + GFX_EVENT_PPF = 4, + GFX_EVENT_P3D = 5 +} GfxEvent; + + #ifdef ARM11 void GX_memoryFill(u64 *buf0a, u32 buf0v, u32 buf0Sz, u32 val0, u64 *buf1a, u32 buf1v, u32 buf1Sz, u32 val1); @@ -51,6 +65,7 @@ void GFX_setBrightness(u32 brightness); void* GFX_getFramebuffer(u8 screen); void GFX_swapFramebufs(void); +void GFX_waitForEvent(GfxEvent event, bool discard); void GFX_init(void); void GFX_deinit(void); #endif diff --git a/include/mem_map.h b/include/mem_map.h index 044430e..c5fd94b 100644 --- a/include/mem_map.h +++ b/include/mem_map.h @@ -119,10 +119,10 @@ /* Custom mappings */ #ifdef ARM9 -#define A9_VECTORS_START (A9_RAM_BASE) -#define A9_VECTORS_SIZE (0x40) -#define A9_STUB_ENTRY (ITCM_KERNEL_MIRROR + ITCM_SIZE - 0x200) -#define A9_STUB_SIZE (0x200) +#define A9_VECTORS_START (A9_RAM_BASE) +#define A9_VECTORS_SIZE (0x40) +#define A9_STUB_ENTRY (ITCM_KERNEL_MIRROR + ITCM_SIZE - 0x200) +#define A9_STUB_SIZE (0x200) #define A9_HEAP_END (A9_RAM_BASE + A9_RAM_SIZE) #define A9_STACK_START (DTCM_BASE) #define A9_STACK_END (DTCM_BASE + DTCM_SIZE - 0x400) @@ -137,7 +137,7 @@ #ifdef ARM11 #define A11_MMU_TABLES_BASE (AXIWRAM_BASE) #define A11_VECTORS_START (AXIWRAM_BASE + AXIWRAM_SIZE - 0x60) -#define A11_VECTORS_SIZE (0x60) +#define A11_VECTORS_SIZE (0x60) #define A11_FALLBACK_ENTRY (AXIWRAM_BASE + AXIWRAM_SIZE - 0x4) #define A11_STUB_ENTRY (AXIWRAM_BASE + AXIWRAM_SIZE - 0x200) #define A11_STUB_SIZE (0x1A0) // Don't overwrite the vectors diff --git a/source/arm11/hardware/gfx.c b/source/arm11/hardware/gfx.c index 030c53a..e4a296a 100644 --- a/source/arm11/hardware/gfx.c +++ b/source/arm11/hardware/gfx.c @@ -53,7 +53,8 @@ #define REGs_TRANS_ENGINE ((vu32*)(GPU_EXT_REGS_BASE + 0x0C00)) -static u32 activeFb = 0; +static vu32 activeFb = 0; +static volatile bool eventTable[6] = {0}; @@ -207,13 +208,13 @@ { if(!activeFb) { - if(!screen) return (void*)FRAMEBUF_TOP_A_2; - else return (void*)FRAMEBUF_SUB_A_2; + if(screen) return (void*)FRAMEBUF_TOP_A_2; + else return (void*)FRAMEBUF_SUB_A_2; } else { - if(!screen) return (void*)FRAMEBUF_TOP_A_1; - else return (void*)FRAMEBUF_SUB_A_1; + if(screen) return (void*)FRAMEBUF_TOP_A_1; + else return (void*)FRAMEBUF_SUB_A_1; } } @@ -225,10 +226,16 @@ *((vu32*)(0x10400500+0x78)) = activeFb; } -static void vblankIrqHandler(UNUSED u32 intSource) +static void gfxIrqHandler(u32 intSource) { - GX_textureCopy((u64*)RENDERBUF_TOP, (240 * 2)>>4, - (u64*)FRAMEBUF_TOP_A_2, (240 * 2)>>4, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB); + eventTable[intSource - IRQ_PSC0] = true; +} + +void GFX_waitForEvent(GfxEvent event, bool discard) +{ + if(discard) eventTable[event] = false; + while(!eventTable[event]) waitForEvent(); + eventTable[event] = false; } void GFX_init(void) @@ -266,7 +273,11 @@ gfxSetupFramebuffers(); } - IRQ_registerHandler(IRQ_PDC0, 14, 0, true, vblankIrqHandler); + IRQ_registerHandler(IRQ_PSC0, 14, 0, true, gfxIrqHandler); + IRQ_registerHandler(IRQ_PSC1, 14, 0, true, gfxIrqHandler); + IRQ_registerHandler(IRQ_PDC0, 14, 0, true, gfxIrqHandler); + IRQ_registerHandler(IRQ_PPF, 14, 0, true, gfxIrqHandler); + IRQ_registerHandler(IRQ_P3D, 14, 0, true, gfxIrqHandler); GFX_swapFramebufs(); REG_LCD_COLORFILL_MAIN = 0; diff --git a/source/arm11/menu.c b/source/arm11/menu.c index 14239d0..e229fe4 100644 --- a/source/arm11/menu.c +++ b/source/arm11/menu.c @@ -16,18 +16,20 @@ * along with this program. If not, see . */ - #include +#include #include "types.h" #include "arm11/menu.h" #include "arm11/hardware/hid.h" #include "arm11/console.h" #include "arm11/fmt.h" +#include "hardware/gfx.h" + void menuShowDesc(MenuInfo* curr_menu, PrintConsole* desc_con, u32 index, bool clear) { MenuEntry* entry = &(curr_menu->entries[index]); - char* desc = entry->desc; + char* desc = entry->desc; // select and clear description console consoleSelect(desc_con); @@ -58,10 +60,10 @@ */ void menuDraw(MenuInfo* curr_menu, PrintConsole* menu_con, u32 index, bool clear, bool is_sub_menu) { - const u32 menu_block_height = curr_menu->n_entries + 5; + const u32 menu_block_height = curr_menu->n_entries + 5; int menu_x = (menu_con->consoleWidth - MENU_WIDTH) >> 1; int menu_y = (menu_con->consoleHeight - menu_block_height) >> 1; - + // select and clear menu console consoleSelect(menu_con); if (clear) consoleClear(); @@ -78,12 +80,12 @@ for (u32 i = 0; i < curr_menu->n_entries; i++) { MenuEntry* entry = &(curr_menu->entries[i]); - char* name = entry->name; + char* name = entry->name; bool is_selected = (i == index); consoleSetCursor(menu_con, menu_x, menu_y++); ee_printf(is_selected ? "[%s]" : " %s ", name); - } + } // second separator consoleSetCursor(menu_con, menu_x, menu_y++); @@ -108,89 +110,95 @@ */ u32 menuProcess(MenuInfo* info) { - MenuInfo* curr_menu = info; - MenuInfo* prev_menu[MENU_MAX_DEPTH]; - u32 prev_index[MENU_MAX_DEPTH]; - u32 menu_lvl = 0; - u32 index = 0; - u32 result = MENU_EXIT_REBOOT; - + MenuInfo* curr_menu = info; + MenuInfo* prev_menu[MENU_MAX_DEPTH]; + u32 prev_index[MENU_MAX_DEPTH]; + u32 menu_lvl = 0; + u32 index = 0; + u32 result = MENU_EXIT_REBOOT; + // init menu console PrintConsole menu_con; consoleInit(SCREEN_TOP, &menu_con, true); // init description console PrintConsole desc_con; - consoleInit(SCREEN_LOW, &desc_con, true); + consoleInit(SCREEN_SUB, &desc_con, true); // draw menu & description for the first time - menuDraw(curr_menu, &menu_con, 0, false, true); + menuDraw(curr_menu, &menu_con, 0, false, true); menuShowDesc(curr_menu, &desc_con, 0, true); - - // main menu processing loop - while (true) { + + // main menu processing loop + while (true) { hidScanInput(); const u32 kDown = hidKeysDown(); const u32 kHeld = hidKeysHeld(); bool redraw_menu = false; bool redraw_desc = false; - if ((kDown & KEY_A) && (curr_menu->entries[index].function == NULL)) + if ((kDown & KEY_A) && (curr_menu->entries[index].function == NULL)) { // store previous menu and index for return - if (menu_lvl < MENU_MAX_DEPTH) + if (menu_lvl < MENU_MAX_DEPTH) { - prev_menu[menu_lvl] = curr_menu; - prev_index[menu_lvl] = index; - menu_lvl++; - } + prev_menu[menu_lvl] = curr_menu; + prev_index[menu_lvl] = index; + menu_lvl++; + } // enter submenu - curr_menu = info + curr_menu->entries[index].param; - index = 0; + curr_menu = info + curr_menu->entries[index].param; + index = 0; // menu & desc redraw redraw_desc = redraw_menu = true; - } + } else if (kDown & KEY_A) { // call menu entry function MenuEntry* entry = &(curr_menu->entries[index]); - (*(entry->function))(entry->param); + (*(entry->function))(entry->param); // menu redraw redraw_menu = true; - } + } else if ((kDown & KEY_B) && (menu_lvl > 0)) { // return to previous menu - menu_lvl--; - curr_menu = prev_menu[menu_lvl]; - index = prev_index[menu_lvl]; + menu_lvl--; + curr_menu = prev_menu[menu_lvl]; + index = prev_index[menu_lvl]; // menu & desc redraw redraw_desc = redraw_menu = true; - } + } else if (kDown & KEY_DDOWN) { // cursor down - index = (index == curr_menu->n_entries - 1) ? 0 : index + 1; + index = (index == curr_menu->n_entries - 1) ? 0 : index + 1; // description redraw redraw_desc = true; - } + } else if (kDown & KEY_DUP) { // cursor up - index = (index == 0) ? curr_menu->n_entries - 1 : index - 1; + index = (index == 0) ? curr_menu->n_entries - 1 : index - 1; // description redraw redraw_desc = true; - } - if (kDown & KEY_START) + } + if (kDown & KEY_START) { - result = (kHeld & KEY_DLEFT) ? MENU_EXIT_POWEROFF : MENU_EXIT_REBOOT; - break; - } - + result = (kHeld & KEY_DLEFT) ? MENU_EXIT_POWEROFF : MENU_EXIT_REBOOT; + break; + } + // update menu and description - menuDraw(curr_menu, &menu_con, index, redraw_menu, menu_lvl); + menuDraw(curr_menu, &menu_con, index, redraw_menu, menu_lvl); menuShowDesc(curr_menu, &desc_con, index, redraw_desc); - } - - return result; + + + GX_textureCopy((u64*)RENDERBUF_TOP, (240 * 2)>>4, (u64*)GFX_getFramebuffer(SCREEN_TOP), + (240 * 2)>>4, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB); + GFX_swapFramebufs(); + GFX_waitForEvent(GFX_EVENT_PDC0, true); // VBlank + } + + return result; }