PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   Программирование для PSP (https://www.pspx.ru/forum/forumdisplay.php?f=101)
-   -   PSPxIDE - среда разработки хомбрю (https://www.pspx.ru/forum/showthread.php?t=36622)

pspowner 26.10.2007 13:08

Только в ядре 1.50 можно грузить прогу напрямую в Кернел-мод.

На 3.ХХ, если надо чо из кернела - нада подгружать внешнюю либу. Т.е. не напрямую.

CHERTS 26.10.2007 14:11

Уважаемые! А подскажите как можно из программки проиграть flash-ролик? есть ли какие нибудь наработки на сях по этому делу?
А так же есть ли у кого исходники по воспроизведению MP3 на PSP

Заранее спасибо!

l3VGV 26.10.2007 14:42

мр3 есть. флеша не видел. если мр3 надо то в приват давай.

pspowner 26.10.2007 15:12

Ну хорошо, дабы подвести черту. Рассказываю как юзать кернел-мод в 3.ХХ хомках. По крайней мере как я это понял читая ps2dev.org

Фактически, на нужно сделать 2 проги.

1) Kernel mode PRX - обычная библиотека, она будет вызываться из нашей главной программы.
2) EBOOT.PBP - по сути простой PRX лоадер, загружающийся в USER-режиме.


Также, как это сделано на ps2dev разбираем на прмере Nand-дампера.

Делаем библиотеку.

main.c

Код:

#include <pspsdk.h>
#include <pspkernel.h>
#include <pspnand_driver.h>
#include <string.h>

PSP_MODULE_INFO("NandDumper", 0x1006, 1, 1);
PSP_MAIN_THREAD_ATTR(0);

int nandLocked = 0;

void LockNand()
{
  if (!nandLocked)
      sceNandLock(0);
 
  nandLocked = 1;
}


void UnlockNand()
{
  if (nandLocked)
      sceNandUnlock();

  nandLocked = 0;
}

int ReadBlock(u32 page, u8 *buffer)
{
  u32 i, j;
  u32 k1;

  k1 = pspSdkSetK1(0);

  LockNand();

  if (sceNandIsBadBlock(page))
  {
      memset(buffer, 0xFF, 528);
      UnlockNand();
      pspSdkSetK1(k1);     
      return -1;
  }

  for (i = 0; i < 32; i++)
  {
      for (j = 0; j < 4; j++)
      {
        sceNandReadPagesRawAll(page, buffer, NULL, 1);
        sceNandReadExtraOnly(page, buffer+512, 1);
      }

      page++;
      buffer += 528;
  }

  UnlockNand();
  pspSdkSetK1(k1);

  return 0;
}


int module_start(SceSize args, void *argp)
{
  return 0;
}

int module_stop()
{
  return 0;
}

В заголовке обращаем внимание на -

Код:

PSP_MODULE_INFO("NandDumper", 0x1006, 1, 1);
PSP_MAIN_THREAD_ATTR(0);

0x1006 - Kernel mode prx
1,1 - версия нашей библиотеке (пофиг какая)

Также обратите внимание, что у нашей библиотеки есть функции module_start() и module_stop()
- они обязательны для внешних библиотек. Также важно, что в нашей библиотеке нету точки входа main().
pspSdkSetK1() - устанавливаем в 0, чтобы не дать Кернелу упасть при обращении к областям памяти юзер-режима..

Makefile делаем следущим образом -

Код:

TARGET = nanddumper
OBJS = main.o

INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

BUILD_PRX = 1
PRX_EXPORTS = nanddumper.exp

USE_KERNEL_LIBC=1
USE_KERNEL_LIBS=1

LIBDIR =
LDFLAGS = -mno-crt0 -nostartfiles
LIBS = -lpspnand_driver2


PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Обращаем внимание на "no-crt0" и "nostartfiles". Так делается по той причине, что у нас не программа,
а просто библиотека и все это нам не надо. Также обращаем внимание на подключаемые библиотеки.
Да, и у нас появляется строчка "PRX_EXPORTS = nanddumper.exp" - в этом файлике указаны функции нашей библиотеки,
функции которые будут видимы после её загрузки.


nanddumper.exp -
Код:

# Define the exports for the prx
PSP_BEGIN_EXPORTS

# These four lines are mandatory (although you can add other functions like module_stop)
# syslib is a psynonym for the single mandatory export.
PSP_EXPORT_START(syslib, 0, 0x8000)
PSP_EXPORT_FUNC_HASH(module_start)
PSP_EXPORT_VAR_HASH(module_info)
PSP_EXPORT_END

