Форум

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум » Руссификация и программирование на PSP » Программирование для PSP » Знакомство с SDK (Что нужно для программирования для PSP? - Ответ здесь.)
Знакомство с SDK
Andy_maNДата: Вторник, 2009-06-16, 3:12 PM | Сообщение # 1
Сержант
Группа: Администраторы
Сообщений: 21
Репутация: 7
Статус: Offline
Всё постараемся описать по пунктам, и так поехали...

Что нужно:

1. Знание Английского языка - хотя бы технического
Если ваш английский хромает, то очень большая вероятность того, что программирование для PSP превратится для вас в танцы с бубном.
Но это всего лишь препятствие, и тех кто твёрд в своих намерениях, это не остановит.

2. Наличие опыта программирования на C/С++. Все программы для PSP пишутся именно на этом языке (или же на ассемблере для процессора MIPS). С ассемблером начинающему я бы не рекомендовал экспериментировать, лучше наберитесь опыта в языке высокого уровня.
Если вы пока не знакомы с C/С++ то рекомендую вам ознакомиться со следующей книгой:
Джесс Либерти - Освой C++ самостоятельно за 21 день
Все электронные книги рекомендую искать здесь http://www.ebdb.ru

3. Ну и наконец нам понадобится SDK. Как бы меня не осуждали, но я использую SDK под Windows и всем пользователем "винды" так же советую не переходить на Linux ради программирования для PSP, просто если вы с Linux-ом на "вы", то это будет сильно тормозить скорость разработки ваших программ.

Устанавливаем SDK:

Итак вы всё еще здесь smile
Давайте договоримся, что про Linux мы ничего не знаем и будем всё делать в Windows.

Для начала надо скачать сам SDK.
Рекомендую MINPSPW - это самый лучший SDK под Windows, который мне доводилось использовать.
Скачать его можно отсюда: http://sourceforge.net/projects/minpspw/
(на момент написания данного гайда, последняя версия 0.8.3 ~30MB)
Скачиваем версию с документацией!!! (если вы только не гений)

Установка не займёт много времени, просто запустили инсталлер и выбрали куда устанавливать.
Рекомендуется устанавливать в папку на корне диска, причём имя папки должно содержать только латинские символы (лучше не длиннее 8-ми символов)
Самый лучший вариант устанавливать по умолчанию в C:\pspsdk

Если вам нужны дополнительные библиотеки, то вы также можете их скачать по адресу: http://sourceforge.net/projects/minpspw/

Итак, SDK установлен и вы готовы скомпилировать ваш первый проект smile

"HELLO WORLD"

Давайте с самого начала договоримся, что мы установили SDK в C:\pspsdk.
Итак, идём в папку с примерами из SDK:
C:\pspsdk\psp\sdk\samples\controller\basic
Как вы видите мы выбрали пример использования контроллера, т.е. джойстика.
И так в этой папке нам надо создать файлы с помощью которых мы будем компилировать наш примерчик, стирать объектные файлы и копировать на PSP

Сделав это, мы сможем работать так же комфортно, как и с IDE, при этом никакой IDE нам не понадобится.

Итак, создаём файлы BUILD.BAT, CLEAR.BAT и COPY.BAT.

В файл BUILD.BAT добавляем следующие строки:

REM C:/pspsdk - это путь к вашему SDK
C:/pspsdk/bin/make
pause

Таким способом мы сможем компилировать двойным нажатием на BUILD.BAT
Просто, не правда ли? Всё равно, что нажать на BUILD в любом IDE smile
К тому же, вызывая напрямую наш MAKE из папки C:/pspsdk/bin/, у нас не возникнет конфликтов с другими установленными компиляторами.

Теперь создадим CLEAR.BAT

del *.o
del *.elf
del *.sfo
del *.pbp
del *.prx

Данный файл можно использовать для "зачистки", если вы заметите, что компилятор не хочет компилировать измененные исходники.

И наконец COPY.BAT

