piroyan's Lablog

実験の合間に思いついた戯言などをつらつらと

<<次の記事 前の記事>>

MSX × SDCC(第2回)

早速行き詰まりました……orz

なんだか上手く動かない……orz



色々試しているうち、ふとmapファイルを見て気付いたのですが、通常のC言語の実装ではmain関数がプログラムの開始位置となるはずなのに、どうもSDCCではmain関数の置いてあるソースの一番上に記述されている関数がプログラムの開始位置となるようなのです。

色々試す間は、main関数の上に適当に関数を書く(プロトタイプ宣言を横着する)というのは常套手段(?)だと思うのですが、こんな実装とは。。あうっ

……まぁ、そうと解ればmain関数を先頭に置くだけで解決にぱっ

【6/20追記】
--
MSXでプログラムを組む際には必要無いと思って外していたのですが、スタートアップルーチン(crt0.s)から_mainを呼び出すという仕様でした。

また、main関数の置いてあるソースではなく、一番最初にリンクされるオブジェクトが--code-locで指定したアドレスの先頭に来るようです。(前述の通り、先頭で_mainが呼ばれるのが前提の為)

しかし、crt0.sは.orgで絶対番地を指定している為、ここはやはりスタートアップルーチンは使用せずに、main関数のあるオブジェクトを最初にリンクするという方法で回避したいと思います。

……あ、でもグローバル変数やstatic変数の初期化をどうしよう……(考え中)
--

さて、前回書きかけていた「何故MSXでCなのか?」につきましては、去年、SCREEN 3を使って擬似スプライトを表示するという実験をやっていて、何を間違ったかス○ハリのような画面を動かすに至ったわけですが(途中で仕事が忙しくなって半年以上放置されていましたがダッシュ)、ソースを見直していて、色々問題が発覚……

……というか、勢いだけで作っていたので、基本設計が全然ダメダメだったのですね。。汗

まず、スプライトと言いつつ、実際にはバッファにペタペタと毎フレーム透過コピーしているだけで、表示の優先順位が管理されていなかったこと。
これを解決する為には、Zバッファを用意するか、描画する順番を決めるオーダー処理を実装してやらなくちゃいけない。

次に、ゲームのシステムとして、必要最低限のゲームループは入っていますが、オブジェクトを動かすのに必要なタスク処理が実装されていなかったこと。

しかしこの2点を解決するのに、全てアセンブラで書くには非常に根気が要る(←根性無しにわとり)
……ただでさえ飽き性なのに、片手間でやっていたら一体何年かかるやら。。ダッシュ

また、使っているクロスアセンブラが古いもので、シングルファイルのソースしか扱えず、大きな開発には向かないという問題もありました。

まぁとにかく、何とか逃げ道を求めた結果辿り付いたのが、SDCCだったというわけですうさぎ


……と、これまた能書きが長くなってしまいましたが、ひとまずタスク処理が出来ましたにぱっ
最初、そのまま載せると物凄い容量になったので、必要な機能は残しつつ色々削ぎ落として、なんとか3KBytes程にダイエット成功ぶた

サンプルを……と思ったのですが、なんかタスクの実行の流れだけを見ていても面白くも何ともないので、今回はスクリーンショットもサンプルも無しダッシュ

……色気のあるサンプルはもう少しお待ち下さいてへっ

| MSX | 02:32 AM | comments (0) | trackback (0) |

コメント

コメントする








この記事のトラックバックURL

http://piroyan.com/lablog/tb.php/34

トラックバック

PAGE TOP ↑

CALENDAR

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30   
<前月 2017年11月 次月>

QR CODE

QRコード

PROFILE

NEW ENTRIES

CATEGORIES

ARCHIVES

RECENT COMMENTS

RECENT TRACKBACK

PRODUCTS

LINK

BANNER

piroyan's lablog banner

リンクする際にお使い下さい。
※リンクはご自由にどうぞ。

大きいサイズはコチラ

POWERED BY

BLOGNPLUS(ぶろぐん+)

OTHER