nsawa氏によるp/ece用のGCCが ソース公開されてたんで、「これあったらLinuxでもごにょごにょできるんちゃうかなー」って 感じでやってみた。なんか今更な感じでいっぱいだけど。
Linux初心者にはわかりずらい部分とかもあるかもしれないので注意
とりあえず、 nsawa氏のgccとwine,libusb, それからこれ(Linux用isd) をコンパイル。Linux用isdはlibusbで適当にでっちあげた物なんだけど、コンパイルはできると思う。 ただ、そのままでは動かない。gccのコンパイルについては後述。
あと、wine使うんだったら標準のpcc33でも大丈夫なような気がする。気付いたときは遅かった。
ext33,as33 と lk33 はそのまま使うのは辛いのでのラッパーを用意
#!/bin/sh # # as33 # # # $ as33 -o out.o asm.s # # っていう形式で使えるようにしたext33,as33ラッパ。 piece_path=$HOME/piece/bin ext33=$piece_path/ext33.exe as33=$piece_path/as33.exe set -- `getopt o: $@` if [ $? != 0 ] then exit 2 fi for i do case "$i" in -o) output=$2; shift; shift;; --) shift; break;; esac done if [ $# == 0 ] then echo "no input file" >&2 exit 2 fi if [ "$output" == "" ] then output=`basename $1| sed -e 's/\([^.]*\)\.\(.*\)/\1/g'`.o fi dir=`dirname $1` prefix=`basename $1| sed -e 's/\([^.]*\)\.\(.*\)/\1/g'` wine $ext33 -- -e $1 if [ $? != 0 ] then exit 2 fi wine $as33 -- $prefix.ms if [ $? != 0 ] then exit 2 fi rm $prefix.ms if [ "$prefix.o" != "$output" ] then mv -f $prefix.o $output fi
#!/usr/local/bin/ruby # # lk33 # # $ lk33 -o out.srf 1.o 2.o 3.o # # で使えるようにしたlk33ラッパ # 変数の配置変えたりとかは対応してない… require 'getopts' piece_path=ENV["HOME"]+"/piece/bin" lk33=piece_path+"/lk33.exe" lk33_com = "tmp.cm" lkadr=0x100000 lib_path="g:\\usr\\piece\\lib" default_libs="pceapi.lib io.lib lib.lib math.lib string.lib ctype.lib fp.lib idiv.lib " if getopts('o:') output=$OPT_o else output='a.out' end com_output=File.open(lk33_com,"w") begin com_output.puts "-v3\n-objsym\n" com_output.printf( "-addr 0x%x {DEFAULT_CODE DEFAULT_DATA DEFAULT_BSS}\n", lkadr ) com_output.puts "-l "+lib_path com_output.puts '-o' + output com_output.puts lib_path+"\\cstart.o" com_output.puts ARGV com_output.puts default_libs com_output.close system("wine "+lk33+" -- -cref -c "+lk33_com) ensure File.unlink lk33_com end
で、適当なディレクトリ(ここでは ~/piece/bin を仮定することにする)に as33.exe ext33.exe lk33.exe と、上のふたつをコピー
適当に変数とかを弄って、動くようにしといてください。
続いてGCCのコンパイル。gcc.gnu.orgからgcc 3.3.1をダウンロード、nsawa氏のgccのgcc/gcc.c以外のソースを適切な場所にコピーして、
$ configure --target=c33 --program-suffix=-c33 --with-as=$HOME/piece/bin/as33 --with-ld=$HOME/piece/bin/lk33
でconfigure。program-suffixは好きなように。 with-asとwith-ldはそれぞれ上の as33, lk33 スクリプトへのパスになるように して。 enable-languages=c,c++もありかと。C++使えます。それについては後述。 で、 make すると浮動小数点ライブラリ(だと思う)構築に失敗するけど、負けずにmake install。 その後、必要なバイナリをパスが通ってる所にインストールして終わり。動くかどうか確認しといてください。
続いてUSBの設定。とりあえず、p/eceを適当なUSB穴に差しこんで、dmesgに反応が無かったら USBの基本的な設定ができてないと思う。そういうのではなくて、とりあえず、dmesgしたときに なんかメッセージ出てるようだったら大丈夫。
$ mount -t usbdevfs none /proc/bus/usb/
で usbdevfs を動くようにして、$ ls /proc/bus/usb したら"001"とかっていうディレクトリが あると思う。この中に001,002とかがあると思うんだけど、これの中のどれかが p/ece。どれかわからんときは、 抜き差ししてみて、変化があった物がそれだと思う。で、これをchmodして読み書きの許可を与えておく。 isdをrootで動かすんだったら別に大丈夫だけど、そういうのは良くない。
これでとりあえず準備は完了。このへん自動化もできるんだけど、長くなるので後日。
$ isd -c
してみて、エラーメッセージとかが出なかったら大丈夫。出た時は…適当になんとかしてください…
Makefileのテンプレートは
CC=gcc-c33 CXX=g++-c33 LD=lk33 INCLUDE=-I$(HOME)/piece/include CFLAGS= $(INCLUDE) OBJS=hello.o hello.srf: $(OBJS) $(LD) -o $@ $(OBJS) hello.pex: hello.srf ppack -e $< -o$@ hello.srf -nhello send: isd -s hello.pex clean: rm *.o
こんな感じ。p/ece標準のMakefileよりもすっきりしてていいと思う。適当にカスタマイズして使ってください。
nsawa氏の日記 6月14日分によると、 「なんとかC++が使える」みたいな感じで書いてあるけど、 実際その通りぎりぎり使えるようになってます。サンプル
ポイントとしては
__cxa_pure_virtualが無いって言われるけど、無視していいのなら仮想関数も使える。 なんだったら、自分で定義しておけばいいし。
仮想関数が使えるんならC++使う理由は十分にあるんじゃないかと思う。