正直日記



2005/12/10

_ あ、だめだ
マップデータはマップデータで、16bitに二枚入るからリニアになんねえや。
やり直し。
_ タイルモードでプロポーショナルフォントとか使いたい
http://forum.gbadev.org/viewtopic.php?t=403

ここに「VCOUNT割り込みでBGキャラクタバンクとアフィンレジスタを弄れば、
120x80限定だけどmode 1/2(タイルマップ)でもリニアなビットマップが作
れるぜ?hehehe..」みたいなことが書かれてるんだけど、具体的に何をどう
するんだ?3日間考えてるけど、何も思い浮かばないぞ。

いや待て、やっぱ嘘。実は何も考えてなかったので、書きながら考えるから。

横サイズは半分になるってのが多分ヒントになるんだよなー。あと、VRAMは
16bit以上の単位でしかアクセスできない。そして16bitにつき16色で4ドット
256色で2ドット入る。で、多分256色にして、アフィン変換で横サイズを半分
に圧縮すれば、16bitで1ドットってことになるので4ドットまでならリニアと
みなせる。おお!この調子だ!

次に縦方向についてだけど、だけど……駄目だ思いつかねえや。ひらめいた
人はコメントするように。

で、それとは別にちょっと思いついたんだけど、縦横それぞれ1/8に圧縮すれ
ばマップデータで1024x1024の1/8で最大128x128のリニアなビットマップが作
れねえ?

 

こんな感じで。まあ実際には、マップは256x256で一枚とみなすタイル状に並
んでいるので(ややこしいな)完全にリニアってわけにはいかないけどさ。
_ 標準関数とか使いたい
ARMステートで書いてる関数からは標準関数が呼べないんですよね。何故かと
言うとリンク時に relocation truncated to fit : R_ARM_PC24 エラーが出
るから。じゃあどうするのかというと、bxで飛ぶようにすればいいわけで。

extern int sprintf(char *, const char *, ...) __attribute__ ((long_call));

CODE_IN_IWRAM void hoge(int num)
{
  char str[128];
  sprintf(str, "test: %d", num);
  vbalog(str);
  return;
}
このように使いたい関数に対してlong_call属性をつけてやればいいわけ。 というか、これが思いつくまで3日間悩んでたよ……。
CODE_IN_IWRAM void hoge(int num)
{
  void (*pfunc)(char *, const char*, ...);
  pfunc = sprintf;
  pfunc(str, "test: %d", num);
  vbalog(str);
}
最初こんな感じで回避出来るだろと思ってたら出来ねえしー。 なんなのよもう!でも、これでprintfデバッグが出来るようになったわよ! 女の子はいちいちデバッガなんて起動してらんないのよ!ぷんぷん!

SaTa. > DSなのにタイルモード(256色)のままlineとか書く関数とか作ってましたね。座標変換とかロングワードアクセス変換で劇遅い。  (2005/12/10 09:39:27)
> そうそう、いちいち変換してたら遅いんですよねえ。まあフォントだったらフレーム辺りの描画文字数を減らせばいいんですが。  (2005/12/10 11:48:17)
> タイルモードと言えば farbrauschのfr-018 http://www.pouet.net/prod.php?which=5235は凄いですね。タイルにトンネル描いたり、スプライトにバンプ当てたものを4枚使って箱作ったり……しかも60fps出してるし、大したもんだ。  (2005/12/10 11:55:59)
SaTa. > なんかすごいですね。メモリにBG画像生成かつDMA転送とかでがんばっているんでしょうかね。  (2005/12/15 10:31:53)

最新
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