Программирование для PlayStation 2 — старт

    image
    Каждый справляет новый год по разному.
    Кто-то помнит его, а кто-то нет.
    Я стоял на балконе и курил, наблюдая салют. Вобщем-то, я ждал когда запишется диск.
    Диск было не жалко ради такого эксперимента – он того стоил.
    Это было мое первое приложение под PlayStation 2. Правда, все, что оно умело – это выводить клавиатуру и, с помощью джойстика, печатать, но это был уже прогресс!
    Итак, запуск! Работает!

    Сама суть


    Так я начинаю цикл статей по программированию для PlayStation 2
    Сначала будет длинная теория.
    Потом практика. Поскольку я не профессионал С++ (или С — кому как нравится, но я буду рассказывать на С++), то прошу строго не судить о коде.
    Также, по PlayStation 2 SDK желательно использовать Red Hat 6 или выше, однако, я пишу все это под Windows 7. Хоть все и работает криво, но работает – и ладно.
    К началу практических экспериментов советую иметь чипованную PlayStation 2 и сетевой кабель. Для моих экспериментов выбрана PlayStation 2 Slim 90006 формата NTSC чипованная и сетевой кабель синего цвета =) (Я не использовал для дебага режим iLink, поскольку драйвера в комплекте идут только под Linux, да и жесткий диск нужен).



    Официально



    Естественно, ваши игры не будут официальными. Даже уверен, что компания Sony может не простить такого разгильдяйства. Официально вы можете купить поддержку, сам SDK и оборудование всего, не соврать бы, за $10 000. Да и дают лицензию не каждому…

    Мы с вами люди не богатые, поэтому мы пойдем путем…

    Неофициально



    Неофициально я искал этот SDK несколько суток, качал его две недели (а может и больше), разбирался в куче доков еще больше. На данный момент SDK занимает 608 метров, включая ПО, без Visual Studio 6.

    Итак. Для начала нам придется пройти по 13 несложным главам (только в некоторых у меня остались вопросы, в которых я еще разбираюсь, например, карта памяти).

    Главы я собираюсь рассказать в следующем порядке:

    Controller Library (главы две – это про джойстик и мультитап);
    CD(DVD)-ROM Library (игры могут быть как на CD так и на DVD);
    Memory Card Library. (карта памяти. Главы две и они очень сложные для понимания);
    PS2 Memory Card FileSystem (файловая система FAT карты памяти);
    EE Kernel (самая геморройная тема, но стоит знать);
    Graphic Library (это будет долго, но этой статьи будут ждать многие – я уверен);
    Sound Library (тоже много);
    Movie Library (MPEG и IPU);
    Network Library (работа с сетью и все с ним связанное);
    Hard Disk Library (жесткого диска у меня нет, поэтому рассказывать о ней буду только в теории);

    Базовые требования


    Pentium 3, фиг знает сколько оперативки, но 500 метров думаю хватит.

    В определенный момент, когда из теории можно будет выйти, я выложу PlayStation 2 SDK (копейки не докачались, но писать, вроде, не мешает).
    Так же, в определенный момент, я начну учиться вместе с вами, поскольку я не осилил пока всю информацию. Предлагаю, пока что, просто писать, а как получится, я выложу SDK и можно будет объединять.

    Я использую Metrowerks CodeWarrior 4.2.6.844. Увы, встал PS2 SDK нормально только туда. Компилятором является GCC или Visual Studio 6.

    Для информации и тех кто «все могу»


    На PS2 используется Linux. Если мои догадки правильны, то это «что-то» напоминает мне Red Hat. Естественно, все файлы и команды чувствительны к регистру.
    Вы можете использовать потоки, но процессор там один — ARM.
    Как вы понимаете, работать придется с байтами. Например, вот что включает в себя ответ на запрос потоков (тип — DBGP_EE_THREADLIST_DATA):
    • Id – ID потока
    • Priority – его приоритет
    • Status – статус потока, который может включать в себя следующие виды:
      • THS_RUN = 0х01 // запущен
      • THS_READY = 0x02 // готов
      • THS_WAIT = 0x04 // в ожидании
      • THS_SUSPEND = 0x08 //приостановлен
      • THS_WAITSUSPEND = 0xc // в ожидании приостановки (для меня это вообще тайна тайная)
      • THS_DORMANT = 0x10 // бездействующий поток
    • Cause – собственно причина ожидания: 0 – none, 1 – sleep, 2 – sema (т.е. семафор)
    • Waited – ID семафора
    • Wakeupcount – количество запросов на побудку
    • Count – количество раз, когда поток вошел в состояние RUN
    • Pc – Счетчик команд
    • Sp – Указатель на вершину стека $29 (спасибо Maccimo)
    • Func – Адрес точки исполнения
    • Ra – Адрес точки возврата $31
    • reserved [0] – Зарезервированная инфа
    • reserved [1] – Зарезервированная инфа.

    Ах, да, если поток в состоянии RUN, то в pc, sp и ra находятся текущие значения.

    Как видно, программирование на PS2 не самая простая задача. Сравнивать ее с программированием для ПК можно только языком и вызовами стандартных функций. Естественно, на памяти надо экономить. Лишнее надо выгружать. Если вы хотите считать что-то с диска – вам надо передвигать головку непосредственно до чтения – информация может стать неактуальной. Это очень непростое программирования, так что оценивайте свои силы реально.

    Вобщем, до следующей статьи. Постараюсь выложить побыстрее…

    P.S.: Извиняюсь, что не могу выложить PS2 SDK сейчас. Но, надеюсь, к следующей статье все будет.

    Update: Начал писать первую статью и вспомнил.
    Я забыл указать, что используется обычный makefile.

    Выглядит он примерно так (взят из первого примера для джойстика):

    SHELL = /bin/sh
    TOP = /usr/local/sce/ee
    LIBDIR = $(TOP)/lib
    INCDIR = $(TOP)/include
    TARGET = main
    OBJS = crt0.o \
    $(TARGET).o
    LCFILE = $(LIBDIR)/app.cmd
    LIBS = $(LIBDIR)/libgraph.a \
    $(LIBDIR)/libdma.a \
    $(LIBDIR)/libdev.a \
    $(LIBDIR)/libpkt.a \
    $(LIBDIR)/libkernl.a \
    $(LIBDIR)/libpad.a
    PREFIX = ee
    AS = $(PREFIX)-gcc
    CC = $(PREFIX)-gcc
    LD = $(PREFIX)-gcc
    DVPASM = $(PREFIX)-dvp-as
    OBJDUMP = $(PREFIX)-objdump
    RUN = dsedb -r run
    RM = /bin/rm -f
    CFLAGS = -O2 -Wall -Wa,-al -fno-common
    CXXFLAGS = -O2 -Wall -Werror -Wa,-al -fno-exceptions -fno-common
    ASFLAGS = -c -xassembler-with-cpp -Wa,-al
    DVPASMFLAGS = -g
    LDFLAGS = -Wl,-Map,$(TARGET).map -mno-crt0 -L$(LIBDIR) -lm
    TMPFLAGS =
    .SUFFIXES: .c .s .cc .dsm
    all: $(TARGET).elf
    $(TARGET).elf: $(OBJS) $(LIBS)
    $(LD) -o $@ -T $(LCFILE) $(OBJS) $(LIBS) $(LDFLAGS)
    crt0.o: $(LIBDIR)/crt0.s
    $(AS) $(ASFLAGS) $(TMPFLAGS) -o $@ $< > $*.lst
    .s.o:
    $(AS) $(ASFLAGS) $(TMPFLAGS) -I$(INCDIR) -o $@ $< > $*.lst
    .dsm.o:
    $(DVPASM) $(DVPASMFLAGS) -I$(INCDIR) -o $@ $< > $*.lst
    .c.o:
    $(CC) $(CFLAGS) $(TMPFLAGS) -I$(INCDIR) -c $< -o $*.o > $*.lst
    .cc.o:
    $(CC) $(CXXFLAGS) $(TMPFLAGS) -I$(INCDIR) -c $< -o $*.o > $*.lst
    run: $(TARGET).elf
    $(RUN) $(TARGET).elf
    clean:
    $(RM) *.o *.map *.lst core *.dis *.elf


    Ваша программа работает с функции main.
    Ваш код должен работать в бесконечном цикле, т.е. пустой проект выглядит так:

    #include #include <mwutils.h>
    // прототипы
    int main (void);
    int main (void)
    {
    while(1){
    //ваш код
    }
    return 0;
    }
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 40

      +4
      Для SDK под Xbox360 гораздо менее изуверские условия. И поделки в XBoxLive публиковать можно.

      А вот с плейстейшн и нинтендо беда какая-то в этом плане.
        0
        зато создает некую элитарность и малое кол-во шлака, а для XBoxLive публикации же вроде все равно придется выложить 100бакцав (или нет?)
          0
          Студням вроде ж нахалявку
            0
            что нам их элитарность. 100 баксов меньше 10 тысяч баксов (про десятки тысяч за СДК это не преувеличение).
              +2
              Современные девкиты кстати стали заметно дешевле. Проскакивала информация о $2500 за PS3, девкиты бокса продают на ебее за $1500-$2500. Вот кстати совершенно не представляю, как публиковать что-то в XBLA, заплатив 100 баксов, не имея возможности протестировать игру на девките ;)
                +2
                хбоховые проги можно заливать из ВизуалСтудии на устройство и тестить
                http://msdn.microsoft.com/en-us/library/bb975643.aspx. Без перепрошивки устройства.
                  0
                  О, понятно, спасибо!
                    0
                    Только не из России, к сожалению
                    0
                    Для PS3, насколько я помню, это лицензия магазина Minis — небольшие игры для PS3 и PSP, чаще всего, инди. Если речь идёт о больших тайтлах, пролезть напрямую к публикации можно только если за плечами есть имя, хорошие годовые обороты, успешные игры и т.д.: тогда Ваш путь в SCEE. Самый лучший вариант — договориться с успешным издателем, типа Ubisoft.

                    ИМХО, сейчас рынки онлайн продаж игр для консолей подстёгивают успехи AppStore и Steam, в частности, успехи Indie-разработчиков, сделавших себе имя и миллионные продажи, а так же неплохие агентские владельцам этих онлайн магазинов.
                      0
                      Таки, нарыл:

                      Общую информацию можно почерпнуть здесь: www.scedev.net/
                  +1
                  Сам долго мучился в прочтении информации… Там вобще беда на самом деле. Я только после полного прочтения дока и перечитывания его заново понимал что и как.
                  В карте памяти я пока еще не понимаю где собственно хранится информации о сейве.

                  Да и раздает этот SDK только один человек, который выходит в сеть по неизвестному мне расписанию. Один файл от SDK остался, который как раз с видео, но, слава богу, я его пока не использовал.
                    +1
                    Вообще-то для Xbox 360 такие же изуверские условия, если хотите нормальный development kit с native-кодом (а не C#-поделки). Тоже non-disclosure agreement, тоже адски дорогие железки (2000$ за один девайс разработчика).
                      0
                      группа #RGLoader@efnet уже больше трех месяцев работает над запуском devkit ядра на обычных консолях, результаты можете поискать на ютубе. очень приятно удивитесь. релиза еще не было (была только утечка кривущего билда, не советую его использовать, может случайно прожечь фьюзы и будет кирпич процессора), но я уверен — они добьются своего.
                      +1
                      Если уж вы заговорили про сравнение, то сравнивать нужно PS2 и Xbox, а не Xbox360 которая следующее поколение.
                      –10
                      в этом году уже PS4 анонсируют, как бы PS2 уже не очень актуальна
                        +5
                        Она есть у многих, в этом плюс.
                          0
                          PS2 самая продаваемая за всю историю приставка, под которую выпущено over 9000 игр (11000), и эти игры продолжают выходить :)
                          0
                          Писал когда-то приложения на Lua для PSP. Да, с ценами у них действительно дела, мягко говоря, не очень обстоят.
                            0
                            Эх, жаль что сейчас Sony скурвилась и на новых приставках ни о чём таком можно даже не мечтать. Когда я покупал PS3 то надеялся, что смогу ставить различные эксперименты в виде установки линукса и homebrew игр.
                              +1
                              Пробовали запускать в эмуляторе(pcsx2) программы? Работает?
                                +1
                                У меня его комп не тянет, увы. Было переведено куча болванок, но того стоило.
                                  0
                                  А использовать RW совсем не желательно — можно убить лазер.
                                    0
                                    В PlayStation лазер вы имеете ввиду?
                                      +1
                                      Да
                              • UFO just landed and posted this here
                                  +1
                                  еще далеким от темы, будет интересно узнать, что все современные консоли (ps3, x360, wii) работают фактически на одном и том же ядре PowerPC, различия лишь в реализациях.
                                  • UFO just landed and posted this here
                                      0
                                      И в разработке процессоров для следующего поколения(по слухам о PS4 и Wii U) — тоже IBM. Надо откапывать))
                                  +2
                                  Тема статьи очень интересна, но стиль изложения требует проработки.
                                  Чисто субъективные замечания:
                                  1) код оформляйте если не подсветкой, то хотя бы уж blockquote
                                  2) во вставках кода количество пустых строк между строками кода не должно превышать 1 — повышает читабельность
                                  3) Поменьше в повествовании используйте местоимения «я», т.е. рассказ от первого лица, смахивает на заметку в персональный блог. Имхо от 3-го лица самый торт.

                                  Ожидаю следующую статью, надеюсь изложена будет более аккуратно. Спасибо и терпения вам :)
                                    +3
                                    Как я понял, есть утекший оффициальный sdk, пригодный для компиляции.
                                    Но почему бы не воспользоваться тулчейном и наработками ps2dev.org вместо него?
                                    Оффициальный sdk, видимо, никто и не раздаёт потому, что он особо и не нужен для homebrew-разработки.
                                    Было бы клёво, кстати, увидеть сравнение инструментов, доступных «большим» разработчикам и энтузиастам.

                                    ps: форум и wiki ps2dev. Несмотря на название, там занимаются разработкой под все консоли от Sony.
                                      +2
                                      Fun fact:
                                      Есть команда Realtech VR, которая несколько лет назад занималась тем, что клепала homebrew для PSP. Одна из игр — No Gravity (точнее, сперва это была демо версия) — оказалась настолько хороша, что возникла сумасшедшая идея выпустить её в PSN. И таки выпустили.

                                      Зарегистрировали компанию-издателя, получили девкит и ещё год вылизывали игру. Но основа уже была создана без оффициальных средств разработки.

                                      Уникальный случай в истории — демо-версия оффициально распространяемой игры была выпущена в виде homebrew.
                                      +1
                                      >На PS2 используется Linux
                                      Нет. Даже не близко.

                                      >Вы можете использовать потоки, но процессор там один — ARM.
                                      И снова нет. Там два MIPS: EE и IOP

                                      >не могу выложить PS2 SDK сейчас
                                      svn.ps2dev.org/ СДК и тулчейны под пс2/пс3/псп
                                      (впрочем, выше уже написали)
                                        0
                                        > Нет. Даже не близко.
                                        Я не гений линукса, но по моему первому взгляду — вполне.

                                        >И снова нет. Там два MIPS: EE и IOP
                                        Видимо я путал их с режимами.

                                        Про SDK — я имел в виду официальный SDK, но, вполне, он там может быть.
                                          +1
                                          В официальном сдк, честно говоря, нет ничего особо интересного и того, чего не может неофициальный.
                                          Насчет линукса — таки нет. Там самописная, частично POSIX-совместимая ось, возможно с ошметками *BSD.
                                          В противном случае их давно бы уже засудили и заставили открыть ее исходный код, согласно GPL, под которой распространяется линукс.
                                            0
                                            Про PS3 ходят слухи, что там внутри вполне себе живой AIX, а вот что в PS2 не знаю толком, но интересно пошуршать на тему того, какие из никсов лучше всего на MIPSах работают, может модифицированный IRIX?
                                              0
                                              Ну, теоретически да, ирикс пилился спецом под мипсы.
                                              Но я сильно сомневаюсь, что там он.
                                              По сути там два разных ядра (одно крутится на EE, одно на IOP), которые общаются через SIF RPC. Оба имеют поддержку загружаемых модулей, ядро EE умеет перезагружать ядро IOP.
                                            0
                                            > Видимо я путал их с режимами.
                                            IOP (Input/Output Processor) отвечает за взаимодействие со «звуковухой» и дисками.
                                            Доводилось править баги в pcsxr2 :)
                                              0
                                              По сути он отвечает за работу со всей периферией, кроме GS (ну, на то он и I/O).
                                              На деле же, это обычный процессор от пс1, на котором крутится собственное ядро и использоваться может не только для периферии.
                                              Например, во многих портах с дримкаста на IOP крутится декодер CRI ADX
                                          +2
                                          # Pc – Количество команд
                                          # Sp – Точка стека $29 (не знаю как это выразить)


                                          PC — Program Counter — Счётчик команд.
                                          SP — Stack Pointer — Указатель на вершину стека.
                                            0
                                            Спасибо, поправлю.

                                          Only users with full accounts can post comments. Log in, please.