■■D0#01とりあえずcygwin(2005-12/28)
2005-12/28
myPSP1.0で遊ぶだけにはそろそろ飽きてきた。
偉大な先人たちはいろいろプログラムを作って開発してるし、っていうわけで
なんか作ってみよ。と思ってインターネットを漁ってみた。(昨日12/27日)
→わかんねーよ(怒)!
もうPSP1.0なんて旬をとっくに過ぎてるのかもしんないけど、初心者には
あんまりな仕打ちだにょ
それでも1時間ぐらい漁ってとりあえず判った事:(全く誤解している可能性もある)
1.まず、unix互換の環境が1つはいるらしい。(たとえばcygwin)
2.それからPSPのコードを吐くコンパイラとかライブラリのセット
(それは要ると思ってんだ)
3.後はサンプルになるソースコード(PSP用の)プログラム
まあとりあえずこんなもんだと理解。
1.はcygwinとかMingWとか言ってたような気がするんだけど、
まあ良く判らない。(昔Mingというのがあってそれとごっちゃになっている)
古ーい記憶(たぶんどこか間違っている)を引っ張り出してみると。
MingWって違うような気がしたんでcygwinに決定。
(この選択が既にまづいのかもしれないが)
とにかくやってみようってことで、公式ページに接続。なになに、
死ね!
おっと、いきなり死ねと言われてしまった。なになに、てきとーに意訳すると、
「メールボマーは死ね。うざいから。もし人間だったら
別のブラウザからアクセスしろ」
って書いてある。ああ、2chブラウザかオペラあたりでもいれるかなあ。
たったそれだけの為に、めんどくさいなあ。それに俺が悪いんじゃないし。
IEバージョンアップしてパソコンが不安定に
なるのも嫌だし何よりHDの容量がない。
で、別のPC(私のではない)をこっそり使って、落としてきましたよ
「SETUP.EXE」(299kb)
3.5FDにいれて(心臓に悪い音がするから嫌い)なんとか持ってきた。
どおでもいいけど、この「SETUP.EXE」っていう生理的に気持ち悪い
名前はなんとかならんもんかね。
「インターネット(で落としてきた怪しげな)」+「SETUP」
+「(しかも)EXE」普通の神経の人間には「ActiveX」並に
怪しげな名前に聞こえるんだが、(別にMSが怪しいなんて言ってません)
だって怪しいよやっぱ。
で、嫌だけど「SETUP.EXE」を実行。うちはすっぴんの
98SEなので(だって初心者だもん)
(IE5.00.2614.3500暗号化40bit)IE5を選択。
で、何のかんのやってやっとのことでcygwinを入れる。ディスクトップに
アイコンがでてきたので無意識にクリック。(すでに疲れてきている)
なんかunixっぽい画面が、出てきたので無意識に「login↓」
「pass word:」とでてきて、ここで意識が回復。
し、しまった。んなもんわかんねーよ。なんせ相手はunixだし、やたら
べしって切っちゃうと後でおかしくなるかもしれん(その辺が判らない)
「exit」って打ってもだめだし、「logout」「quit」もだめだし、
(pass wordだから駄目に決まってるってば)うおー。5分発狂して
「300 sec 経過 タイムアウトしました」
ああよかった。で「exit」
結局ここは立ち上がったら既にログインしてるって落ちだったんだけど、
ええん初めてだとわかんないよお。ログインしてんなら「login: admin」
「pass word :*****」とか無駄なメッセージだしといてくれれば、そりゃあ
うざいかもしんないけど、「ああ勝手にログインしてくれんのかよかった」って
わかるのにぃ。文句。文句。
ああ、先は長そうだ。(本日のレベル単細胞生物)
■補足情報(2006-01/19)
http://cygwin.com/ (Cygwin Projectのページ)
Cygwinでなくても、
MinGWでも、出来るそうです。(試してないので知らない)
オフィシャルサイトはこちら、
http://www.mingw.org/
■■D0#02とりあえずstartup.S(2005-12/29)
2005-12/29
とにかく意味不明でもなんでも動くものがなければ
話にならない。で、無謀にも動くものは1つもない。
まあいっか。
次は、startup.Sをさくっと盗んでくる。とりあえず
psp-as startup.S↓
で、a.outができる。
(あ、その前にpathを通すんだよ。念のため
C:\cygwin\home\xxxxxx xxxxxxはログイン名
にある .bashrc の最後に
PATH=/usr/local/pspdev/psp/bin:$PATH
を追加。このやり方でいいのかよく判らないがまあこの辺は
目的に関係がないから、汚くたってなんだってどおでもいいや)
--------------------
次に a.out をてきとーなバイナリエディタで覗いてみる。
うんうんちゃんとELFファイルになってる。動くといいなあ。
この辺で例によって悪い癖が出た。
とりあえず動けばいいやって思ってるからまずバッチにしとこ。
(Makefileにすりゃいいのに)
cygwinのインストールもまだサボってるし、
この時点でmakeはまだ落として来ていなかった。
ぢゃ
おっともうお昼(夜の12:00)かあ、そろそろ寝よ。
ああ、先は長そうだ。(本日のレベルまだ単細胞生物)
■■D0#03toolchainいれなきゃ駄目なのかな(2005-12/30)(その1)
2005-12/30(その1)
cygwin環境を再構築する必要ありそう
情報が多すぎて用語が混乱
こちらは単に「コンパイル→実行」したいだけなのに、そこまで
辿りつけん。
具体的には
int xmain(int argc, char *argv)
{
return 0;
}
と"startup.S"をリンク/コンパイルして、
outpatch.exeをあてて。
elf2pbp outp "null test"
でPBPファイル(EBOOT.PBP)に変換。
あとはPSPに持ってって実行すれば、
ぴろーんてなって、メニューに戻るハズ。
もし何も動かなければ、"startup.S"のリンク自体が失敗してるし。
ぴろーんだけならコンパイル失敗してる。
うんうん、やりたい事(目的)ははっきりしてるんだけど。
具体的手段(技術、環境設定など)がついていかん。
(だって全部アセンブラで書くなんて非現実的でしょ、
_xmain:
rts (pspのアセンブラは判らないので気分です)
なんて、仮に動くとしても書く気になれん。最低でも
Cにリンク出来なきゃ)
現状は全然そんなとこまで進んでなくて、とにかく
cygwin環境がきちんと設定できてないから、
リンク/コンパイルがうまくいかない。
むーん、なんて低レベルなんだ。
先が思いやられる。
基本的には(理屈上は)いまの怪しげなcygwin環境でも
aliasさえ通せばうまくいくと思うんだが、それでいいんなら
「toolchain」ていらないよなあ。よく判らない。
コンパイル失敗するの嫌だからこの際、dosv用のgcc達には
どいてもらうか。だってきちんと環境が設定できてない
から「psp-gcc-4.0.0.exe」(コンパイラドライバ)が
アーカイバとかアセンブラとかライブラリアンとかみーんな
「psp-ar.exe」があっても「ar.exe」
「psp-as.exe」があっても「as.exe」
「psp-ld.exe」があっても「ld.exe」
...
を呼びにいっちゃうみたいなんだもん。
この調子じゃあ絶対コンパイルできないってば。
なんて低レベルなんだ。先が思いやられる。
少し情報を整理:
1.まず、「toolchain」これってとあるページを見に行ったら
まるで「==SDK」みたいに書いてある。だからSDKの事だ
と思ってた。
これは勘違い。とうやらこれは「設定用スクリプト」らしい。
(まだ勘違いしてるかも)
具体的には「psptoolchain-20051202.tgz」らしい。
2.次SDK、これって
「psp-gcc-4.0.0.tar.bz2」とそのライブラリ
「psp-newlib-1.13.0-compiled-with-gcc-4.0.0.tar.bz2」の
ことだよね。(2005年12/29現在)
あとこれもかな
「psp-binutils-2.16.tar.bz2」(?とにかくいるらしい)
とにかくよく判んないから少しtoolchainの中調べたほうが
良さそう。
そうしないとcgwinにどういうものを入れたら
(インストールしたら)いいのか判らないし。
□現状必要なものは
bash(普通標準で入ってるってば)
make(dosv用でいいのかな?)
「psp-binutils-2.16.tar.bz2」(?とにかくいるらしい)
「psp-gcc-4.0.0.tar.bz2」(psp用(もしかして
これって中身はps2用?)GCC)
「psp-newlib-1.13.0-compiled-with-gcc-4.0.0.tar.bz2」
(そのライブラリ)
「psptoolchain-20051202.tgz」(?まだ良く判ってない)
(これを動かせば設定してくれるんじゃあないかな
(未だやってない))
それから
「outpatch.exe」(ps2用?ELFファイルを
psp用ELFファイルに変換(多分))
「elf2pbp.exe」 (psp用ELFファイルを
psp用実行可能ファイルに変換(多分))
(elf2pbp3.zip)
□要らない物は
gcc達(dosv用)
(だってoutpatchもelf2pbpもexeであるし)
えーっ。今、始めてtoolchainの中身見たんだけど、
これって普通のGCC? → PSP用のGCCへの
改造スクリプトぢゃないの?(GCC以外も改造する)
これってBUP(そりはDOS)ぢゃなくて、CVSだっけ
(だから違うってば)いやdiff(だっけ?)で
バリバリパッチ当ててんじゃん。
てことは、gcc達(dosv用)いるかも(?)しれないし、
そもそも「psp-gcc-4.0.0.tar.bz2」って「gcc-4.0.0」に
PSP用パッチ当ててあるもの、ぢゃあなかったの?
基本的な処で誤解をしてるのかもしれないなあ。
「toolchain」ているんだか、いらないんだか。
それすらよく判らない。
きっと「toolchain」は要らなくて。もっとずーっと
低レベルな環境設定でこけてるんだろな。
(そのとうり、かも)
それにこのverの「toolchain」は
(「psptoolchain-20051202.tgz」)
## Source code versions.
BINUTILS="binutils-2.16"
GCC="gcc-4.0.1" →(ここが違う!)
NEWLIB="newlib-1.13.0"
とか書いてあるし、GCCのVerが違うから。
「gcc-4.0.1.patch」は当てない方が安全なのかな。
その場合「gcc-4.0.0.patch」がいるよなあ。もう
ちっと古いver検索した方がいいのかも?
いやそんな後ろ向きな話より、万が一、
「psp-gcc-4.0.1.tar.bz2」と
「psp-newlib-?.??.?-compiled-with-gcc-4.0.1.tar.bz2」
がもし見つかれば、その方がいいな。
って、そんなの探してみなくちゃ、見つかるんだか、
どおだか、そもそも世間に存在するんだか、
さっぱり判らない。
でも、
## Main pspdev settings.
PSPDEV="/usr/local/pspdev"
PATH="$PATH:$PSPDEV/bin"
とか書いてあってここでパスを設定してるみたいだから、
みんなは、これを動かしてるのかもしれないなぁ?
この一連のシェルスクリプトに関しては、結局の所。
いるんだか、いらないんだか、さっぱり判らない。
はやく人間になりたーい(本日のレベル単細胞生物、分裂気味)
(C)ベム、ベラ、ベロ
(状態:今だ迷走中、もう3日もさまよってるんですけど)
■追記(2006-1/19)
上のは日記なので、訳わからないかも知れませんが、要点は
「psp-binutils-2.16.tar.bz2」は必要。
「psp-gcc-4.0.0.tar.bz2」は必要。
「psp-newlib-1.13.0-compiled-with-gcc-4.0.0.tar.bz2」は必要。
一方、
「psptoolchain-20051202.tgz」は不要。(参考用にDLしてもよい)
という事です。(初心者がPSP開発のみをしたい場合)
また、「psptoolchain-20051202.tgz」を展開して、動作させれば、
上記3つの必要ファイルを勝手にDLして、インストールしてくれるみたいです。
(試してないので判らない)
ツールチェイン「psptoolchain-20051202.tgz」にすべて任せても(要ネット接続環境)
かまわないですが、なくてもできます。
(うちはいまだにツールチェイン「toolchain.sh」使ってないです。)
詳しくはこちら
■■D0#04ええとConfigureって何だっけ(2005-12/30)(その2)
(2005-12/30)(その2)
なるほどこれでGCC設定すればいいのか。
こんな簡単なこと何なやんどんねん。って突っ込み
入りそうだけど、こういう簡単な事こそ判らない時には
わからない!っ
で、普通の人なら知っているConfigure、
私にはまだ判らないから、少し調べなくっちゃ。
(この場合のconfigureは「Configure.sh」の事です)
(全然関係ない話だけど、DOS版のGCC(DJGPP)の
場合はMake configure↓ だったっけ。全然覚えてないや。)
それぢゃあ「toolchain」は全然全くいらないのかな?
もうファイルがぐちゃぐちゃになってきて何がどれだったか
把握できなくなってきつつあるんですけど。
(これだから初心者はだめだな)
あれえpsp-gcc用 のconfigureって何処にあるんだろ、
ファイル全部検索させたけど、どこにもないぞ?
(↑まだ全然理解できてない、多分なくて当たり前)
先は長い、急ぐのぢゃ(本日のレベル単細胞生物、分裂するのやっぱ中止)
(C)源平討魔伝 ↑急いでどうする。
(状態:未だインストール中かつ迷走中)
■補足(2006-01/19)
Configure。多分知らなくても大丈夫です。
■■D0#05初心者でも3日迷走すればなんとかなる(2005-12/30)(その3)
(2005-12/30)(その3)
なんとか動いたけど(5月のバージョンだよ)
初心者でも3日迷走すればなんとかなる
outpatchが判らない
$ make
psp-gcc-4.0.0 -mgp32 -mlong32 -msingle-float
-mabi=eabi -c startup.S -o startup.o
psp-gcc-4.0.0 -Wall -O3 -fomit-frame-pointer
-mgp32 -mlong32 -msingle-float
-mabi=eabi -c xmain.c -o xmain.o
psp-gcc-4.0.0 -nostartfiles -Wl,-Ttext=0x08900000
startup.o xmain.o -lc -o out
psp-strip out
outpatch
modulename not found
make: *** [EBOOT.PBP] Error 1
outpatchにモジュール名がみつかんないよって
言われちゃうんだけど、昨日も言われたんだけど
まだ怪しいからって事で切り捨ててたんだけど、
今日も言われてしまった。
んー、設定が何処か基本的におかしいのかな。
(ごちゃごちゃついてるオプション達は、まさか私の頭が、
考えた訳ではなく、単にコピー&ペーストしただけです。
大体、テキストエリアが何処からとか、そんなん全然
知らないのに、書ける筈がないでしょ。
しかも現在のレベルでは、そんなんどうでもいいよっ!
て、余計な事ばかり)
で、outpatchって一体何を探してるのかな。
”out”の中を覗くとsceDisplayとかsceGe_userとか
いかにも私はラベルですってのが入ってんだけど。
user_mainってのはあるけどxmainはないなあ。
なんでだろ。おかしいなあxmain.oにはあるのに、
なんで抜け落ちちゃうんだろ。
とにかくそんな事はどうでも良くって、仕方がないから
outpatchのソース(なんと標準で添付されてた!
ありがとお→だってわかんないからdisになりがちでしょ)
で、”outpatch.cpp”を見た。
#define str_modulename ”HelloWorld”
...
ofs_modulename=0;
unsigned long len_modulename=strlen(str_modulename);
for (i=0; i<filesize; i++) {
if (memcmp(buf+i,str_modulename,len_modulename)==0) {
ofs_modulename=i;
break;
}
}
...
if (ofs_modulename==0) {
printf(”modulename not found¥n”);
if (buf) { free(buf); buf=NULL; }
exit(1);
}
ってそりゃあ無理でしょ。HelloWorldなんて関数ある訳ない。
あああ、またはまってるなあ。がっくし。ぢゃあ
int HelloWorld(void)
{
return 0;
}
でも追加するか。とりあえず。
で、やってみたけど駄目、相変わらずモジュール名消えちゃうし
最適化で喰われちゃうのか?
無駄なコード書けばいいのか?
-O3はやめるべきなのか?
うーんどれも違うよな。単に人のせいにしてるよな。
なにかこうもっと根本的な事だな多分。
もっとなーんだっていうようなはづかしい事なんだろうけど
思いつかない。でもなんでHelloWorldなんてツールなのに
書いてあるんだろ不思議。
で、他のソースを”HelloWorld”で検索してみた。
あれえ、出てこないぞ?もしかしてこの
”outpatch”ってとてつもなく古いversionなのか?
でgoo”outpatch”でWeb検索
1行目に出てきた。(5月の情報)
少し検索をしたので少し情報が増えた。
私は3日前から始めたので過去の事は判らないが、
どおも世間には(5月の情報)(7月の情報)(10月の情報)が
あるらしい。とにかく詳しく知らないが、
(5月、7月の情報)についてはPS2のSDKを使って
PSPのプログラムを作っていたらしい。
(今でもそうなのかも知れないが)そんで現時点(12月の末)では、
(5月、7月の情報)にあるPS2のSDKは手に入らない
(回った所は全部だめ、だから迷走してるんだよ、
別に個人的にはとりあえず古い方法でもかまわない)
(10月の情報)もまあかなりリンク切れであやしい。
(5月の情報)によると「Hellopsp_src」というのがあって
それを改造してごにょごにょって書いてある。それは一応落として
きてあるんだけどmakeじゃなくてバッチ”mk.bat”なんだよね。
うちのcygwinは、バッチを実行すると何故かホストOS(W98SE)
ごと落ちる。”$ ./mk.bat↓” だからこれやりたくなかったんだけど。
(だから迷走してるんです。)仕方がない。やってみますか。
c:¥ps2dev¥gcc¥ee¥bin¥ee-gcc は psp-gcc-4.0.0 に変えて、
-march=r4000 はいらないでしょ当たり前だから。
-xassembler はいらないでしょ当たり前だから。
c:¥ps2dev¥gcc¥ee¥bin¥ee-ld も psp-gcc-4.0.0 でいいと思うんだが
念のため psp-ld にしておこう。
あと-g オプションはたぶんgnu互換って意味だろうから取っちゃぇ。
でどおせOS落ちるんだから、最後に
elf2pbp outp ”null test”
を追記
これでEBOOT.PBPが出来るといいな。→だめだな(OS落ちた)
(注意:cygwinはbashですから、batは実行できません。しかもこれ、
MSDOS用のBATファイルだし、そんなん動く訳ないんだってば!
無理やり動かすと、ホストOSごと暴走します。(危険)
(Unix用の)BATを書きたいのなら、とっととシェルスクリプトに
してください。シェルスクリプト化するには、頭の一行目に、
(2行目では駄目、コメントになってしまう。1行目は特殊な意味がある)
「#!/bin/sh」を追加するだけです。BATと紛らわしいので普通は、
ファイル名の拡張子を「sh」に変更します。例えば「hennyohennyo.sh」)
じゃあ1行づつ手打ちで、
$ psp-gcc-4.0.0 -mgp32 -mlong32 -c hellopsp.c
これはOK。
$ psp-gcc-4.0.0 -mgp32 -mlong32 -c pg.c
pg.c: In function ’pgFillvram’:
pg.c:110: warning: pointer targets in assignment differ in signedness
pg.c: In function ’pgBitBlt’:
pg.c:124: warning: pointer targets in assignment differ in signedness
pg.c: In function ’pgPutChar’:
pg.c:153: warning: comparison is always false due to limited
range of data type
pg.c:155: warning: pointer targets in assignment differ in signedness
まあこれもOKってことにしよ。(運が悪くても暴走するだけでしょ)
$ psp-gcc-4.0.0 -mgp32 -c -O -o startup.o startup.s
startup.s: Assembler messages:
startup.s:17: Error: illegal operands `la $v0,_gp’
startup.s:18: Error: illegal operands `move’
startup.s:23: Error: illegal operands `li $v0,1’
startup.s:70: Warning: setting incorrect section attributes
for .rodata.entrytable
これは致命的だな書き換えなきゃ。
_start:
la $v0,_gp
move $gp,$v0
jal xmain
nop
jr $ra
li $v0, 1
...
.section .rodata.entrytable,”wa”,@progbits
__entrytable:
を
_start:
la $2,_gp
move $gp,$2
jal xmain
nop
jr $ra
li $2, 1
...
.section .xodata.entrytable,”wa”,@progbits
__entrytable:
にしよ(これでいいのかな)
で最後に、
psp-ld -O0 startup.o hellopsp.o pg.o -M -Ttext 8900000 -q -o out
うわてぇ抜いたからでろでろ出てきた。仕方ない。手抜きしないで。
psp-ld -O0 startup.o hellopsp.o pg.o -M -Ttext 8900000 -q -o out > map.txt
まあよしとしよ。で、outpatch
$ outpatch
successed filesize:00010494 modulename:0000F084 scemoduleinfo:0000F36B
お、”modulename not found” ぢゃないもんが、なんかでてる(わざとらしい)
じゃあ
$ elf2pbp outp ”taihen desuuu”
BASH: elf2pbp: command not found
あり、HDDもったいないから消ちゃったんだっけ(せこ)気を取り直して
$ elf2pbp outp ”otukare sama”
Elf2Pbp v0.3 - loser 2005
successfully generated pbp file
さてこれで動くもんかね。で、XMASパーティーに連れてったっきり
ほっぽっといたPSPを取り出して、えーとコード、コード、USB
に繋いで、転送する。(WinXPのSP2以降なら何も考えずOK、
うちはWin98SEだけどドライバ入れてあるからOKなんよ)
で、動いた。で、サターン何たらって何?あっゲームラボだ。
最近読んでないなあ。
(本日のレベル単細胞生物、乾き気味)
(状態:やっと迷走から首一つ上に出た、でも死にかけ)
■補足(2006-01/19)
Outpatchが判らないのは、当たり前です。
Outpatchは複数のVerがあり、互換性がありません。
その互換性がない部分というのは、「モジュール名」のみです。
モジュール名「HelloWorld」のタイプと、
モジュール名「USERPROG」のタイプの2種類が存在する様です。
ここの「モジュール名」はコンパイルさせたいStartup.Sの中身と一致する
必要があります。
現在のOutpatchの標準モジュール名は「USERPROG」に
統一されているようですので、
もし「HelloWorld」のタイプのOutpatchなら、
バイナリエディターで強制的に書き換えちゃえ。
(注:書き換えて余った名称は、ゼロ(0x00)で埋める事。)
■補足(2006-04/27)
ええと、ここhttp://www.decomo.info/psp/use_psptoolchain.html
によると。
レジスタ番号 | レジスタ名 | レジスタ番号 | レジスタ名 |
$0 | $zero | $16 | $s0 |
$1 | $at | $17 | $s1 |
$2 | $v0 | $18 | $s2 |
$3 | $v1 | $19 | $s3 |
$4 | $a0 | $20 | $s4 |
$5 | $a1 | $21 | $s5 |
$6 | $a2 | $22 | $s6 |
$7 | $a3 | $23 | $s7 |
$8 | $t0 | $24 | $t8 |
$9 | $t1 | $25 | $t9 |
$10 | $t2 | $26 | $k0 |
$11 | $t3 | $27 | $k1 |
$12 | $t4 | $28 | $gp |
$13 | $t5 | $29 | $sp |
$14 | $t6 | $30 | $fp または $s8 |
$15 | $t7 | $31 | ra |
だそうです。へー、今まで調べもせんと「山勘」でやってた。へー。