PSP_EXPORT_START(NandDumper, 0, 0x4001)
PSP_EXPORT_FUNC(ReadBlock)
PSP_EXPORT_END

PSP_END_EXPORTS

Усё должно быть в этом файле именно так, за исключением строчек "PSP_EXPORT_FUNC()" -
именно этими строчками вы указываете ваши функции экспортируемые из вашей библиотеки.
Да, и не забываем что строчка "PSP_EXPORT_START(NandDumper, 0, 0x4001)" должна соответствовать тому,
что вы написали в модульинфе в файле main.c.

Значит этот файлег "nanddumper.exp" нам нужен для того, чтобы сгенерить .S файл, который в свою очередь
юзается нашей прогой для доступа к экспортированным функциям. Чтобы сгенерить S файл идём в Пуск->выполнить
вбиваем "cmd", заходим в папку с установленным PSPSDK и выполняем команду-

Код:

psp-build-exports -s nanddumper.exp
Не забываем, что перед этим нам надо установить правильное окружение(запустить файл pspdev.bat)
Т.е. вся процедура отображена здесь -

[IMG]http://img521.**************/img521/8778/54330844wh4.jpg[/IMG]

Получившийся .S - файл будет выглядеть примерно так -

Код:

    .set noreorder

#include "pspstub.s"

    STUB_START "NandDumper",0x40090000,0x00010005
    STUB_FUNC  0x9EDD6EE1,ReadBlock
    STUB_END

Копируем .S файл в папку с нашей прогой. Усё, компилим нашу либу.

Ну а теперь делаем наш EBOOT.PBP - главную программу, которая грузит нашу библиотеку.

Код:

#include <pspsdk.h>
#include <pspkernel.h>
#include <stdio.h>
#include <string.h>

PSP_MODULE_INFO("NandDumperMain", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(20000);

u8 block[32*32*528];

int ReadBlock(u32 page, u8 *buffer);

#define printf pspDebugScreenPrintf

int main()
{
  pspDebugScreenInit();
 
  SceUID mod = pspSdkLoadStartModule("nanddumper.prx", PSP_MEMORY_PARTITION_KERNEL);

  if (mod < 0)
  {
      printf("Error 0x%08X loading/starting naddumper.prx.\n", mod);
  }

  else
  {

      SceUID fd = sceIoOpen("ms0:/nanddump.flash", PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0777);

      printf("Dumping...\n");

      int i, j;

      for (i = 0; i < (2048*32); )
      {       
        u8 *p = block;
        memset(block, 0xff, sizeof(block));

        for (j = 0; j < 32; j++)
        {

            if (ReadBlock(i, p) < 0)
            {
              printf("bad block at page %d block %d\n", i, i/32);
            }

            i += 32;
            p += (528*32);
        }
       
        sceIoWrite(fd, block, sizeof(block));       
      }

      sceIoClose(fd);

      printf("Done. Exiting in 5 seconds\n");
  }

  sceKernelDelayThread(5*1000*1000);
  sceKernelExitGame();

  return 0;
}

Обращаем внимание на заголовок. Прога должна быть в USER-режиме.

Код:

PSP_MODULE_INFO("NandDumperMain", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(20000);

Размер буфера тоже увеличиваем.
Внимание, необходимо задекларировать все функции которые будем юзать из внешней библиотеки

Код:

int ReadBlock(u32 page, u8 *buffer);
А вот этой строчкой -

Код:

SceUID mod = pspSdkLoadStartModule("nanddumper.prx", PSP_MEMORY_PARTITION_KERNEL);
Грузим нашу библиотеку. Она уже будет в КЕРНЕЛ-режиме. Файлег .s у нас позаботится о переходах юзер/кернел
и голова у нас об этом не болит.

Ну и makefile

Код:

TARGET = nanddumpermain
OBJS = main.o NandDumper.o

INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

BUILD_PRX = 1
PSP_FW_VERSION = 371

LIBDIR =
LIBS =
LDFLAGS =

EXTRA_TARGETS = EBOOT.PBP

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Ну вот собстна и всё. Откомпилив всё это, вы получаете 2 файла - nanddumper.prx и EBOOT.PBP
Закидываете на стик и всё готово.

(С)Перевод мой) Оригинал на ps2dev

Писал, не проверяя на PSP, вечерком возможно проверю. Если есть каменты, пожелания/исправления - пишите.

CHERTS 29.10.2007 12:47

Уважаемые, у кого-нибудь пробовал скомпилить плагин Mp3prx?

есть исходники но непонятно под какую SDK?
при компиляции арет что файл psputility_avmodules.h не найден

какие есть идеи?

ALgraFx 29.10.2007 14:58

Цитата:

Сообщение от CHERTS (Сообщение 551150)
Уважаемые, у кого-нибудь пробовал скомпилить плагин Mp3prx?

есть исходники но непонятно под какую SDK?
при компиляции арет что файл psputility_avmodules.h не найден

какие есть идеи?

очевидный вариант - ищи psputility_avmodules.h - либо геморный удали строку подключающую этот файл и смотри по ошибкам компиляции чего нехватает и ищи только эти переменные, структуры...

pspowner 29.10.2007 15:09

*UPDATE по компиляции хомок для 3ХХ

Идём в папку pspdev/psp/sdk/lib
Находим там файлег build.mak, открываем его, смотрим в самом низу -

$(PACK_PBP) EBOOT.PBP $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) strip_$(FINAL_TARGET) $(PSP_EBOOT_PSAR)

