gintrace/src/menu/context.c

121 lines
3.7 KiB
C

#include "gintrace/menu/context.h"
#include "gintrace/ubc.h"
#include "gintrace/tracer.h"
#include "gintrace/gui/menu.h"
#include "gintrace/gui/display.h"
#include <gint/std/stdio.h>
#include <gint/keyboard.h>
#include "./src/menu/internal/dictionary.h"
//---
// Internal information
//---
/* printXY(): Display register information */
static void printXY(int column, int row, const char *text, uintptr_t reg)
{
char bf[128];
const char *addrname;
size_t idx;
int a;
a = 0;
idx = snprintf(bf, 128, text, reg);
addrname = dictionary_peripherals_check((void*)reg);
if (addrname != NULL) {
idx = snprintf(&bf[idx], 128 - idx, " - %s", addrname);
a = 1;
}
addrname = dictionary_syscalls_check((void*)reg);
if (addrname != NULL) {
if (a == 0)
idx = snprintf(&bf[idx], 128 - idx, " - %s", addrname);
else
idx = snprintf(&bf[idx], 128 - idx, ", %s", addrname);
a = 1;
}
addrname = dictionary_notes_check((void*)reg);
if (addrname != NULL) {
if (a == 0)
idx = snprintf(&bf[idx], 128 - idx, " - %s", addrname);
else
idx = snprintf(&bf[idx], 128 - idx, ", %s", addrname);
a = 1;
}
gtextXY(column, row, bf);
}
/* context_ctor: Menu constructor */
static void context_ctor(struct tsession *session)
{
session->menu.context.cursor.hoffset = 0;
session->menu.context.cursor.voffset = 0;
}
/* context_display(); Display trace information */
static void context_display(struct tsession *session)
{
uintptr_t __vbr;
int x;
int y;
__asm__ volatile ("stc vbr, %0": "=r"(__vbr)::);
x = session->menu.context.cursor.hoffset;
y = session->menu.context.cursor.voffset;
printXY(0 + x, 0 + y, "vbr : %p", __vbr);
printXY(0 + x, 0 + y, "gbr : %p", session->info.context->gbr);
printXY(0 + x, 1 + y, "macl : %p", session->info.context->mach);
printXY(0 + x, 2 + y, "mach : %p", session->info.context->macl);
printXY(0 + x, 3 + y, "ssr : %p", session->info.context->ssr);
printXY(0 + x, 4 + y, "pr : %p", session->info.context->pr);
printXY(0 + x, 5 + y, "spc : %p", session->info.context->spc);
printXY(0 + x, 7 + y, "r0 : %p", session->info.context->reg[0]);
printXY(0 + x, 8 + y, "r1 : %p", session->info.context->reg[1]);
printXY(0 + x, 9 + y, "r2 : %p", session->info.context->reg[2]);
printXY(0 + x, 10 + y, "r3 : %p", session->info.context->reg[3]);
printXY(0 + x, 11 + y, "r4 : %p", session->info.context->reg[4]);
printXY(0 + x, 12 + y, "r5 : %p", session->info.context->reg[5]);
printXY(0 + x, 13 + y, "r6 : %p", session->info.context->reg[6]);
printXY(0 + x, 14 + y, "r7 : %p", session->info.context->reg[7]);
printXY(0 + x, 15 + y, "r8 : %p", session->info.context->reg[8]);
printXY(0 + x, 16 + y, "r9 : %p", session->info.context->reg[9]);
printXY(0 + x, 17 + y, "r10 : %p", session->info.context->reg[10]);
printXY(0 + x, 18 + y, "r11 : %p", session->info.context->reg[11]);
printXY(0 + x, 19 + y, "r12 : %p", session->info.context->reg[12]);
printXY(0 + x, 20 + y, "r13 : %p", session->info.context->reg[13]);
printXY(0 + x, 21 + y, "r14 : %p", session->info.context->reg[14]);
printXY(0 + x, 22 + y, "r15 : %p", session->info.context->reg[15]);
}
/* context_keyboard(): Handle one key event */
static int context_keyboard(struct tsession *session, int key)
{
if (key == KEY_LEFT)
session->menu.context.cursor.hoffset += 1;
if (key == KEY_RIGHT)
session->menu.context.cursor.hoffset -= 1;
if (key == KEY_UP)
session->menu.context.cursor.voffset += 1;
if (key == KEY_DOWN)
session->menu.context.cursor.voffset -= 1;
return (0);
}
//---
// Define the menu
//---
struct menu menu_context = {
.ctor = (void*)&context_ctor,
.init = NULL,
.display = (void*)&context_display,
.keyboard = (void*)&context_keyboard,
.command = NULL,
.dtor = NULL
};