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;
}