REM X - это буква PSP, а MY_APP_FOLDER - папка для вашей программки
copy /Y EBOOT.PBP X:\PSP\GAME\MY_APP_FOLDER

Данным файлом можно с лёгкостью скопировать скомпилированную программу прямиком на PSP

Вы так же можете создать файл MKNCPY.BAT, который сразу выполнит все операции.
Вот его содержимое:

CALL CLEAR.BAT
CALL BUILD.BAT
CALL COPY.BAT

Вот и всё, можно компилировать smile
Подключаем PSP, запускаем MKNCPY.BAT и вуаля всё готово!
Можно отключить PSP и посмотреть, что получилось smile

Cоветы:

Для редактирования исходных файлов использовать БЛОКНОТ не рекомендую, лучше вооружиться текстовым редактором с подсветкой синтаксиса.
В этом отношение рекомендую EmEditor - на мой взгляд, самый лучший вариант.

Те файлы, которые мы с вами создали, очень легко изменить для работы с другим проектом. Просто копируйте их в папку с проектом и меняйте MY_APP_FOLDER на нужное название.

Сайты по теме:
http://www.pspdev.org
http://www.psp-programming.com/
http://www.qj.net
http://www.maxconsole.org

И про MAKEFILE

TARGET = controller_basic
НАЗВАНИЕ ВАШЕГО ПРИЛОЖЕНИЯ (при компиляции EBOOT.PBP это название ни где ни мелькает)

OBJS = main.o
(файлы для компиляции, все файлы .c .cpp .S вашего проекта только с расшерением .o)

INCDIR =
Путь к папке с заголовками

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

Стандартные параметры компиляции (о подробностях их использования можно узнать из справочной информации к компилятору)

LIBDIR =
Папка с библиотеками

LDFLAGS =
Дополнительные параметры для линковки (о подробностях их использования можно узнать из справочной информации к компилятору)

EXTRA_TARGETS = EBOOT.PBP
Используется для компиляции файла исполняемого файла EBOOT.PBP

PSP_EBOOT_TITLE = Basic controller sample
Название вашего приложения в XMB

PSPSDK=$(shell psp-config --pspsdk-path)
Путь к SDK - это строчка везде одинаковая

include $(PSPSDK)/lib/build.mak
Путь к скрипту компиляции (Для компиляции PRX файлов можно использовать build_prx.mak)

====================================================================

Начинающий, может столкнуться со следующей проблемой:

Библиотека вывода текста из PSPSDK не поддерживает КИРИЛИЦУ

Конечно можно использовать множество разных способов устранения данного недостатка, но я вам предлагаю самый лёгкий вариант smile
Для этого просто используйте, данную библиотеку, она уже пропатчена и тестировалась с СДК версии 0.8.3

 
deadnikДата: Суббота, 2009-07-04, 3:10 PM | Сообщение # 2
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
у меня вообще не открывается ни один файл
 
Andy_maNДата: Суббота, 2009-07-04, 9:12 PM | Сообщение # 3
Сержант
Группа: Администраторы
Сообщений: 21
Репутация: 7
Статус: Offline
Quote
у меня вообще не открывается ни один файл

это просто крик безисходности? smile или все же просьба о помощи, если так то по-подробнее надо было написать (что делал и что получил)
 
deadnikДата: Воскресенье, 2009-07-05, 12:33 PM | Сообщение # 4
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
у меня вопрос как создавать файлы ну например BUILD.BAT, CLEAR.BAT и COPY.BAT.
 
Andy_maNДата: Воскресенье, 2009-07-05, 2:59 PM | Сообщение # 5
Сержант
Группа: Администраторы
Сообщений: 21
Репутация: 7
Статус: Offline
На примере BUILD.BAT
(подразумевается что сдк установлен в C:/pspsdk)

Создаём обычный тестовый файл:
1 открываем папку с нужной программой
2 Правой кнопкой мыши > Создать > Текстовый документ

