2009年06月
« 2009年05月 |
メイン
| 2009年07月 »
|
私の手元に届きました。学研さんの『大人の科学マガジン』の「4ビットマイコン」。発売前の付録マイコンキット(GMC-4)をお借りして、ここんところ、ヒマを見つけては遊ばせてもらっていたのはこの日記を見るとよく分かります。とはいっても、「光のハート」(POV)と「ハノイの塔」と「4ビット人工知能」の3本くらいですが。最後の4ビット人工知能というのは、その昔、桜田幸嗣さんの『月刊アスキー』の連載記事で出てきたネタ。「いじめる・いじめないゲーム」の4ビットマイコン移植版ともいえるものです。『大人の科学マガジン』Vol.24に掲載されています。
私は、もっぱらプログラミングのことしか考えなかったんですが、結構、みなさんハードと組み合わせて遊んでるんですねぇ。船田先生のキャタピラ式の茶運び人形の制御とか……いい絵になっています。個人的には、「これで閉じているから小宇宙なんだろう」とか、この中で「アルゴリズムでGO!だろう」とか言いたいのですが、そこは人それぞれですね。 |
たしか、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まですべて命令コードが割り当てられているので暴走してもほとんど分からなかったりします。
まだあるはずですが、とりあえず。
昨日の日記で、学研『大人の科学マガジン』の4ビットマイコンで「光のハート」(POV)のプログラムが、「まじめに書き直そうとしたら半分くらいの長さになってしまいました」と書きました。余計な部分をどんどん取り去ってみたら、半分どころか5バイト半の長さになりました。漢字2文字と3/4の情報量。誰がやってもこれ以上の手はないという「詰めプログラミング」の世界がありそうです。気合いでまだ短くするともっと短くなるか? こういうもんですよねプログラムってのは。ちょっと楽しい。
以前のバージョンでは、真正直にテーブルからパターンを取り出しては(LEDの右4ビットと左3ビット)表示エリアにセットして、表示。そこで残像を生かすためにウェイトを挿入。パターンを取り出すカウンタを進めて、また次のパターンに・・・という処理だった。ところが、よく見るとパターンのテーブルと表示エリア(5Eh、5Fh)は連続している。ウェイトしている間に何か処理もできそうだ。そこで、全体をリングバッファのようなものに見立てて、中身をズリズリと動かしてみるこにした。遊星歯車のように動かすポイントがバッファの中を移動するのだが、ちょうど5Fhと5Ehを通りかかったときだけ表示している。
POVは、それを作る人の趣向がいろいろ出ますよね。たとえば、左右対称の像を出すならパターンは半分だけ持っていればよいという指摘もあるでしょう。作る人の几帳面さとか、セコさとかが出てくると思います。私も、もう1つほどアイデアがあるんですが、よく考えたら製品の発売がまだ(6月30日)なんですよね。自分だけ遊んでいるみたいで申し訳ない。
学研『大人の科学マガジン』の4ビットマイコンをいじっているというお話を書きました。「光のハート」を書いて機械語のソースまであげてしまったのですが、ひさしぶりに見てみると、どうもダラダラと書いてしまったのが心残りです。そこで、まじめに書き直そうとしたら半分くらいの長さになってしまいました。この手のプログラムですが、私は「光の木」という名前で知っていたのですが、オシャレに「POV」(Persistence of Vision)と呼んだりするんですねぇ。POVの醍醐味は、なんといってもそれ自身がアニメーションすること、ということでハートが上から降ってくるようにしてみました。ビデオが残像をうまく撮れていないみたいで、見えてますかね?
東京カレーニュース
個人サイト(http://www.8-p.net)個人Twitter(http://twitter.com