2009年06月
« 2009年05月 | メイン | 2009年07月 »

 私の手元に届きました。学研さんの『大人の科学マガジン』の「4ビットマイコン」。発売前の付録マイコンキット(GMC-4)をお借りして、ここんところ、ヒマを見つけては遊ばせてもらっていたのはこの日記を見るとよく分かります。とはいっても、「光のハート」(POV)と「ハノイの塔」と「4ビット人工知能」の3本くらいですが。最後の4ビット人工知能というのは、その昔、桜田幸嗣さんの『月刊アスキー』の連載記事で出てきたネタ。「いじめる・いじめないゲーム」の4ビットマイコン移植版ともいえるものです。『大人の科学マガジン』Vol.24に掲載されています。


_640_DSCN9449.jpg

 私は、もっぱらプログラミングのことしか考えなかったんですが、結構、みなさんハードと組み合わせて遊んでるんですねぇ。船田先生のキャタピラ式の茶運び人形の制御とか……いい絵になっています。個人的には、「これで閉じているから小宇宙なんだろう」とか、この中で「アルゴリズムでGO!だろう」とか言いたいのですが、そこは人それぞれですね。

 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まですべて命令コードが割り当てられているので暴走してもほとんど分からなかったりします。

 まだあるはずですが、とりあえず。


  昨日の日記で、学研『大人の科学マガジン』の4ビットマイコンで「光のハート」(POV)のプログラムが、「まじめに書き直そうとしたら半分くらいの長さになってしまいました」と書きました。余計な部分をどんどん取り去ってみたら、半分どころか5バイト半の長さになりました。漢字2文字と3/4の情報量。誰がやってもこれ以上の手はないという「詰めプログラミング」の世界がありそうです。気合いでまだ短くするともっと短くなるか? こういうもんですよねプログラムってのは。ちょっと楽しい。


00 AIY  B Yレジスタから3を引く(パターン上のポインタを進める)。
01 <D>  D 
02 MA  5 パターンのデータを取り出す。
03 AIY  B Yレジスタに2を加える(パターン上のポインタを戻す)。
04 <2>  2 (YレジスタがEとFのときだけ桁あふれでフラグが立つ)
05 CALL E 現在のE、Fの内容を表示する
06 _DSPR D (CALL文はフラグ1のときしか実行されないことを利用)
07 AM  4 パターンデータを書き込む。
08 JUMP F 先頭に戻る。
09 <0>  0
0A <0>  0

初期値
50 8 ※50h~5Dhにパターンデータ(1ライン8ビット)ここではハートを表している。
51 3 (LEDは7個しかないので最上位のビットは無視される)。
52 4 実行するたびに破壊されるので注意。
53 4    ○○ ○○
54 2   ○  ○  ○
55 4   ○     ○
56 1   ○     ○
57 2    ○   ○
58 2     ○ ○
59 4      ○
5A 4 4ビットマイコンをLED列と直角の方向に振ると
5B 4 上記のパターンが見える。
5C 8 CALL _DSPR文は5Eh、5Fhの中身をLEDに点灯する働きがある。
5D 3

6E 0 Yレジスタの初期値です。

 以前のバージョンでは、真正直にテーブルからパターンを取り出しては(LEDの右4ビットと左3ビット)表示エリアにセットして、表示。そこで残像を生かすためにウェイトを挿入。パターンを取り出すカウンタを進めて、また次のパターンに・・・という処理だった。ところが、よく見るとパターンのテーブルと表示エリア(5Eh、5Fh)は連続している。ウェイトしている間に何か処理もできそうだ。そこで、全体をリングバッファのようなものに見立てて、中身をズリズリと動かしてみるこにした。遊星歯車のように動かすポイントがバッファの中を移動するのだが、ちょうど5Fhと5Ehを通りかかったときだけ表示している。

 POVは、それを作る人の趣向がいろいろ出ますよね。たとえば、左右対称の像を出すならパターンは半分だけ持っていればよいという指摘もあるでしょう。作る人の几帳面さとか、セコさとかが出てくると思います。私も、もう1つほどアイデアがあるんですが、よく考えたら製品の発売がまだ(6月30日)なんですよね。自分だけ遊んでいるみたいで申し訳ない。

 学研『大人の科学マガジン』の4ビットマイコンをいじっているというお話を書きました。「光のハート」を書いて機械語のソースまであげてしまったのですが、ひさしぶりに見てみると、どうもダラダラと書いてしまったのが心残りです。そこで、まじめに書き直そうとしたら半分くらいの長さになってしまいました。この手のプログラムですが、私は「光の木」という名前で知っていたのですが、オシャレに「POV」(Persistence of Vision)と呼んだりするんですねぇ。POVの醍醐味は、なんといってもそれ自身がアニメーションすること、ということでハートが上から降ってくるようにしてみました。ビデオが残像をうまく撮れていないみたいで、見えてますかね?



ASCII.jp Blogmag
[ブログマグ]
東京カレー日記

カテゴリー

最近の投稿

アーカイブ


Blog profile