2019年02月19日

KallistiOS in Cygwin64

私事ですが新PCになりまして、ハードもソフトも新品でやる気満々だったのですが、今までしていたようにドリームキャスト開発環境を構築しようとしたところ、思いっきりエラーが出てビルドできず。うそん。
ググったところ、forkエラーでrebaseallがどうとか書かれており結局改善せず。Cygwin64で試したところ同じエラーは出なかったので、
今回はCygwin64上でKallistiOS環境を整えたいと思います。
KallistiOSのバージョンは2.1.1、Cygwin64は2019年2月時点のクリーンインストールです。


基本は前も参考にしたこのページで。
Let's build a Sega Dreamcast game from scratch - Breakout

今回のキモは、KallistiOSに同梱されているクロスコンパイラ構築「dc-chain」のMakefileの改造になります。
上記サイトの通りに展開した場合、dc/kos/utils/dc-chain/Makefileをテキストエディタで編集していきます。

56行目:
pass2_languages=c,c++

エラーが出て止まるので、対応言語からObjective-CとObjective-C++を外します。容量足りなかったら外してねと書いてあるしいいでしょう。

165行目:
cd $(build); ../$(src_dir)/configure --target=$(target) --prefix=$(prefix) --without-headers --with-newlib --enable-languages=c --disable-libssp --disable-tls --disable-lto --disable-libstdcxx-pch $(extra_configure_args) CXX=$(CXX) $(to_log)

202行目:
cd $(build); ../$(src_dir)/configure --target=$(target) --prefix=$(prefix) --with-newlib --disable-libssp --disable-tls --disable-lto --disable-libstdcxx-pch \

前回の記事でも触れていた、--disable-ltoと--disable-libstdcxx-pchオプションを追加します。--disable-ltoがなくてもビルドは終わりますが、自作プログラム作成時にltoライブラリが無いと怒られます。

makeします。これでドリキャス用クロスコンパイラが構築されます。その後KallistiOSのセットアップもするのですが、それは前回の記事も参考にしてみてください。
あと、Kos-Portsのビルドですが、kosディレクトリから、「make kos-ports_all」でビルドできるんですね。


ふう、ようやく終わった・・・。
posted by たあし at 14:22| Comment(0) | ドリームキャスト自作ソフト | このブログの読者になる | 更新情報をチェックする

2019年01月28日

ドリームキャスト開発環境 in Cygwin64

ポリゴン表示はとりあえずひと段落しまして、こないだまで触っていたMPEG1デコーダーの速度問題も pvr_wait_ready(); を外すと全然間に合うというか早いぐらいだったので、そろそろサウンドにかかりたいと思いまして。
サウンド関係は全くノータッチだったので全然仕組みがわからないということで、Marcusさんのサンプルから勉強することにしました。

今までKallistiOSのクロスコンパイラを使っていたのですが、サウンドCPUであるARMのコンパイラの種類がMarcusさんのサンプルと違う(Marcusさんのはarm-elfでKOSはarm-eabi。eabiってなんぞ。)模様だったので、
2019/01/29追記:arm-eabiでもオプション替えたらコンパイルできました。arm-elfって単に古いだけなのでしょうか?
1.ドリームキャストのサウンドの勉強がしたい。
2.なのでKallistiOSを使う環境と棲み分けしたい。
という考えのもと、KallisiOSはCygwinにあるから、「Cygwin64に別環境つくっちゃえ!」というのが今回の話です。

参考:書籍「大熱血アセンブラ」


前置き長いけど要はCygwin64でSHとARMのクロスコンパイラをビルドしようぜ。ということです。
最近SHは下火だそうですね。ドリームキャスト互換機が出れば1000万個ぐらい出荷できるから盛り返すかもしれませんが、とりあえず今は下火だそうで、最新のGCCは不向きだそうです。ルネサスさんセガさんにプレゼンしようよ。
というわけで、以下のバージョンを使用しました。

gmp-5.1.1
mpfr-3.1.2
mpc-1.0.1
binutils-2.28
gcc-4.7.4
newlib-2.0.0


GCCはバージョン4からgmp、mpfr、mpcを先にインストールしなければいけないようです。
インストール先は「/usr/local/dc」としました。お好きな位置に変更してください。
適当にダウンロード、home辺りに解凍してビルドします。バージョンは「熱血アセンブラ」を参考にしました。

gmp-5.1.1
./configure --prefix=/usr/local/dc/gmp --enable-cxx
make
make check
make install

mpfr-3.1.2
./configure --prefix=/usr/local/dc/mpfr --with-gmp=/usr/local/dc/gmp --enable-static --disable-shared
make
make check
make install

mpc-1.0.1
./configure --prefix=/usr/local/dc/mpc --with-gmp=/usr/local/dc/gmp --with-mpfr=/usr/local/dc/mpfr --enable-static --disable-shared
make
make check
make install

