pspowner
28.05.2007, 12:43
Приветствую всех.
Решил сегодня накатать програмку а-ля Version Changer, только чтобы работала на 3.40ОЕ.
Ну изначально мне показалось всё довольно просто. Прочитать строчку из файлика - без проблем, а вот с записью её обратно возникли проблемы.
Вобщем отрабатывает нормально, но ничего никуда не записывается.
Если добавляю PSP_MAIN_THREAD_ATTR(0) и sceNandSetWriteProtect(true);
то просто тупо виснет, проичём виснет даже не доходя до записи.
Народ, если кто где встречал, или может сам знает как правильно писать во flash0, то буду благодарен за разъяснения или ссылку.
Брикеров обещаю не клепать ;)
Вот как выглядит у меня.
int main(int argc, char *argv[])
{
int cnt, fd, pos=0;
char buff[18];
SceCtrlData pad;
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_DIGITAL);
pspDebugScreenInit();
printf ("This will try to read version info!\n");
fd = sceIoOpen("flash0:/kn/vshctrl.prx", PSP_O_RDONLY, 0777);
sceIoLseek(fd, 0x3D70, PSP_SEEK_SET);
sceIoRead(fd, &buff, 18);
sceIoClose(fd);
printf("Data read:[");
for (cnt=0; cnt<=18; cnt+=2) printf("%c",buff[cnt]);
printf("]");
pspDebugScreenSetXY(11+(pos/2),1);
pad.Buttons=0;
while(1) {
sceDisplayWaitVblankStart();
sceKernelDelayThread(100000);
sceCtrlReadBufferPositive(&pad, 1);
switch (pad.Buttons) {
case PSP_CTRL_START: sceKernelExitGame();
break;
case PSP_CTRL_LEFT: pos-=2;
if (pos<0) pos = 0;
pspDebugScreenSetXY(11+(pos/2),1);
break;
case PSP_CTRL_RIGHT: pos+=2;
if (pos>18) pos= 18;
pspDebugScreenSetXY(11+(pos/2),1);
break;
case PSP_CTRL_UP: buff[pos]+=1;
printf("%c", buff[pos]);
pspDebugScreenSetXY(11+(pos/2),1);
break;
case PSP_CTRL_DOWN: buff[pos]-=1;
printf("%c", buff[pos]);
pspDebugScreenSetXY(11+(pos/2),1);
break;
case PSP_CTRL_CROSS: buff[pos]-=1;
printf("\n\n\n Writing value to flash0...");
sceNandSetWriteProtect(true);
fd = sceIoOpen("flash0:/kn/vshctrl.prx", PSP_O_WRONLY, 0777);
if (!fd) printf ("/n Failed to open file for writing! /n");
sceIoLseek(fd, 0x3D70, PSP_SEEK_SET);
int res;
res=sceIoWrite(fd, &buff, 18);
sceIoClose(fd);
printf("\n\n\n %i bytes written. DONE... Exiting...", res);
sceNandSetWriteProtect(false);
sceKernelDelayThread(10*1000*1000);
sceKernelExitGame();
break;
}
pad.Buttons=0;
}
sceKernelDelayThread(10*1000*1000);
sceKernelExitGame();
return 0;
}
Решил сегодня накатать програмку а-ля Version Changer, только чтобы работала на 3.40ОЕ.
Ну изначально мне показалось всё довольно просто. Прочитать строчку из файлика - без проблем, а вот с записью её обратно возникли проблемы.
Вобщем отрабатывает нормально, но ничего никуда не записывается.
Если добавляю PSP_MAIN_THREAD_ATTR(0) и sceNandSetWriteProtect(true);
то просто тупо виснет, проичём виснет даже не доходя до записи.
Народ, если кто где встречал, или может сам знает как правильно писать во flash0, то буду благодарен за разъяснения или ссылку.
Брикеров обещаю не клепать ;)
Вот как выглядит у меня.
int main(int argc, char *argv[])
{
int cnt, fd, pos=0;
char buff[18];
SceCtrlData pad;
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_DIGITAL);
pspDebugScreenInit();
printf ("This will try to read version info!\n");
fd = sceIoOpen("flash0:/kn/vshctrl.prx", PSP_O_RDONLY, 0777);
sceIoLseek(fd, 0x3D70, PSP_SEEK_SET);
sceIoRead(fd, &buff, 18);
sceIoClose(fd);
printf("Data read:[");
for (cnt=0; cnt<=18; cnt+=2) printf("%c",buff[cnt]);
printf("]");
pspDebugScreenSetXY(11+(pos/2),1);
pad.Buttons=0;
while(1) {
sceDisplayWaitVblankStart();
sceKernelDelayThread(100000);
sceCtrlReadBufferPositive(&pad, 1);
switch (pad.Buttons) {
case PSP_CTRL_START: sceKernelExitGame();
break;
case PSP_CTRL_LEFT: pos-=2;
if (pos<0) pos = 0;
pspDebugScreenSetXY(11+(pos/2),1);
break;
case PSP_CTRL_RIGHT: pos+=2;
if (pos>18) pos= 18;
pspDebugScreenSetXY(11+(pos/2),1);
break;
case PSP_CTRL_UP: buff[pos]+=1;
printf("%c", buff[pos]);
pspDebugScreenSetXY(11+(pos/2),1);
break;
case PSP_CTRL_DOWN: buff[pos]-=1;
printf("%c", buff[pos]);
pspDebugScreenSetXY(11+(pos/2),1);
break;
case PSP_CTRL_CROSS: buff[pos]-=1;
printf("\n\n\n Writing value to flash0...");
sceNandSetWriteProtect(true);
fd = sceIoOpen("flash0:/kn/vshctrl.prx", PSP_O_WRONLY, 0777);
if (!fd) printf ("/n Failed to open file for writing! /n");
sceIoLseek(fd, 0x3D70, PSP_SEEK_SET);
int res;
res=sceIoWrite(fd, &buff, 18);
sceIoClose(fd);
printf("\n\n\n %i bytes written. DONE... Exiting...", res);
sceNandSetWriteProtect(false);
sceKernelDelayThread(10*1000*1000);
sceKernelExitGame();
break;
}
pad.Buttons=0;
}
sceKernelDelayThread(10*1000*1000);
sceKernelExitGame();
return 0;
}