250 lines
4.7 KiB
C
250 lines
4.7 KiB
C
/**
|
|
* PlayStation Memory Viewer
|
|
* by Giuseppe Gatta a.k.a. nextvolume
|
|
*
|
|
* PSXSDK Example - released to the Public Domain
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <psx.h>
|
|
|
|
unsigned int cur_addr = 0x80000000;
|
|
unsigned int prim_list[0x20000];
|
|
|
|
int display_is_old = 1;
|
|
volatile int should_read_pad = 1;
|
|
|
|
void pshex_vblank_handler()
|
|
{
|
|
should_read_pad = 1;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
unsigned short padbuf;
|
|
int y, f, x, x1;
|
|
int highres_mode=0;
|
|
int srp=0;
|
|
int wasup=0, wasdown=0, wasleft=0, wasright=0, wasl1=0, wasr1=0,
|
|
wasl2=0;
|
|
int wascross=0, wascircle=0, wasstart=0,wasselect=0;
|
|
unsigned int go_address = 0x80000000;
|
|
int go_pos = 0;
|
|
GsRectangle pshex_rect;
|
|
|
|
|
|
PSX_InitEx(0);
|
|
|
|
GsInit();
|
|
GsClearMem();
|
|
|
|
GsSetVideoMode(640, 240, VMODE_PAL);
|
|
GsSetList(prim_list);
|
|
GsSetDispEnvSimple(0, 0);
|
|
GsSetDrawEnvSimple(0, 0, 640, 240);
|
|
GsLoadFont(768, 0, 768, 256);
|
|
|
|
SetVBlankHandler(pshex_vblank_handler);
|
|
|
|
GsPrintFont(16, 16, "PAL/NTSC SELECTION");
|
|
GsPrintFont(16, 32, "X - PAL");
|
|
GsPrintFont(16, 40, "O - NTSC");
|
|
GsDrawList();
|
|
while(GsIsDrawing());
|
|
|
|
while(1)
|
|
{
|
|
if(should_read_pad)
|
|
{
|
|
PSX_ReadPad(&padbuf, NULL);
|
|
|
|
if((padbuf & PAD_CROSS))
|
|
{
|
|
GsSetVideoModeEx(640, 480, VMODE_PAL, 0, 1, 0);
|
|
wascross=1;
|
|
break;
|
|
}
|
|
|
|
if((padbuf & PAD_CIRCLE))
|
|
{
|
|
GsSetVideoModeEx(640, 480, VMODE_NTSC, 0, 1, 0);
|
|
wascircle=1;
|
|
break;
|
|
}
|
|
|
|
should_read_pad=0;
|
|
}
|
|
}
|
|
|
|
GsSetDrawEnvSimple(0, (GsScreenM==VMODE_PAL?8:0), 640, 480);
|
|
|
|
while(1)
|
|
{
|
|
if(display_is_old)
|
|
{
|
|
GsSortCls(0, 0, 255);
|
|
|
|
for(y = 0; y < (highres_mode?58:28); y++)
|
|
{
|
|
f = GsPrintFont(24, y*8, "%08x", cur_addr + (y*0x10));
|
|
x1 = prfont_get_fx(f) + 16;
|
|
|
|
for(x = 0; x < 16; x++)
|
|
{
|
|
if(( (x&3) == 0) && x>0)
|
|
x1+=16;
|
|
|
|
f = GsPrintFont(x1, y*8, "%02x", *((unsigned char*)(cur_addr + (y*0x10) + x)));
|
|
x1 = prfont_get_fx(f) + 8;
|
|
}
|
|
|
|
x1+=8;
|
|
|
|
for(x=0;x<16;x++)
|
|
{
|
|
GsPrintFont(x1, y*8, "%c", *((unsigned char*)(cur_addr + (y*0x10) + x)));
|
|
x1+=8;
|
|
}
|
|
}
|
|
|
|
pshex_rect.x = (go_pos * 8)+24;
|
|
pshex_rect.y = highres_mode?472:232;
|
|
pshex_rect.r = 255;
|
|
pshex_rect.g = 69;
|
|
pshex_rect.b = 0;
|
|
pshex_rect.attribute = 0;
|
|
pshex_rect.w = 8;
|
|
pshex_rect.h = 8;
|
|
GsSortRectangle(&pshex_rect);
|
|
|
|
GsPrintFont(24, highres_mode?472:232, "%08X", go_address);
|
|
|
|
GsDrawList();
|
|
while(GsIsDrawing());
|
|
display_is_old = 0;
|
|
}
|
|
|
|
if(should_read_pad)
|
|
{
|
|
PSX_ReadPad(&padbuf, NULL);
|
|
|
|
if((padbuf & PAD_UP) && !wasup)
|
|
{
|
|
cur_addr -= 0x10;
|
|
display_is_old = 1;
|
|
wasup = 1;
|
|
}
|
|
|
|
if((padbuf & PAD_DOWN) && !wasdown)
|
|
{
|
|
cur_addr += 0x10;
|
|
display_is_old = 1;
|
|
wasdown = 1;
|
|
}
|
|
|
|
if((padbuf & PAD_LEFT) && !wasleft)
|
|
{
|
|
cur_addr -= 0x100;
|
|
display_is_old = 1;
|
|
wasleft=1;
|
|
}
|
|
|
|
if((padbuf & PAD_RIGHT) && !wasright)
|
|
{
|
|
cur_addr += 0x100;
|
|
display_is_old = 1;
|
|
wasright=1;
|
|
}
|
|
|
|
if((padbuf & PAD_L1) && !wasl1)
|
|
{
|
|
if(go_pos>0)go_pos--;
|
|
display_is_old = 1;
|
|
wasl1=1;
|
|
}
|
|
|
|
if((padbuf & PAD_R1) && !wasr1)
|
|
{
|
|
if(go_pos<7)go_pos++;
|
|
display_is_old = 1;
|
|
wasr1=1;
|
|
}
|
|
|
|
if((padbuf & PAD_L2) && !wasl2)
|
|
{
|
|
go_pos = 0;
|
|
wasl2 = 1;
|
|
}
|
|
|
|
if((padbuf & PAD_CROSS) && !wascross)
|
|
{
|
|
if(((go_address >> ((7-go_pos)<<2))&0xf) < 0xf)
|
|
go_address += 1 << ((7-go_pos)<<2);
|
|
|
|
display_is_old = 1;
|
|
wascross=1;
|
|
}
|
|
|
|
if((padbuf & PAD_CIRCLE) && !wascircle)
|
|
{
|
|
if(((go_address >> ((7-go_pos)<<2))&0xf) > 0)
|
|
go_address -= 1 << ((7-go_pos)<<2);
|
|
|
|
display_is_old = 1;
|
|
wascircle = 1;
|
|
}
|
|
|
|
if((padbuf & PAD_START) && !wasstart)
|
|
{
|
|
cur_addr = go_address;
|
|
display_is_old = 1;
|
|
wasstart=1;
|
|
}
|
|
|
|
if((padbuf & PAD_SELECT) && !wasselect)
|
|
{
|
|
highres_mode = !highres_mode;
|
|
|
|
GsSortCls(0,0,255);
|
|
GsDrawList();
|
|
while(GsIsDrawing());
|
|
|
|
if(highres_mode)
|
|
{
|
|
GsSetVideoModeEx(640, 480, GsScreenM, 0, 1, 0);
|
|
GsSetDrawEnvSimple(0, (GsScreenM==VMODE_PAL)?8:0, 640, 480);
|
|
}
|
|
else
|
|
{
|
|
GsSetVideoMode(640, 240, GsScreenM);
|
|
GsSetDrawEnvSimple(0, (GsScreenM==VMODE_PAL)?8:0, 640, 240);
|
|
}
|
|
|
|
display_is_old = 1;
|
|
wasselect = 1;
|
|
}
|
|
|
|
if(!(padbuf & PAD_UP) || srp==5)wasup=0;
|
|
if(!(padbuf & PAD_DOWN) || srp==5)wasdown=0;
|
|
if(!(padbuf & PAD_LEFT) || srp==5)wasleft=0;
|
|
if(!(padbuf & PAD_RIGHT) || srp==5)wasright=0;
|
|
if(!(padbuf & PAD_L1))wasl1=0;
|
|
if(!(padbuf & PAD_R1))wasr1=0;
|
|
if(!(padbuf & PAD_L2))wasl2=0;
|
|
if(!(padbuf & PAD_CROSS) || srp==5)wascross=0;
|
|
if(!(padbuf & PAD_CIRCLE) || srp==5)wascircle=0;
|
|
if(!(padbuf & PAD_START)) wasstart=0;
|
|
if(!(padbuf & PAD_SELECT)) wasselect=0;
|
|
|
|
should_read_pad = 0;
|
|
srp++;
|
|
if(srp > 5) srp=0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//AAAAAAAA 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF abcd
|