「--enable-cxx」はC++有効という意味だそうです。
「--enable-static」と「--disable-shared」は ./configure を実行する際に警告されたため付けました。環境によっては必要ないのでしょうか?

次はbinutilsをインストールします。

binutils-2.28
mkdir build-sh-elf
cd build-sh-elf
../configure --target=sh-elf --prefix=/usr/local/dc/sh-elf --disable-nls
make

「--disable-nls」は国際化、つまり日本語表示しないということです。不具合でたらめんどくさいのでつけました。

最後にgccとnewlibをまとめてビルドします。二つとも解凍しておきましょう。
gccですが、4.8.x以降は共通のエラーが出てビルドできませんでした。ビルドの方法が変わっているのかもしれません。

gcc-4.7.4 newlib-2.0.0

まず、以下の三つのファイルを修正します。

./gcc/doc/gcc.texiを以下のように修正。参考:https://osmocom.org/attachments/2798/patch-gcc46-texi.diff
- 89 @tab General: @tex press@@gnu.org @end tex
+ 89 @tab General:
@tex
press@@gnu.org
@end tex
- 91 @tab Orders: @tex sales@@gnu.org @end tex
+ 91 @tab Orders:
@tex
sales@@gnu.org
@end tex

./gcc/cp/cfns.gperfに以下の行を追加。参考:https://patchwork.ozlabs.org/patch/504982/
+ 25 #ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif

./gcc/cp/cfns.hに以下の行を追加。
+ 56 #ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif


gccのフォルダ内に移動し、パスを通してからシンボリックリンクを作成します。
cd gcc-4.7.4
export LD_RUN_PATH=/usr/local/dc/gmp/lib:/usr/local/dc/mpfr/lib:/usr/local/dc/mpc/lib
ln -sf ../newlib-2.0.0/newlib .
ln -sf ../newlib-2.0.0/libgloss .

シンボリックリンクとは、擬似的にフォルダ階層を作るものだそうです。ためしに「cd newlib」と打ってみてください。gcc-4.7.4フォルダ内にnewlibフォルダなど存在しないのに移動できてしまいます。これはすごい。はい、「cd ../」で戻りましょう。
mkdir build-sh-elf
cd build-sh-elf
../configure --target=sh-elf --prefix=/usr/local/dc/sh-elf --with-gmp=/usr/local/dc/gmp --with-mpfr=/usr/local/dc/mpfr --with-mpc=/usr/local/dc/mpc --disable-nls --disable-lto --disable-libgomp --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-languages=c,c++ --with-newlib
make
make install

これでgccとnewlibが一気にビルドされます。永遠に思えるかのようなビルド時間ですがエラーが出なければこれで終わりです。
「--disable-lto」はリンク時に最適化を行わないということです。「--disable-libstdcxx-pch」はビルド時にホストのC++コンパイラを使わないということだそうで、これがないとエラーが出てビルドできませんでした。C++を使わないならいらないかと思います。
最初は「--disable-multilib」をつけていたのですが、multilibとは複数のSHシリーズに対応するのに必要なものだそうで、これがないと自作ソフトのコンパイルの時リンク先が見当たらないとか言われます。

これで終わりです。次にARMコンパイラをビルドしますが、gmp、mpfr、mpcは新しくビルドせずこのまま使えます。
ARMのコンパイラは、「sh-elf」を「arm-elf」に変更し、gccのconfigureに「--enable-obsolete」をつけましょう。つけないと怒られました。

dc-toolを「/usr/local/dc/bin/」にインストールしてから、「/home/ユーザー名/.bash_profile」に以下の行を追加しておけば、いちいちフォルダパスを打たなくても実行できるようになります。
export PATH=$PATH:/usr/local/dc/bin:/usr/local/dc/sh-elf/bin:/usr/local/dc/arm-elf/bin



よっしゃー!終わったー!
posted by たあし at 11:01| Comment(0) | ドリームキャスト開発 | このブログの読者になる | 更新情報をチェックする

2018年12月11日

モーション実装

ようやくモーション実装しました。
リニア補完ですが。リニア補完だけど!


あの有名なセガの本の丸写しだったりするのですが、念願のモーションです。喜びひとしおです。
20周年デモ動画のコメントに3D触って一年みたいなことを書きましたが、よくよく考えたらがっつり二年目でした。うそん。自分でもびっくりです。
でもこれで画的な部分はひと段落ということで、ようやく次のステップに進めます。いくぞ「ゲーム」制作!来年はプレイアブルに行きたいです。ご期待・・・うん。
posted by たあし at 23:44| Comment(0) | ドリームキャスト開発 | このブログの読者になる | 更新情報をチェックする