とりあえず以下の基本命令だけでかなりのことができると考えます。
これだけは命令ではありません。 jmp や bbtp1 などの命令の飛び先を指定するするものです。 適当な名前を付けて最後にコロン (:) を書くのが特徴です。
HOGE: ledz 7 7 7 wait 25 ledz 0 0 0 wait 25 jmp HOGE |
白の点滅を延々と繰り返す |
左上の LED の色を指定する。輝度はそれぞれ 0〜7 の値です。 各値と色の対応はこちらを参考ください。
leda 7 0 0 |
左上の LED を赤くする |
左下の LED の色を指定する。輝度はそれぞれ 0〜7 の値です。 各値と色の対応はこちらを参考ください。
ledb 0 7 0 |
左下の LED を緑にする |
右下の LED の色を指定する。輝度はそれぞれ 0〜7 の値です。 各値と色の対応はこちらを参考ください。
ledc 0 0 7 |
右下の LED を青くする |
右上の LED の色を指定する。輝度はそれぞれ 0〜7 の値です。 各値と色の対応はこちらを参考ください。
ledd 7 7 0 |
右上の LED を黄色にする |
4 つすべての LED の色を指定する。輝度はそれぞれ 0〜7 の値です。 各値と色の対応はこちらを参考ください。
ledz 0 7 7 |
すべての LED を水色にする |
指定した LED の指定した色の輝度を指定した値にする。
ledset b r 2 |
左下の LED の赤の輝度を 2 にする |
指定した LED の指定した色の輝度を一段階上げる。 ただし既に輝度が 7 だった場合そのまま
ledinc c b |
右下の LED の青の輝度を一段上げる |
指定した LED の指定した色の輝度を一段階下げる。 ただし既に輝度が 0 だった場合そのまま
ledinc d b |
右上の LED の緑の輝度を一段下げる |
LED の色を入れ替える。
ledchg a b d c |
右下と右上の LED の色を入れ替える |
ledchg b c d a |
LED の色を時計周りに入れ替える |
ledchg a a a a |
すべての LED を左上の LED と同じ色にする |
スイッチ 1 が押されていたら飛び先にジャンプする。
LABEL1: wait 10 bbtp1 LABEL2 ledz 0 7 7 jmp LABEL1 LABEL2: ledz 7 0 7 jmp LABEL1 |
普段は水色でボタンが押されたら紫色になる |
スイッチ 1 が押されてなかったら飛び先にジャンプする。用例は bbtp1 を参照。
スイッチ 2 が押されていたら飛び先にジャンプする。用例は bbtp1 を参照。
スイッチ 2 が押されてなかったら飛び先にジャンプする。用例は bbtp1 を参照。
ジャンプする。用例は LABEL や bbtp1 を参照。
lend とペアを組み、指定した回数だけ lend までの処理を繰り返します。。 ただし使用にあたっては以下の点に注意
leda 7 0 0 ledb 0 7 0 ledc 0 0 7 ledd 0 0 0 START: loop 20 wait 10 ledchg d a b c lend loop 20 wait 10 ledchg b c d a lend jmp START |
半時計回り 5 周、時計回り 5 周を繰り返す |
ループの終わり。loop で指定した回数に達してなければ対応する loop に飛ぶ。 使い方は loop を参照。
一番内側のループを抜ける
leda 7 0 0 ledb 0 7 0 ledc 0 0 7 ledd 0 0 0 loop 200 wait 15 ledchg d a b c bbtn1 SKIP break SKIP: lend MAIN: ledz 7 7 7 wait 25 ledz 0 0 0 wait 25 jmp MAIN |
ボタンが押されるとオープニング表示 (反時計回り) をスキップする |
ループ情報を初期値に戻す
DEC: ledz 7 7 7 loop 8 wait 15 leddec a r leddec b g leddec c b leddec d z bbtp1 INC lend jmp DEC INC: ledz 0 0 0 loop 8 wait 15 ledinc a r ledinc b g ledinc c b ledinc d z bbtp2 DEC lend jmp INC |
ボタン 1 が押されると段々明るくなるモード ボタン 2 が押されると段々暗くなるモードになる ltop がないと数回モード切替をするとエラーになる |
指定した時間動きを止める。時間の単位は 20msec。用例は他の用例を参考のこと。
サブルーチンコールを行う。なお 5 段以上のコールは行えない。
DEC: leda 7 0 0 ledb 0 7 0 ledc 0 0 7 ledd 0 0 0 START: loop 20 wait 20 ledchg d a b c bbtn1 SKIP1 call SWAP SKIP1: lend loop 20 wait 20 ledchg b c d a bbtn1 SKIP2 call SWAP SKIP2: lend jmp START SWAP: wait 20 ledcha b a d c WAIT: bbtp1 WAIT ret |
右周り、左回りどちらのループであっても ボタン 1 が押されると上下切り替えする 上下切り替え処理は SWAP 一か所でやっている |
サブルーチンコールから戻る。用例は call 参照。 なお、ループ中に当命令を実行すると管理情報がおかしくなるので注意。
以下はより凝ったプログラムを組むためのものです。 これらの命令は“レジスタ”と呼ぶ数値置き場を利用してます。 当システムは a, b, r1, r2, r3, r4, z, i の 8 つのレジスタを持ってます。 それぞれのレジスタは 0〜255 もしくは -128〜127 の値を格納することができます。 これは以下のように三つのグループに分けられます。
演算を行う汎用レジスタである
一次的に情報を蓄えておくためのレジスタである。 直接演算を行うことはできない。 また ledst や ledld 等大量の情報を一つの命令で処理する際も用いられる。
特殊な用途に使うレジスタである。 z レジスタは比較命令 (cmp) を行うとその結果が 0〜2bit 目に入る。 また i レジスタは一番内側のループ回数の残りが入る。
以下が命令の一覧です。 {a/b} という表現は a か b のどちらかという意味です。例えば、add{a/b} と書かれていた場合、adda と addb という二つの命令があり、 それぞれ作用するレジスタが a か b かの違いがあるだけです。 以下では a もしくは b レジスタのことを「汎用レジスタ」と呼んでいます。 また引数でレジスタに指定できる文字は a, b, r1, r2, r3, r4, z, i という文字です。
指定した LED(a〜d) の RGB 値をそれぞれ r1〜r3 に格納する。ただし格納された値は通常の指令値 n でなく 2n-1。
r1〜r3 に格納された値を指定した LED(a〜d) の色にする。値の意味は ledld と同様。
汎用レジスタに値 (0〜255) を格納する
汎用レジスタに定数値を加算し元のレジスタに格納する。引算を行いたい場合マイナスの値を与えればよい。
汎用レジスタに引数で指定されたレジスタに格納された値を加算する。
汎用レジスタに引数で指定されたレジスタに格納された値を減算する。
汎用レジスタと定数値との論理積を取り元のレジスタに格納する
汎用レジスタと引数で指定されたレジスタとの論理積を取り元のレジスタに格納する。
汎用レジスタと定数値との論理和を取り元のレジスタに格納する
汎用レジスタと引数で指定されたレジスタとの論理和を取り元のレジスタに格納する。
汎用レジスタと引数で指定されたレジスタとの排他的論理和を取り元のレジスタに格納する。
[値]で指定された分だけ汎用レジスタを右シフトする
[値]で指定された分だけ汎用レジスタを左シフトする
a レジスタを上位、b レジスタを下位とする 16bit 変数を想定し右シフトを行う
a レジスタを上位、b レジスタを下位とする 16bit 変数を想定し左シフトを行う
汎用レジスタと引数の値とを比較する。結果は z レジスタに格納され次の beq, bne, bgt, ble 命令で活用される。
汎用レジスタと引数で指定されたレジスタとを比較する。結果は z レジスタに格納され次の beq, bne, bgt, ble 命令で活用される。
事前の cmp 命令で比較結果が等しければ飛び先にジャンプする
事前の cmp 命令で比較結果が等しくなければ飛び先にジャンプする
事前の cmp 命令でレジスタの方が大きければ飛び先にジャンプする
事前の cmp 命令でレジスタの方が小さければ飛び先にジャンプする
コピー元レジスタの値をコピー先レジスタに格納する
引数で指定されたレジスタに格納されている値だけ動きを止める。 数値の単位は20msec。
強制的にエラーを発生させる。デバッグ用
以下の命令は当基板では使われていません。