前回までのあらすじ。
ドイツのサイト(品揃えが良い)→ソース21個DL→使えるサンプルは短い方が優秀→
reflectionsrc.zip人を舐めてんのか!→お!、「TerrainSrc2.zip」なら簡単そう
多少前回の流れとは違うような気もしますが、気のせいって事で。
真のタイトル:DE、「TerrainSrc2.zip」簡単そうだから、さくっと済ませちゃお。(2006-02/11)
の巻。
あ、まだ頭がDGENから離れない方。このページは全く関係ないですよ。さくっと過去記事に飛ばそう。
(もう今日の事なんて過去過去)2006-02/11 D #11 UPdate1合成
えーと、今20:55、アーカイブ開けたばっかり、1時間もありゃおわるでしょ?
で、今make書いた。
「startup.s」なんて危険な名前になってる。「startup.S」に変えないと消されちゃう。
で、Make、エラーでんがな。また例のレジスタ置換か。GCC対応してよ。めんどいよ。まあ直すか。
えーと、
$v0は$2
$a2は$6
$a3は$7
$t0は$8
$t1は$9
$a0は$16
$a1は$17
$raは$31
に直せば、アセンブル通ります。管理人だってPSPのアッセンブラ一片も判りませんから、
ご安心ください。今回はDGENのStartup.Sと突き合わせて考えましたが、
どうもこれはHOME終了じゃなくて、きちんと終われるタイプのSTARTUP.Sので、
お魚さんのソースから引っ張ってくれば、まったく同じかも知れない。責任は持ちませんが。
(上記をエディターで置換した方が安全です。)
例によってここで、ワーニングでるから。rodataをxodataにしましょうね。
.section .rodata.entrytable,"wa",@progbits
__entrytable:
.section .xodata.entrytable,"wa",@progbits
__entrytable:
もうこれくらい、覚えたでしょ?なぬ。いいかげん覚えろー何度もやってるんだから。
src/glvox.c:30:17: error: Sky.c: No such file or directory
なぬーーーっ。そんなもんアーカイブに入ってないとりゃせんじゃないか。
で、glvox.cを見る。
// *******************************************************************
// Not yet used.. yet..
#include "Sky.c"
//#include "Water1.c"
訳:まだ作って無いけどいるんでちゅ。
くううぅぅ。。..どいつもこいつもふざけたマネを。ああそお。で、コメントアウト。
src/glvox.c:437: error: 'SkyData' undeclared (first use in this function)
ああそう、世界の何処にもなくてもいる訳ね。じゃあしょうがない。さっきのこめんとアウトを
外して、"Sky.c"を作る。中身はHelloWorldからでも抜いてこよう。どおせ適当な長さがあれば、
何でもいいんだろ。自分の作った別館からHW2A.ZIPを落としてくる。
落としてきて解凍したら即効消去。なーんかインターネットの使い方間違ってるかもしれんが、
既にそおいう時代だ。こいつのbitmap.cをSky.cにリネーム。
そんで、中身空けてこんな感じに直した。
// bitmap image for Hello World PSP
const unsigned short SkyData[]={
0x5881,0x54E6,0x54E6,0x54E6,0x54E6,0x以下略
なんかエラーでてる。
src/_clib.c: In function '_memset':
src/_clib.c:151: error: invalid lvalue in increment
src/_clib.c: In function '_memcmp':
src/_clib.c:158: error: invalid lvalue in increment
src/_clib.c:158: error: invalid lvalue in increment
src/_clib.c: In function '_memcpy':
src/_clib.c:166: error: invalid lvalue in increment
src/_clib.c:166: error: invalid lvalue in increment
make: *** [obj/_clib.o] Error 1
ソース見るとこんなん。
void _memset(void *d, const long s, unsigned long n)
{
for (; n>0; n--) *(((char *)d)++)=s;
}
int _memcmp(const void *s1, const void *s2, unsigned long n)
{
for (; n>0; n--) {
if (*(((unsigned char *)s1))>*(((unsigned char *)s2))) return 1;
if (*(((unsigned char *)s1)++)<*(((unsigned char *)s2)++)) return -1;
}
return 0;
}
void _memcpy(void *d, const void *s, unsigned long n)
{
for (; n>0; n--) {
(*(((unsigned char *)d)++)=*(((unsigned char *)s)++));
}
}
はいはい、直してあげますよ
void _memset(void *d, const long s, unsigned long n)
{
for (; n>0; n--) *(((char *)d++))=s;
}
int _memcmp(const void *s1, const void *s2, unsigned long n)
{
for (; n>0; n--) {
if (*(((unsigned char *)s1))>*(((unsigned char *)s2))) return 1;
if (*(((unsigned char *)s1++))<*(((unsigned char *)s2++))) return -1;
}
return 0;
}
void _memcpy(void *d, const void *s, unsigned long n)
{
for (; n>0; n--) {
(*(((unsigned char *)d++))=*(((unsigned char *)s++)));
}
}
で、いいんでしょ?で、コンパイル。outpatchがとうらんからそいつも治して(直す)。
と思ったけど、"USERPROG"だ。
「elf2pbp.exe」と「outpatch.exe」をDGENのフォルダから持ってこよう。念のため「*.out」を消して。
「ICON0.png」がないから、エラー。も一回。
今度はOK。なんかできた。でもこれなんのプログラムか知らんぜよ。仕方がない。ソース見よう。
怪しいことはしてないな。PG呼んで線かなんか書いてるだけの模様。
じゃあPSPに持ってってみるよ。仕方がない。
ぐげぇ動かない[HOME]も効かない。
のんびりやってるからそろそろ1時間立っちゃうよ。時間の無駄のような気もしてきたが、
こっちも意地だ。デバッグしたる。
まず、startup.sどおせ古いタイプだ。関数をSTABしまくってるSTAB登録マクロのところまで、
削除し、DGENのSTARTUP.Sを貼り付け。
関数のアドレスがいっしょでも、関数名は、いつも違うので、そこは残すんだよ。
元々入ってた奴。
略
\funcname:
jr $ra
nop
.section .rodata.stubidtable
.word \funcid
.set pop
.endm
ここが切れ目
STUB_START "sceDisplay",0x40010000,0x00030005
STUB_FUNC 0x0E20F177,sceDisplaySetMode
略
DGENの奴(注:管理人が勝手に改造)
略
.word \funcid
.set pop
.endm
ここが切れ目
STUB_START "sceDisplay",0x40010000,0x00110005
STUB_FUNC 0x0e20f177,sceDisplaySetMode
# STUB_FUNC 0xdea197d4,sceDisplayGetMode
略
だからな。
切れ目以降は残すんだぞ。切れ目までが「頭」。切れ目以降が「体」だとすると、
「頭」を削除して、DGENの「頭」をコピーして貼り付け、保存だからな。判ったな。
で、エラー。
psp-gcc-4.0.0 obj/startup.o obj/glvox.o obj/pg.o obj/_clib.o -nostartfiles -Wl
,-Ttext=0x08900000 -o moya.out
obj/pg.o: In function `pgExit':
pg.c:(.text+0xff0): undefined reference to `__exit'
obj/pg.o: In function `pgMain':
pg.c:(.text+0x2060): undefined reference to `__exit'
collect2: ld returned 1 exit status
make: *** [moya.out] Error 1
訳:「__exit」なんてねーよ。
はいはい、わかったよ。[HOME]終了のスレ追加して、PGのexit消したる。
が、ちとトイレ。(管理人人間です。ロボットじゃありません。いいからはよトイレ逝け!!)
なんだか管理人疲れてきたし、アメブロも混んできたからこの辺で止めるか。(今22:07)
でも、あとちょっとなんだよなぁ。
もういいや[]
// while(app_running)
for(;;)
{
void pgExit(int n)
{
pg_terminate=1;
// terminate subsystem preprocess
pgaTermPre();
// terminate subsystem
pgaTerm();
// __exit();
}
にした。一番はじめにコメントになってるのとふぉrが管理人のいじった所。
これで動かなければ、ねる。動いたら、終了できないから、電源スイッチ長押し。
これでいいだろ!
動きやがった。
もわもわしてる地面。コマンチみたいなデモだ。
しょうがない。別館に上げとくが、終了できんぞ。明日終了を付け加える。今日はもう寝る。
お休めなさい。