Ein dekompressions Algorithmus für Daten, benuzt wird ein Huffmanbaum.
Nützlich z.B. für die komprimierung von statischen Bildern bei
Grafikdisplays. (bis zu 70% Kompression je nach Eingangsdaten)
Die Funktion benötigt im Y-Pointer einen Zeiger auf den SRAM wohin die
Daten entpackt werden sollen, und im Z-Pointer auf den Flash wo die
komprimierten Daten liegen.
Dies kann aber durch #defines angepaßt werden, sodass theoretisch gleich
auf das DisplayRam geschrieben wird, oder aus dem EEProm/externem
Speicher gelesen wird.
Beispiel:
1 | .include "m32def.inc"
|
2 |
|
3 | .dseg
|
4 | buffer:
|
5 | .org 0x60
|
6 | .byte 12
|
7 | .cseg
|
8 |
|
9 | //Feldpointer initialisieren für Huffman
|
10 | ldi YL, LOW(buffer)
|
11 | ldi YH, HIGH(buffer)
|
12 | //Datenpointer initialisieren
|
13 | ldi ZL, LOW(daten*2)
|
14 | ldi ZH, HIGH(daten*2)
|
15 | call huffman
|
16 | call <FlushSRAM2Display>
|
17 |
|
18 | loop:
|
19 | rjmp loop
|
20 | .include "Huffman.asm"
|
21 | daten:
|
22 | .include "daten.txt"
|
Einstellmöglichkeiten: (jeweil über #defines)
- Von wo gelesen werden soll
- Wohin soll geschriben werden
- Sollen die verwendeten Register gerettet werden
- soll der 4bit Modus unterstüzt werden
Komprimiert werden können Daten mittels des Javaprogramms im Anhang
(nächstes Posting), gelesen werden Binärdaten (Ich erzeuge die mit
meinem GrafikKonverter bspw: Beitrag "Grafikkonverter Tool für AVR/Mikrocontroller (BMP2C, BMP2ASM, BMP2BASCOM)"
), geschrieben wird eine TXT Datei im AVR Studio ASM Format die einfach
per include eingebunden werden kann.
Wenn Interese besteht kann ich natürlich noch ne kleine Doku zum
Dateiformat veröffentlichen, z.B. wenn jemand Lust hat einen
(kompatiblen) dekompressor in C oder Basic zu verfassen.
Zur Geschwindigkeit:
bei 16MHZ dauert es eine 240x64 Pixel Grafik zu dekodieren mit 24%
kompressionsrate im 8bit Modus etwa 15ms
bei 4bit (30% gleiche Datei) etwa 19,5ms