Полученный файл Текстовый документ.txt переименовываем в BUILD.BAT - (соглашаемся на смену расширения)
для того чтобы можно было переименовывать расширения нужно отключить следующий чекбокс:
Сервис > Свойства папки

Правой кнопкой мыши на BUILD.BAT - выбираем Изменить (файл откроется в текстовом редакторе)
добавляем наши 2 строчки:
C:/pspsdk/bin/make
pause

Сохраняем изменения - файл готов

Пробуем запустить

При удачном стечении обстоятельств все должно пройти гладко и в папке появится скомпилированный файл
вот пример удачной компиляции (\samples\kernel\fileio)

Code
C:\pspsdk\prx\samples\kernel\fileio>C:/pspsdk/bin/make
psp-gcc -I. -IC:/pspsdk/psp/sdk/include -O2 -G0 -Wall -D_PSP_FW_VERSION=150   -c
   -o main.o main.c
psp-gcc -I. -IC:/pspsdk/psp/sdk/include -O2 -G0 -Wall -D_PSP_FW_VERSION=150  -L.
   -LC:/pspsdk/psp/sdk/lib   main.o -lpspumd -lpspdebug -lpspdisplay -lpspge -lpsp
ctrl -lpspsdk -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpspu
tility -lpspuser -lpspkernel -o dumper.elf
psp-fixup-imports dumper.elf
mksfo 'File IO example ' PARAM.SFO
psp-strip dumper.elf -o dumper_strip.elf
pack-pbp EBOOT.PBP PARAM.SFO NULL  \
          NULL NULL NULL  \
          NULL  dumper_strip.elf NULL
[0]        408 bytes | PARAM.SFO
[1]          0 bytes | NULL
[2]          0 bytes | NULL
[3]          0 bytes | NULL
[4]          0 bytes | NULL
[5]          0 bytes | NULL
[6]      82320 bytes | dumper_strip.elf
[7]          0 bytes | NULL
C:/pspsdk/bin/rm -f dumper_strip.elf

C:\pspsdk\prx\samples\kernel\fileio>pause
Для продолжения нажмите любую клавишу . . .

Остальный файлы *.BAT создаются по аналогии
Описал все очень подробно - вопросов возникнуть не должно

Прикрепления: 7675496.gif(25Kb)
 
YotiДата: Вторник, 2009-09-01, 3:36 PM | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 10
Репутация: 0
Статус: Offline
А почему бы не вписывать очистку папки перед командой на компиляцию? Выйдет один удобный батник.
 
Andy_maNДата: Вторник, 2009-09-01, 6:05 PM | Сообщение # 7
Сержант
Группа: Администраторы
Сообщений: 21
Репутация: 7
Статус: Offline
так я же писал про MKNCPY.BAT не одно ли это и тоже? - кроме того это все дело вкуса, как удобнее так и надо делать smile
 
ErikPshatДата: Четверг, 2009-09-17, 1:20 Am | Сообщение # 8
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
Andy_maN, не мог бы ты написать, как настроить "Dev-Cpp" для компиляции с pspsdk.

Мне в ней нравиться писать. Она сама делает нужные отступы. Но хотелось бы, чтобы из неё проводилась компиляция, нажатием кнопочки в программе.

Я просто не совсем врубаюсь, какие папки нужно вписывать в "Настройки" для PSP. Пути по умочанию изменил с Dev-Cpp на PSPSDK, там они почти совпадают, но некоторые файлы, присутствующие в Dev-Cpp, отсутствуют в PSPSDK.
Вот что с ними делать, на какие заменить или просто из Dev-Cpp перенести недостающие в PSPSSK?

Посмотри вот настройки, что там не так на скрине:

http://s08.radikal.ru/i181/0909/bf/3fc459155e01.gif

Сообщение отредактировал ErikPshat - Четверг, 2009-09-17, 1:55 Am
 
Andy_maNДата: Суббота, 2009-09-19, 2:18 PM | Сообщение # 9
Сержант
Группа: Администраторы
Сообщений: 21
Репутация: 7
Статус: Offline
Могу предложить самый простой способ:
Переносим наш стандартный build.bat в C:\pspsdk\ (или любое другое место)
Затем добавляем новый инструмент в Дев спп

