Больше полугода назад у меня появилась игровая консоль Sony Playstation Portable (или просто PSP). Надо сказать, что игры на ней отменные, консоль можно взять в любую поездку и приятно скоротать время в дороге. Как разработчику мне всегда было интересно, как же писать приложения для PSP, я видел множество свободнораспространяющихся приложений, таких как PSP WiFile Transfer, Bookr и даже порты OpenSource игр, например OpenTTD, а недавно у меня появилось немного свободного времени, чтобы заняться вопросом разработки для PSP более подробно, поэтому я поискал информацию по данному вопросу и, как оказалось, программировать для PSP не так уж и сложно.
Итак, в данной статье мы рассмотрим настройку среды разработки для PSP на языках программирования Си и Си++ и написание простейшей классической программы Hello world.
Что же мы имеем изначально:
1. дистрибутив Ubuntu 9.04
2. доступ в интернет (придется скачивать исходные коды библиотек, необходимых для разработки PSP программ)
13 ИНТЕРЕСНЫХ ФАКТОВ О PSP
3. свободное время порядка 3 — 4 часов (библиотеки собираются из исходных кодов, поэтому компиляция занимает несколько часов)
Первое что нам потребуется — установить subversion:
sudo aptitude install subversion
Теперь можно получить последние исходные коды psptoolchain (кросскомпилятора для PSP)
svn co svn://svn.ps2dev.org/psp/trunk/psptoolchain
В полученной папке есть readme файл для всех и специально для дистрибутива Ubuntu (замечу, что psptoolchain можно собрать в любом linux дистрибутиве, а так же cygwin-е). В readme файле для дистрибутива Ubuntu написано что для сборки psptoolchain необходимо удовлетворить зависимости с помощью следующей команды:
sudo apt-get install build-essential autoconf automake bison flex
libncurses5-dev libreadline-dev libusb-dev texinfo libgmp3-dev
libmpfr-dev subversion gcc-4.2
что мы и сделаем. После этого нам нужно определить несколько переменных окружения. Добавим следующие строки в файл ~/.bashrc:
export PSPDEV=»/usr/local/pspdev»
export PSPSDK=»$PSPDEV/psp/sdk»
export PATH=»$PATH:$PSPDEV/bin:$PSPSDK/bin»
и выполним команду:
source ~/.bashrc
Теперь можно приступить непосредственно к сборке среды разработки:
cd psptoolchain
sudo ./toolchain-sudo.sh
После этого необходимо получить дополнительные библиотеки для разработки (zlib, SDL и т.п.). Для этого сначала получим набор скриптов из SVN с помощью следующей команды:
svn co svn://svn.ps2dev.org/psp/trunk/psplibraries psplibraries
К сожалению в скриптах установки дополнительных библиотек есть ошибка, для того чтобы ее исправить необходимо сделать следующее: открваем файл psplibraries/scripts/003-freetype.sh и заменяем его содержимое на следующий текст:
После этого установим одну зависимость:
sudo aptitude install libtool
и запускаем компиляцию библиотек:
sudo ./libraries-sudo.sh
Программы и утилиты для PSP
После данных махинаций мы имеем кросскомпилятор и набор библиотек для разработки программ для PSP на Си и Си++. Давайте напишем нашу первую программу.
#include #include PSP_MODULE_INFO(«Hello World», 0, 1, 1); #define printf pspDebugScreenPrintf /* Exit callback */ int exit_callback(int arg1, int arg2, void *common) < sceKernelExitGame(); return 0; >/* Callback thread */ int CallbackThread(SceSize args, void *argp) < int cbid; cbid = sceKernelCreateCallback(«Exit Callback», exit_callback, NULL); sceKernelRegisterExitCallback(cbid); sceKernelSleepThreadCB(); return 0; >/* Sets up the callback thread and returns its thread id */ int SetupCallbacks(void) < int thid = 0; thid = sceKernelCreateThread(«update_thread», CallbackThread, 0x11, 0xFA0, 0, 0); if(thid >= 0) < sceKernelStartThread(thid, 0, 0); >return thid; > int main()
Итак, с помощью макроса PSP_MODULE_INFO мы определяем задаем информацию о нашей программе и ее версии, далее опредяем несколько стандартных callback-ов и соотвественно главную функцию нашей программы main — которая устанавливает заданные нами callback-и и печатает на экране заветную строку «Hello world».
Теперь напишем Makefile для того чтобы собрать наш код.
TARGET = hello
OBJS = main.o
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Hello world
PSPSDK=$(shell psp-config —pspsdk-path)
include $(PSPSDK)/lib/build.mak
Скомпилируем нашу программу командой make. Полученный файл EBOOT.PBP поместим на консоль в папку psp/game/hello. Вот и все. В следующей статье мы рассмотрим, как контролировать нажатия клавиш.
Источник: habr.com
ТОП-5 лучших плагинов для PSP-консоли
С плагинами вы можете сделать с PSP многое из того, что невозможно по умолчанию. Предложение, соответственно, велико. Мы расскажем, какие пять плагинов следует установить в обязательном порядке.
sceKernelSleepThread();
// поток засыпает
// если уснули все потоки, то единственное,
// что может случиться — это каллбек
// в этой программе эта строчка никогда не выполнится 😉
Все остальные функции лучше оставить такими, какие есть. Полную версию этой программы с комментарием к каждой строчке можно найти в архиве.
Итак, мы можем теперь выводить что угодно и узнавать, как на это реагирует пользователь. Самое время портировать Moria или какую-нибудь змейку Для полного текстового счастья не хватает, конечно же, цвета и возможности писать где угодно. Ради цвета я бы посоветовал использовать макрос, который я благополучно стырил откуда-то из хедеров к IDE:
typedef unsigned char byte;
// определяем, потому что DevKitPSP понятия не имеет,
// что есть такой тип
#define RGB(r,g,b) ((u32)((byte)(r)|((byte)(g)
Этот макрос выдает цвет, подходящий к любым функциям, связанным с цветом среди API PSP. Например, к функции установки фона для текста:
pspDebugScreenSetBackColor(RGB(0, 0, 255));
// ставим синий
или цвета самого текста:
pspDebugScreenSetTextColor(RGB(0, 255, 0));
// зеленый!
или даже установки символа в любую позицию:
pspDebugScreenPutChar(100, 100, RGB(255, 0, 0), ‘A’);
// ставим красный символ ‘A’ в точку с координатами (100, 100)
Кстати, координаты задаются в пикселях, а не в строках и столбцах символов.
Ну что ж, теперь ты можешь написать на экране PSP что угодно. Например, проклятие черными буквами на черном фоне своему врагу, или другу-готу. Или розовым по черному нарисовать ASCII-спанч боба. Или красным по розовому признаться в любви своей девушке (парню?). Или. а, о чем я. Решать тебе.
Наслаждайся! А в следующей статье я постараюсь рассказать про картинки. Хотя бы немножко
Источник: xakep.ru