Pull to refresh

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

Reading time 4 min
Views 16K
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;
}
Tags:
Hubs:
+60
Comments 40
Comments Comments 40

Articles