GCC344実験。までw-ぷ
キメラ実験。までわ-p
OPTI実験。までわあぷ
コースケ氏?。までわwwぷ
Z05始動。(Z80死闘編)
■SEGADRIVEA32。如何でした?で、Z80づいてる今日この頃なんですが、暑くてアイスが欠かせません。
ぺろぺろ...そりゃ、ともかく。
SEGADRIVEA31/32に実験的に混入されてる。Z05が始動したす。原因はzBase。
つまりPC(==プログラムカウンタ)、の使い方にオフセットが入ってない為。
ともかく、BF03でパフォーマンスチェック。
ううう、z03とほぼ同じかはええ。で、「ぷよぷよ2」...何の問題もない。
「m22z03EBOOT.PBP」653kB(MAMEベースのZ80)
「m22z05EBOOT.PBP」625kB(CZ80ベースのZ80)
でサイズも小さい。
あの苦労は一体...
(2006-07/15、23:10)
■NEOCDZのページでさあ。CZよりMAMEZの方が早いでちゅって書いてあったから、Z05には
全く全然期待してなかったんですが...正しく使えば速いじゃないか。
「正しく使う」→あのZ80はI/F外して、PCをポインタにしましょう。つまり、
#define zRealPC (zPC - zBase)
static unsigned char *zBase;//z80ram base
static unsigned char *zPC;//z80pc
#define SET_PC(A) zPC = (A) + zBase;
こーゆーふーにしよ。ちなみに現状
#undef CZ80_USE_JUMPTABLE
でっす。(だから小さい)
(2006-07/15、23:35)
■
「m33z03EBOOT.PBP」635kB(MAMEベースのZ80)
「m33z05EBOOT.PBP」609kB(CZ80ベースのZ80)
って、ちいせえ。ついに500kB台になる気がスル。
大抵のROMより本体が小さい。圧縮してないのに...
(2006-07/15、23:42)
■さてと、もしこのZ80カイゾーしたら何処までイケルんでしょうかね。(遅くなるかもしんない)
ほいメス。カンシ。(そんなもんはさすがに使わん)しゅゆちゅ。しゅゆちゅ。きょーは遅いからOPはあすにしよー。
(2006-07/16、00:00)
■Z05ちとテストしてみたら、「ソニック3」で音楽あやしー気がする。つまりげんじょー再現度は、やっぱMAMEZ。
速度はまあMAMEZと殆ど一緒だがCZも結構オモシロイな。
再現度:Z03>Z05>Z02>Z01
速度:Z05>Z03>Z01>Z02
サイズ:Z05<Z02<Z01<Z03
てな感じ。現状。
(2006-07/16、06:42)
いちおー別館に(さしあたり動く奴を)「A32_Z05TEST.zip」で上げといたです。
(2006-07/16、08:12)
■■■GCC344実験。
今日生まれて初めてGCC344を入れてみた...って遅いよ。何ヶ月放置しとんねん。まあまあ。
んで、GCC344でコンパイル。何故か「font3333.c」がちーともコンパイル出来ない。
GCC344は(ワーク増やさない限り)マクロに弱いんだな。と思った。
「font3333.c」はマクロかましてあるが、中身は単なるフォントデーター。仮にOBJに「GCC4.0.0」って付いてたって、
何の問題もないやろって思い。picodriveA14のディレクトリから「font3333.o」をコピー。で、OK。
そのあとCPPでキャストのワーニングが出たんで直す。(2ヵ所、まったく同じ奴)
if( (unsigned int)(t[0]&0x80) == (priority<<7) ) // 0x8000
こんなん。さしあたり(unsigned int)にキャストして切り抜ける。(上みたいに)
(余談だが、ここは本当は(unsigned char)で足りてる。CHARにしときゃヨカッタ。が、差し当たりコンパイルが目的だし)
で、EBOOT.PBPになったんでPSPでBF03チェックしてみた。
結果: OFF 44 22 11 55
Z32m33z05 77 54+ 64 69 71 637kb /GCC344
A32m33z05 80 58+ 67 72 74+ 609kb /GCC402
Z32m22z05 81 57+ 67+ 73 75 683kb /GCC344
A32m22z05 84 62 71+ 76 79 625kb /GCC402
GCC344の方が重いとは思わなかった。ふーん。サイズもGCC344のほーが、でかいしな。
ちうか、運だな。まーでも「運」だから「これ以上ソースに手を入れるのめんどくせえ」って時に、
「もしかして!」ちって試してみるのもアリかと。GCC344のほーが速くなる場合もある(らしい)しな。
それからGCC344の方がfpsが安定しない。+2ぐらい動く。
GCC400/GCC402の場合は+1ぐらいしか動かん。
結局GCC402がいいな。fpsが同じ値ぐらいなら、安定的の方がゲームはやりやすいからな。
まあこれも「運」かもしんないケド。そーゆー傾向はありそう。...な気がする。
それともう一つ。速度が
GCC402>GCC344>GCC400
って可能性はある。まあ「運」だと思うケド。
結局。ヨクワカンナイ。GCC344で速くなる方法は(ワタシが使ったことないから)全く解からんし。
基本的にこのページの速くなる方法ってのはGCC400の場合です。タブン。(ってゆーかそれしか知らん)
(2006/07-17、00:35)
以下妄想。
いちよー。他の機械(PC)にcygwinとsubversionいれて、toolschain.sh経由で環境を構築する気は(時間が取れれば)ある。
ちゅーか、今の(環境の)状態は世間一般の常識にすれば「異常」だからな。でも、やってないからまだ妄想。
この機械(貧弱NOTE-PC@0.233GHz!PSPより遅い開発マシン。しかし何の不便も無い)には
ちと入れたくない事情があってな。
(でも、次の実験PCも小数点以下GHzの予定。NOTE用の無線LANカードをそのまま使う予定の為)
(2006/07-17、00:55)
■■■キメラ実験
GCC402版(本当はもどき)unziplib.aが46kbだったのに、
GCC344版unziplib.aが45kbだったので、これを強引にリンクしたら小さくなるのかどおか実験してみたつ。
対象はsegadriveA32m33z05(609kb)
で、やってみたら。出来るのね。そんで予想(ふつーそんなん変わらんと思うでしょ?)と
裏腹に小さくなる。607kbになった。んで、(EBOOT.PBP)バイナリ覗くと、
---------|-0--1--2--3--4--5--6--7--8--9--A--B--C--D--E--F-|---0123456789ABCDEF
0000970b0|00 00 f4 03 03 b0 00 00 00 00 00 00 00 00 00 00 | .....ー..........
0000970c0|00 00 00 00 00 00 10 d5 9d 08 00 47 43 43 3a 20 | .......ユ...GCC:
0000970d0|28 47 4e 55 29 20 34 2e 30 2e 30 00 00 47 43 43 | (GNU) 4.0.0..GCC
0000970e0|3a 20 28 47 4e 55 29 20 34 2e 30 2e 30 00 00 47 | : (GNU) 4.0.0..G
0000970f0|43 43 3a 20 28 47 4e 55 29 20 34 2e 30 2e 30 00 | CC: (GNU) 4.0.0.
000097100|00 47 43 43 3a 20 28 47 4e 55 29 20 34 2e 30 2e | .GCC: (GNU) 4.0.
000097110|30 00 00 47 43 43 3a 20 28 47 4e 55 29 20 34 2e | 0..GCC: (GNU) 4.
000097120|30 2e 30 00 00 47 43 43 3a 20 28 47 4e 55 29 20 | 0.0..GCC: (GNU)
000097130|34 2e 30 2e 30 00 00 47 43 43 3a 20 28 47 4e 55 | 4.0.0..GCC: (GNU
000097140|29 20 34 2e 30 2e 30 00 00 47 43 43 3a 20 28 47 | ) 4.0.0..GCC: (G
000097150|4e 55 29 20 34 2e 30 2e 30 00 00 47 43 43 3a 20 | NU) 4.0.0..GCC:
000097160|28 47 4e 55 29 20 34 2e 30 2e 30 00 00 47 43 43 | (GNU) 4.0.0..GCC
000097170|3a 20 28 47 4e 55 29 20 34 2e 30 2e 30 00 00 47 | : (GNU) 4.0.0..G
000097180|43 43 3a 20 28 47 4e 55 29 20 34 2e 30 2e 30 00 | CC: (GNU) 4.0.0.
000097190|00 47 43 43 3a 20 28 47 4e 55 29 20 34 2e 30 2e | .GCC: (GNU) 4.0.
0000971a0|30 00 00 47 43 43 3a 20 28 47 4e 55 29 20 34 2e | 0..GCC: (GNU) 4.
0000971b0|30 2e 30 00 00 47 43 43 3a 20 28 47 4e 55 29 20 | 0.0..GCC: (GNU)
0000971c0|34 2e 30 2e 30 00 00 47 43 43 3a 20 28 47 4e 55 | 4.0.0..GCC: (GNU
0000971d0|29 20 33 2e 34 2e 34 00 00 47 43 43 3a 20 28 47 | ) 3.4.4..GCC: (G
0000971e0|4e 55 29 20 33 2e 34 2e 34 00 00 47 43 43 3a 20 | NU) 3.4.4..GCC:
0000971f0|28 47 4e 55 29 20 33 2e 34 2e 34 00 00 47 43 43 | (GNU) 3.4.4..GCC
000097200|3a 20 28 47 4e 55 29 20 33 2e 34 2e 34 00 00 47 | : (GNU) 3.4.4..G
000097210|43 43 3a 20 28 47 4e 55 29 20 33 2e 34 2e 34 00 | CC: (GNU) 3.4.4.
000097220|00 47 43 43 3a 20 28 47 4e 55 29 20 33 2e 34 2e | .GCC: (GNU) 3.4.
000097230|34 00 00 47 43 43 3a 20 28 47 4e 55 29 20 33 2e | 4..GCC: (GNU) 3.
000097240|34 2e 34 00 00 00 1c c8 96 08 00 00 00 00 00 00 | 4.4....ネ........
000097250|00 00 00 00 00 00 00 00 00 00 00 00 00 00 1d 00 | ................
こーんな感じで強引にリンクされてる。
■そんで、そのキメラちゃんで、BF03取ってみた。
結果: OFF 44 22 11 55
Z32m33z05 77 54+ 64 69 71 637kb /GCC344
Z32m22z05 81 57+ 67+ 73 75 683kb /GCC344
A32m33z05 80 58+ 67 72 74+ 609kb /GCC402
A32m33z05 80+ 59+ 68+ 73 75+ 607kb /GCC402+uz344
A32m22z05 84 62 71+ 76 79 625kb /GCC402
ててて、(サイズが小さくなって)速くなるのね。一応。ちゅー事で、unziplib.aは分離した方がいいし、
最適化OPTも-O3(速度最適化)とかは止めて-O1(サイズ最適化)とかに変えたほーがいいんだな。
...参考になるなあ。でも、「運」かもなあ?(謎)
例えばさあ、「unziplib.a」に勿論「速度」は要らないんだケド。でも現状は、「解凍速度重視」の為、
「CRC32テーブル」とか入ってる。「サイズ重視」なら、んなもんとっぱらっちゃったほーがいいし。
「*.a」止めて「NesterJ」や「MAME」みたいに内蔵型にしちゃったほーがいいって事だね。
■■■OPTI実験。
先程の「キメラ」実験で「要点」が解かったんで、んじゃ今度は最適化OPTを変えてみる実験。
今度はGCC402(本当は400?+402LIB?)のみを使う。
★segadrive本体は-O3.(速度最適化)
★unziblib.aは-O1.(サイズ最適化)
にする。おそらくキメラ実験と同じよーな効果が得られるだろー。えっとMakefile
まず
CC_OPT = -Werror -Wall -fomit-frame-pointer -fno-exceptions -mgp32 -mlong32 -msingle-float -mabi=eabi -c
で最適化指定を外す。
んで、
# UnzipLib 関係は-O1(サイズ最適化)にしてみた。
$(OBJ)/UnzipLib/%.o : src/UnzipLib/%.c
$(CC) -O1 $(CC_OPT) $(DEFINES) $< -o $@
# んで、その他は-O3(速度最適化)ね。
$(OBJ)/%.o : src/%.c
$(CC) -O3 $(CC_OPT) $(DEFINES) $< -o $@
こーゆーふーに、Makeは書くんだお。そーすると自動で最適化を振り分けてくれる。(だからソースファイルの
位置には意味があるんだお)
んで、
# EBOOT.PBPの作り方
$(BINARY): $(OBJS) unziplib.a
$(LD) $(SOBJS) $(LIBS) $(LINK_OPT) -o $@
$(STRIP) $(BINARY)
$(OUTPATCH) $(BINARY) $(BINARY_P) "USERPROG"
$(ELF2PBP) $(BINARY_P) $(TITLE) $(ICON0)
$(CP) EBOOT.PBP m$(MV)z$(ZV)EBOOT.PBP
$(RM) $(TEMP_FILE)
# unziplib.aの作り方
unziplib.a: $(ZOBJS)
$(AR) rcs unziplib.a $(ZOBJS)
こーゆーふーに分けた。(きおつけないと古いVERのunziplib.aリンクしちゃうけど、最近中身弄らんし、
万一弄ったら、「make unziplib.a」で更新しときゃ問題はない。(それかmake clean)
とにかく御託より結果。んで、BF03。
結果: OFF 44 22 11 55
Z32m33z05 77 54+ 64 69 71 637kb /GCC344
Z32m22z05 81 57+ 67+ 73 75 683kb /GCC344
A32m33z05 80 58+ 67 72 74+ 609kb /GCC402
A32m33z05 80+ 59+ 68+ 73 75+ 607kb /GCC402+uz344
A32m33z05 81 59+ 68+ 73 75+ 606kb /GCC402_o3+uz402_o1
A32m22z05 84 62 71+ 76 79 625kb /GCC402
なーる程。で、同じ事「A32m22z05」でやってにる。
A32m22z05 84 62 71+ 76+ 79 625kb /GCC402_o3+uz402_o1
これでも「運」だと思うかも知れない。んだけど一般的に、こーゆー傾向があるんじゃあないのかな?
つまりエミュのコアとかメモリ周りとか速くないと困るとこは-O3で、
STATEセーブとかメニューとかZIP展開とか、そんなに速くなくて構わんとこは-O1で、
んで、そーゆーふーにしなかった場合とやった場合。悪くなる事はないんじゃあないかなー。
ちゅう仮説。おしまい。(だぶんDGEN100SRCの344のがはえーってのはZIPLIBのせいなんではないかと妄想)
■■■で、コースケ氏?強引に344でコンパイルしてみたんで、出来れば試して欲しいんだが...
別館に「A32Z05GCC344.zip」
(2006/07-17、02:20)