« 詰めプログラミング(世界最小POVプログラム?) | メイン | 4ビット人工知能と4ビット人工生命 »
たしか、6月30日発売でした。学研「大人の科学マガジン」の4ビットマイコン。ひと足さきに遊ばせてもらって申し訳ないというわけで、落とし穴とか、ちょっと楽しいところとか書いてみたいと思います。
【JUMP命令のワナ】
4ビットマイコンには「JUMP」命令が1つしかありません。
直前の命令でフラグが立つ場合は条件ジャンプになる。無条件ジャンプのつもりが条件ジャンプになっているのは陥りやすいパターン。
AIA <3>
JUMP <xx>
Aレジタに3を加えたあとどこかに飛びたいとき、3を加えた結果が桁溢れしたときしか飛びません。
【CALL命令のワナ】
「CALL」命令は、フラグが1のときしか実行されません。
例)たとえば、Aレジスタを2ビット右にシフトしたいと思ってCALL _SIFTを2回連続してもAレジスタの内容が偶数のときしか2回目は実行されません。 この日記の前の日記の「詰めプログラミング」の話は、これ使ってるわけですね。
CALL _SIFT Aレジスタの中身が奇数で実行された。
CALL _SIFT -> 実行されない。
【CH命令のワナ】
「CH」命令でA、Bレジスタを交換するとY、Zも交換されます。
便利なときもあるのかも知れませんが。
【50番地以降をプログラミングに使う】
プログラム領域は00~4F番地ということになっていますが、50番地以降もプログラム領域として使えそう。
【自己書き換えプログラミングが可能】
50番地以降をプログラミング領域として使えるとなると、50番地以降にストアしたコードをガシガシ書き換えたくなってしまいます。少なくとも以下のようなサンプルコードは動くようです。
00 TIY A
01 <2> 2
02 TIA 8
03 <B> B
04 AM 4 52番地に<B>セット
05 AO 1 LEDにBと表示
06 CALL E Bの音を鳴らす
07 _SUND B
08 JUMP F 50番地に飛ぶ!
09 <5> 5
0A <0> 0
0B TIA 8
0C <2> 2
0D AM 4 52番地に<2>セット
0E AO 1 LEDに2と表示
0F CALL E 2の音を鳴らす
10 _SUND B
11 JUMP F 50番地に飛ぶ!
12 <5>
13 <0>
50 <F> 実際にはJUMP命令
51 <0>
52 <0> ここをBとか2と書き換えて飛び先を変更
【1ビット左シフト】
MA
M+
AM
【最上位ビット取りだし】
MA Yレジスタで示す番地に元の値があるとき
M+
AO {フラグが立つ命令ならなんでもよい}
CALL _SIFT
M- Aレジスタに最上位ビットだけ残ります
【最上位ビットのチェック】
AIA 8
JUMP 立ってたときの処理
【1ビット排他的論理和】
AレジスタとBレジスタが、0か1のどちらかの値をとるとき。内容が異なるときAレジスタを1に、同じときには0にする。
05 CIA
06 <1> 1
07 JUMP F
08 <2> 2
09 <9> 9
0A CH 2 Aが1のとき
0B CALL E Bを反転1->E、0->F
0C _CMPL 4
0D AIA 9
0E <2> 2 2を加える E->0、F->1
0F JUMP
10 <2>
11 <A>
29 CH 2 Aはゼロだったので0
2A CALL E
2B _SUND B
【論理演算がなくても算術演算でやりましょう】
4ビットマイコンの最大の弱点は、論理演算がないことだと思うのですよね。AND、OR、XOR、使いたくなるでしょう。しかし、そこは根性で切り抜けましょう。
【AレジとYレジを一気にセーブしておく方法はあるか?】
AレジスタをセーブしようとするとYレジスタをを変更しないといけません。そこで、Aレジスタが0~7の値を取るとき。セーブしたいYレジスタの値を50~57番地にセットするのはどうでしょう? 取り出すときは、CYしてMA、CYします(ちと分かりにくいか……)。
【暴走のワナ】
コンピュータの醍醐味は、「暴走」、「無限ループ」、「命令例外」ですよね。4ビットマイコンは、0~Fまですべて命令コードが割り当てられているので暴走してもほとんど分からなかったりします。
まだあるはずですが、とりあえず。
東京カレーニュース
個人サイト(http://www.8-p.net)個人Twitter(http://twitter.com