gccのbuild
gccに関して、
./configure --target=sh-elf --without-headers --without-libs --with-cpu=sh4
./gcc/Makefile中にある以下の箇所を探して、
# Additional target-dependent options for compiling libgcc2.a.
TARGET_LIBGCC2_CFLAGS =
"-Dinhibit_libc"を付け加える。その後、make。
make LANGUAGES="c" all install
Newlibのbuild
Newlibの構築
./configure --target=sh-elf
su
make all \
CC_FOR_TARGET=/usr/local/bin/sh-elf-gcc \
AS_FOR_TARGET=/usr/local/bin/sh-elf-as \
LD_FOR_TARGET=/usr/local/bin/sh-elf-ld \
AR_FOR_TARGET=/usr/local/bin/sh-elf-ar \
RANLIB_FOR_TARGET=/usr/local/bin/sh-elf-ranlib
make install \
CC_FOR_TARGET=/usr/local/bin/sh-elf-gcc \
AS_FOR_TARGET=/usr/local/bin/sh-elf-as \
LD_FOR_TARGET=/usr/local/bin/sh-elf-ld \
AR_FOR_TARGET=/usr/local/bin/sh-elf-ar \
RANLIB_FOR_TARGET=/usr/local/bin/sh-elf-ranlib
Dreamcasr用ライブラリの一つ、libdreamについて
http://www.allusion.net/dcdev/
から、tar ballをとってくる。このとき、Dreamcasr用の
libcも一緒に取って来ると、libdreamのexampleのdc_main関数
をmain関数に名前を変更するということをしないですむ。
また、/example以下にあるファイルをコンパイルすると、
main関数がない!といって止まる。これは、main関数を
dc_main関数に置換したにも関わらず、newlibのcrt0を
読むようになっているからである。
簡単な解決法は、Makefile.prefを修正することである。
Makefile.prefのgccのリンカの引数に、
-nostartfiles
を加えて、さらに、独自のc startup file(crt0)の場所を示してやる必要がある。
上に述べてきた開発環境で作成したプログラムを、
どのようにすればDreamcast上で動かすことが出来るのか。
DC <-> PC をシリアルで接続するために、シリアルケーブルを作成する。
作り方は、以下のURLを参照。
http://mc.pp.se/dc/serifc.html
起動ディスクと転送プログラムを含んだイメージを以下のサイトから、取って
来る。
http://www.cerc.utexas.edu/~andrewk/dc/
http://www.cerc.utexas.edu/~andrewk/dc/dcload-serial/index.shtml
この起動ディスクをDCに入れて起動する。
PC上で、プログラムをコンパイルして、バイナリを作成。
出来た、バイナリをシリアル経由でDCに転送して、実行。
この方法は、PC-DC接続のために、serialケーブルを自作しなくてはならないという
障壁がある。CMOSレベルのチャージポンプは日本ではあまり売られていない。
TTLレベルのMAX232でもよいと書いてあるサイトもあるが、SH4はCMOSレベル動作で、しかも、
DC背面のSerialポートはSH4のポートに直結である。
MAX232でも動く(かもしれない)が、SH4のポートに直接5V入れるのは危険である。
頑張って、MAX3222あたりを手にいれるしかない。
Serialケーブルを自作しなくても、ブロードバンドアダプタ(BBA)を持っていれば、
LAN経由でバイナリをuploadすることが出来るip_slaveというソフトもあるので、
BBAを持っている人はそれを使うのが良いであろう。