ふと
なんとなくわかったょ。8時くらいに寝て、2時くらいに起きると、色々やる気が出るようだ。必要なのは、不規則な生活だったようだ。
それはいいとして、
http://morihyphen.hp.infoseek.co.jp/files/a24z-0.5.tar.gz
適当に修正、追加。
- gcc3では構造体に入れてるとレジスタに割り当てられないのか…知らなかったよ。を修正
- 色々バグあったような気がするけど、忘れたな。を修正。
- 固定小数点
- Direct Threaded Code対応(参考:http://www.kt.rim.or.jp/~tyamamot/forthj/threaded-codej.html)
- Cからの関数呼び出し
なんか並べてみると、色々修正したような感じだけど、実際、どれもこれもちょっとずつなのでそれほどでもない。
ちょい前のRISC欲しい発作の時に、ARMについて調べてたら、ARMはFPUが無いのが普通っぽいらしいのを見て、おもむろに固定小数点対応。固定小数点演算が自然に書けるようになるので、悪くないと思う。
a24z_config.hに、
#define A24Z_USE_FIXFLOAT #define A24Z_FIXFLOAT_SHIFT 10
とかやっといて、コンパイルしなおすと、それ用のVMになる。んで、コンパイル時に-s 10とかしておけばコンパイラがそれ用のコードを吐く。
Direct Threaded Codeは速くなるらしい。a24z_config.hに#define USE_THREADED_CODEを追加すればできる。
Cからの関数呼び出しはちょい面倒だけど、
entry hoge def start() -> void : yield def hoge() -> int : return 10
こんな感じにしておいて、C側から、
ret = a24z_vm_call_entry( vm, 1 );
こんなふうにすれば呼べる。2番目の引数はentryの番号。entry宣言しておくと、上から順番に番号が付いていって、それが使える。
entry foo entry bar def foo() -> void: ... def bar() -> void: ...
こんなふうにしておいて、barが呼びだければ、
enum { FUNCID_FOO = 1 FUNCID_BAR }; ret = a24z_vm_call_entry( vm, FUNCID_BAR );
こんな感じで。二番目の引数を0にすると、startが呼べる。
と、そういうのはどうでもよくて、a24zに必要なのは、ドキュメントとちゃんとしたエラーメッセージとそれなりのサンプルなんだろうけど、知らねーよ。そんなの。コード書く気も出ないのに、そんな作業やる気が出るわけがない。