Приставку strip_ перед $(FINAL_TARGET) удаляем и сохраняем файл.

Вот теперь ебуты будут собираться правильно, если этого не сделать, то полученные хомки будут вываливаться в XMB с формулировкой Unsupported prx type.

CHERTS 29.10.2007 15:50

Цитата:

Сообщение от ALgraFx (Сообщение 551210)
очевидный вариант - ищи psputility_avmodules.h - либо геморный удали строку подключающую этот файл и смотри по ошибкам компиляции чего нехватает и ищи только эти переменные, структуры...

Очевидный, но с подводными камнями, даже если я и нашел psputility_avmodules.h, но он от старой SDK, и даже с ним возникают корявости.

Ладно, будем грызть кактус дальше.

SееD 29.10.2007 17:40

что у меня получилось:

1) всё поставил
2) успешно скомпилил готовый сэмпл под 1,50
3) успешно скомпилил Превед Мир! под 1,50
4) успешно скомпилил Превед Мир! под 3,71

5) безуспешно попытался скомпилить Нанд Дампер.

ошибки при комплиляции PRX следующие:

Код:

******************************************
Ошибки/Предупреждения ...
******************************************
main.c: In function 'ReadBlock':
main.c(49) : warning: implicit declaration of function 'sceNandReadPagesRawAll'
main.c(50) : warning: implicit declaration of function 'sceNandReadExtraOnly'
/cygdrive/c/pspdev/bin/../lib/gcc/psp/4.0.2/../../../../psp/bin/ld: cannot find -lpspnand_driver2
collect2: ld returned 1 exit status
make: *** [nanddumper.elf] Error 1
Компиляция прервана !

я где-то ошибся или нужен новый SDK? и если да, то можно ссылку?

pspowner 29.10.2007 22:29

Цитата:

Сообщение от SееD (Сообщение 551371)
что у меня получилось:

1) всё поставил
2) успешно скомпилил готовый сэмпл под 1,50
3) успешно скомпилил Превед Мир! под 1,50
4) успешно скомпилил Превед Мир! под 3,71

5) безуспешно попытался скомпилить Нанд Дампер.

ошибки при комплиляции PRX следующие:

Код:

******************************************
Ошибки/Предупреждения ...
******************************************
main.c: In function 'ReadBlock':
main.c(49) : warning: implicit declaration of function 'sceNandReadPagesRawAll'
main.c(50) : warning: implicit declaration of function 'sceNandReadExtraOnly'
/cygdrive/c/pspdev/bin/../lib/gcc/psp/4.0.2/../../../../psp/bin/ld: cannot find -lpspnand_driver2
collect2: ld returned 1 exit status
make: *** [nanddumper.elf] Error 1
Компиляция прервана !

я где-то ошибся или нужен новый SDK? и если да, то можно ссылку?

Это хорошо что откомпилил) Надеюсь запустилось?

Вобщем ну его к черту этот НАНДДампер. Это был лишь пример того как использовать внешние библиотеки, к тому же я скорее всего в инструкции чот не так написал(по мелочи)))). Но это не главное, главное что в ДевКите чевота нехватает, подозреваю что этого самого nand_driver2


Разбирацца было лень, такчто ща сделал простенькую пару prx/pbp - всё компилица и работает. Надеюсь там будет всё понятно ибо уж упростил до предела. Потом может и инструкцию под это перепишу.

http://www.rapidshare.ru/448787
http://www.rapidshare.ru/448790

З.Ы. Кстати, нечто похожее лежит в сэмплах в папке prx. Не совсем то что нужно, правда, но для общего развития советую посмотреть.

HRR 02.11.2007 21:02

