Hello PSP world!
Автор: Konstantin Kolesnichenko
Начинаем программировать для PSP, для этого нам понадобятся следующие вещи:
1. Сама приставка, можно конечно взять эмулятор, но это лишняя головная боль, поскольку он не очень хорош и даже сами SCEx на него забили. Приставка нужна с "правильной" прошивкой, т.е. той, которая позволяет запускать программы с флешки. На данный момент такое позволяет сделать только прошивка версии <=1.5, версии, которые старше 1.5 но младше или равны 2.0 можно "сдаунгрейдить" до 1.5. Приставка версии 2.01 и старше нам не подходит, поэтому если вы ее еще не купили, то ищите "правильную", а если у вас она есть, то или делайте правильную версию или выбрасывайте :)
2. Нужен пирацкий СДК (хомебрю, homebrew, искать на www.ps2dev.org), или, если вы заключили договор с SCEx, официальный. Где взять официальный - известно :), а неофициальный ищется в осле или других одноранговых сетях.
3. Качаем из нашего subversion (ссылки должны быть где-то в постах), prx loader.
4. Ставим его на псп: Должно быть следующее дерево:
| |-PSP-| |-GAME-| |-CWPSP -|-eboot.pbp |-CWPSP%-|-eboot.pbp
Для запуска приложения все готово.
Приступим к программированию:
Рассказывать буду для компилятора гцц, ибо с кодеварриором дружба у нас как-то не сложилась, имхо код там страшноватый генерируется.
1. Нужно скачать и установить cygwin.
2. Скачать psp toolchain (должен лежать на www.ps2dev.org).
Для того, чтобы приложение запустилось нам надо добавить следующие строки в main.cpp
(вместо слова basic — можно написать helloworld — это информация для линкера)
SCE_MODULE_INFO(basic, 0, 1, 1 );
Со следующими строчками все должно быть понятно.
SceInt32 sce_newlib_heap_kb_size = (1024 * 20 ); // allocate 20MB to the heap SceInt32 sce_newlib_stack_kb_size = ( 256 ); // allocate 256KB to stack //Дисплей-лист, в который будут заноситься все графические команды. char display_list[0x1000];
А дальше пишем
main.cpp
#include <KERNEL.H> #include <LIBGU.H> #include <DISPLAYSVC.H> int main() { sceGuInit( ); // Включаем графическую библиотеку //Начинаем дисплей-лист sceGuStart( SCEGU_IMMEDIATE,display_list, sizeof( display_list)); // Устанавливаем фреймбуфер и бек-буфер sceGuDrawBuffer( SCEGU_PF8888,SCEGU_VRAM_BP32_0,SCEGU_VRAM_WIDTH); sceGuDispBuffer( SCEGU_SCR_WIDTH,SCEGU_SCR_HEIGHT,SCEGU_VRAM_BP32_1,SCEGU_VRAM_WIDTH); // Устанавливаем буфер глубины sceGuDepthBuffer( SCEGU_VRAM_BP32_2,SCEGU_VRAM_WIDTH); // Выставляем параметры вьюпорта sceGuOffset( SCEGU_SCR_OFFSETX, SCEGU_SCR_OFFSETY); sceGuViewport( 2048, 2048, SCEGU_SCR_WIDTH, SCEGU_SCR_HEIGHT); sceGuFinish( ); sceGuSync( SCEGU_SYNC_FINISH, SCEGU_SYNC_WAIT); sceDisplayWaitVblankStart( ); sceGuDisplay( SCEGU_DISPLAY_ON); while( 1) { sceGuStart( SCEGU_IMMEDIATE,display_list, sizeof( display_list)); sceGuDebugPrint( 90, 100, 0xff0000ff, "Hello world!"); sceGuFinish( ); sceGuSync( SCEGU_SYNC_FINISH, SCEGU_SYNC_WAIT); sceDisplayWaitVblankStart( ); sceGuSwapBuffers( ); } }
Программа готова, теперь ее надо собрать. Для этого напишем простой мейкфайл.
Makefile
CC = psp-gcc SDK_TOP = d:/cygwin/usr/local/psp/devkit INCDIR = $(SDK_TOP)/include LIBDIR = $(SDK_TOP)/lib CFLAGS = -W -Wall -I$(INCDIR) ASFLAGS = $(DBGFLAG) LDFLAGS = $(DBGFLAG) -L$(LIBDIR) LDLIBS = -lgu -lstdc++ LOADLIBES = $(LIBDIR)/ctrl_stub.a LOADLIBES += $(LIBDIR)/display_stub.a LOADLIBES += $(LIBDIR)/ge_user_stub.a TARGET = helloworld OBJS = main.o all: $(TARGET).prx clean: rm -f $(TARGET).prx *.o *~ *.bak .cpp.o: $(CC) $(CFLAGS) -Wa,-al -c $< -o $*.o > $*.lst $(TARGET).prx: $(OBJS) $(LINK.c) $^ $(LDLIBS) $(LOADLIBES) -startfiles -o $@
Вот собственно и все, выполнив команду make вы должны получить helloworld.prx, который потом надо переименовать в program.prx и скопировать на приставку в каталог: I:\PSP_GAME\USRDIR\prx\program.prx
2 июня 2006