« 宇宙人ピピとデジタルコマ | メイン | ネット関係者にもお薦め「モンハン」のセミナーやります。 »
5月4日のこの日記(4ビットマイコンで光のハートを描いてみる)のプログラムはこんな感じです(写真の後ですね)。パターンをセットしては順番にLEDに表示しているだけなんですが、タイミング調整のためにこうなりました。最後のハートの部分のパターンを変えてしまえば、闇の空間に浮かび上がる絵も自由自在(といっても7×7ドットしかないのですが)。
これの16進コード(各行の左から2番目の16進1桁)を1つずつ入力して実行するわけですが、なにしろ40バイトしかないので気合いで入れてしまいます(データを入れても48バイト)。電源を入れたら、[RESET]00[A SET]E[INCR]0[INCR]A[INCR]D[INCR]……と入力していって、5Dまで入れたら、[RESET]1[RUN]で実行です(LEDの表示時間の長さやパターンを表示する間隔はソースコードの中で調整)。
00 E CALL RESTO GMC-4 用「光のハート」
01 0 (c) Hortense.S.Endo 2009/05/09
02 A TIY 5D ハートパターンの一部を補助レジAに退避
03 D ※メモリが足りないので
04 5 MA ※5Dhは、Yレジスタの待避エリアに使用
05 E CALL CHNG
06 5
07 8 L01 TIA 0 パターン読み出しポインタ初期化
08 0
09 A L02 TIY D パターン読み出しポインタ退避
0A D
0B 4 AM
0C 3 CY Y <- パターン読み出しポインタ
0D 5 MA Yで示した位置のデータ読む(50,52,54,56,58,5a)
0E A TIY F 上位パターン書き込み
0F F
10 4 AM
11 A TIY D 読み出しポインタ取り戻し
12 D
13 5 MA A <- に読み出しポインタ
14 9 AIA 1 1加える
15 1
16 C CIA D 13番目のパターンか(5Dhのパターンのときか?)
17 D
18 F JUMP L03 13でないとき
19 2
1A 5
1B E CALL CHNG 5Dの本来のパターン戻す
1C 5
1D A TIY E 上位パターン書き込み
1E E
1F 4 AM
20 E CALL CHNG 5Dhのパターンを退避
21 5
22 F JUMP L04
23 2
24 A
25 3 L03 CY Y <- 読み出しポインタ(通常処理)
26 5 MA Yで示した位置のデータ読む(50,52,54,56,58,5a)
27 A TIY E 上位パターン書き込み
28 E
29 4 AM
2A 8 TIA 0 ディレイ処理のためのカウンタ初期化
2B 0
2C E L04 CALL DSPR LED点灯
2D D
2E 9 AIA 1 ディレイ処理
2F 1
30 C CIA F ※この値を調整することで残像の長さが変わる
31 F
32 F JUMP L04
33 2
34 C
35 A TIY D パターン読みだしポインタ取り出し
36 D
37 5 MA
38 9 AIA 2 2加える
39 2
3A C CIA E 14(最後のパターンまで処理したか?)と比較
3B E
3C F JUMP L02 そうでないならL02に飛んで次のパターンへ
3D 0
3E 9
3F 8 TIA 0 最後の列まで来たならLED消灯の処理
40 0 0
41 A TIY F
42 F
43 4 AM
44 A TIY E
45 E
46 4 AM
47 E CALL DSPR LED消灯
48 D
49 8 TIA 3 この値で消灯時間が変わる
4A 3
4B E CALL TIMR
4C C
4D F JUMP L01 パターンの表示を最初からもう一度やる
4E 0
4F 7
50 0 ※※5Dは実行するたびに破壊されるので注意
51 E 要するに50から5Dがこの状態ではハートを表している。
52 1
53 1 ※※ ※※
54 2 ※ ※ ※
55 1 ※ ※
56 4 ※ ※
57 2 ※ ※
58 2 ※ ※
59 1 ※
5A 1
5B 1 GMC-4をLED列と直角の方向に振ると
5C 0 上記のパターンが見える。
5D E
※ ハートのデータの一部(51h番地)の行が欠けているというご指摘をいただいたので修正しました(10/07/2009)。
個人サイト(http://www.8-p.net)個人Twitter(http://twitter.com