#8SYS1カスタム、ダイエットにゃー(2006-02/17)
■にゃー。07:25に、起きたにゃー。
実は昨日辺りから、やってるダイエットに関しては、PSPと関係なく、どんなターゲットでも、
それなりに応用の効く技術だったりするにゃ。
MAMEをタイニーでコンパイルしてみたけど、(ターゲットは問わないにゃ)
「少し早くなったんだけど、まだパフォーマンスに不満なごなご」って人は、参考にしては、如何がかにゃん。
(文責:ねこ)
えーと、そろそろ偽名古屋弁は辛くなって来たので、話を元にもどすがや。
■昨日の続きやから、いっこまえを読まないと、意味わからへん。よう、出来てんねん。
ほい、昨日のあらすじ。
少し路線を、まちがえたがなあ、先にartworkとかmd5とかsha1とか簡単にはずせるもんがあるような気が...
まあ、やっちまったもんはしかたがない。
追加の要点#4な、
#4 32ビットレンダーは無条件で消して良い。(DRAWGFX.Cのみの話だよ)
これはどおいう事かというとやな。元のSYS1が16ビット色で足りるからなんや。
(例えばF3の場合は、32ビットがないと駄目やで、あれはレンダーが32ビットカスタムになってる。
超複雑なF3のアルファ関係をなるべく簡単に実装する為)
えーとな、今回はターゲットがPSP専用やけどな。ターゲットがDOS/Vで、
画面モードが32ビット色にしか対応してない特殊なPCだったとしても、
それでもSYS1専用エミュの場合は32ビット色を削除して良い。
原理はこう。
MAMEシステム内-------
SYS1「src/vidhrdw/namcos1.c」{
SYS1のドライバが、「出力用仮想VRAM」に、(ドライバの仮想VRAMとは話が別)
「DRAWGFX.C」を使って、(一般用語では、スプライト描画ルーチン。ナムコ用語ではOBJ)
「TILEMAP.C」を使って、(一般用語では、BG描画ルーチン。ナムコ用語ではCHR)
あるいは直接。
レンダー。(SYS1は必ず16ビット色)
}
-------
MAMEのMENU画面は、(あるいはFPS表示や、プロファイラー等は、)
ドライバの使ってる色数にあわせて(つまりSYS1なら16ビット色)
「DRAWGFX.C」を使って、(一般用語では、スプライト描画ルーチン。MAME用語ではDRAWGFX)
「出力用仮想VRAM」(SYS1は必ず16ビット色)に、
(MENU用8ビット色(データーは1ビット色)→16ビット色にして)
(↑これはDRAWGFX内でやるから8ビット色は単純に削除出来ない)
レンダー。
つまり合成やね。
MAMEシステム内-------ここまではすべてシステムRAMの話。
-------
MAMEシステム機種別対応ルーチン(DOS用とかWIN用とかPSP用とかその他とか)
「出力用仮想VRAM」のレンダリング色を調べ、(SYS1の場合16ビット色)
色数を変更し、(例えば16ビット色→32ビット色変換)
どっか(本物のVRAMとか)へ出力
つまり、仮想的な色数である。
MEMU色はMAMEが合わせてくれる。
■うぃーー。今実験で、「ROZ」と「ZOOM」が付いてるものを単純に「DRAWGFX.C」から削除して
OBJを生成してみた。
DRAWGFX.Oサイズ:346kb→317kb(12%減)でこれだけでは大して減ってない。
DRAWGFX.Cサイズ:150kb→91kBこれは見て(1/3減)ってわかるでしょ?
別にソースの減り量は意味がないが。参考まで。
ここが減ると、何が嬉しいかというと、実は単純にパフォーマンスUPするからだ。
忘れていたが、DRAWGFX.CよりもTILEMAP.Cの方がパフォーマンスUPには効果が高い。
次に色数減でもやるか、(08:56)
■32ビット色はSYS1では使わんので、削除してみた。
DRAWGFX.Oサイズ:346kb→191kb(45%減) るん♪。
DRAWGFX.Cサイズ:150kb→82kBこれは約半分ってわかるでしょ?
うし、いい感じ〆♂∠√
次にアルファ減でもやるかと思ったけど、いい加減飽きてきた。やっぱ早くEBOOT.PBPに
もって行きたいから、そんな事より、ちまちまファイル削減しよ。昨日みたいにさ。そりゃ管理人だって、
単純なファイル削減作業は、つまんないからやだよ。でも早くEBOOT.PBPにしたいっ!(09:45)
■ファイル減らすのは盲目的にやってるのではなくて、戦略がいるねん。今なMAME直下のOBJを合計して、
(soundの下とかcpuの下とかpspの下とかそおいうのは含まない)
つまりこいつらがMAMEシステムな訳やろ。
えーと、1.49MBな。これ、半分にしよ。目標半分。750KBな。妄想やけど。(10:00)
じゃ、
LIBEXPAT.A XML整形ライブラリ
PROFILER.O リアルタイム性能測定(いったん外す。便利だから後で追加する)
CDROM.O そんなものSYS1にはない
HARDDISK.O そんなものSYS1にはない
MD5.O 圧縮ファイルのチェックサム計算をMD5でやる(そんなんCRCだけで十分)
SHA1.O 圧縮ファイルのチェックサム計算をSHA1でやる(そんなんCRCだけで十分)
をはずそ、このうちMD5とSHA1は、外すとCHD.Cでごちゃごちゃ訳わからんエラーでる事が、
予想されんねん。あんまし訳わからん事いうてきはったら、なかった事。にしよ。な。
CHDのシステムが変わってるねん。あんまし自信がないっていうかこのVERのMAMEは、
ここ触った事、ないねん。もちっと前のVERのMAMEなら、すごく簡単に外せてオイシイ所やったんやけど。
ソース見たら、まだらに融合されてんねん。いーよ、そんな事しないで。そんな所パフォーマンス
要求されないだろ。ソース見て判りやすい(保守性が高い)方が、ここは価値が高いねん。
改悪されとるがな。(10:24、でも管理人早起きでちと疲れたから9K)
さて今(11:48)作業再開するか。
■
「x86drc.c」「x86drc.h」はいらんでしょ。
src/expatに退いてもらう。エラー待ち。ついでに「xml2info.c」「xml2info.txt」も外す。
差当たり、まずsrc/debugにも退いてもらおう。PSPキーボードも付いてないし。
こんなんあってもデバッグできる訳でもなし、現時点では、意味不明だからだ。
だたし、この辺もMAMEコアに密接に関わってるかもしれないから、(VECTOR.Cと似た境遇だな)
ちゃんとはあとではずそ。
とりあえず。退いてもらったディレクトリの中から「mamedbg.h」を拾い出して、src/にコピー。
src/mame.c:146:22: error: harddisk.h: No such file or directory
src/mame.c: At top level:
src/mame.c:226: error: variable 'mame_chd_interface' has initializer but incompl
ete type
うーん、harddiskは判らんから、やっぱ元にもどそ。
現状
「harddisk.h」「harddisk.c」
「md5.c」「md5.h」
「chd.c」「chd.h」
「sha1.c」「sha1.h」
はずす
「chdcd.c」「chdcd.h」
「cdrom.c」「cdrom.h」
ここまで、調べて、「hash.c」をなんとかすれば簡単に外せるかも、しれないと気がついた。
もしかして「旧名:CRC.C→新名:HASH.C」に移行してるだけかもしれない。
とりあえず、
src/vidhrdw/vector.cをはずし、vector.hをsrc/へ移動。エラー待ち。
src/machine/の
「idectrl.c」「idectrl.h」「ticket.c」「ticket.h」を外し。エラー待ち。
「core.mak」は現状
# the core object files (without target specific objects;
# those are added in the target.mak files)
OBJS += $(OBJ)/version.o $(OBJ)/mame.o \
$(OBJ)/drawgfx.o $(OBJ)/common.o $(OBJ)/usrintrf.o $(OBJ)/ui_text.o \
$(OBJ)/cpuintrf.o $(OBJ)/cpuexec.o $(OBJ)/cpuint.o $(OBJ)/memory.o $(OBJ)/timer.o \
$(OBJ)/palette.o $(OBJ)/input.o $(OBJ)/inptport.o $(OBJ)/config.o $(OBJ)/unzip.o \
$(OBJ)/audit.o $(OBJ)/info.o $(OBJ)/png.o $(OBJ)/artwork.o \
$(OBJ)/tilemap.o $(OBJ)/fileio.o \
$(OBJ)/state.o $(OBJ)/datafile.o $(OBJ)/hiscore.o \
$(sort $(CPUOBJS)) \
$(OBJ)/sndintrf.o \
$(OBJ)/sound/streams.o $(OBJ)/sound/mixer.o $(OBJ)/sound/filter.o \
$(sort $(SOUNDOBJS)) \
$(OBJ)/vidhrdw/generic.o $(OBJ)/machine/eeprom.o $(OBJ)/machine/random.o \
$(OBJ)/profiler.o \
$(OBJ)/hash.o $(OBJ)/sha1.o $(OBJ)/chd.o $(OBJ)/md5.o \
$(OBJ)/sound/wavwrite.o
#$(OBJ)/vidhrdw/vector.o
#$(OBJ)/machine/idectrl.o
#$(OBJ)/harddisk.o
#$(OBJ)/cdrom.o
#ifdef NEW_DEBUGGER
#OBJS += $(OBJ)/debug/debugcmd.o \
#$(OBJ)/debug/debugcpu.o \
#$(OBJ)/debug/debugexp.o \
#$(OBJ)/debug/debugvw.o \
#$(OBJ)/debug/debughlp.o \
#$(OBJ)/debug/debugcon.o
#else
#OBJS += $(OBJ)/debug/mamedbg.o $(OBJ)/debug/window.o
#endif
#ifdef X86_MIPS3_DRC
#OBJS += $(OBJ)/x86drc.o
#endif
#OBJS += $(sort $(DBGOBJS))
#TOOLS = romcmp$(EXE) chdman$(EXE) xml2info$(EXE)
こんなとこ。とりあえずprofilerは保留。
あとmakefileも
# NEW_DEBUGGER = 1
#X86_MIPS3_DRC = 1
#X86_PPC_DRC = 1
# BUILD_EXPAT = 1
略
# start with an empty set of libs
LIBS =
#ifdef BUILD_EXPAT
#CFLAGS += -Isrc/expat
#OBJDIRS += $(OBJ)/expat
#EXPAT = $(OBJ)/libexpat.a
#else
###LIBS += -lexpat
EXPAT =
#endif
略
# secondary libraries
#$(OBJ)/libexpat.a: $(OBJ)/expat/xmlparse.o $(OBJ)/expat/xmlrole.o $(OBJ)/expat/xmltok.o
■さてごちゃごちゃいじったんで「make」↓(12:23)
src/mame.c: In function 'update_video_and_audio':
src/mame.c:1300: error: 'vector_dirty_list' undeclared (first use in this functi
on)
src/mame.c:1300: error: (Each undeclared identifier is reported only once
src/mame.c:1300: error: for each function it appears in.)
make: *** [obj/namcos1psp2/mame.o] Error 1
「mame.c」
// /* set the vector dirty list */
// if (Machine->drv->video_attributes & VIDEO_TYPE_VECTOR)
// if (!full_refresh_pending && !ui_dirty && !skipped_it)
// {
// current_display.vector_dirty_pixels = vector_dirty_list;
// current_display.changed_flags |= VECTOR_PIXELS_CHANGED;
// }
■vector.hをsrc/へ移動してたのは、方針を変えることにした。
vector.hを何故残すのかというのは、
「MAMEはvector.hより前に必ずartwork.hをインクルードしなければいけない。」
これは「必ず」なので、エンバグ(単にコンパイルエラーが出て止まるだけだが)
の入り込む余地があるだろう。
だから、最近のMAMEのソースリストでは、従来artwork.hをインクルードしていた位置に、
vector.hをインクルードすることで、この問題を避けている。
vector.hで、さしあたり重要なのはvector.hの頭でartwork.hをインクルードしている事だけだ。
src/mame.c:144:28: error: vidhrdw/vector.h: No such file or directory
と似たエラーが出たら、
#include "vidhrdw/vector.h"
を
#include "artwork.h"
に置換しよう。
「mame.c」の場合は、その前に
#include "artwork.h"
が既にあるから、単純に削除してしまえば良い。(SYS1で復活する可能性はないし)
■しかし、あれやな。blogじゃなくてlogになってるな。まあええねん。
src/usrintrf.c: In function 'onscrd_vector_flicker':
src/usrintrf.c:3712: warning: implicit declaration of function 'vector_get_flick
er'
src/usrintrf.c:3718: warning: implicit declaration of function 'vector_set_flick
er'
src/usrintrf.c: In function 'onscrd_vector_intensity':
src/usrintrf.c:3733: warning: implicit declaration of function 'vector_get_inten
sity'
src/usrintrf.c:3739: warning: implicit declaration of function 'vector_set_inten
sity'
make: *** [obj/namcos1psp2/usrintrf.o] Error 1
やっとUSRINTRF.Cでエラーが出たな。
このONSCRD_なんちゃらってのは、ON_SCREEN_DISPLAY_MENUで、
(訳:画面上に表示メニュー)
要するに「ボリューム変えたいな」。とか「明るさまぶしいな」とか、
「青みがキツイけど、俺のPCじゃないしディスプレイ画面の設定勝手に弄ったらまずいっしょ」
とかそおいう需要にこたえた。サブメニューで、
PSPはボリューム調整できるし、色味調整なんて、要らないし、仮にやるにしたって
サブメニューでやることないし。
つまり、とっちまえ。
いらんオン、スクリーンのサブメニューなんて役にたたん。PSPでは。
(PCでは、色味は要らんのでVOLUME調整だけ残した。昔は)
不便ならもっと別のメニューを追加しような。
終了機能と同じで他で出来るから、単なる容量の無駄だ。PSPでは。
削除さくじょ。(12:55)
「usrintrf.c」ソース130kb→115kbになった。
■
src/memory.c:2524: warning: cast increases required alignment of target type
src/memory.c: In function 'io_read_qword_64le':
src/memory.c:2525: warning: cast increases required alignment of target type
src/memory.c: In function 'io_write_word_64le':
src/memory.c:2527: warning: cast increases required alignment of target type
src/memory.c: In function 'io_write_dword_64le':
src/memory.c:2528: warning: cast increases required alignment of target type
src/memory.c: In function 'io_write_qword_64le':
src/memory.c:2529: warning: cast increases required alignment of target type
src/memory.c: In function 'cpu_readop16_safe':
src/memory.c:2545: warning: cast increases required alignment of target type
src/memory.c: In function 'cpu_readop32_safe':
src/memory.c:2551: warning: cast increases required alignment of target type
src/memory.c: In function 'cpu_readop64_safe':
src/memory.c:2557: warning: cast increases required alignment of target type
src/memory.c: In function 'cpu_readop_arg16_safe':
src/memory.c:2569: warning: cast increases required alignment of target type
src/memory.c: In function 'cpu_readop_arg32_safe':
src/memory.c:2575: warning: cast increases required alignment of target type
src/memory.c: In function 'cpu_readop_arg64_safe':
src/memory.c:2581: warning: cast increases required alignment of target type
make: *** [obj/namcos1psp2/memory.o] Error 1
ぐあーっ。ついに来たか。エミュでもっとも効果が高いが、バグも入りやすい所。
出来れば1st版が動いてから弄りたい所。
ちょっと弄ると、鬼のようにパフォーマンスが向上する所。EXEC関係と並んで。
そろそろお腹減ってきたんでお昼にするよ(13:28)ふう、作って食べた。(14:02)
メモリはS1には明らかにタコな事、解りきってるし、手をつけたくてうずうずしてるが、
1stコンパイルが動くまで封印な。だって、USRINTRFとかDRAWGFXとかとは、
レベルが違う。仮にエンバグするとして。USRINTRFとかDRAWGFXとかは、
あはっへーーんながーーめん。なーーおそーーーっ。で済むけど、
MEMORYエンバグした日にゃ。
メニュウは動くんだけどROMも読んでる臭いんだけど実行できません。
原因も判らない、どおしたらいいんだぁーーーー。と。
猪木になってしまう事、安請け合い。
嫌。それだけは、嫌。
幸い「debugcpu.h」「debugexp.h」を追加したら、先に進んだ。
触らぬメモリに祟り...あるかも知れない。
■
src/config.c:535: error: 'p' undeclared (first use in this function)
src/config.c: At top level:
src/config.c:560: warning: type defaults to 'int' in declaration of 'XML_Char'
src/config.c:560: error: parse error before '*' token
src/config.c:561: warning: function declaration isn't a prototype
src/config.c: In function 'config_data':
src/config.c:563: error: 'len' undeclared (first use in this function)
src/config.c:565: error: 's' undeclared (first use in this function)
src/config.c: In function 'config_load_xml':
src/config.c:581: error: 'XML_Parser' undeclared (first use in this function)
src/config.c:581: error: parse error before 'parser'
src/config.c:599: error: 'parser' undeclared (first use in this function)
src/config.c:599: warning: implicit declaration of function 'XML_ParserCreate'
src/config.c:604: warning: implicit declaration of function 'XML_SetElementHandl
er'
src/config.c:605: warning: implicit declaration of function 'XML_SetCharacterDat
aHandler'
src/config.c:622: warning: implicit declaration of function 'XML_Parse'
src/config.c:622: error: 'XML_STATUS_ERROR' undeclared (first use in this functi
on)
src/config.c:642: warning: implicit declaration of function 'XML_ParserFree'
make: *** [obj/namcos1psp2/config.o] Error 1
出るべくして出したエラー達。
だってXMLなんざ要らん。って開発方針。
XMLなんて使ってるとママに怒られるもん。知らないデーターとお話したら、いけないんだもん。
はい、そうですか。
じゃ、削除開始。(14:14)
struct config_file
{
mame_file * file; /* handle to the file */
int filetype; /* what type of config file is this? */
struct config_data data; /* the accumulated data */
// struct config_parse parse; /* parsing info */
};
ここの構造体が少し短くなったけど、まあ多分大丈夫じゃろ。
XMLのコンフィグは読み書き出来なくした。
■
src/artwork.c:1635: error: 'vector_pixel_t' undeclared (first use in this functi
on)
src/artwork.c:1635: error: parse error before 'offset'
src/artwork.c:1636: error: 'list' undeclared (first use in this function)
src/artwork.c:1641: error: 'VECTOR_PIXEL_END' undeclared (first use in this func
tion)
src/artwork.c:1643: error: parse error before 'coords'
src/artwork.c:1644: error: 'coords' undeclared (first use in this function)
src/artwork.c:1646: error: 'offset' undeclared (first use in this function)
src/artwork.c:1656: error: parse error before 'coords'
src/artwork.c: In function 'render_game_bitmap_underlay_overlay':
src/artwork.c:1776: error: 'vector_pixel_t' undeclared (first use in this functi
on)
src/artwork.c:1776: error: parse error before 'offset'
src/artwork.c:1777: error: 'list' undeclared (first use in this function)
src/artwork.c:1782: error: 'VECTOR_PIXEL_END' undeclared (first use in this func
tion)
src/artwork.c:1784: error: parse error before 'coords'
src/artwork.c:1785: error: 'coords' undeclared (first use in this function)
src/artwork.c:1787: error: 'offset' undeclared (first use in this function)
src/artwork.c:1797: error: parse error before 'coords'
make: *** [obj/namcos1psp2/artwork.o] Error 1
ふふ。遂に来ましたね。アートワークです。
アートワークでやってくれる事。
1.ゲーム画面が寂しいなと思ったときに背景が付けられる。
2.ゲーム画面を見にくくして難しくする為に前景が付けられる。(一部嘘)
MAME本家にいくと、たくさんアートワークの画像がDLできます。
が、
遅いPCではより遅くなる。
遅いPSPも、もっと遅くなる。
うーん、いいことづくめ。
取って、お仕舞い!
(14:32)
■
ううん、ARTWORKに関しては全域弄ったからな。書くのがめんどい。
基本的にこんな感じ。
/* get the effective screen size, including artwork */
// artwork_get_screensize(&w, &h);
w = Machine->drv->screen_width;
h = Machine->drv->screen_height;
でも23個所「artwork_get_screensize」で検索すれば、出てくる。
ここをなんで
void artwork_get_screensize(int *width, int *height)
{
*width = Machine->drv->screen_width;
*height = Machine->drv->screen_height;
}
としないのか、こんなとこ、大してパフォーマンスに影響しないよってのは、理由があって、
後の最適化に繋がるからなんである。つまり動いたらMachine->drvは弄るって事。
それの複線ね。(検索、置換を有効活用するため、まあマクロしといてもいいんだけどさ)
で、「mame.c」では
/* enable artwork now */
//artwork_enable(1);
とか、
/* initialize the display through the artwork (and eventually the OSD) layer */
if (osd_create_display(¶ms, direct_rgb_components /*,artcallbacks*/))
goto cant_create_display;
あとは忘れたが、
いろいろやった。
あとベクター関係も殺した。
で、「make clean」↓「make」↓
ふうここまでは問題ないみたい。先にすすもう。でも、ちっと休憩(っていうかゲームタイム。
別に遊んでたっていいだろ16:01)
■で、しばらくゲームで遊んで、疲れたから寝た。んで起きた。(18:00)
人間寝て起きると、アイデアが浮かぶものである。
「Makefileは本当に悪くないんだろうか?」
管理人の疑問である。プログラムOKで、DGENみたいにMakefile難ありで(-lc)
うまく動かないのは、やりきれない。
今のうちにその芽を潰しておこう。
専門的な事が、判らなくったって、いいアイデアが浮かんだんである。
もちろん普通の(正統的な)方法ではないし、専門家がみたら、笑っちゃうだろう。
でもいいの出来れば。
で、その方法とは、
■事実その1.お魚さんのMakefileは正常に動いていて、コンパイルもとうるし、ゲームも遊べるんだから。
これはOK.の筈。
■事実その2.MAMEのMakefileはコンパイルはとうるが、EBOOT.PBPまで生成できんし、OKかどうか判らない。
■事実その3.しかしながら、MAMEのMakefileはmapファイルを生成し中身を見た(もちろん意味はわからん)
けど、お魚さんの生成するMAPファイルと似てる。
■事実その4.MAMEのMakefileを実行するとOBJファイルはすべて生成する。
■事実その5.MAMEのMakefileが生成したMAPファイルにはリンクしようとしたOBJファイルが、
フルパスでコメントされている。
そうか、判ったぞ。
「MAMEのMakefileを実行してOBJファイルをすべて生成させた状態」で、
「MAMEのMakefileが生成したMAPファイル」とまったく同じ順序でリンクするように
お魚さんのMakefileをコピーしたものを改造し、Makeすれば、
上手くいけばEBOOT.PBPが生成される。
うーん。やってみたけど駄目でした。
でも、「改造版お魚さんMakefileが生成したMAPファイル」が出来た。
瓢箪から駒というか、棚から牡丹餅というか、
こんなものが出来たら。
「MAMEのMakefileが生成したMAPファイル」と比較しない訳には、いくまい。
で、比較したら、アドレスが違う。
#8900000 osakana
#8810000 psp mame04
では、再改造してアドレスもあわせて比較。
結果。ほぼ同じものです。
■つまり、Makefileは悪くないんじゃないかな。だってお魚さんのだって遊べる(PSPで動く)んだもん。
ってのが結論。徒労だけど、やっぱソース、ダイエットしよ。
今OBJ合計が2.2MB程度。お魚さんのEBOOTが1.4MB程度だから、その辺まで
ダイエットすれば、ひょっとすると、ひょっとする。
昔は4MBとかあったからな。過去日記確認しないと正確な数字は忘れたけどね。
もう夕食だって。(18:28)
■過去日記、確認したじぇ。3日前の奴だ。OBJ3.34MBって書いてある。
今、TILEMAPを32KBにした(ROZと32ビットを削除した)から、でもやっぱ2.20MB。
こいつをもっと減らせばいいんだな。じゃ次はINPUTPORTだな。あそこは減るからな。
使わない設定が山ほどある。光線銃だのハンドルだの1Pから8Pぐらいまで全部そろってるからな。
PSPなら多くても2Pまででいいだろ。1Pのみだって何の問題もない。いまOBJが133KB。
さてどこまで減るかな。(19:48)
■うし、OBJが50kbになった。もっと削れるけど、程々にしておく。(20:02)
今、OBJが計2.12MB。
「cheat.o」が135KBあるぞ。これいらなくないか?管理人これ使った事ないんだけど。
どおしても「ズル」したかったら別の方法で実装するとか。っていうか。SYS1の「ズル」って、どっかで
解析されてんのかな?WEB探せばきっとあるだろな。その場合。CHEATファイルがあれば、
エミュレーター本体にハードコーティングして実装してもいいよ。RAINのVERチェンジと同じやり方でさ。
メニュー出して。人数とか、面とか、無敵とか、おもむろに出てくるって仕掛け。こんなの実装するのは、
簡単だろRAM書き換えるだけなんだから。つう訳で、CHEAT.Cは要らんな。
とっちまえ。(汎用品はでかいの、専用なら小さくなる)
(20:10)
■今、OBJが計1.99MB。
いい加減リンカ通れよ。もしかしたら順序が悪いのか?順序変えたら、なんとかなる可能性って、
あるんじゃないのか?(20:26)
(今02/18-01:09ぐらい)
■アメブロの混んでる時間とうりすぎたみたい。やっぱ本来夜型だから、無理はいけないんだけど、
ああでも寝ないとな。それはともかく、さすがに夜は頭が働く。やっぱWEB更新しないで進めると
はええ。しまった。このページの存在意義がなくなってしまう。WEB更新のペースで1日分グライ
先に進んでしまったので、既にlogの意味もなくなってしまった。うーん、残念。
今ねえOBJは1.91MBそんなに変わってないが、ソースは既に別物に。多分リンカのエラー
確認してないから、現状昨日よりバグだらけかもしんない。でもそれは構造的バグではなくて、
要らん関数がないとか、少なくとも管理人が見ればすぐ外せる類の物。
■リンカで標準関数系のエラーばっかり出るから、ちょうどOBJの半分くらいの位置に、(どっちからでも
届くでしょ?)試験的に「_clib」を配置してみた。こいつの中身は、リンカでエラーが出たもの以外入ってない。
なのにこんなエラー。
In file included from src/psp/_clib.c:5:
src/psp/_clib.h:17: warning: conflicting types for built-in function 'memset'
src/psp/_clib.h:19: warning: conflicting types for built-in function 'memcpy'
src/psp/_clib.h:28: warning: function declaration isn't a prototype
src/psp/_clib.c:16:1: warning: "PI" redefined
:1:1: warning: this is the location of the previous definition
src/psp/_clib.c:99: warning: function declaration isn't a prototype
src/psp/_clib.c:112: warning: conflicting types for built-in function 'strcpy'
src/psp/_clib.c: In function 'memset':
make: *** [obj/namcos1psp2/psp/_clib.o] Interrupt
訳:「注意、内蔵のライブラリと競合してるちゅー。」
おまえな、さっきは、みえねー。とか言っておきながら、見えるところに設置してやれば、WARING。
どないせいちゅーんや。でもまあ、さっきはエラー今度はワーニング。このままSCEのライブラリ使って、
いい加減なCLIB作成して、なんとかなるんだろうか?やっぱ’‐lc’を付ければ、一発解決なんだろか。
ちとやってみよ。(01:23)
■-lcをただつけるだけでは、駄目みたい。不思議な事にオプションをつける位置によってまるっきり動作が
違う。
$(LD) -lc -O0 $^ $(LIBS) -M -Ttext 8810000 -q -o out > main.map
これだと、全然だめ。効いてないみたい。
$(LD) -O0 $^ $(LIBS) -lc -M -Ttext 8810000 -q -o out > main.map
これだと、標準ライブラリ系の(strcpyとかsprintfとかmemcpyとか、あの辺)エラーは一つも出ない。
が、フロートライブラリ系のエラーがバリバリでる。上の状態でも、それは出てたんだけど。
こんな感じ。
■
../../../../../newlib/libc/stdlib/dtoa.c:511: undefined reference to `__muldf3'
../../../../../newlib/libc/stdlib/dtoa.c:513: undefined reference to `__fixdfsi'
../../../../../newlib/libc/stdlib/dtoa.c:514: undefined reference to `__floatsidf'
../../../../../newlib/libc/stdlib/dtoa.c:514: undefined reference to `__subdf3'
../../../../../newlib/libc/stdlib/dtoa.c:518: undefined reference to `__adddf3'
../../../../../newlib/libc/stdlib/dtoa.c:518: undefined reference to `__ltdf2'
../../../../../newlib/libc/stdlib/dtoa.c:520: undefined reference to `__subdf3'
../../../../../newlib/libc/stdlib/dtoa.c:520: undefined reference to `__gtdf2'
../../../../../newlib/libc/stdlib/dtoa.c:343: undefined reference to `__adddf3'
../../../../../newlib/libc/stdlib/dtoa.c:442: undefined reference to `__divdf3'
/usr/local/pspdev/psp/bin/../psp/lib/libc.a(mprec.o): In function `_ratio':
../../../../../newlib/libc/stdlib/mprec.c:943: undefined reference to `__divdf3'
../../../../../newlib/libc/stdlib/mprec.c:943: undefined reference to `__divdf3'
/usr/local/pspdev/psp/bin/../psp/lib/libc.a(mprec.o): In function `_mprec_log10':
../../../../../newlib/libc/stdlib/mprec.c:983: undefined reference to `__muldf3'
make: *** [EBOOT.PBP] Error 1
やっぱ'-lc'は想像したとおり、「Cのライブラリを使う(ってリンク)」と言う意味としか考えられない。
/usr/local/pspdev/psplib/gcc/psp/4.0.0/libgcc.a を使って欲しいんだけどな。
いっその事。これコピーして、直リンクさせるか。設定わかんないから。ちょっとやってみよ。
その場合は-lcいらんじゃろ。(02/18-01:46)
■
$(LD) -O0 $^ $(LIBS) ./libgcc.a ./libgcov.a -lc -M -Ttext 8810000 -q -o out > main.map
既にやりたい放題だな。LIBSの最後にはZIPLIB.A UNZIPLIB.Aも入ってる。
obj/namcos1psp2/psp/pspmain.o: In function `Draw_All':
pspmain.c:(.text+0x23c): undefined reference to `drivers'
obj/namcos1psp2/psp/pspmain.o:pspmain.c:(.text+0x240): more undefined references to `drivers' follow
/usr/local/pspdev/psp/bin/../psp/lib/libc.a(strtod.o): In function `_strtod_r':
../../../../../newlib/libc/stdlib/strtod.c:563: undefined reference to `__ledf2'
../../../../../newlib/libc/stdlib/strtod.c:556: undefined reference to `__nedf2'
../../../../../newlib/libc/stdlib/strtod.c:389: undefined reference to `__nedf2'
../../../../../newlib/libc/stdlib/strtod.c:393: undefined reference to `__nedf2'
/usr/local/pspdev/psp/bin/../psp/lib/libc.a(vfprintf.o): In function `_vfprintf_r':
../../../../../newlib/libc/stdio/vfprintf.c:1186: undefined reference to `__nedf2'
../../../../../newlib/libc/stdio/vfprintf.c:1304: undefined reference to `__nedf2'
/usr/local/pspdev/psp/bin/../psp/lib/libc.a(dtoa.o):../../../../../newlib/libc/s
tdlib/dtoa.c:282: more undefined references to `__nedf2' follow
make: *** [EBOOT.PBP] Error 1
どおしてもMAMEのdriversが見えないのも謎だし。うちにはPSP用のlibcなんてないよ。多分。
strtodとvfprintfなら(C言語の標準LIBだから)判るけど、他のは何?'_r'が付いてると「レジスタ使え」って事?
`__ledf2'とか`__nedf2'って、アンダースコアが2つだから、アッセンブラ?のラベル?vfprintf.cならともかく、
strtod.cってそんなに複雑な事してんの?要らないよそんな複雑なVER.こうなったら、どっかから、
ライブラリのソース持ってきて自前で全部やるか。libc手に入れれば、何とかなりそうでしょ?
とにかく良く判らん。特にリンカがわからん。今日はもう、寝よ。おやすみなさい。(02:02)