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 互換コマンドを定義できるわけです。
defun Jump dwx( 0x0d ) dwx( [ %1 - :: ] ) endfuncこれは SCASM の Jump 命令を、関数を使って定義したものです。 [ %1 - :: ] の部分でラベルオフセットを計算しています。 %1 には Jump 先のラベル名が入っています。:: はこの関数を呼び出し た位置を表す特殊なラベルを表すとします。これにより、 ジャンプ先までのオフセット(バイト数)を計算できるわけです。
SCASM には、このようなラベル間の計算ができなかったので、Dbx()などの コマンドを駆使しても Jump 関係の命令は実現することはでき なかったのです。
#define RED 05 F0'RED' という文字列を '05 F0' という文字列に定義したことにより、 以後 'RED' という文字列が現れたら '05 F0' に置換します。 このため、
SurfaceColor( RED )という書き方ができるようになります。
#include "hogehoge.scm"といった書き方も許す方針です。