Как же теперь этим пользоваться?
1 При создании проэкта в Дев Спп сохранить в папке с мэйкфайлом
2 Добавить все исходные коды в проэкт (хотя это не обязательно)
3 Компилировать через Tools->Compile

Можно добавить и другие полезные кнопки - например открыть папку с проэктом

Прикрепления: 9266173.gif(21Kb) · 2931436.gif(15Kb) · 4935230.gif(16Kb)
 
YotiДата: Вторник, 2009-10-13, 0:07 Am | Сообщение # 10
Рядовой
Группа: Пользователи
Сообщений: 10
Репутация: 0
Статус: Offline
Имеем консоль с экраном 480х272 квадратных точек. Имеется желание разместить в произвольном месте дебажные буквы. Используется
Code
pspDebugScreenSetXY(int X, int Y)

с различными координатами. Казалось бы, в чём вопрос? А вопрос таков: как подставить координаты из bin файла? Содержимое бинарника (хекс):
Code
01 0F

что соответствует приведению pspDebugScreenSetXY(int X, int Y) к виду pspDebugScreenSetXY(1, 15).
Собственно, интересует: "подхват" бинарника, чтение байта с произвольным порядковым номером, hex -> dec и подсовывание свежеполученной dec величины в качестве координаты.
 
Andy_maNДата: Вторник, 2009-10-13, 7:19 PM | Сообщение # 11
Сержант
Группа: Администраторы
Сообщений: 21
Репутация: 7
Статус: Offline
Для начала советую почитать литературу по Си - не глупые примеры для билдера и вижала, а чисто как о языке програмирования.
(В шапке я говорил уже о лучшей на мой вгляд книге для новичков - в ней все просто и достаточно глубоко рассмотрено)

Теперь конкретно о проблеме.
Для доступа к определеным частям файла есть функция int fseek ( FILE * stream, long int offset, int origin );
В случае с psp не сложно найти аналогичную:

SceOff sceIoLseek (SceUID fd, SceOff offset, int whence)

Описание:
Изменение смещения, с которого производится запись(считывание) в(из) файл(а).

Пример:

Code
pos = sceIoLseek(fd, -10, SEEK_END);

Параметры:
fd - Открытый файловый дескриптор, в котором нужно изменить смещение
offset - Относительное смещение (относительно whence см. ниже)
whence - SEEK_SET от начала файла, SEEK_CUR от текущего положения и SEEK_END от конца.

Возвращает:
Новое положение после смещения.

Переводить из хекса в десятичный формат не нужно, т.к. бессмыслено.

 
YotiДата: Вторник, 2009-10-13, 11:15 PM | Сообщение # 12
Рядовой
Группа: Пользователи
Сообщений: 10
Репутация: 0
Статус: Offline
Сейчас читаю Кернигана и Ритчи, вроде грамотная книжка.
Почему бессмыслено? Мне же нужно подставить в переменную типа интеджер число (координату). Сикаю я на нужный байт, считываю его и получаю 0F - хекс число, а не децимальное. Или я что-то не понял?
 
Andy_maNДата: Среда, 2009-10-14, 3:28 PM | Сообщение # 13
Сержант
Группа: Администраторы
Сообщений: 21
Репутация: 7
Статус: Offline
Попробую объяснить попроще на конкретном примере:
Допустим у нас есть переменная
Code
char i = 77;

В памяти хранится значение 77 - а как его представлять это уже вопрос к программисту
Например его можно интерпритировать как символ
Code
printf("Symbol #77 is %c",i);

На экране будет выведено:
Symbol #77 is M

Или как шеснадцатиричное значение

Code
printf("DEC 77 = HEX 0x%x",i);

На экране будет выведено:
DEC 77 = HEX 0x4D

Или как обыное десятичное число

Code
printf("Decimal %d",i);

На экране будет выведено:
Decimal 77

