113 lines
2.7 KiB
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);
|
||
|
}
|
||
|
|