#8SYS1カスタム、ダイエット(2006-02/17) | //www.旧型、PSP開発幼稚園.game.jp/(本館)

#8SYS1カスタム、ダイエット(2006-02/17)

#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(&params, 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)