Бинарный файл можно сказать это слепок, кусок памяти.
При чтении из него мы считываем значения, а как их представлять это наше дело.

Если мы запишем нашу переменную в файл
(не буду описывать процесс открытия и закрытия файла)

Code
fwrite (i , 1 , sizeof(i) , File );

То позже, открыв его в Хекс редакторе, будет видно что он интерпретирует его как 0x4D и как символ M (стандартный вид хекс редактора)

Теперь если мы считаем его из файла

Code
fread (i , 1 , sizeof(i) , File);

То ничего не изменится - ведь считываем значение, а не интерпритацию - и в нашей переменой i будет попрежнему хранится значение 77
 
Andy_maNДата: Среда, 2009-10-14, 4:06 PM | Сообщение # 14
Сержант
Группа: Администраторы
Сообщений: 21
Репутация: 7
Статус: Offline
(Копнем немного глубже - для общего развития не повредит)

Если произвести тот же опыт с переменной типа Integer - то можно встреть такую забавную вещь
Допустим у нас есть переменная

Code
int i = 0x12AB34CD;

Я специально показываю значения как шестнадцатиричное число для лучшего дальнейшего понимания (десятичный вариант 313210061)

Пишем его в файл

Code
fwrite (i , 1 , sizeof(i) , File );

Открываем в хекс редакторе и...

Code
CD 34 AB 12

Что за чудо, а где 12AB34CD?

Ответ простой: есть два вида хранения чисел в памяти
little-endian - когда байты хранятся от младшего к старшему (т.е. задом на перед)
Этот порядок записи принят в памяти персональных компьютеров с x86-процессорами, в связи с чем, иногда, его называют интеловский порядок байтов

big-endian - от старшего к младшему (привычный для нас тип записи)
Этот порядок байтов используется процессорами IBM 360/370/390, Motorola 68000, SPARC (отсюда третье название — порядок байтов Motorola, Motorola byte order).

Отсюда вывод процессор PSP использует little-endian как и наш с вами настольный компьютер
И в его памяти числа хранятся перевернутыми. А так как бинарный файл это кусок памяти то
перевернув CD 34 AB 12 получим 12 AB 34 CD - никаких фокусов и чудес.

При считывании из файла это кусок вернется в память как он там и был в перевернутом виде (так что ненужно ничего переворачивать самому)

Code
fread (i , 1 , sizeof(i) , File);

Можно проверить и вывести на экран:
Code
printf("HEX 0x%x",i);

На экране будет выведено:
HEX 0x12AB34CD

Хотя в памяти значение хранится в перевернутом виде, но нам это не важно - мы оперируем с переменной как обычно.
Если мы захотим прямо в памяти поменять значение какого то байта в этом числе, то тут нужно учитывать что число хранится в перевернутом виде.

Например изменим 12AB34CD на 12AB77CD с помощью прямой записи в память

Code
Int i = 0x12AB34CD;
...
char* p = (char*)&i; //адресс первого байта перемнной [b]i[/b] поместим в указатель [b]p[/b]
p[1] = 77; // Так как 12AB34CD в памяти хранится как CD34AB12 то обращаемся ко второму байту а не третьему (Отсчет идет от 0 - поэтому второй будет 1)

Конечно можно проще smile
Code
Int i = 0x12AB34CD;
...
i &= ~(int)(0xFF << 8);
i |= 77 << 8;

Ну и конечно элементарный вариант сменить все число
Code
i = 0x12AB77CD;
 
ErikPshatДата: Среда, 2009-10-14, 10:15 PM | Сообщение # 15
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
Andy_maN, спасибо! Полезная инфа.

Эх, научиться бы элементарный "Hello World" на экран выводить.

 
Форум » Руссификация и программирование на PSP » Программирование для PSP » Знакомство с SDK (Что нужно для программирования для PSP? - Ответ здесь.)
Страница 1 из 212»
Поиск:


FOOSA.RU 2008-2009 Создать бесплатный сайт с uCoz