diff --git a/assets-fx/img/opt_gint_spuram.png b/assets-fx/img/opt_gint_spuram.png new file mode 100644 index 0000000..3878f43 Binary files /dev/null and b/assets-fx/img/opt_gint_spuram.png differ diff --git a/src/gint/spuram.c b/src/gint/spuram.c index 7065d48..6a7a0d7 100644 --- a/src/gint/spuram.c +++ b/src/gint/spuram.c @@ -40,6 +40,54 @@ static void restore(volatile uint32_t *area, uint32_t *save, int pages) } } +#ifdef FX9860G +static void render_header(int y, int bank_count) +{ + y = 9 + 6*y; + dtext( 1, 9, C_BLACK, "Area"); + dtext(24, 9, C_BLACK, "Address"); + dtext(60, 9, C_BLACK, "Visible pages"); +} + +static void render_area(int y, char const *name, uint32_t *area) +{ + y = 9 + 6*y; + dprint( 1, y, C_BLACK, "%s", name); + dprint(24, y, C_BLACK, "%08X", (uint32_t)area); + + int b = 0, bank = 0; + while(1) + { + bank = bank_number(area); + if(b == 7) break; + + dprint(60+8*b, y, C_BLACK, bank >= 0 ? "%d" : "-", bank); + area += 0x2000; + b++; + } +} + +static void render_bank(int y, char const *name, volatile uint32_t *bank, + int banks, int dsp, int focus) +{ + y = 9 + 6*y; + dprint( 1, y, C_BLACK, "%s", name); + dprint(29, y, C_BLACK, "=%02X", *bank); + + for(int b = 0; b < banks; b++) + { + int active = *bank & (1 << b); + + int x = 50 + 8*b - 1; + int ry = y + (dsp==0) - 1; + + int fill = active ? C_BLACK : C_WHITE; + int border = (focus == b) ? C_BLACK : C_WHITE; + drect_border(x, ry, x+7, ry+5, fill, 1, border); + } +} +#endif + #ifdef FXCG50 static void render_header(int y, int bank_count) { @@ -118,10 +166,47 @@ void gintctl_gint_spuram(void) int cur_bank = 0; int cur_page = 0; + #ifdef FX9860G + int tab = 0; + #endif + while(key != KEY_EXIT) { dclear(C_WHITE); + #ifdef FX9860G + row_title("SPU memory banking"); + + extern font_t font_hexa; + font_t *old_font = dfont(&font_hexa); + + if(tab == 0) + { + render_header(0, 7); + render_area(1, "PRAM0", PRAM0); + render_area(2, "XRAM0", XRAM0); + render_area(3, "YRAM0", YRAM0); + render_area(4, "PRAM1", PRAM1); + render_area(5, "XRAM1", XRAM1); + render_area(6, "YRAM1", YRAM1); + } + else if(tab == 1) + { + render_bank(1, "PBANKC0", &SPU.PBANKC0, 5, 0, + (cur_bank == 0) ? cur_page : -1); + render_bank(2, "PBANKC1", &SPU.PBANKC1, 5, 1, + (cur_bank == 0) ? cur_page : -1); + render_bank(4, "XBANKC0", &SPU.XBANKC0, 7, 0, + (cur_bank == 1) ? cur_page : -1); + render_bank(5, "XBANKC1", &SPU.XBANKC1, 7, 1, + (cur_bank == 1) ? cur_page : -1); + } + + dfont(old_font); + extern bopti_image_t img_opt_gint_spuram; + dimage(0, 56, &img_opt_gint_spuram); + #endif + #ifdef FXCG50 row_title("SPU memory: PRAM0, XRAM0, YRAM0, YRAM"); row_print(1, 1, "Pages layout in memory (offsets in kiB):"); @@ -159,16 +244,21 @@ void gintctl_gint_spuram(void) if(key == KEY_DOWN && cur_bank == 0) cur_bank++; - if(key == KEY_F1 && cur_bank == 0) + if(key == KEY_F1 && cur_bank == 0 && _(tab == 1, 1)) { SPU.PBANKC0 ^= (1 << cur_page); SPU.PBANKC1 ^= (1 << cur_page); } - if(key == KEY_F1 && cur_bank == 1) + if(key == KEY_F1 && cur_bank == 1 && _(tab == 1, 1)) { SPU.XBANKC0 ^= (1 << cur_page); SPU.XBANKC1 ^= (1 << cur_page); } + + #ifdef FX9860G + if(key == KEY_F2) tab = 0; + if(key == KEY_F3) tab = 1; + #endif } /* Restore the values we saved before altering page data */ diff --git a/src/gintctl.c b/src/gintctl.c index 6f8ac0d..3cd5f08 100644 --- a/src/gintctl.c +++ b/src/gintctl.c @@ -37,8 +37,8 @@ struct menu menu_gint = { { "RAM discovery", gintctl_gint_ram, MENU_SH4_ONLY }, #ifdef FXCG50 { "DSP processors", gintctl_gint_dsp, 0 }, - { "SPU memory", gintctl_gint_spuram, MENU_SH4_ONLY }, #endif + { "SPU memory", gintctl_gint_spuram, MENU_SH4_ONLY }, { "Memory dump", gintctl_gint_dump, 0 }, { "Switching to OS", gintctl_gint_switch, 0 }, { "TLB management", gintctl_gint_tlb, 0 }, diff --git a/src/regs/regs.c b/src/regs/regs.c index 2f74e91..51ff63d 100644 --- a/src/regs/regs.c +++ b/src/regs/regs.c @@ -1,5 +1,7 @@ #include #include +#include +#include #include #include #include @@ -58,9 +60,14 @@ void gintctl_regs(void) dclear(C_WHITE); row_title("Register browser"); - row_print(2, 1, "RAMCR: %08x", *(uint32_t *)0xff000074); - row_print(3, 1, "SAR0: %08x", *(uint32_t *)0xfe008020); - row_print(4, 1, "CHCR0: %08x", *(uint32_t *)0xfe00802c); + row_print(2, 1, "%08X %08X", + SH7305_POWER.MSTPCR0.lword, + SH7305_POWER.MSTPCR2.lword); + row_print(3, 1, "%08X %08x", + SH7305_CPG.FSICLKCR.lword, + SH7305_CPG.SPUCLKCR.lword); + row_print(4, 1, "%08X", + *(volatile uint32_t *)0xff000074); dupdate(); getkey();