Люди, скажите ламеру, реально написать дебаггер под PSP (хотя бы просто окно дизасма, вьювер памяти/регистров, возможность бряков) так, чтобы на PSP скомпилить плагин, который будет обмениваться данными с софтиной на PC через USB? Или есть какие-нибудь другие рабочие дебаггеры, в которых можно дебажить UMD-шные игры?

l3VGV 03.11.2007 09:09

psplink+usbhost+pcterm+psp-gdb. Это всё описано в мануале к псп линку.

pspowner 03.11.2007 13:01

Есть ещё CWCheats который имеет встроенную фанукцию дизасма. Однако отладки там нет.

Ваще RISC для меня китайская грамота, скока не пытался хоть чевота понять.

HRR 03.11.2007 13:54

Цитата:

psplink+usbhost+pcterm+psp-gdb. Это всё описано в мануале к псп линку.
А что нужно знать и уметь для написания подобной вещи?
И вообще реально ли мне это сделать?..

Цитата:

Есть ещё CWCheats который имеет встроенную фанукцию дизасма. Однако отладки там нет.
Ну, отдизасмить я и так смогу, но мне позарез нужны бряки :( От дизасма толку нет...

Цитата:

Ваще RISC для меня китайская грамота, скока не пытался хоть чевота понять.
Ты о R4000? Что там понимать то? Не сложнее ГБА и PSX(R3000) :)

pspowner 03.11.2007 14:03

Цитата:

Сообщение от HRR (Сообщение 555181)
А что нужно знать и уметь для написания подобной вещи?
И вообще реально ли мне это сделать?..


Ну, отдизасмить я и так смогу, но мне позарез нужны бряки :( От дизасма толку нет...


Ты о R4000? Что там понимать то? Не сложнее ГБА и PSX(R3000) :)

А что такое "бряки"? Брейкпоинты? Странное произношение...

Я о RISC, упрощённом наборе инструкций для процессоров. RХХХХ в частности. CISC на х86 у меня вопросов не вызывает, я с ним работал.

Если знаешь по риску полезное чтиво, буду рад ознакомиться.

HRR 03.11.2007 16:15

Цитата:

А что такое "бряки"? Брейкпоинты? Странное произношение...
Не знаю, все знакомые знатоки дебаггеров произносят именно так :)

Цитата:

Если знаешь по риску полезное чтиво, буду рад ознакомиться.
Мне просто приходилось дебажить пару игр на PSX. Совершенно ничего сложного, не сложней, чем дебаг GBA. В особенности процессора я не вникал, да и не изучал ничего, так что практически ничего не знаю. Справочник инструкций - и вот оно, счастье :) Хотя большинство инструкция там и так сразу понятно на интуитивном уровне.
Смотрел инструкции R4000 - не сильно отличается от 3k, но вот дебаггера нет :( С удовольствием бы написал сам, да вот нет необходимых знаний и умений :(
Насколько я понимаю, достаточно написать плагин, который будет дежурить во время игры и связываться с прогой на PC, при требовании отсылая ей данные о регистрах, памяти и т.п. А прога в свою очередь будет обладать юзверьским интерфейсом, дизасмом и т.п.
Реально ли такое сделать?...
Если всё получится - выйдет немало хороших переводов :)

L0NG 30.11.2007 01:33

люди подскажите плиз, у меня сабж psplink - не работает!
все настроил, и никак... пишет что к псп никак не подключиться. делал всё шаг в шаг как писал камрад Pspowner. псп fat прошивка 3.71 m33 - 3
очень хотелось бы откомпилированный код запускать сразу на железяке!


psplink ставил 2.0 из набора что выкладывал Pspowner
у меня когда его запускаешь, на компе зыза определяется просто зыза, НЕ type B.
пробовал и 3.0 с ней определяется как type B но все равно не работает.
что пробовать сделать?

pspowner 01.12.2007 11:29

Поставить драйвера PSP type b. найти пральный psplink.ini или выправить его самому.

Попробуй снять/установить галку на Запускать "USBHost в Daemon-режиме".

Вобще ща уже не помню всех этих плясок с бубном... Но кароч работает он.
А запускать на железяке - ну скомпили, перепиши да запускай.

L0NG 01.12.2007 14:52

спасибо, ждал! сейчас попробую. я кстати раздобыл дрова для psp type B
и поставил но когда просто втыкаю её она определяется как PSP. напрочь грохнуть обычные дрова я не решаюсь ... или она как тип Б должна определяться только в psplink ?

l3VGV 01.12.2007 15:02

только после запуска псплинк на псп.


Текущее время: 01:40. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.