# Hold-And-Modify-Modus

Der Hold-And-Modify-Modus (HAM-Modus) ist ein Anzeigemodus der Grafik-Chipsätze der Amiga-Plattform, um 12-Bit- und 18-Bit-Bilder mit nur 6 bzw. 8 Bits pro Pixel anzuzeigen. Dabei wird eine spezielle hardwareimplementierte Datenkompression verwendet, um Speicherbandbreite zu sparen.
Falls in einer IFF-Bilddatei ein CAMG-Chunk vorhanden ist, kann dieser Modus am 11. Bit identifiziert werden.
Beim HAM-Modus werden zwei Varianten unterschieden:
* HAM- oder HAM6-Bilder können 4096 Farben darstellen und benutzen dafür sechs Bit pro Pixel und eine Farbpalette von 16 Farben.
* Der HAM8-Modus wurde mit dem Amiga 4000 und dem Amiga 1200 eingeführt und bietet mit nur acht Bit pro Pixel und einer Basispalette von 64 Farben eine sehr gute, fotoähnliche Bildqualität. In diesem Modus können fast so viele Farben aus dem 24-Bit-Spektrum dargestellt werden, wie in das Chip-RAM passen (abzüglich der ersten Pixelspalte) und wie die Bildauflösung ermöglicht.
Die Farbe eines Pixels im HAM-Modus kann jede Farbe der 12-Bit-Farbpalette bei HAM6 bzw. der 24-Bit-Farbpalette bei HAM8 sein. Alternativ kann die Farbe des direkt links daneben liegenden Pixels übernommen werden, wobei eine der drei Farbkomponenten des RGB-Farbraums (Rot, Grün, Blau) auf einen neuen Wert gesetzt wird. An der linken Bildseite wird die Randfarbe übernommen (Farbindex 0 der Farbpalette). Anm.: Die Videohardware beginnt damit nicht beim ersten Pixel einer Bitplane, sondern erst beim ersten sichtbaren Pixel, was bei Hardwarescrolling (virtueller bzw. übergroßer Screen) einen (unschönen) Unterschied macht.
Dieses Verfahren harmoniert mit den Eigenschaften von Fernsehsignalen (FBAS), so dass die verlustbehaftete Datenkompression nicht zu Qualitätsminderung führt.
In HAM-Bilddateien sind die Pixeldaten im BODY-Chunk als Code gespeichert, welcher in den Modus und die restlichen Bits aufgeteilt wird. Die Kodierung der Pixel entspricht dem von der Videohardware verwendeten Format.
| Modus | Bedeutung |
| 00 | Index in der Farbpalette |
| 01 | Änderung der Blaukomponente |
| 10 | Änderung der Rotkomponente |
| 11 | Änderung der Grünkomponente |
Sofern ein Pixel nicht eine Farbe der Palette darstellt (Modus 00), kann nur der neue Wert eines der drei RGB-Werte angegeben werden. Die anderen beiden Werte sind die gleichen wie im Pixel zuvor. Wenn der Pixel der erste einer Bildzeile ist, wird der vorherige Pixel als RGB-Tripel (0, 0, 0) angenommen (anders als von der Videohardware, s. o.).
Format von Modus und Datenbits eines Pixels im HAM6-Modus:
Ein HAM-Bild kann nicht direkt in ein Bild mit 256 oder weniger Farben dekodiert werden, ohne vorher eine Reduktion der Farben durchzuführen. Um die volle Qualität zu erhalten, benötigt man mindestens ein 12-Bit-Bild.
Will man ein Bild, das in 256 oder mehr Farben vorliegt, in ein HAM-Bild konvertieren, sucht man zunächst die für dieses Bild optimale Basispalette, mit der schon möglichst viele Punkte des Bildes direkt oder nur mit geringen Abweichungen dargestellt werden können. Wenn die Basispalette festliegt, geht man zeilenweise durch das Bild und optimiert für jedes Pixel, ob es am besten durch eine der Basispalettenfarben dargestellt werden kann oder noch besser durch eine HAM-Modifikation des vorangehenden Pixels (eine der drei RGB-Farbkomponenten auf den gewünschten Wert setzen). Die Bewertung erfolgt dabei durch Abstandsberechnung im 3D-Farbraum zwischen dem Bild-Pixel und dem jeweiligen Basis- oder HAM-Kandidaten. Dies gilt so allgemein sowohl für HAM6 als auch für HAM8.
Die Anzahl der Datenbits ist vier für Standard-HAM6 und sechs für HAM8. Die Anzahl der Bitplanes im BMHD-Chunk ist sechs bzw. acht. Wenn ein HAM-Bild als 24-Bit-Bild angezeigt werden soll, sollten die Datenbits (vier bzw. sechs) auf acht Bit erweitert werden. Der Maximalwert sollte, bei acht Bit pro RGB-Kanal, zu 255 umgewandelt werden.
Format von Modus und Datenbits eines Pixels im HAM8-Modus:
HAM8-Bilder müssen in 24-Bit-Bilder umgewandelt werden, um auf Nicht-Amiga-Systemen die volle Bildqualität beizubehalten.
Um im HAM8-Modus wirklich alle Farben der 24-Bit-Palette darstellen zu können, muss man die 64 Farben der Basispalette so vorbelegen, dass die 64 Kombinationsmöglichkeiten der untersten zwei Bit aller Farbkomponenten genau abgedeckt werden. Dann kann man mittels des HAM-Mechanismus von diesen Basisfarben aus alle Farben der 24-Bit-Palette erreichen. Begrenzt wird die gleichzeitig darstellbare Zahl von Farben nur durch die Größe des Chip-RAMs. Letztere beträgt zwei Megabyte, so dass man auf einem HAM8-Bild ca. 2 Millionen verschiedene Farben darstellen kann. (Vom Chip-RAM gehen diverse andere Beträge ab, für die Workbench und diverse Datenstrukturen des Betriebssystems, die im Chip-RAM stehen müssen.)

## Ausblick

Es war lange in der Diskussion, diesen HAM-Modus, der auf der RGB-Farbdarstellung beruht, durch einen entsprechenden Modus aufbauend auf dem HSV-Farbraum (Farbton, Sättigung, Helligkeit) zu ersetzen, wovon man sich noch höhere Kompressionsmöglichkeiten und/oder noch bessere Darstellungsqualität versprach. Der HAM-Modus ist jedoch auf aktuellen Computern aufgrund der gefallenen RAM-Preise und der schnelleren Grafik-Hardware nicht mehr notwendig, so dass diese Überlegungen bisher zu keiner praktischen Implementierung geführt haben.