121 lines
2.6 KiB
C
121 lines
2.6 KiB
C
#include <kernel/devices/ubc.h>
|
|
#include <kernel/devices/display.h>
|
|
#include <kernel/hardware/ubc.h>
|
|
#include <kernel/keybios.h>
|
|
#include <lib/display.h>
|
|
|
|
// Menu string format.
|
|
const char *content_string[] = {
|
|
"!!!! UBC INTERRUPT !!!!",
|
|
"Special registers:",
|
|
"SPC = %p",
|
|
"Stack = %p",
|
|
"SSR = %#x",
|
|
"\n",
|
|
"Generale registers:",
|
|
"r0 = %#x",
|
|
"r1 = %#x",
|
|
"r2 = %#x",
|
|
"r3 = %#x",
|
|
"r4 = %#x",
|
|
"r5 = %#x",
|
|
"r6 = %#x",
|
|
"r7 = %#x",
|
|
"r8 = %#x",
|
|
"r9 = %#x",
|
|
"r10 = %#x",
|
|
"r11 = %#x",
|
|
"r12 = %#x",
|
|
"r13 = %#x",
|
|
"r14 = %#x",
|
|
"r15 = %#x",
|
|
"\n",
|
|
"Debug informations:",
|
|
"context = %p",
|
|
"UBC interrupt = %#x",
|
|
"Channel = %#x",
|
|
NULL
|
|
};
|
|
|
|
//
|
|
// cursor_update - Update cursor position key pressed based.
|
|
// @note:
|
|
// Some limits are hard coded so be careful.
|
|
//
|
|
static void cursor_update(ubc_session_t *session)
|
|
{
|
|
if (session->key == KEY_CTRL_UP &&
|
|
session->menu.context.cursor > 0)
|
|
{
|
|
session->menu.context.cursor = session->menu.context.cursor - 1;
|
|
return;
|
|
}
|
|
if (session->key == KEY_CTRL_DOWN &&
|
|
session->menu.context.cursor < 28 - DISPLAY_VCHAR_MAX)
|
|
{
|
|
session->menu.context.cursor = session->menu.context.cursor + 1;
|
|
return;
|
|
}
|
|
}
|
|
|
|
//
|
|
// menu_context - Show programe context.
|
|
// @note:
|
|
// This is not the best way to do the job,
|
|
// but for now the goal is the create a fonctionnal
|
|
// on-calc debugger.
|
|
//
|
|
void menu_context(ubc_session_t *session)
|
|
{
|
|
// Menu string data
|
|
uint32_t content_data[] = {
|
|
0,
|
|
0,
|
|
session->context->spc,
|
|
session->context->reg[15],
|
|
session->context->ssr,
|
|
0,
|
|
0,
|
|
session->context->reg[0],
|
|
session->context->reg[1],
|
|
session->context->reg[2],
|
|
session->context->reg[3],
|
|
session->context->reg[4],
|
|
session->context->reg[5],
|
|
session->context->reg[6],
|
|
session->context->reg[7],
|
|
session->context->reg[8],
|
|
session->context->reg[9],
|
|
session->context->reg[10],
|
|
session->context->reg[11],
|
|
session->context->reg[12],
|
|
session->context->reg[13],
|
|
session->context->reg[14],
|
|
session->context->reg[15],
|
|
0,
|
|
0,
|
|
(uint32_t)session->context,
|
|
SH7305_UBC.CCMFR.LONG_WORD,
|
|
session->channel
|
|
};
|
|
|
|
// Update cursor position.
|
|
cursor_update(session);
|
|
|
|
// Clear VRAM.
|
|
dclear();
|
|
|
|
// Display menu based on cursor position.
|
|
for (int i = 0 ; content_string[i + session->menu.context.cursor] != NULL &&
|
|
i < DISPLAY_VCHAR_MAX ; i = i + 1)
|
|
{
|
|
dprint(0, i,
|
|
content_string[i + session->menu.context.cursor],
|
|
content_data[i + session->menu.context.cursor]
|
|
);
|
|
}
|
|
|
|
// Display VRAM
|
|
dupdate();
|
|
}
|