Vhex-kernel/src/kernel/dbr/handler.c

58 lines
1.4 KiB
C

#include <kernel/devices/ubc.h>
#include <kernel/hardware/ubc.h>
#include <kernel/keybios.h>
#include <kernel/syscall.h>
#include <kernel/extra.h>
#include <lib/display.h>
// Internal function.
extern void menu_context(ubc_session_t *session);
extern void menu_disassembly(ubc_session_t *session);
void ubc_module_handler(int action)
{
/* dclear();
dprint(0, 0, "spc = %p", action);
dupdate();
for (int i = 0 ; i < 4000000 ; i = i + 1);
*/ //TODO stop all clock / timer.
}
void ubc_handler(struct ubc_context_s *context, int channel)
{
void (*menu)(ubc_session_t *session);
ubc_session_t session;
// Initialize new session.
session.key = 0;
session.channel = channel;
session.context = context;
session.menu.context.cursor = 0;
session.menu.disassembly.vcursor = -(DISPLAY_VLINES_MAX >> 1);
session.menu.disassembly.hcursor = 0;
// Initialize menu function.
menu = &menu_disassembly;
// Main loop.
while (session.key != KEY_CTRL_EXIT)
{
menu(&session);
casio_GetKey(&session.key);
switch (session.key)
{
case KEY_CTRL_F1: menu = &menu_disassembly; break;
case KEY_CTRL_F2: menu = &menu_context; break;
}
}
// Update UBC
SH7305_UBC.CBR0.CE = 0; // Disable channel.
SH7305_UBC.CAR0 = context->spc; // Update break address.
SH7305_UBC.CAMR0 = 0x00000000; // Update break address.
SH7305_UBC.CBR0.CE = 1; // Disable channel.
icbi((void*)0xa0000000);
}