正直日記



2009/12/08

_ 世界初! C++ でメガドラソフトを作るおとこ
と言うネタを温存していたのだが、さすがに温存しすぎたらしく、気づいたら既
にやっている方がいた。これでは今から始めても2位になってしまう。別に1位
でなくても構わない話ではありますが。(←時事ネタは風化するわよ)

メガドラでオブジェクト指向プログラミング


どうやら私の手抜きのせいで面倒をお掛けてしまったようで申し訳なし。

malloc その他の関数が 68020 の命令を使っているのはバグではなくて、 gcc 
のビルド時に --enable-multilib を指定して、かつ適切なビルドオプションを
指定しないとデフォルトのリンクライブラリが 68020 用になるという仕様に起
因していて

$ wine m68k-gen-elf-gcc -dumpspecs ...snip... *multilib_defaults: m68020 m68881
という風に確認できる。 ついでに multilib も確認しておくと…
$ wine m68k-gen-elf-gcc -print-multi-lib .; m68000;@m68000 m5200;@m5200 m5206e;@m5206e m528x;@m528x m5307;@m5307 m5407;@m5407 mcpu32;@mcpu32 m68040;@m68040 m68060;@m68060 msoft-float;@msoft-float
と 68000 用のライブラリも用意されているので、リンクオプションで -A 68000 もしくは --architecture 68000 と指定すればそっちがリンクされるようになる はず。しかし紛らわしいので最初からそちらがリンクされるように(私の方で配 慮を)しておけよって話ですね……。 -- devkitGenesis と謳っている割にはメガドラ用の C ランタイムとリンカスクリ プトが入ってなくて、それは何故かというと非 GPL なライブラリを GPL なソフ ツに混ぜるとどうなるのか分からなかったので保留していたのだよな……。 crt0.o は自分で用意したいとずっと思っているのだけど、セキュリティコード の辺りがよく分からない。これはこういうもんだと割り切って既存のを使わせて もらっちゃうのが正解なのかな。 あとの手順としてはこんなもんだろうか。
  • MPU(68000) 初期化(モード, 割り込み, スタック)
  • CPU(Z80) リセット& HALT
  • VDP 初期化
  • OPN2, DCSG 初期化
  • RAM 初期化(.bss と .sbss をゼロクリアし .data のコピー)
  • libc 初期化(__libc_preinit_array, __libc_init_array, __libc_fini_array ?)
  • グローバルコンストラクタ呼び出し(__do_global_ctors_aux ?)
  • main 呼び出し
68 アセンブリが微妙に書けないので、手始めに C で書いて吐かれたコードを手 直しするかと見てみたら、明らかに dbra が使える局面でそれが使われてなかっ たりする。うーむどうしたら使ってくれるのだろう。
void Copy(u32 dst, u32 src, size_t n) { char* s = (char*)src; char* d = (char*)dst; do { *dst++ = *src++; } while (--n); }
が、こうなる。
Copy: move.l 12(%sp),%d0 move.l 8(%sp),%a1 move.l 4(%sp),%a0 .L2: move.b (%a1)+,(%a0)+ subq.l #1,%d0 jne .L2 rts
gcc/config/m68k/m68k.md を見ると dbra を使ってくれる局面は2種類存在する のだけど、よく分からない。つーかどんどん脱線していくな……。

最新
2010 | 01 04
2009 | 01 02 03 04 05 06 07 09 10 11 12
2008 | 01 02 03 04 05 06 07 08 09 10 11 12
2007 | 02 03 04 05 06 07 08 10 11 12
2006 | 01 02 03 04 05 06 07 08 09 10 11 12
2005 | 01 02 03 04 05 06 07 08 09 10 11 12