拡張機能

SCASM に対する拡張機能として、以下の機能を入れる予定です。

関数定義機能

関数を自由に定義できるようにします。(関数というよりは、 "インラインマクロ" と言ったほうがわかりやすいかもしれません。)

SCASM にあった Macro() 命令は、外部ファイルにある機能を呼び出す ものでした。ここでいう関数はこれに似ていますが、別ファイルに する必要がなく、かつ関数をあたかも新しいコマンドであるかのように 使用することができます。

例を示します。

defun Box
Points( 0
	-%1 0 -%2
	%1 0 -%2
	%1 0 %2
	-%1 0 %2
	)
Poly( 0 1 2 3 )
endfunc
ここでは、Box という関数を定義しています。 この定義をしたあとでは、あたかも Box というコマンドが定義されたかの ようにこの関数を使うことができます。たとえば、
Box( 10 20 )
と書くだけで、20 * 40 の長方形を描画します。

これは簡単な例ですが、FreeSC では SCASM のコマンドのほとんどをこの 関数を使って定義しようと思っています。こうすることにより、コンパイラ はシンプルなままで簡単に SCASM 互換コマンドを定義できるわけです。

ラベルオフセット計算機能

ラベルオフセット計算機能とは、2つのラベル間で計算を行わせる機能です。 以下の例を見てください。
defun Jump
dwx( 0x0d )
dwx( [ %1 - :: ] )
endfunc
これは SCASM の Jump 命令を、関数を使って定義したものです。 [ %1 - :: ] の部分でラベルオフセットを計算しています。 %1 には Jump 先のラベル名が入っています。:: はこの関数を呼び出し た位置を表す特殊なラベルを表すとします。これにより、 ジャンプ先までのオフセット(バイト数)を計算できるわけです。

SCASM には、このようなラベル間の計算ができなかったので、Dbx()などの コマンドを駆使しても Jump 関係の命令は実現することはでき なかったのです。

define

C 言語の #define のようなことをできるようにします。 例を示します。
#define	RED 	05 F0
'RED' という文字列を '05 F0' という文字列に定義したことにより、 以後 'RED' という文字列が現れたら '05 F0' に置換します。 このため、
SurfaceColor( RED )
という書き方ができるようになります。

include

Include はネストが可能なようにします。 C 言語のように
#include "hogehoge.scm"
といった書き方も許す方針です。
To Be Continued...