= !PicoBlazeAbi = PicoBlazeのソフトウェアを作成するために使用できる言語は、基本的にはアセンブラしかありません。 ふつう、ABIはC言語とアセンブラ言語とで、お互いに呼び出しを行うための決まりごと(CコンパイラがCソースを機械語に翻訳するときの規則)のことなので、アセンブラしかないPicoBlazeにはABIなんてものはありません。 しかし、アセンブラだけでプログラムを書くとしても、いちいち「破壊レジスタ」が何であるかを気にしながらサブルーチンを呼び出すのは面倒なので、自分で書くルーチンに関しては自分で考えた規則でレジスタを操作することにしました。(オレ策定・オレ適用のオレオレABIです) = 言葉の定義 = ローカル~ ローカルとは、呼び出し元が不特定多数でなく、ある特定のルーチンからのみ呼び出さ れることを示します。 ABIの適用はされませんので、効率を優先してかまいません。 ローカルラベル 特定のルーチンからのみJUMP先として指定されるラベルのことです。 ローカルルーチン 特定のルーチンからのみCALL先として指定されるラベルのことです。 グローバル 不特定多数の呼び出し元から参照されるラベルのことです。 = レジスタの使われ方 = s0 ~ s5 の6個 スクラッチ * 呼び出され側で自由に破壊できます。 * 呼び出し側から呼び出され側へ、引数を渡すために使用されます。 * 呼び出され側から呼び出し側へ、戻り値を渡すために使用されます。 s6 ~ sE の9個 通常 * 呼び出され側は破壊してはいけません(CALL直後の値とRET直前の値が同一であるこ とを保証しなければなりません)。 * サブルーチンから戻ってきた後でも継続して使用したい値を格納するために、しば しば使用されます。 * 呼び出し側から呼び出され側へ、s0~s5では足りない場合に、引数を渡すために使 用されます。 sF データスタックポインタ * スクラッチパッド内の領域をデータスタックとして活用するために使用されます。 Z,Cフラグ * ローカルでないすべてのサブルーチンにおいて、呼び出され側は破壊してはいけま せん(CALL直後のフラグ状態と、RET直前のフラグ状態が同一であることを保証しな ければなりません)。 * 例外的に、bool値を返すサブルーチンでは、呼び出し側の条件ジャンプに供するた めに、ZおよびCフラグを更新してリターンすることができます。 = コーディングルール = ローカルラベル * ローカルなサブルーチンやローカルなジャンプ先には、'_'で始まる名前を付けま す。 他バンクへのラベル * 本体が別のバンクにあるサブルーチンには、'_'で終わる名前を付けます。