EXCEEDの同人ソフト開発日記という名の備忘録

趣味のゲームソフト開発人。プロなのかアマなのかは不明(不定)らしい。

任天堂のソフトはいつも予定通りに出てこないって言われるけど、
ソフト作りっていうのは、そういうもの。
ゲームソフトは、期限までにやれと言われて、徹夜したり死に物狂いでやったからといって、
期待通りのものにはならない。そういうふうにすると、
結局、チームは妥協しなければならなくなる。
妥協させられて、できたものは、粗くなってしまう。
ユーザーは目が肥えていますから、受け付けてもらえない

山内 薄

俺の屍を超えてゆけ

第2回コンテストの応募は絶望的だが、どういうワケか、今回は今まで創作活動に無縁だった友人知人が大変やる気な上に、自分はいつも誰かに助けられているだけの状態なので、参考になりそうなことを書いてみようとか思う。

yasuho さん、たけまろさんのお陰で、無事 SilentC へのログインに成功。9月号50ページのメモリマップを見て「すげー!RAMが512KBもあるのかよ!」と思っていたのだが、すぐに、0x80000(512KB) と 0x8000(32KB) の間違いと気付いて落胆する(笑)

私的には、SilentC を N-BASIC や MSX BASIC のような位置づけで考えて、定期的に DEF USR=&Hxxxxx:RET=USR(D0) な感じの呼び出しを行い、自前で用意したネイティブコードを「主」として、SilentC を「従」とした動作を行ってみようかと考えてみる。そうなると、SilentC からネイティブコードルーチンのコールを行うライブラリ関数が必要となるが・・・・あった!これだ! UserDriver!(85ページ)

説明を読む限り、「0x013000〜 0x013FFF の 4KB の領域をネイティブコード領域とすることができ、UserDriver.bin というファイルを用意しておけば、SilentC 起動時に、この UserDriver.bin を 0x013000〜のFlashROM 領域に書き込んでくれる(そして不要となった UserDriver.bin を削除してくれる)」とのこと。しかし、4KB というのは、ちょっと狭いので、この 4KB の領域は、もっぱらアドレステーブル格納用として使い、実際のネイティブコードルーチンは、GDBスタブ領域の 0x200000〜にオーバーレイして書き込んでおけばいいかな?とか思ってみる。(なお、COLDFIRE.BIN という名称の 128KBのバイナリファイルを用意して、SilentC に対して、PCから c:\tftp -i 192.168.1.10 put COLDFIRE.BIN とすると、0x20000〜0x3FFFF の領域に COLDFIRE.BIN の内容を焼きこんでくれるらしい)

で、なにかそれらしいサンプルはないかと、Interface誌を物色すると、3章4節に「JPEGカメラをつないで見る」なんて記事があり、大変良いサンプルがあるのだが、ここで1つ疑問が発生・・・・

95ページのリスト5の一文に

UserDriver(0,0); ptr=MemoryAlloc(90);UserDriver(2,ptr);

という箇所がある。94ページの一番左上の asm{...} 内を見るとわかるが、順を追って見ていくと、UserDriver(0,0)で、94ページの UINT16 Init(UINT32 arg) 関数が呼ばれるというのが分かる。次に 90バイトのヒープ領域を確保し、それのアドレスを SIlentC が管轄している char *ptr に格納しているのも分かる。

問題はその次! UserDriver(2,ptr); で、 95ページの UINT32 GetOneLine(UINT32 arg) が呼ばれることが分かるが、switch文の条件的には、default:の部分が実行され、BufAdrs = (UINT8*)arg; が実行されるが、この、BufAdrs というグローバル変数が、いったいどこにアサインされるのかが全くもって不明なのだ。もちろん94ページの左上の // Vars の所でグローバル定義されているのはわかるが、そもそも、この94〜95ページの「JPEGカメラ用のドライバ」自体がなにかのコンパイラ(gcc?)でコンパイルされることが前提のソースとなっているので、コンパイルして最終的に objcopy かなにかで UserDriver.bin に変換するまでに、リンカスクリプトかなにかでグローバル領域(リードライト領域)のアサインを明示していたはずなのだが・・・

そうなると、SilentC のRAM使用状況の仕様(SilentC が使用しないことを保障しているRAM領域)を知りたくなるのが人情というものだが、調べた限りでは、記事のソースをダウンロードしても、UserDriver.bin はあるものの、なぜかそれのソースはアーカイブされていないし、それらしい情報も見つからない。また、SilentC_Registry にも SystemRegistry にもそれらしい記述が見つからない。もちろん、CQ出版やサイレントシステム社に問い合わせるのは反則らしいので、自分でなんとかしないといけない。

まあ、UserDriver で、毎回ヒープのアドレスを渡すという方法も無いわけではないが、基本的にネイティブコードへは引数を1つしか渡せないので、ヒープのアドレスを渡したらそれでおしまいになるので、ヒープ上に引数用の構造体を取る方法が思い浮かぶが、正直インタープリターには荷が重いと思うし・・・

あと、このカメラドライバのソース、普通に sleep(1); とかが使われているが、この sleep(); はどこのライブラリに対してのアクセスなのだろう・・・・

最悪は UserDriver.bin をディスアセンブルするまでだが・・・


要はいつもやってることか・・・・(爆