http://make-it-hazy.blogspot.com/2009/02/tinypong_07.html
http://make-it-hazy.blogspot.com/2009/02/tinypong_20.html
TINY2313でPONGを作ってしまう記事を
発見。
ワンチップマイコンゲームの原点って言えば
PIC16F84のブロック崩しが昔から有名ですが、
マイコンでビデオ表示といえばやはりAVRの方が
向いてるんだろうなぁ…。
完成品のムービーを見る限り、かなりの出来のよさ
という感じです。
わたし的にこのページで目を引くものは2つ。
一つはレジスタマップ。もう一つはビットイメージを
.dbでビジュアル的に書く際の書法。
レジスタマップ(変数表)的なものは、私も
ある程度の規模のプログラムを書くときには
一応書くことにしているんですが、こういう風に
サブルーチン毎に用途を決めるということは
しなかったな…。これはお勉強になった。
これまで私の頭の中にあったのは、
・高級言語では、サブルーチン毎に変数は
局所化して使用する(いわゆる処理や変数の
「構造化プログラミング」)
・アセンブリ言語で組む場合、普段はレジスタでは
なくメモリマップ上にモノを記憶させておく
(変数の変わりにRAMを使う)
といった固定観念。サブルーチン間でレジスタの共用
を厳格に管理するっていう概念が頭の中に無かった
からなぁ。
まぁ、AVRのようにレジスタが大量にあるマイコン
ならレジスタを変数のように使うことは普通に出来て
しまうわけだし、スプライト表示器などでも実際に
使ってたし。
ただ、もちろんルーチン間でごちゃごちゃにならない
ようにする方法についてはこういう風にドキュメントに
明示しないにしても、頭の中ではあれこれやりくり
してました。
(正確にいうと、局所変数的なレジスタと大域変数
的なレジスタは分けて使ってましたけど)
こういう風に、レジスタとサブルーチンのマトリックス
で表しておけば使いやすいな…。使いまわしも効くし、
間違えも防げるはず。すばらしい。
あとビットイメージの表現方法。
こういう風にソース上で1バイト単位のビットイメージ
を描きたいっていうニーズは多々あると思うんですが、
AVRのプログラムメモリエリア(cseg)は
1ワード単位(2バイト単位)で格納しないと
ウォーニングが出るし、2バイトのところに1バイト
だけ格納される(のこり1バイト分は0b00000000が
格納される)ことになっちゃう。
ってことで、これまではPC上でツールとか組んで
hexデータを作り出したりしてましたが、このサイト
の方法は頭いいなと思いました。
.setでビット列を文字列としてマクロ定義して
おいて、その定義した文字列を寄せ集めた形にして
.dbでバイトデータとして定義するっていう方法。
これなら2バイト単位で簡単に定数化できるもんな…。
すばらしい。お勉強になりました。
マクロ自体は基本的にあまり好きではないのですが、
これは解りやすい方法だと思うので、多用しても
あとで訳わかんなくなることもないだろうし、
逆にソースの可読性も上がる気がする…。
日々、お勉強だな。
お、cm見てたら山本梓が森雪のカッコしてる!
意外に違和感無いな…
(追記)
.set擬似命令って…なんだ?
.macroともちがうんだなぁ…。山根さん本に
載ってないなぁ。
(さらに追記)
.set擬似命令、解りました。
.equに似てて、相違点としてはプログラム中で
何度も再定義が出来るってことみたい。
.equだと同じシンボルで再定義するとエラーに
なるけど、.setなら上書きされるイメージみたい。
なるほどね。
以下、helpファイルより抜粋。
SET - Set a symbol equal to an expression
The SET directive assigns a value to a label. This label can then be used in later expressions. Unlike the .EQU directive, a label assigned to a value by the SET directive can be changed (redefined) later in the program.
Syntax:
.SET label = expression
Example:
.SET FOO = 0x114 ; set FOO to point to an SRAM location
lds r0, FOO ; load location into r0
.SET FOO = FOO + 1 ; increment (redefine) FOO. This would be illegal if using .EQU
lds r1, FOO ; load next location into r1
|