Der Bitmap-Compander
Mit diesem kurzen Programm können Grafikbildschirme, die auf Diskette abgespeichert werden, auf die Hälfte komprimiert werden.
Jeder, der schon einmal eine hochauflösende Grafikauf Diskette abgespeichert hat, weiß, daß sie 33 Blocks benötigt. Das entspricht den 8 KByte des hochauflösenden Grafikbildschirms. Es besteht aber die Möglichkeit, diese Grafikbildschirme je nach Inhalt auf 10 bis 20 Blocks zu komprimieren. Das Verfahren beruht darauf, häufig wiederkehrende Sequenzen durch kürzere zu ersetzen. Dazu kann man sich die Bitmap als eine lange Kette von Nullen und Einsen vorstellen. Diese Kette wird jetzt in 4-Bit-Blöcke aufgeteilt. Solche Blöcke bezeichnet man als Halb-Byte oder Nibbles. Es gibt 16 verschiedene solcher Nibbles, wovon einige häufiger und andere seltener vorkommen. Jedem Nibble wird nun ein neuer Code zugeordnet, wobei das häufigste Nibble »0000«, den kürzesten Code »0« bekommt. Alle anderen 15 Codes müssen mit einer »1« beginnen. Einen Code »00« darf es nicht mehr geben, denn er könnte bei der Decodierung nicht mehr von dem Code »0« unterschieden werden. Es läßt sich nicht umgehen, viele Codes länger als 4 Bitzu machen. Die komplette Code-Tabelle ist in Tabelle 1 zu sehen. Doch die langen Codes kommen viel seltener vor als die kurzen, so daß bei einem »normalen« Bild viele Bits gespart werden können. Theoretisch wäre es möglich, daß eine komprimierte Bitmap länger wird als das Original. Aber selbst die Fotos aus der »Diashow« lassen sich komprimieren. Sir Winston Churchill magert zum Beispiel auf 24 Blocks ab. Bilder, wie sie üblicherweise in Gafik-Adventures vorkommen, lassen sich meist auf unter 15 Blocks zusammendrücken.
Nibbles | Codes | Hex | Länge |
0000 | 0 | $00 | 1 |
0001 | 10100 | $A0 | 5 |
0010 | 10101 | $A8 | 5 |
0011 | 10110 | $B0 | 5 |
0100 | 10111 | $B8 | 5 |
0101 | 11000 | $C0 | 5 |
0110 | 11001 | $C8 | 5 |
0111 | 111100 | $F0 | 6 |
1000 | 11010 | $D0 | 5 |
1001 | 11011 | $D8 | 5 |
1010 | 11100 | $E0 | 5 |
1011 | 111101 | $F4 | 6 |
1100 | 11101 | $E8 | 5 |
1101 | 111110 | $F8 | 6 |
1110 | 111111 | $FC | 6 |
1111 | 100 | $80 | 3 |
Tippen Sie das Programm (Listing 1) mit dem MSE ab und speichern Sie es, damit es jederzeit mit LOAD "BMC.EXE",8,1 geladen werden kann (auf der Leserservice-Diskette unter "BITMAPCOMPANDER" gespeichert). Der Aufruf des Companders funktioniert vom Basic aus mit einem SYS-Befehl. Die Parameter werden wie beim OPEN-Befehl angehängt.
Laden einer komprimierten Bitmap:
SYS 52798,Filenummer,Geräteadresse,Kanalnummer,"Name"
Speichern einer komprimierten Bitmap:
SYS 52736.Filenummer,Geräteadresse,Kanalnummer,"Name,P,W"
Mit der Filenummer wird die Anfangsadresse der Bitmap ausgewählt.
Filenummer | Bitmap-Adresse | |
1 | $2000 = 8192 | (sichtbares Bild bei Hi-Eddi) |
2 | $4000 = 16384 | |
3 | $6000 = 24576 | |
5 | $A000 = 40960 | (Bitmap bei Hires-3) |
7 | $E000 = 57344 | (Bitmap bei Simons Basic) |
Die Bitmaps 0, 4 und 6 sind theoretisch möglich, aber nicht sinnvoll, da der Videocontroller sie nicht adressieren kann. Die Gerätenummer ist 8 für das Floppy-Laufwerk und die Kanalnummer eine beliebige Zahl von 2 bis 14.
Beispiele für Aufrufe:
Speichern einer Simons Basic-Bitmap:
SYS 52736,7,8,2,"Name,P,W"
Laden dieser Bitmap in Hires-3:
SYS 52798,5,8,2,"Name"
Das Programm belegt den Bereich von $CE00 bis $CF19 (52736 bis 53017). Es belegt somit keinen Basic-Speicherplatz und verträgt sich auch mit Hires-3 und Simons Basic, solange der Befehl MEM nicht verwendet wird.
(Hans Haberl/ah)PROGRAMM : BIT-MAP-COMPANDE CE00 CF19 ----------------------------------- CE00 : 20 89 CE A6 B8 20 C9 FF 21 CE08 : A9 08 85 FC 78 A9 34 85 67 CE10 : 01 A0 00 B1 F8 A2 37 86 26 CE18 : 01 58 48 4A 4A 4A 4A 20 01 CE20 : 9D CE 68 29 0F 20 9D CE 6A CE28 : E6 F8 D0 02 E6 F9 A5 F9 C7 CE30 : 29 1F C9 1F D0 D6 A5 F8 8B CE38 : C9 40 D0 D0 F0 42 20 89 24 CE40 : CE A6 B8 20 C6 FF 20 CF 20 CE48 : FF 85 FA 20 CF FF 85 FB D7 CE50 : A9 08 85 FC 20 BC CE 0A 35 CE58 : 0A 0A 0A 48 20 BC CE 68 E7 CE60 : 05 FD A0 00 78 A2 34 86 06 CE68 : 01 91 F8 A2 37 86 01 58 21 CE70 : E6 F8 D0 02 E6 F9 A5 90 3D CE78 : F0 DA A5 F8 C9 40 D0 D4 E9 CE80 : 20 CC FF A5 B8 20 C3 FF 56 CE88 : 60 20 FD AE 20 BE E1 A5 18 CE90 : B8 0A 0A 0A 0A 0A 85 F9 0C CE98 : A9 00 85 F8 60 A8 B9 09 06 CEA0 : CF AA B9 E9 CE A4 FC 0A 8A CEA8 : 26 FA 88 D0 09 48 A5 FA E7 CEB0 : 20 D2 FF A0 08 68 CA D0 DE CEB8 : EE 84 FC 60 A2 0F A5 FA 63 CEC0 : 3D F9 CE DD E9 CE F0 03 48 CEC8 : CA D0 F3 86 FD BD 09 CF 59 CED0 : AA A4 FC 06 FB 26 FA 88 BA CED8 : D0 07 20 CF FF 85 FB A0 8B CEE0 : 08 CA D0 EF 84 FC A5 FD 42 CEE8 : 60 00 A0 A8 B0 B8 C0 C8 EB CEF0 : F0 D0 D8 E0 F4 E8 F8 FC 0F CEF8 : 80 80 F8 F8 F8 F8 F8 F8 43 CF00 : FC F8 F8 F8 FC F8 FC FC 5B CF08 : E0 01 05 05 05 05 05 05 E1 CF10 : 06 05 05 05 06 05 06 06 28 CF18 : 03 37