mirror of
https://github.com/emu-russia/pureikyubu.git
synced 2025-04-02 10:42:15 -04:00
298 lines
14 KiB
C++
298 lines
14 KiB
C++
// registers view
|
|
#include "pch.h"
|
|
|
|
#define FPRU(n) (Gekko::Gekko->regs.fpr[n].uval)
|
|
#define FPRD(n) (Gekko::Gekko->regs.fpr[n].dbl)
|
|
#define PS0(n) (Gekko::Gekko->regs.fpr[n].dbl)
|
|
#define PS1(n) (Gekko::Gekko->regs.ps1[n].dbl)
|
|
|
|
// register memory
|
|
static uint32_t gpr_old[32];
|
|
static FPREG ps0_old[32], ps1_old[32];
|
|
|
|
static const char *gprnames[] = {
|
|
"r0" , "sp" , "sd2", "r3" , "r4" , "r5" , "r6" , "r7" ,
|
|
"r8" , "r9" , "r10", "r11", "r12", "sd1", "r14", "r15",
|
|
"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
|
|
"r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
|
|
};
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void con_memorize_cpu_regs()
|
|
{
|
|
for(int i=0; i<32; i++)
|
|
{
|
|
gpr_old[i] = Gekko::Gekko->regs.gpr[i];
|
|
ps0_old[i].uval = Gekko::Gekko->regs.fpr[i].uval;
|
|
ps1_old[i].uval = Gekko::Gekko->regs.ps1[i].uval;
|
|
}
|
|
}
|
|
|
|
static void con_print_other_regs()
|
|
{
|
|
con_printf_at(28, 1, "\x1%ccr \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.cr);
|
|
con_printf_at(28, 2, "\x1%cxer \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::XER]);
|
|
con_printf_at(28, 4, "\x1%cctr \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::CTR]);
|
|
con_printf_at(28, 5, "\x1%cdec \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DEC]);
|
|
con_printf_at(28, 8, "\x1%cpc \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.pc);
|
|
con_printf_at(28, 9, "\x1%clr \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::LR]);
|
|
con_printf_at(28,14, "\x1%ctbr \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM,
|
|
Gekko::Gekko->regs.tb.Part.u, Gekko::Gekko->regs.tb.Part.l);
|
|
|
|
con_printf_at(42, 1, "\x1%cmsr \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.msr);
|
|
con_printf_at(42, 2, "\x1%cfpscr \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.fpscr);
|
|
con_printf_at(42, 4, "\x1%chid0 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID0]);
|
|
con_printf_at(42, 5, "\x1%chid1 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID1]);
|
|
con_printf_at(42, 6, "\x1%chid2 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID2]);
|
|
con_printf_at(42, 8, "\x1%cwpar \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::WPAR]);
|
|
con_printf_at(42, 9, "\x1%cdmau \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DMAU]);
|
|
con_printf_at(42,10, "\x1%cdmal \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DMAL]);
|
|
|
|
con_printf_at(58, 1, "\x1%cdsisr \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DSISR]);
|
|
con_printf_at(58, 2, "\x1%cdar \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DAR]);
|
|
con_printf_at(58, 4, "\x1%csrr0 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::SRR0]);
|
|
con_printf_at(58, 5, "\x1%csrr1 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::SRR1]);
|
|
con_printf_at(58, 8, "\x1%csprg0 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::SPRG0]);
|
|
con_printf_at(58, 9, "\x1%csprg1 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::SPRG1]);
|
|
con_printf_at(58,10, "\x1%csprg2 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::SPRG2]);
|
|
con_printf_at(58,11, "\x1%csprg3 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::SPRG3]);
|
|
con_printf_at(58,13, "\x1%cear \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::EAR]);
|
|
con_printf_at(58,14, "\x1%cpvr \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::PVR]);
|
|
|
|
// Some cpu flags.
|
|
con_printf_at(74, 1, "\x1%c%s", ConColor::CYAN, (Gekko::Gekko->regs.msr & MSR_PR) ? "UISA" : "OEA"); // Supervisor?
|
|
con_printf_at(74, 2, "\x1%c%s", ConColor::CYAN, (Gekko::Gekko->regs.msr & MSR_EE) ? "EE" : "NE"); // Interrupts enabled?
|
|
con_printf_at(74, 4, "\x1%cPSE \x1%c%i", ConColor::CYAN, ConColor::NORM, (Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID2] & HID2_PSE) ? 1 : 0); // Paired Single mode?
|
|
con_printf_at(74, 5, "\x1%cLSQ \x1%c%i", ConColor::CYAN, ConColor::NORM, (Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID2] & HID2_LSQE)? 1 : 0); // Load/Store Quantization?
|
|
con_printf_at(74, 6, "\x1%cWPE \x1%c%i", ConColor::CYAN, ConColor::NORM, (Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID2] & HID2_WPE) ? 1 : 0); // Gather buffer?
|
|
con_printf_at(74, 7, "\x1%cLC \x1%c%i", ConColor::CYAN, ConColor::NORM, (Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID2] & HID2_LCE) ? 1 : 0); // Cache locked?
|
|
}
|
|
|
|
static void con_print_gprreg(int x, int y, int num)
|
|
{
|
|
if(Gekko::Gekko->regs.gpr[num] != gpr_old[num])
|
|
{
|
|
con_printf_at(x, y, "\x1%c%-3s \x1%c%.8X", ConColor::CYAN, gprnames[num], ConColor::GREEN, Gekko::Gekko->regs.gpr[num]);
|
|
gpr_old[num] = Gekko::Gekko->regs.gpr[num];
|
|
}
|
|
else
|
|
{
|
|
con_printf_at(x, y, "\x1%c%-3s \x1%c%.8X", ConColor::CYAN, gprnames[num], ConColor::NORM, Gekko::Gekko->regs.gpr[num]);
|
|
}
|
|
}
|
|
|
|
static void con_print_gprs()
|
|
{
|
|
int y;
|
|
|
|
for(y=1; y<=16; y++)
|
|
{
|
|
con_print_gprreg(0, y, y - 1);
|
|
con_print_gprreg(14, y, y - 1 + 16);
|
|
}
|
|
|
|
con_print_other_regs();
|
|
}
|
|
|
|
static void con_print_fpreg(int x, int y, int num)
|
|
{
|
|
ULARGE_INTEGER li;
|
|
|
|
if(Gekko::Gekko->regs.fpr[num].uval != ps0_old[num].uval)
|
|
{
|
|
if(FPRD(num) >= 0.0) con_printf_at(x, y, "\x1%cf%-2i \x1%c%e", ConColor::CYAN, num, ConColor::GREEN, FPRD(num));
|
|
else con_printf_at(x, y, "\x1%cf%-2i \x1%c%e", ConColor::CYAN, num, ConColor::GREEN, FPRD(num));
|
|
|
|
li.QuadPart = FPRU(num);
|
|
con_printf_at(x + 20, y, "\x1%c%.8X %.8X", ConColor::GREEN, li.HighPart, li.LowPart);
|
|
|
|
ps0_old[num].uval = Gekko::Gekko->regs.fpr[num].uval;
|
|
}
|
|
else
|
|
{
|
|
if(FPRD(num) >= 0.0) con_printf_at(x, y, "\x1%cf%-2i \x1%c%e", ConColor::CYAN, num, ConColor::NORM, FPRD(num));
|
|
else con_printf_at(x, y, "\x1%cf%-2i \x1%c%e", ConColor::CYAN, num, ConColor::NORM, FPRD(num));
|
|
|
|
li.QuadPart = FPRU(num);
|
|
con_printf_at(x + 20, y, "%.8X %.8X", li.HighPart, li.LowPart);
|
|
}
|
|
}
|
|
|
|
static void con_print_ps(int x, int y, int num)
|
|
{
|
|
if(Gekko::Gekko->regs.fpr[num].uval != ps0_old[num].uval)
|
|
{
|
|
if(PS0(num) >= 0.0f) con_printf_at(x, y, "\x1%cps%-2i \x1%c%.4e", ConColor::CYAN, num, ConColor::GREEN, PS0(num));
|
|
else con_printf_at(x, y, "\x1%cps%-2i \x1%c%.4e", ConColor::CYAN, num, ConColor::GREEN, PS0(num));
|
|
|
|
ps0_old[num].uval = Gekko::Gekko->regs.fpr[num].uval;
|
|
}
|
|
else
|
|
{
|
|
if(PS0(num) >= 0.0f) con_printf_at(x, y, "\x1%cps%-2i \x1%c%.4e", ConColor::CYAN, num, ConColor::NORM, PS0(num));
|
|
else con_printf_at(x, y, "\x1%cps%-2i \x1%c%.4e", ConColor::CYAN, num, ConColor::NORM, PS0(num));
|
|
}
|
|
|
|
if(Gekko::Gekko->regs.ps1[num].uval != ps1_old[num].uval)
|
|
{
|
|
if(PS1(num) >= 0.0f) con_printf_at(x + 18, y, "\x1%c %.4e", ConColor::GREEN, PS1(num));
|
|
else con_printf_at(x + 18, y, "\x1%c%.4e", ConColor::GREEN, PS1(num));
|
|
|
|
ps1_old[num].uval = Gekko::Gekko->regs.ps1[num].uval;
|
|
}
|
|
else
|
|
{
|
|
if(PS1(num) >= 0.0f) con_printf_at(x + 18, y, " %.4e", PS1(num));
|
|
else con_printf_at(x + 18, y, "%.4e", PS1(num));
|
|
}
|
|
}
|
|
|
|
static void con_print_fprs()
|
|
{
|
|
int y;
|
|
|
|
for(y=1; y<=16; y++)
|
|
{
|
|
con_print_fpreg(0, y, y - 1);
|
|
con_print_fpreg(39, y, y - 1 + 16);
|
|
}
|
|
}
|
|
|
|
static void con_print_psrs()
|
|
{
|
|
int y;
|
|
|
|
for(y=1; y<=16; y++)
|
|
{
|
|
con_print_ps(0, y, y - 1);
|
|
con_print_ps(32, y, y - 1 + 16);
|
|
}
|
|
|
|
for(y=1; y<=8; y++)
|
|
{
|
|
con_printf_at(64, y, "\x1%cgqr%i \x1%c%08X", ConColor::CYAN, y - 1, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::GQRs + y - 1]);
|
|
}
|
|
|
|
con_printf_at (64, 10, "\x1%cPSE \x1%c%i", ConColor::CYAN, ConColor::NORM, (Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID2] & HID2_PSE) ? 1 : 0); // Paired Single mode?
|
|
con_printf_at (64, 11, "\x1%cLSQ \x1%c%i", ConColor::CYAN, ConColor::NORM, (Gekko::Gekko->regs.spr[(int)Gekko::SPR::HID2] & HID2_LSQE)? 1 : 0); // Load/Store Quantization?
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------------
|
|
// MMU
|
|
|
|
static int cntlzw(uint32_t val)
|
|
{
|
|
int i;
|
|
for(i=0; i<32; i++)
|
|
{
|
|
if(val & (1 << (31-i))) break;
|
|
}
|
|
return ((i == 32) ? 31 : i);
|
|
}
|
|
|
|
static void describe_bat_reg (int x, int y, uint32_t up, uint32_t lo, int instr)
|
|
{
|
|
// Use plain numbers, no definitions (for best compatibility).
|
|
uint32_t bepi = (up >> 17) & 0x7fff;
|
|
uint32_t bl = (up >> 2) & 0x7ff;
|
|
uint32_t vs = (up >> 1) & 1;
|
|
uint32_t vp = up & 1;
|
|
uint32_t brpn = (lo >> 17) & 0x7fff;
|
|
uint32_t w = (lo >> 6) & 1;
|
|
uint32_t i = (lo >> 5) & 1;
|
|
uint32_t m = (lo >> 4) & 1;
|
|
uint32_t g = (lo >> 3) & 1;
|
|
uint32_t pp = lo & 3;
|
|
|
|
uint32_t EStart = bepi << 17, PStart = brpn << 17;
|
|
uint32_t blkSize = 1 << (17 + 11 - cntlzw((bl << (32-11)) | 0x00100000));
|
|
|
|
const char *ppstr = "NA";
|
|
if(pp)
|
|
{
|
|
if(instr) { ppstr = ((pp & 1) ? (char *)("X") : (char *)("XW")); }
|
|
else { ppstr = ((pp & 1) ? (char *)("R") : (char *)("RW")); }
|
|
}
|
|
|
|
con_printf_at (x, y, "\x1%c%08X->%08X" " %-6s" " %c%c%c%c" " %s %s" " \x1%c%s" ,
|
|
ConColor::NORM,
|
|
EStart, PStart, UI::FileSmartSizeA(blkSize).c_str(),
|
|
w ? 'W' : '-',
|
|
i ? 'I' : '-',
|
|
m ? 'M' : '-',
|
|
g ? 'G' : '-',
|
|
vs ? "Vs" : "Ns",
|
|
vp ? "Vp" : "Np",
|
|
ConColor::NORM, ppstr
|
|
);
|
|
}
|
|
|
|
static void con_print_mmu()
|
|
{
|
|
con_printf_at (0, 11,"\x1%csdr1 \x1%c%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::SDR1]);
|
|
|
|
con_printf_at (0, 13,"\x1%cIR \x1%c%i", ConColor::CYAN, ConColor::NORM, (Gekko::Gekko->regs.msr & MSR_IR) ? 1 : 0);
|
|
con_printf_at (0, 14,"\x1%cDR \x1%c%i", ConColor::CYAN, ConColor::NORM, (Gekko::Gekko->regs.msr & MSR_DR) ? 1 : 0);
|
|
|
|
con_printf_at (0, 1, "\x1%cdbat0 \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT0U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT0L]);
|
|
con_printf_at (0, 2, "\x1%cdbat1 \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT1U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT1L]);
|
|
con_printf_at (0, 3, "\x1%cdbat2 \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT2U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT2L]);
|
|
con_printf_at (0, 4, "\x1%cdbat3 \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT3U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT3L]);
|
|
|
|
con_printf_at (0, 6, "\x1%cibat0 \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT0U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT0L]);
|
|
con_printf_at (0, 7, "\x1%cibat1 \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT1U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT1L]);
|
|
con_printf_at (0, 8, "\x1%cibat2 \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT2U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT2L]);
|
|
con_printf_at (0, 9, "\x1%cibat3 \x1%c%08X:%08X", ConColor::CYAN, ConColor::NORM, Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT3U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT3L]);
|
|
|
|
describe_bat_reg(24, 1, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT0U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT0L], 0);
|
|
describe_bat_reg(24, 2, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT1U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT1L], 0);
|
|
describe_bat_reg(24, 3, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT2U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT2L], 0);
|
|
describe_bat_reg(24, 4, Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT3U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::DBAT3L], 0);
|
|
|
|
describe_bat_reg(24, 6, Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT0U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT0L], 1);
|
|
describe_bat_reg(24, 7, Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT1U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT1L], 1);
|
|
describe_bat_reg(24, 8, Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT2U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT2L], 1);
|
|
describe_bat_reg(24, 9, Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT3U], Gekko::Gekko->regs.spr[(int)Gekko::SPR::IBAT3L], 1);
|
|
|
|
for(int n=0, y=1; n<16; n++, y++)
|
|
{
|
|
const ConColor prefix = Gekko::Gekko->regs.sr[y-1] & 0x80000000 ? ConColor::BRED : ConColor::NORM;
|
|
con_printf_at (64, y, "\x1%csr%-2i " "\x1%c" "%08X", ConColor::CYAN, y-1, prefix, Gekko::Gekko->regs.sr[y-1]);
|
|
}
|
|
}
|
|
|
|
void con_update_registers()
|
|
{
|
|
con_attr(7, 0);
|
|
|
|
for (int i = 0; i < wind.regs_h; i++)
|
|
{
|
|
con_fill_line(wind.regs_y + i, ' ');
|
|
}
|
|
|
|
con_attr(0, 3);
|
|
con_fill_line(wind.regs_y, 0xc4);
|
|
con_attr(0, 3);
|
|
if(wind.focus == WREGS) con_printf_at(0, wind.regs_y, "\x1%c\x1f", ConColor::WHITE);
|
|
con_attr(0, 3);
|
|
con_print_at(2, wind.regs_y, "F1");
|
|
|
|
switch(wind.regmode)
|
|
{
|
|
case REGMOD_GPR: con_printf_at(6, wind.regs_y, " GPR, SPR"); break;
|
|
case REGMOD_FPR: con_printf_at(6, wind.regs_y, " FPR"); break;
|
|
case REGMOD_PSR: con_printf_at(6, wind.regs_y, " PSR"); break;
|
|
case REGMOD_MMU: con_printf_at(6, wind.regs_y, " MMU"); break;
|
|
}
|
|
|
|
con_attr(7, 0);
|
|
|
|
switch(wind.regmode)
|
|
{
|
|
case REGMOD_GPR: con_print_gprs(); break;
|
|
case REGMOD_FPR: con_print_fprs(); break;
|
|
case REGMOD_PSR: con_print_psrs(); break;
|
|
case REGMOD_MMU: con_print_mmu(); break;
|
|
}
|
|
}
|