Sim's blog

電子工作はじめてみました

ATMega88でもネギミク

2008-10-23 01:55:56 | AVR
Nokia6100液晶でネギミクの続きです。

前回はフラッシュが16kあるATMega168を使いました。今回はもうちょっとがんばってATMega88に載せてみました。

前回はランレングス圧縮を使って32256バイト(6x5376)を8004バイトまで縮めました。今回は、4524バイトまで縮めています。やったことは、そうたいしたことではなく、変化部分を3つの長方形で囲むようにして、各長方形毎に圧縮しただけです。

前回は長方形1つでした。下の図で、oは変化したドット、.と-は変化しなかったドットです。.は白で-は白以外です。左上の方はネギで右の方に髪の毛があります。変化した部分(o)が2箇所に分断されているせいで、囲む長方形が大きくなっています。
(2,1)-(42,32) → 1152バイト
..........o....o.........................  o 変化したドット
.........ooo.ooo.........................  . 変化しなかったドット(白)
.........oooooooo.............-------....  - 変化しなかったドット(白以外)
.........oooooooo............------------
..........ooooooo...........-------------
...........oooooo..........--------------
............oooooo........---------------
.............ooooo........---------------
...............ooo.......----------------
..oo............ooo......----------------
.ooooo...........ooo.....----------------
oooooooo.........ooo....-----------------
.ooooooooo........oo.oooo----------------
....oooooooo......ooooooo----------------
...ooooooooooooooooooooooo---------------
...oooooooooooooooooo---ooo--------------
...oo........oooooooo----oo--------------
...................o------ooo------------
...................ooo-------oo---------.
...................oooooo---oooo------.--
....................oooooooooooo-------..
....................oooooooooo----------.
....................--------.o----------.
....................---------------------
...................----------------------
...................----------------------
...................----------------------
...................----------------------
..................--------------------oo-
..................--------------------oo-
..................--------------------oo-
..................---------------------oo

変化部分(o)を3つの領域に分けます。具体的には以下のようにしました。
(2,1)-(28,22) → 294バイト
..........o....o...........
.........ooo.ooo...........
.........oooooooo..........
.........oooooooo..........
..........ooooooo..........
...........oooooo..........
............oooooo........-
.............ooooo........-
...............ooo.......--
..oo............ooo......--
.ooooo...........ooo.....--
oooooooo.........ooo....---
.ooooooooo........oo.oooo--
....oooooooo......ooooooo--
...ooooooooooooooooooooooo-
...oooooooooooooooooo---ooo
...oo........oooooooo----oo
...................o------o
...................ooo-----
...................oooooo--
....................ooooooo
....................ooooooo

(29,18)-(33,23) → 60バイト
oo---
--oo-
-oooo
ooooo
ooo--
-.o--

(40,29)-(42,32) → 22バイト
oo-
oo-
oo-
-oo

元々が1152バイトだったものが376バイト(= 294+60+22)に縮みました。
白以外の部分(-)は色変化があって圧縮しずらいので、白い外の部分があまり含まれないような分割の方が圧縮率が高くなります。
長方形の決め方は、3つの長方形のx座標が重ならないような組み合わせを全て試して一番縮んだものにしています。透明色が使えれば変化しない部分は全て透明色になるのでランレングスが効くのですが、そうはなっていません。一旦RAMに展開して重ね合わせ処理をしてから、再度転送しないといけないと思います。全画面展開できるだけのメモリがないので、作るのは難しそうです。

もっとちゃんとした方法を使えばもっと縮みそうですが、ちゃんとした方法を実装するのに必要なメモリがありません。原始的な方法ですが、そこそこ効果がありました。プログラムコード込みで5550バイトでした。