Vhex-kernel/src/kernel/util/disasm/show_context.c

113 lines
2.7 KiB
C

#include <kernel/util/disasm.h>
#include <kernel/devices/earlyterm.h>
#include <kernel/drivers/screen.h>
#include <display.h>
#include <stdio.h>
#include <string.h>
// Menu string format.
// TODO: FIND BETTER WAY TROUDUC'
const char *content_string[26] = {
"General registers:",
"r0 = %#.8x",
"r1 = %#.8x",
"r2 = %#.8x",
"r3 = %#.8x",
"r4 = %#.8x",
"r5 = %#.8x",
"r6 = %#.8x",
"r7 = %#.8x",
"r8 = %#.8x",
"r9 = %#.8x",
"r10 = %#.8x",
"r11 = %#.8x",
"r12 = %#.8x",
"r13 = %#.8x",
"r14 = %#.8x",
"r15 = %#.8x",
"\0",
"Special registers:",
"GBR = %p",
"MACL = %p",
"MACH = %p",
"SR = %p",
"PC = %p",
"PR = %p",
NULL
};
static void cursor_update(ubc_session_t *session)
{
extern struct earlyterm earlyterm;
if (session->key.up == 1 && session->menu.context.cursor > 0)
session->menu.context.cursor = session->menu.context.cursor - 1;
if (session->key.down == 1
&& (int)session->menu.context.cursor < 24 - earlyterm.display.ws_row)
session->menu.context.cursor = session->menu.context.cursor + 1;
}
//
// 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 disasm_menu_show_context(ubc_session_t *session)
{
extern struct earlyterm earlyterm;
char line[64];
// Menu string data
uint32_t content_data[25] = {
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,
session->context->gbr,
session->context->macl,
session->context->mach,
session->context->ssr,
session->context->spc,
session->context->pr
};
// Update cursor position.
cursor_update(session);
// Clear VRAM.
dclear(&earlyterm.display);
// Display menu based on cursor position.
memset(line, 0x00, 64);
for (int i = 0 ; content_string[i + session->menu.context.cursor] != NULL
&& i < earlyterm.display.ws_row ; ++i)
{
sprintf(line,
content_string[i + session->menu.context.cursor],
content_data[i + session->menu.context.cursor]
);
dprint(&earlyterm.display, 0, i, line);
}
// Display VRAM
screen_update(earlyterm.display.vram);
}