mirror of
https://github.com/array-in-a-matrix/SAROO.git
synced 2025-04-02 10:31:43 -04:00
170 lines
2.9 KiB
C
170 lines
2.9 KiB
C
|
|
#include "main.h"
|
|
#include "smpc.h"
|
|
|
|
/**********************************************************/
|
|
|
|
typedef struct {
|
|
u32 pr;
|
|
u32 gbr;
|
|
u32 vbr;
|
|
u32 mach;
|
|
u32 macl;
|
|
u32 r15;
|
|
u32 r14;
|
|
u32 r13;
|
|
u32 r12;
|
|
u32 r11;
|
|
u32 r10;
|
|
u32 r9;
|
|
u32 r8;
|
|
u32 r7;
|
|
u32 r6;
|
|
u32 r5;
|
|
u32 r4;
|
|
u32 r3;
|
|
u32 r2;
|
|
u32 r1;
|
|
u32 r0;
|
|
u32 pc;
|
|
u32 sr;
|
|
}REGS;
|
|
|
|
void vbi_isr_entry(void);
|
|
void ubr_isr_entry(void);
|
|
void debug_shell(void);
|
|
|
|
static inline u32 get_sr(void)
|
|
{
|
|
u32 sr;
|
|
|
|
__asm volatile ( "stc\tsr,%0": "=r" (sr) );
|
|
return sr;
|
|
}
|
|
|
|
static inline void set_sr(u32 sr)
|
|
{
|
|
__asm volatile ( "ldc\t%0,sr":: "r" (sr) );
|
|
}
|
|
|
|
|
|
|
|
void show_regs(REGS *reg)
|
|
{
|
|
printk("SH2 Registers:\n");
|
|
printk("R0 =%08x R1 =%08x R2 =%08x R3 =%08x\n", reg->r0, reg->r1, reg->r2, reg->r3);
|
|
printk("R4 =%08x R5 =%08x R6 =%08x R7 =%08x\n", reg->r4, reg->r5, reg->r6, reg->r7);
|
|
printk("R8 =%08x R9 =%08x R10=%08x R11=%08x\n", reg->r8, reg->r9, reg->r10,reg->r11);
|
|
printk("R12=%08x R13=%08x R14=%08x R15=%08x\n", reg->r12,reg->r13,reg->r14,reg->r15);
|
|
printk("PC =%08X PR =%08x SR =%08x GBR=%08x\n", reg->pc, reg->pr, reg->sr, reg->gbr);
|
|
}
|
|
|
|
void set_break_pc(u32 addr)
|
|
{
|
|
BARA = addr;
|
|
BAMRA = 0;
|
|
BBRA = 0x0054;
|
|
BRCR = 0x1400;
|
|
}
|
|
|
|
void ubr_handle(REGS *reg)
|
|
{
|
|
sci_init();
|
|
printk("\nubr_handle! BRCR=%04x\n", BRCR);
|
|
show_regs(reg);
|
|
BRCR = 0x1400;
|
|
|
|
// 修改设置SR时的参数, 打开ubr中断
|
|
if(reg->pc==0x0000044c){
|
|
reg->r0 = 0xe0;
|
|
set_break_pc(0x000002c2);
|
|
}
|
|
|
|
// memcpy
|
|
if(reg->pc==0x000002c4){
|
|
// 避免向量表被BIOS重设
|
|
if(reg->r3==0x06000000){
|
|
reg->r6 = 0x0c;
|
|
set_break_pc(0x06004000);
|
|
}
|
|
}
|
|
|
|
if(reg->pc==0x06006180){
|
|
printk("Game Start!\n");
|
|
debug_shell();
|
|
}
|
|
}
|
|
|
|
void vbi_handle(REGS *reg)
|
|
{
|
|
sci_init();
|
|
printk("\nvbi_handle!\n");
|
|
show_regs(reg);
|
|
return;
|
|
}
|
|
|
|
|
|
void install_ubr_isr(void)
|
|
{
|
|
u32 sr;
|
|
|
|
//*(u32*)(0x06000100) = (u32)vbi_isr_entry;
|
|
*(u32*)(0x06000030) = (u32)ubr_isr_entry;
|
|
|
|
set_break_pc(0x0000044a);
|
|
|
|
sr = get_sr();
|
|
sr &= 0xffffffef;
|
|
set_sr(sr);
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
int gets(char *buf, int len);
|
|
int parse_arg(char *str, char *argv[]);
|
|
void dump(int argc, char *argv[]);
|
|
void mrd(int argc, char *argv[]);
|
|
void mwr(int argc, char *argv[]);
|
|
void command_go(int go_addr);
|
|
void mem_dump(char *str, void *addr, int size);
|
|
|
|
void debug_shell(void)
|
|
{
|
|
int ch;
|
|
char str[128];
|
|
int argc;
|
|
char *argv[16];
|
|
|
|
while(1){
|
|
ch = gets(str, 128);
|
|
argc = parse_arg(str, argv);
|
|
if(argv[0][0]=='d')
|
|
dump(argc, argv);
|
|
if(argv[0][0]=='r')
|
|
mrd(argc, argv);
|
|
if(argv[0][0]=='w')
|
|
mwr(argc, argv);
|
|
if(argv[0][0]=='g'){
|
|
int addr = strtoul(argv[1], 0, 0, 0);
|
|
command_go(addr);
|
|
}
|
|
|
|
if(argv[0][0]=='b'){
|
|
int addr = strtoul(argv[1], 0, 0, 0);
|
|
set_break_pc(addr);
|
|
}
|
|
|
|
if(argv[0][0]=='c'){
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
|
|
|