!! Ngaro 命令セット スタックマシンの ,コード値, 名前, 説明, ,000, nop, 何もしない ,001, lit, スタックに値を積む。値は次のメモリ単位位置から取る ,002, dup, TOS (訳注: スタックのトップ要素) を複製してスタックに積む ,003, drop, TOS を捨てる ,004, swap, TOS と NOS (訳注: TOS のすぐ下の要素) を入れ替える ,005, push, 値をデータスタックからリターンスタックへ移す ,006, pop, 値をリターンスタックからデータスタックへ移す ,007, call, サブルーチンを呼び出す。サブルーチンのアドレスは次のメモリ単位位置から取る (訳注: リターンスタックにリターンアドレスを積む) ,008, jump, 新しいアドレスへジャンプする。アドレスは次のメモリ単位位置から取る ,009, return, サブルーチンを終えて呼び出し元へ戻る (訳注: リターンスタックトップを捨てる) ,010, gt_jump, NOS が TOS より大きければジャンプする。アドレスは次のメモリ単位位置から取る ,011, lt_jump, NOS が TOS より小さければジャンプする。アドレスは次のメモリ単位位置から取る ,012, ne_jump, TOS と NOS が等しくなければジャンプする。アドレスは次のメモリ単位位置から取る ,013, eq_jump, TOS と NOS が等しければジャンプする。アドレスは次のメモリ単位位置から取る ,014, fetch, TOS が指すアドレスに保持されている値を取得する ,015, store, TOS が指すアドレスに NOS を保存する ,016, add, TOS に NOS を足す ,017, subtract, TOS から NOS を引く ,018, multiply, TOS に NOS を掛ける ,019, divmod, NOS を TOS で除算して TOS に商、NOS に余りを置く (訳注: 余りは C や Java のそれで、Scheme での remainder の方) ,020, and, ビット単位 AND ,021, or, ビット単位 OR ,022, xor, ビット単位 XOR ,023, shift_left, ビット列を左 (訳注: より大きい桁方向) へシフトする ,024, shift_right, ビット列を右 (訳注: より小さい桁方向) へシフトする (訳注: 符号ビットをコピーする算術右シフト。ただし C による実装では C 処理系依存) ,025, zero_return, TOS が 0 なら呼び出し元へ戻り TOS を捨てる (訳注: リターンスタックトップも捨てる)。TOS が 0 なら何もしない ,026, inc, TOS に 1 を足す ,027, dec, TOS から 1 を引く ,028, in, スタックトップの要素が示す I/O ポートから値を 1 つ読み込みスタックトップに積む ,029, out, スタックトップの要素が示す I/O ポートへスタックトップの下の値を 1 つ書き込む ,030, wait, I/O イベントを待つ ! スタック 2 つのLIFOスタック Data Stack と Address Stack ! ネタ元 http://retroforth.org/docs/The_Ngaro_Virtual_Machine.html http://www.h7.dion.ne.jp/~samwyn/forth/Ngaro.html