Программируем для PSP: Часть I, настройка компилятора

    Давайте условимся сразу: я следую паттерну «изучение обучением», т.е. учу, одновременно изучая, обгоняя читателей на 2-3 «шага» вперед. Однако это не значит, что я ничего не знаю и все, что говорю — обычные копипасты: я стараюсь разобраться в теме, прежде чем писать о ней. Поэтому смело задавайте вопросы, этим вы принесете пользу и себе, и мне: на вопросы, ответ на которые я не знаю, я буду его искать, осозновать и рассказывать вам.

    Итак, в этом топике будет небольшой рассказ о том, как скомпилировать и запустить первую программу на своей приставке. Сразу предупреждение: статья мегатехнического плана, почти все содержание касается утомительной, но быстрой настройки компилятора, а в результате вы получите лишь банальный «Hello World». Однако без нее никак.

    Будем предполагать как данность, что у вас есть приставка Sony PSP, перепрошитая до последней версии — 3.90 M33-3 (так называемая custom firmware, неофициальная прошивка). О том, как перепрошиваться, уже рассказывали многие, и останавливаться на этом я не буду. Так же будем считать, что в кирпич ваш вставлена флешка, на которой есть хотя бы 50кб свободного места, и вы имеете к ним доступ (например, через саму PSP).

    Скажу сразу: я почти уверен, что ничего плохого с вашей приставкой не случится, если вы будете достаточно аккуратны, но никаких гарантий дать, к сожалению, не могу.

    Используемый язык программирования — Си, я буду использовать бесплатную IDE Code::Blocks под Windows XP. Пользователи других компиляторов или ОС могут попробовать настроить IDE сами, благо, настройки у всех похожи; я же использовал то, для чего нашел мануал ;)

    Для начала, скачаем набор компиляторов, линкеров и библиотек для PSP под названием DevKitPSP. Распакуйте его куда-нибудь, я его распаковал в корень диска E: (теперь у меня есть папка E:\devkitpsp\).

    Теперь откройте Code::Blocks. В меню выберите Settings→Compiler and Debugger, как Selected Compiler в открывшемся окошке выберите GNU GCC (он должен стоять по умолчанию), скопируйте его, назвав, например, DevKitPSP, и настройте его:

    Вкладка Search Directories→Compiler (удалите все, что там есть, и нажимайте Add для добавления каждого из путей):
    E:\devkitPSP\include
    E:\devkitPSP\psp\include
    E:\devkitPSP\psp\sdk\include
    Linker:
    E:\devkitPSP\lib
    E:\devkitPSP\psp\lib
    E:\devkitPSP\psp\sdk\lib


    Вкладка Toolchain Executables:
    Compiler's installation directory: E:\devkitPSP. Там есть примечание, что в этой папке должна быть подпапка bin, проверьте.
    C-compiler: psp-gcc.exe
    C++-compiler: psp-g++.exe
    Linker for dynamic libs: psp-g++.exe
    Linker for static libs: psp-ar.exe
    Еще три поля я оставил пустыми.


    Теперь можно жать OK, и переходить к созданию нового проекта (File→New→Project..., слева в окошке жмем Projects и выбираем Empty). Заполняем Project Title (не играет роли, пусть будет PSPHelloWorld), не забываем поставить папку для сохранения проекта (я вон в первый раз забыл, и получил кучу глюков и ошибок); компилятор, разумеется, ставим свежесозданный нами.

    Наш проект девственно пуст, создаем фаил (File→New→File..., на название наплевать, я выбрал main.c) — не забудьте в мастере создания фаила выбрать как язык Си и поставить галочки «Add to current project», «Debug» и «Release» (почему они не стоят по умолчанию?).

    В созданный фаил копируем код (ключ доступа — хабрахабр). Я бы сюда закинул, если бы не хабрапарсер. Код писал не я, кстати: опыта пока-что маловато, хотя я вполне понимаю, что там происходит и как — в любом случае, в этом топике я останавливаться на этом не буду.

    Теперь последние штрихи к настройке. Мы уже настроили то, с помощью чего будем компилировать, но не настроили, как и что у нас должно выходить. Поэтому жмем правой кнопкой на название проекта справа, выбираем Properties, а там — Build targets. Снимаем галочку «Auto-generate filename extension», и правим в Output filename расширение «exe» на «elf». Выполняем тоже самое для конфигурации Release, жмем Ok.

    Жмем правой кнопкой на название проекта опять, выбираем Build Options и, на вкладке Linker Options, вписываем в Other linker options:
    -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lpsplibc -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel
    . Повторяем для Release.

    Вроде всё (надеюсь, это последняя статья скучного технического плана). Теперь собираем проект (Build→Build или знакомое всем Ctrl-F9) — если вдруг появились ошибки, то думаем, что же сделали не так, а потом спрашиваем в комментариях (может, я забыл чего).

    Чтобы не настраивать потом заново, стоит сохранить проект как шаблон (File→Save Project as user-template...).

    Итак, у нас есть elf-фаил нашей программы. Перед тем, как закидывать его на PSP, надо преобразовать его в EBOOT.PBP (название придумал не я, честно). Для этого у меня стоит такой bat-ник:

    «E:\devkitPSP\bin\mksfo.exe» %1/bin/Debug/%1 %1/bin/Debug/%1.sfo
    «E:\devkitPSP\bin\psp-fixup-imports.exe» %1/bin/Debug/%1.elf
    «E:\devkitPSP\bin\psp-strip.exe» %1/bin/Debug/%1.elf -o %1/bin/Debug/stripped.elf
    «E:\devkitPSP\bin\pack-pbp.exe» %1/bin/Debug/EBOOT.PBP %1/bin/Debug/%1.sfo NULL NULL NULL NULL NULL %1/bin/Debug/stripped.elf NULL


    Он располагается у меня в директории pspprj, в которой я создаю по папке для каждого проекта. Используется он так: make_eboot.bat HelloWorld. Если у вас другая организация папок, или вы просто хотите его переписать или запускать каждую программу вручную — просто запускайте по строчке, не забывая заменять %1 на названия или пути к фаилам. В результате у вас получится фаил EBOOT.PBP, его надо будет закинуть в папку /PSP/GAME150/HelloWorld (или другое название)/, а все остальное можно спокойно удалить. Теперь проверяйте (выход — по кнопке Home).

    Как «домашнее задание» — сделайте так, чтобы все «хелловорлды» были с новой строки. До встречи!

    P.S. Вырезал весь «юмор», который сначала вписывал. Всегда самого раздражали тупые шутки в такого рода постах, а в том, что мои шутки не тупы, я быть уверен не могу :)
    Поделиться публикацией
    Комментарии 45
      0
      Супер! Жду не дождусь когда куплю себе PSP :D
        0
        попробуй погуглить эмуляторы, прежде чем покупать, если для тебя программирование для псп - решающий аргумент при решений покупать или нет :)
        0
        Ну почему я не си-программер... :'-(
          0
          я тоже не про в си, но в чем проблема-то его потихоньку то и изучить? мы же не деньги зарабатывать пытаемся, а стараемся для себя, а потому профессионализм и мастерство тут не столь важны сразу :)
            0
            Мнебы щас изучить то что я ''начал'' - Java, css, php, школа :D
          0
          Не нашёл в посте ни одной орфографической ошибки. =(( Плохо искал, наверное.
          А для пунктуационных у самого скилла не хватает, но чувствую, что они там есть.
          Плохой, в общем пост, не доебаться до правописания.
            +3
            как же так, как же так :(( добавить, что ли, парочку, дабы привлечь сюда ревностных орфографо-самоутверждальщиков )
              +1
              Чтобы привлечь, ошибись в названии темы. Напиши: «Праграммирование». Или «Програмирование». Но так, чтобы новоязом не отдавало, как-бы-ошибся, как-бы-неспециально. И PSP на PCP замени
                +2
                убрал м :)
                пытался сделать в слове компилятор ошибку, но выходило как-то похоже на клитор. я не против клиторов, вот только могут решить что шутка и не изображать сирани перфекционизм
                  +1
                  Социальные эксперименты на хабрахабре. Жаль, графика просмотров нету.
                    0
                    блин, что ж ты сразу не сказал. пихну картинку-счетчик в следующую статью
                    +1
                    О! О! Вставь в пост картинку-счётчик. Хотя ладно, поздно уже. Картины «до» мы уже не увидим.
                      0
                      выглядеть будет так тока оси другие
                      (сорри за говнокач-во, фотал мобилой!111)

                      счетчик надо прогать. это минут на 25 былокодерства, но жутко лень )
                      но я попробую заставить себя (нет! я играю в манхант 2. никаких заставлений не выйдет)

                      кстати, надо было поставить одно неправильное тире или дефис. после того быдлотопика это - любимая тема ;)
                      0
                      >убрал м

                      Фу, верните обратно. )
                0
                Здорово. Спасибо за пост.
                И всё-таки раз код не ваш, то откуда информацию берете. Расшарьте источник пожалуйста :).
                  0
                  не помню :( но я встречал этот код раз 5-6 на разных ресурсах, как шаблонка )
                    0
                    Ок :) Гугл всё знает. Начнём с этого: http://www.psp-programming.com/tutorials…
                      0
                      о, точно. фокс в очередной раз сожрал мои закладки, а на делишс я вроде закинуть забыл )
                      к слову, впервые я увидел сей код не там
                  0
                  кстати, а нет ли у кого информации про средства разработки, которые предоставляет Сони для PSP и PS3? А то посмотреть на них хочется
                    0
                    Насколько я слышал SDK для программирование под платформы стоят немало денег. По крайней мере так обстоят дела с Xbox.
                      0
                      под Xbox как раз все хорошо: Майкрософт выпустил xna framework. С его помощью можно писать игры под винду и иксбокс, а вот хотя-бы рассказ программеров под PS3 о средствах разработки был бы очень интересен
                        0
                        Насколько мне известно DevKit для PS3 до недавнего времени стоил $10k. Сейчас вроде как цены скинули.
                          0
                          я думаю проблема не в цене, а в том что девкиты кому попало не продают
                      0
                      Радует, что есть возможность писать те же вещи на скриптах :) На Lua например. С графикой, конечно, не поработаешь. Силенок интерпретатору не хватит. Но писать всякие мелочи и логику одно удовольствие.
                        0
                        В продолжении о скриптах. Тут же и поддержка Python: http://python-psp.net/trac
                          0
                          а русские буквы удалось побороть (чтоб на экране по человечески строки выводить)? utf8, win1251, установка шрифта ttf - мне не помогла: рисует только "квадратики".
                          логику писать - без ООП с классами и строгой типизацией и проч ... как-то тяжко :(
                          0
                          Ты-гы-ды-дынц, орфографические ошибки! :-)

                          "...я буду его искать, осозновать и рассказывать вам..."
                          ОсознАвать, конечно же.

                          "...не забудьте в мастере создания фаила..."
                          А тут надо: фаЙла.

                          "В созданный фаил..." и прочее — уже ясно.

                          Я это не со зла, а понты — понятие, нам не близкое.
                            +1
                            но-но, если не понты - то в личку

                            и вообще, мне приятно осознОвать, что в моих фаИлах ошибки не столь важны, сколь информация
                            0
                            А почему "Linker for dynamic libs: psp-g++.exe" ?
                              0
                              не скажу так сразу даже, но у меня с такими настройками все работает :)

                              psp-g++.exe --help как-то смутно намекает на то, что он еще и линкер (см. опцию -c)
                              если честно, я не очень хорошо разбираюсь в компиляторах-линкерах, тем более GCC ;) так что если вы сами можете обьяснить, было бы супер; может, даже это надо исправить. в любом случае, я еще поищу на эту тему что-нибудь
                                0
                                вот что нашел в devkitPSP\man\man1\psp-g++.1

                                it normally does preprocessing, compilation, assembly and linking


                                если я правильно понял, то это ответ на твой вопрос )
                                  0
                                  Ну обычно и gcc, и g++ для линковки вызывают что-то типа ld. По идее это и должно быть вписано.
                                    0
                                    руководствуюсь идеей: "работает — и лучше не трогать" :)
                                    расставить так настройки придумал не я, и думать почему да как — не выходит (
                                      0
                                      g++ умеет вызывать встроенный[?] линкер. Лучше не мешать ему, он разберется.
                                        0
                                        Встроенного нет, есть линкер по умолчанию :]
                                  0
                                  На этапе сборки выпадает варнинг:
                                  C:\...\psp\dev\psp.1\main.c:45: warning: implicit declaration of function 'sceDisplayWaitVblankStart'


                                  У меня какая-то либа не подключилась, похоже?
                                    0
                                    это же уорнинг :)
                                      0
                                      душа требует, чтобы все было чисто :)
                                    +1
                                    Работает! :)
                                      0
                                      ну хоть кто-то фидбак оставил ))
                                        0
                                        Жду дальнейших публикаций, заодно сам пока поковыряюсь на предмет сборки чего-нибудь более интересного :)
                                          0
                                          я думаю через полчасика-час выложу вторую часть ;)
                                      0
                                      Всё же код лучше выкладывать сюда, чтобы его можно было обсудить. Тем более, если вы сами не до конца его понимаете. (:
                                        0
                                        >> -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lpsplibc -lpspnet_inet -lpspnet_apctl ->> lpspnet_resolver -lpsputility -lpspuser -lpspkernel
                                        >> . Повторяем для Release.

                                        для релиза -lpspdebug указывать не надо. он нужен только в дебаг конфиге.
                                          0
                                          Приобрел PSP неделю назад, и только сейчас наткнулся на это статью.
                                          Автору спасибо и мое уважение за проделанный труд, но к сожалению автор не программист, покрайней мере не профессиональный программист.
                                          несколько замечаний:
                                          для того, что бы убрать warning достаточно добавить один include
                                          #include
                                          использовать батник при "живом" IDE нет не какого смысла - в Project/"Build Options" закладка "Pre/Post build steps" можно добавить скрипт для всех таргетов:

                                          "c:\Project\psp\devkitPSP\bin\mksfo.exe" "${PROJECT_NAME}" "${TARGET_OUTPUT_DIR}${PROJECT_NAME}.sfo"
                                          "c:\Project\psp\devkitPSP\bin\psp-fixup-imports.exe" "${TARGET_OUTPUT_FILE}"
                                          "c:\Project\psp\devkitPSP\bin\psp-strip.exe" -o "${TARGET_OUTPUT_DIR}stripped.elf" "${TARGET_OUTPUT_FILE}"
                                          "c:\Project\psp\devkitPSP\bin\pack-pbp.exe" "${TARGET_OUTPUT_DIR}EBOOT.PBP" "${TARGET_OUTPUT_DIR}${PROJECT_NAME}.sfo" NULL NULL NULL NULL NULL "${TARGET_OUTPUT_DIR}stripped.elf" NULL

                                          что избавит от гемороя - запускать батник после каждего билда.

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое