Прошивка: 5.50 gen-c
Другие консоли: PS3(CECHC 60Gb), DS lite, x360(20Gb/120Gb)
Регистрация: 11.05.2007
Возраст: 43
Сообщений: 2,509
Вы сказали Спасибо: 337
Поблагодарили 988 раз(а) в 579 сообщениях
Сила репутации: 1Репутация: 948 
(это имя известно всем)
|
Итаг я тут чутка поковырялсо
дело в том что хедеры сильно изменились, причём некоторые нужно инклудить раньше других.
вобщемто всё вроде поправилось, окромя проверки чексуммы. она чёто на ксор ругается...
#include <pspsdk.h>
#include <stdio.h>
#include <zlib/zlib.h>
#include <malloc.h>
#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <psputility.h>
#include <psputility_msgdialog.h>
#include <string.h>
#include <psputility_osk.h>
PSP_MODULE_INFO("osk", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(20048);
static unsigned int __attribute__((aligned(16))) list[262144];
//Содержимое мессадж бокса
char cdata[] = {
0x56, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x43, 0x68, 0x61, 0x6E,
0x67, 0x65, 0x72, 0x0D, 0x0A, 0xD0, 0x9D, 0xD0, 0xB0, 0xD0, 0xBF, 0xD0, 0xB8, 0xD1, 0x81, 0xD0, 0xB0,
0xD0, 0xBD, 0x20, 0x70, 0x73, 0x70, 0x6F, 0x77, 0x6E, 0x65, 0x72, 0x27, 0xD0, 0xBE, 0xD0, 0xBC,
0x20, 0xD1, 0x81, 0xD0, 0xBF, 0xD0, 0xB5, 0xD1, 0x86, 0xD0, 0xB8, 0xD0, 0xB0, 0xD0, 0xBB, 0xD1,
0x8C, 0xD0, 0xBD, 0xD0, 0xBE, 0x20, 0xD0, 0xB4, 0xD0, 0xBB, 0xD1, 0x8F, 0x0D, 0x0A, 0x68, 0x74, 0x74,
0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x70, 0x73, 0x70, 0x78, 0x2E, 0x72, 0x75, 0x20,
0x28, 0x43, 0x29, 0x32, 0x30, 0x30, 0x37
};
char fdata[28930];
gzFile fil;
int f;
void *hbuff, *fbuff;
#define BUF_WIDTH (512)
#define SCR_WIDTH (480)
#define SCR_HEIGHT (272)
#define PIXEL_SIZE (4) /* change this if you change to another screenmode */
#define FRAME_SIZE (BUF_WIDTH * SCR_HEIGHT * PIXEL_SIZE)
#define ZBUF_SIZE (BUF_WIDTH SCR_HEIGHT * 2) /* zbuffer seems to be 16-bit? */
int SetupCallbacks();
int done = 0;
int UnPackLoad(void) {
fil=gzopen("ms0:/vshctrl.prx.gz","r");
gzread(fil,fdata,28930);
gzclose(fil);
f=sceIoOpen("ms0:/vshctrl.prx",PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0777);
sceIoWrite(f, &fdata, 28930);
sceIoClose(f);
sceIoRemove("ms0:/vshctrl.prx.gz");
return 0;
}
static void ConfigureDialog(pspUtilityMsgDialogParams *dialog, size_t dialog_size)
{
memset(dialog, 0, dialog_size);
dialog->base.size = dialog_size;
sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_LANGUAGE,
&dialog->base.language); // Prompt language
sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_UNKNOWN,
&dialog->base.buttonSwap); // X/O button swap
dialog->base.buttonSwap = 1;
// dialog->base.unknown[0] = 0x11; // ???
// dialog->base.unknown[1] = 0x13;
// dialog->base.unknown[2] = 0x12;
// dialog->base.unknown[3] = 0x10;
}
static void ShowMessageDialog(const char *message)
{
pspUtilityMsgDialogParams dialog;
ConfigureDialog(&dialog, sizeof(dialog));
//dialog.unknown[10] = 1; //Туто явно надо знать в какую структуру эту 1 запизать и что раньше под акновном понималось, смотри файл пспутилити.х
strcpy(dialog.message, message);
sceUtilityMsgDialogInitStart(&dialog);
for(;;) {
sceGuStart(GU_DIRECT,list);
sceGuClearColor(0x666666);
sceGuClearDepth(0);
sceGuClear(GU_COLOR_BUFFER_BIT | GU_DEPTH_BUFFER_BIT);
sceGuFinish();
sceGuSync(0,0);
switch(sceUtilityMsgDialogGetStatus()) {
case 2:
sceUtilityMsgDialogUpdate(1);
break;
case 3:
sceUtilityMsgDialogShutdownStart();
break;
case 0:
return;
}
sceDisplayWaitVblankStart();
sceGuSwapBuffers();
}
}
int PackPrepare(void) {
fil = gzopen("ms0:/vshctrl.prx.gz","w");
gzwrite(fil,fdata,28930);
gzclose(fil);
f = sceIoOpen("ms0:/header.prx", PSP_O_RDONLY, 0777);
hbuff=malloc(0x150);
sceIoRead(f, hbuff, 0x150);
sceIoClose(f);
f = sceIoOpen("ms0:/vshctrl.prx.gz", PSP_O_RDONLY, 0777);
int size=sceIoLseek(f, 0, SEEK_END);
sceIoLseek(f, 0, SEEK_SET);
fbuff=malloc(size);
sceIoRead(f, fbuff, size);
sceIoClose(f);
f = sceIoOpen("ms0:/vshctrl1.prx",PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0777);
sceIoWrite(f, hbuff, 0x150);
sceIoWrite(f, fbuff, size);
sceIoClose(f);
//sceKernelDelayThread(1*1000*1000);
sceIoRemove("ms0:/vshctrl.prx.gz");
sceIoRemove("ms0:/header.prx");
sceIoRemove("ms0:/vshctrl.prx");
free(hbuff);
free(fbuff);
return 0;
}
int CopyrightCheck(void) {
unsigned int count, sum;
sum=0;
for (count=0; count<=sizeof(cdata); count++) sum=sum+(cdata[count] xor 0x5A03);
return sum;
}
int main(int argc, char* argv[]) {
SetupCallbacks();
if (CopyrightCheck()!=0x43E33) sceKernelExitGame();
//sceKernelDelayThread(3*1000*1000);
// INIT GU!!!! it will not work without!!!
sceGuInit();
sceGuStart(GU_DIRECT,list);
sceGuDrawBuffer(GU_PSM_8888,(void*)0,BUF_WIDTH);
sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,(void*)0x88000,BUF_WIDTH);
sceGuDepthBuffer((void*)0x110000,BUF_WIDTH);
sceGuOffset(2048 - (SCR_WIDTH/2),2048 - (SCR_HEIGHT/2));
sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT);
sceGuDepthRange(0xc350,0x2710);
sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT);
sceGuEnable(GU_SCISSOR_TEST);
sceGuDepthFunc(GU_GEQUAL);
sceGuEnable(GU_DEPTH_TEST);
sceGuFrontFace(GU_CW);
sceGuShadeModel(GU_FLAT);
sceGuEnable(GU_CULL_FACE);
sceGuEnable(GU_TEXTURE_2D);
sceGuEnable(GU_CLIP_PLANES);
sceGuFinish();
sceGuSync(0,0);
sceDisplayWaitVblankStart();
sceGuDisplay(GU_TRUE);
// INIT OSK
unsigned short intext[128] = { '3','.','7','1',' ','M','3','3','-','3' }; // text already in the edit box on start
unsigned short outtext[128] = { 0 }; // text after input
//Введите новое название
unsigned short desc[128] = { 0x412, 0x432, 0x435, 0x434, 0x438, 0x442, 0x435, 0x20, 0x43D, 0x43E, 0x432, 0x43E, 0x435, 0x20, 0x43D, 0x430, 0x437, 0x432, 0x430, 0x43D, 0x438, 0x435, 0x00 }; // de******ion
// unsigned short [cpr]
ShowMessageDialog(cdata);
SceUtilityOskData data;
memset(&data, 0, sizeof(data));
data.language = 9; // Русский
data.lines = 1; // just online
data.unk_24 = 1; // set to 1
data.desc = desc;
data.intext = intext;
data.outtextlength = 128; // sizeof(outtext) / sizeof(unsigned short)
data.outtextlimit = 10; // just allow 32 chars
data.outtext = outtext;
SceUtilityOskParams osk;
memset(&osk, 0, sizeof(osk));
osk.base.size = sizeof(osk);
osk.base.language = 8;
osk.base.buttonSwap = 1;
// osk.unk_12 = 17; // What
// osk.unk_16 = 19; // the
// osk.unk_20 = 18; // fuck
// osk.unk_24 = 16; // ???
// osk.unk_48 = 1;
osk.data = &data;
// Only ascii code is handled so only the input of the small letters is printed
int rc = sceUtilityOskInitStart(&osk);
if(rc) {
return 0;
}
while(!done) {
sceGuStart(GU_DIRECT,list);
sceGuClearColor(0x666666);
sceGuClearDepth(0);
sceGuClear(GU_COLOR_BUFFER_BIT | GU_DEPTH_BUFFER_BIT);
sceGuFinish();
sceGuSync(0,0);
switch(sceUtilityOskGetStatus()) {
case PSP_UTILITY_DIALOG_INIT :
break;
case PSP_UTILITY_DIALOG_VISIBLE :
sceUtilityOskUpdate(1); // 2 is taken from ps2dev.org recommendation - ***ня, с 1 лучше ся ведёт
break;
case PSP_UTILITY_DIALOG_QUIT :
sceUtilityOskShutdownStart();
break;
case PSP_UTILITY_DIALOG_FINISHED :
done = 1;
break;
case PSP_UTILITY_DIALOG_NONE :
default :
break;
}
sceDisplayWaitVblankStart();
sceGuSwapBuffers();
}
//Это потом надо будет убить
int r,i;
char bu[9];
for (i=0; i<=9; i++) bu[i]=data.outtext[i];
sceGuTerm();
//faccess.prx - грузится в кернел и списывает с ф0 vshctrl.prx в виде двух файлов - header.prx и vshctrl.prx.gz
SceUID mod = pspSdkLoadStartModule("faccess.prx", PSP_MEMORY_PARTITION_KERNEL);
if (mod < 0)
{
pspDebugScreenInit();
printf("Error 0x%08X loading/starting prx.\nExiting...\n", mod);
sceKernelDelayThread(10*1000*1000);
sceKernelExitGame();
}
UnPackLoad();
pspDebugScreenInit();
r=0x4650;
for(i = 0; i<=9; i++) {
fdata[r]=bu[i];
r+=2;
}
PackPrepare();
//flasher.prx - записывает vshctrl1.prx на ф0
mod = pspSdkLoadStartModule("flasher.prx", PSP_MEMORY_PARTITION_KERNEL);
if (mod < 0)
{
printf("Error 0x%08X loading/starting prx.\nExiting...\n", mod);
sceKernelDelayThread(10*1000*1000);
sceKernelExitGame();
}
sceIoRemove("ms0:/vshctrl1.prx");
sceKernelExitGame();
return 0;
}
int exit_callback(int arg1, int arg2, void *common) {
done = 1;
sceKernelExitGame();
return 0;
}
int CallbackThread(SceSize args, void *argp) {
int cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
int SetupCallbacks(void) {
int thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}
Последний раз редактировалось pspowner; 13.11.2007 в 10:24.
|