consoledevСтатьи

Hello PSP world!

Автор:

Начинаем программировать для 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

Комментарии [10]