nsawa氏によるp/ece用のGCCが ソース公開されてたんで、「これあったらLinuxでもごにょごにょできるんちゃうかなー」って 感じでやってみた。なんか今更な感じでいっぱいだけど。

Linux初心者にはわかりずらい部分とかもあるかもしれないので注意

  1. 用意
  2. 設定
  3. 実行
  4. おまけ g++使う

1. 用意

とりあえず、 nsawa氏のgccとwine,libusb, それからこれ(Linux用isd) をコンパイル。Linux用isdはlibusbで適当にでっちあげた物なんだけど、コンパイルはできると思う。 ただ、そのままでは動かない。gccのコンパイルについては後述。

あと、wine使うんだったら標準のpcc33でも大丈夫なような気がする。気付いたときは遅かった。

2. 設定

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

してみて、エラーメッセージとかが出なかったら大丈夫。出た時は…適当になんとかしてください…

3. 実行

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よりもすっきりしてていいと思う。適当にカスタマイズして使ってください。

4. おまけ g++使う

nsawa氏の日記 6月14日分によると、 「なんとかC++が使える」みたいな感じで書いてあるけど、 実際その通りぎりぎり使えるようになってます。サンプル

ポイントとしては

__cxa_pure_virtualが無いって言われるけど、無視していいのなら仮想関数も使える。 なんだったら、自分で定義しておけばいいし。

仮想関数が使えるんならC++使う理由は十分にあるんじゃないかと思う。


戻る   ホーム