2006,06,23, Friday
MSX × SDCC(第3回)
仕事が終わった~~と言いつつ、まだもう少し作業が残っているもので、更新遅めです……
さて、そんな中、今回は取り急ぎ第1回で公開したにも関わらず、不具合が見つかって公開を停止していた→Hex2Binの修正。
そして、第2回の追記で「悩み中」と書いていたスタートアップコード→crt0.s。
(悩むまでも無く、初期値付き変数の初期化が必要なので、必須でしたね。。)
しかし奇妙なのが、初期値付き変数の初期化コードがRAM領域の一番最後に付加されるんですが……
全てのコードがRAM上で実行される場合はともかく、ROM化を前提とするならこれはマズいと思うんですけど、どうなんでしょうか。。
.area _GSINITを設定している辺りがクサそうなんですが、まだまだ勉強不足
もうちょい調べてみます。(MSXで使う分には今のままでも特に問題無いですが)
【12/25追記】
--
何か勘違いをしていました
_DATA領域の初期化コードは、ちゃんと_CODE領域の最後に追加されます。
→さらに追記:
Makefileにおいて、リンクするオブジェクトに crt0.o を一番最初に指定しないとダメなようです。
× OBJ = main.o crt0.o ...
○ OBJ = crt0.o main.o ...
#ctr0にてorgで絶対アドレスを指定しているから?
--
開始アドレスは0x8030からになっているので(BASICでギリギリ
が書けるくらいの場所)、必要に応じて書き換えて下さい。
このままの設定なら、--code-loc 0x8036が良い感じです
【12/25追記】
--
●開始アドレスの補足:
crt0.s内で.orgを指定しないと、0x0000が開始位置になるので、.org指定が必要です。
また、linkerに指定する--code-locは、.orgで指定した開始アドレス+スタートアップコードサイズにする必要があります。
上記のcrt0.sの場合、
の、6バイトのコードなので、0x8030 + 6 = 0x8036 となるわけです。
--
さて、そんな中、今回は取り急ぎ第1回で公開したにも関わらず、不具合が見つかって公開を停止していた→Hex2Binの修正。
そして、第2回の追記で「悩み中」と書いていたスタートアップコード→crt0.s。
(悩むまでも無く、初期値付き変数の初期化が必要なので、必須でしたね。。)
全てのコードがRAM上で実行される場合はともかく、ROM化を前提とするならこれはマズいと思うんですけど、どうなんでしょうか。。
.area _GSINITを設定している辺りがクサそうなんですが、まだまだ勉強不足
もうちょい調べてみます。(MSXで使う分には今のままでも特に問題無いですが)
【12/25追記】
--
何か勘違いをしていました
_DATA領域の初期化コードは、ちゃんと_CODE領域の最後に追加されます。
→さらに追記:
Makefileにおいて、リンクするオブジェクトに crt0.o を一番最初に指定しないとダメなようです。
× OBJ = main.o crt0.o ...
○ OBJ = crt0.o main.o ...
#ctr0にてorgで絶対アドレスを指定しているから?
--
開始アドレスは0x8030からになっているので(BASICでギリギリ
10 BLOAD"xxxxxxxx.xxx",r
が書けるくらいの場所)、必要に応じて書き換えて下さい。
このままの設定なら、--code-loc 0x8036が良い感じです
【12/25追記】
--
●開始アドレスの補足:
crt0.s内で.orgを指定しないと、0x0000が開始位置になるので、.org指定が必要です。
また、linkerに指定する--code-locは、.orgで指定した開始アドレス+スタートアップコードサイズにする必要があります。
上記のcrt0.sの場合、
call gsinit
jp _main
の、6バイトのコードなので、0x8030 + 6 = 0x8036 となるわけです。
--
| MSX | 12:34 AM | comments (0) | trackback (0) |
コメント
コメントする
この記事のトラックバックURL
http://piroyan.com/lablog/tb.php/36