Hold-And-Modify , [1] [2] [3] abreviado habitualmente como HAM , [4] es un modo de visualización del ordenador Commodore Amiga . [5] Utiliza una técnica muy inusual para expresar el color de los píxeles, lo que permite que aparezcan en la pantalla muchos más colores de los que serían posibles de otro modo. El modo HAM se utilizaba habitualmente para mostrar fotografías digitalizadas o fotogramas de vídeo, [6] arte de mapa de bits y, ocasionalmente, animación. En el momento del lanzamiento del Amiga en 1985, esta pantalla casi fotorrealista no tenía precedentes para un ordenador doméstico y se utilizó ampliamente para demostrar la capacidad gráfica del Amiga. [7] Sin embargo, HAM tiene importantes limitaciones técnicas que impiden su uso como modo de visualización de propósito general.
El chipset Amiga original utiliza una pantalla plana con un espacio de color RGB de 12 bits que produce 4096 colores posibles.
El mapa de bits del campo de juego se almacenaba en una sección de la memoria principal conocida como RAM del chip , que se compartía entre el sistema de visualización y la CPU principal . El sistema de visualización solía utilizar un sistema de color indexado con una paleta de colores .
El hardware contenía 32 registros que podían configurarse en cualquiera de los 4096 colores posibles, y la imagen podía acceder a hasta 32 valores utilizando 5 bits por píxel. El sexto bit disponible podía utilizarse en un modo de visualización conocido como Extra Half-Brite , que reducía la luminosidad de ese píxel a la mitad, lo que proporcionaba una forma sencilla de producir efectos de sombras. [2]
El chipset Amiga fue diseñado utilizando un espacio de color HSV ( tono , saturación y luminancia ), como era común en las primeras computadoras hogareñas y consolas de juegos que dependían de televisores para la visualización. HSV se asigna de manera más directa al espacio de color YUV utilizado por los televisores en color NTSC y PAL , lo que requiere una electrónica de conversión más simple en comparación con la codificación RGB .
La televisión en color, cuando se transmite a través de un enlace de RF o de vídeo compuesto , utiliza un ancho de banda de croma mucho más reducido (codificado como dos componentes de diferencia de color, en lugar de tono + saturación) en comparación con el tercer componente, luma . Esto reduce sustancialmente la memoria y el ancho de banda necesarios para una fidelidad de visualización percibida dada, al almacenar y transmitir la luminancia a resolución completa, pero la crominancia a una resolución relativamente menor, una técnica compartida con técnicas de compresión de imágenes como JPEG y MPEG , así como en otros modos de vídeo basados en HSV/YUV, como la codificación YJK del chip MSX-Video V9958 (usado por primera vez en MSX2+ ).
La variante de codificación HSV utilizada en la forma original de HAM permitió priorizar la actualización de la información de luminancia sobre el tono y, en particular, la saturación, alternando entre los tres componentes según fuera necesario, en comparación con el entrelazado más regular de luminancia de resolución completa ( ) con cromas individuales de media o cuarto de resolución ( + ), como se utilizó en los estándares de video digital posteriores. Esto ofreció considerables beneficios de eficiencia sobre RGB.
A medida que el diseño de Amiga pasó de ser una consola de juegos a una computadora hogareña de uso más general, el chipset de video se modificó de HSV al modelo de color RGB moderno , lo que aparentemente anuló gran parte de los beneficios del modo HAM. El líder del proyecto Amiga, Jay Miner, relata:
Hold and Modify surgió de un viaje para ver simuladores de vuelo en acción y tuve una especie de idea sobre un tipo primitivo de realidad virtual . NTSC en el chip significaba que se podía mantener el tono y cambiar la luminancia alterando solo cuatro bits. Cuando cambiamos a RGB dije que ya no era necesario porque no era útil y le pedí al chico de diseño del chip que lo quitara. Volvió y dijo que esto dejaría un gran agujero en el medio del chip o requeriría un rediseño de tres meses y que no podíamos hacerlo. No pensé que nadie lo usaría. Estaba equivocado de nuevo, ya que eso realmente le dio al Amiga su ventaja en términos de paleta de colores.
La forma final de Hold-And-Modify era, en cuanto al hardware, funcionalmente igual que el concepto HSV original, pero en lugar de operar sobre esos tres componentes descriptivos (principalmente priorizando el componente V), modifica uno de los tres canales de color RGB. HAM puede considerarse una técnica de compresión con pérdida , similar en funcionamiento y eficiencia a JPEG menos la etapa DCT ; en el modo HAM6, se codifica un campo de reproducción efectivo de 4096 colores (12 bits) en la mitad de la memoria que normalmente se requeriría, y HAM8 reduce esto aún más, a aproximadamente el 40%. Sin embargo, hay una recompensa por esta compresión simplista: se logra una mayor fidelidad general del color a expensas de los artefactos horizontales, causados por la incapacidad de establecer cualquier píxel individual en un valor arbitrario de 12 (o 18, 24) bits. En el extremo, pueden necesitarse tres píxeles para cambiar de un color a otro, lo que reduce la resolución efectiva en ese punto de un modo de "320 píxeles" a aproximadamente "106 píxeles", y provoca que se extiendan manchas y sombras a lo largo de una línea de exploración a la derecha de una característica de alto contraste si los 16 registros de paleta disponibles resultan insuficientes.
La "descompresión" del espacio de color codificado por HAM se logra en tiempo real mediante el hardware de visualización, a medida que se muestran los datos del búfer de gráficos. Cada píxel codificado actúa como un índice normal para los registros de la paleta de colores o como un comando para alterar directamente el valor guardado en el DAC de salida (algo así como actualizar solo un tercio del registro de paleta activo) y se actúa inmediatamente como tal a medida que pasa a través del chipset.
Cuando se lanzó el Amiga en 1985, el modo HAM ofrecía una ventaja significativa sobre los sistemas de la competencia. HAM permite la visualización de los 4096 colores simultáneamente, aunque con las limitaciones antes mencionadas. Esta visualización pseudofotorrealista no tenía precedentes en un ordenador doméstico de la época y permitía la visualización de fotografías digitalizadas [7] e imágenes 3D renderizadas. En comparación, el estándar EGA de IBM-PC de entonces permitía 16 colores en pantalla de una paleta de 64. El sucesor de EGA, VGA, lanzado en 1987 con su modo de juegos estrella, Mode 13h , permitía 256 colores en pantalla de 262.144. El modo HAM se utilizaba con frecuencia para demostrar la capacidad del Amiga en escaparates y presentaciones comerciales, ya que el hardware de la competencia no podía igualar la profundidad de color. Debido a las limitaciones descritas anteriormente, HAM se utilizaba principalmente para la visualización de imágenes estáticas y los desarrolladores evitaban en gran medida su uso con juegos o aplicaciones que requirieran animación. [7]
El modo HAM solo se usó para el juego en doce juegos, comenzando con Pioneer Plague en 1988. Otros títulos de HAM incluyen Knights of the Crystallion , [7] [8] Links: The Challenge Of Golf , Overdrive (Infacto) , Kang Fu , AMRVoxel , RTG , Zdzislav: Hero Of The Galaxy 3D , OloFight y Genetic Species . [9]
Con la introducción de la Arquitectura Gráfica Avanzada, una imagen plana convencional podía tener una paleta de 256 colores, ofreciendo una fidelidad de color significativamente mayor. El modo HAM original, con su resolución de color limitada, se volvió mucho menos atractivo para los usuarios de una máquina AGA, aunque todavía se incluía por compatibilidad con versiones anteriores. El nuevo modo HAM8 era mucho menos útil para el chipset AGA que el modo HAM para el chipset original, ya que los modos de 256 colores indexados más sencillos (así como los de 128 y 64 colores planares de mayor rendimiento) aumentaron enormemente las opciones para el artista sin sufrir los inconvenientes del HAM. Un modo de paleta "en rodajas" bien programado podría resultar más útil que HAM8, con hasta 256 colores únicos por línea, suficiente para definir directamente un color distinto para cada píxel si se definiera un modo de vídeo de 256 píxeles de ancho, y en resoluciones más altas incluso una única paleta de 256 colores para toda la pantalla, y mucho menos para cada línea, permitía una simulación mucho más efectiva y precisa de mayores profundidades de color utilizando tramado de lo que se podía lograr con sólo 32.
El propósito original de HAM, que era permitir una mayor resolución de color a pesar del tamaño limitado del búfer de video y el ancho de banda de memoria limitado, se había vuelto en gran medida irrelevante gracias a la eliminación de esos límites. Como las computadoras más modernas son inherentemente capaces de mostrar pantallas de color verdadero de alta resolución sin ningún truco especial, ya no hay necesidad de técnicas de visualización como HAM; como las tarjetas gráficas estilo PC que ofrecen modos como SVGA 800x600 en color alto (16 bpp o 65536 colores directamente seleccionables) ya estaban disponibles para Amiga en los últimos días de la plataforma, es poco probable que se hubieran molestado en desarrollar más la técnica si hubiera sobrevivido hasta nuestros días.
El modo HAM impone restricciones sobre el valor de los píxeles adyacentes en cada línea horizontal del campo de juego. Para reproducir dos colores arbitrarios adyacentes, pueden necesitarse hasta dos píxeles intermedios para cambiar al color deseado (si se deben modificar los componentes rojo, verde y azul). En el peor de los casos, esto reduce la resolución cromática utilizable horizontalmente a la mitad, de 320~360 píxeles a 106~120. Aun así, se compara favorablemente con las tecnologías de video contemporáneas como VHS , que tiene una resolución cromática de alrededor de 40 líneas de televisión , aproximadamente equivalente a 80 píxeles.
La visualización de dichas imágenes a través de una conexión de vídeo compuesto proporciona un suavizado horizontal que minimiza los artefactos de color. Pero si se utiliza un monitor RGB , los artefactos se hacen especialmente visibles en áreas de fuerte contraste (fuertes gradientes horizontales de imagen ), donde puede aparecer un artefacto multicolor no deseado o "franjas". Se utilizaron varias técnicas de renderizado para minimizar el impacto de las "franjas" y las pantallas HAM se diseñaron a menudo para incorporar sutiles gradientes de color horizontales, evitando los bordes y contrastes verticales.
Para visualizar una imagen a todo color en el modo HAM es necesario un preprocesamiento cuidadoso. Dado que el modo HAM solo puede modificar uno de los componentes RGB a la vez, las transiciones de color rápidas a lo largo de una línea de escaneo se pueden lograr mejor utilizando uno de los registros de color preestablecidos para estas transiciones. Para reproducir una imagen arbitraria, un programador puede optar por examinar primero la imagen original en busca de las transiciones más notables y luego asignar esos colores a uno de los registros, una técnica conocida como paletas adaptativas . Sin embargo, con solo 16 registros disponibles en el modo HAM original, es común que se pierda cierta fidelidad de color.
Además, el modo HAM no permite fácilmente la animación arbitraria de la pantalla. Por ejemplo, si se debe mover una porción arbitraria del campo de juego a otra posición en la pantalla, es posible que haya que volver a calcular los valores Hold-and-Modify en todas las líneas de origen y destino para mostrar la imagen correctamente (una operación que no es muy adecuada para la animación). En concreto, si el borde más a la izquierda del objeto animado contiene algún píxel de "modificación", o si la imagen inmediatamente a la derecha del objeto contiene algún píxel de "modificación", entonces se deben volver a calcular esos valores Hold-and-Modify. Un intento de mover un objeto por la pantalla (como con el uso del blitter ) creará franjas notables en los bordes izquierdo y derecho de esa imagen, a menos que los gráficos estén especialmente diseñados para evitar esto. Para evitar tener que volver a calcular los valores Hold-and-Modify y evitar los efectos de franjas, el programador tendría que asegurarse de que el píxel más a la izquierda de cada objeto blitter y el píxel más a la izquierda de cada línea de un campo de juego desplazable sea un píxel "establecido". La paleta tendría que estar diseñada de modo que incorpore cada uno de esos píxeles más a la izquierda. Como alternativa, una pantalla HAM se puede animar generando valores de píxeles a través de la generación procedimental , aunque esto generalmente es útil solo para imágenes sintéticas, por ejemplo, los efectos de "arcoíris" utilizados en las demostraciones .
Sin embargo, tenga en cuenta que la función Mantener y modificar solo se aplica a los píxeles del campo de juego. 128 píxeles de datos de sprites (en modo DMA ) por línea de exploración aún están disponibles para su colocación en la parte superior del campo de juego HAM.
El modo HAM6, llamado así por los 6 bits de datos por píxel, se introdujo con el Chip Set original y se conservó en el Chip Set mejorado y la Arquitectura de gráficos avanzada (AGA) posteriores . HAM6 permite mostrar hasta 4096 colores simultáneamente en resoluciones de 320×200 a 360×576.
La codificación HAM6 utiliza seis bits por píxel: dos bits para control y cuatro bits para datos. [10] Si los dos bits de control se establecen en cero, los cuatro bits restantes se utilizan para indexar uno de los 16 registros de color preestablecidos, operando a la manera de un mapa de bits indexado normal. Los otros tres posibles patrones de bits de control indican que se debe utilizar el color del píxel anterior (a la izquierda) en la línea de exploración y los bits de datos se deben utilizar en su lugar para modificar el valor del componente rojo, verde o azul. En consecuencia, hay cuatro posibilidades: [2] [7]
También está disponible un modo similar, HAM5, [11] [12] , en el que se utilizan solo 5 bits de datos por píxel. [10] El sexto bit siempre es cero, por lo que solo se puede modificar el componente de color azul. [2] [13] Debido a que solo se puede modificar el componente azul sin un comando SET, el efecto se limita a un aumento moderado del número de tonos de color amarillo-azul que se muestran. Este modo no es tan flexible como HAM6 y no se utiliza ampliamente. [14] [15]
En el chipset AGA, HAM5 ya no existe. [16]
También es posible utilizar el modo HAM con 4 bitplanes. Su uso práctico es limitado, pero esta técnica se utilizó en demostraciones. [14] [17] [15]
Es posible configurar el modo HAM con 7 bitplanes en OCS/ECS, pero eso utilizará solo 4 bitplanes. Esta técnica se demostró en la demostración “HAM Eager”. [18] En el chipset AGA, HAM7 ya no existe. [16]
El chipset original de Amiga incluía un chip de soporte conocido como " Copper ", que se encarga de las interrupciones y otras tareas de sincronización y mantenimiento independientemente de la CPU y del sistema de vídeo. Con el Copper, es posible modificar los registros del chipset o interrumpir la CPU en cualquier coordenada de la pantalla de forma sincronizada con la salida de vídeo. Esto permite a los programadores utilizar código específico de Copper ensamblado en una Copperlist o código de CPU para efectos de vídeo con muy poca sobrecarga.
Utilizando esta técnica, los programadores desarrollaron el Sliced HAM [19] o modo SHAM , también conocido como HAM dinámico . [20] SHAM cambia algunos o todos los registros de color en las líneas de escaneo seleccionadas para cambiar la paleta durante la visualización. Esto significa que cada línea de escaneo puede tener su propio conjunto de 16 colores base. Esto elimina algunas restricciones causadas por la paleta limitada, que luego se puede elegir por línea en lugar de por imagen. Las únicas desventajas de este enfoque son que Copperlist usa ciclos de reloj adicionales de RAM de chip para los cambios de registro, que la imagen no es solo de mapa de bits y la complejidad adicional de configurar el modo SHAM.
Esta técnica no se limita a HAM y también se utilizó ampliamente con los modos gráficos más convencionales de la máquina. Dynamic HiRes utiliza una técnica de cambio de paleta similar para producir 16 colores por línea en los modos de alta resolución, mientras que HAM está limitado a baja resolución pero permite tanto 16 colores indexados como modificaciones de ellos.
La idea de SHAM quedó obsoleta cuando se introdujo HAM8 con el chipset AGA, [21] ya que incluso una imagen HAM8 sin cortes tiene mucha más resolución de color que una imagen HAM6 cortada. Sin embargo, SHAM sigue siendo el mejor modo HAM disponible en aquellos Amigas con los chipsets OCS o ECS.
Con el lanzamiento de la Arquitectura Gráfica Avanzada (AGA) en 1992, el modo HAM original pasó a llamarse "HAM6" y se introdujo un nuevo modo "HAM8" (el sufijo numerado representa los planos de bits utilizados por el modo HAM respectivo). Con AGA, en lugar de 4 bits por componente de color, el Amiga tenía ahora hasta 8 bits por componente de color, lo que daba como resultado 16.777.216 colores posibles (espacio de color de 24 bits).
El HAM8 funciona de la misma manera que el HAM6, utilizando dos bits de "control" por píxel, pero con seis bits de datos por píxel en lugar de cuatro. La operación de configuración selecciona de una paleta de 64 colores en lugar de 16. La operación de modificación modifica los seis bits más significativos del componente de color rojo, verde o azul; los dos bits menos significativos del color no pueden modificarse con esta operación y permanecen tal como se establecieron en la operación de configuración más reciente.
En comparación con HAM6, HAM8 puede mostrar muchos más colores en pantalla. Se informó ampliamente que el número máximo de colores en pantalla utilizando HAM8 era de 262.144 colores (espacio de color RGB de 18 bits). De hecho, el número máximo de colores únicos en pantalla puede ser mayor que 262.144, dependiendo de los dos bits menos significativos de cada componente de color en la paleta de 64 colores. En teoría, los 16,7 millones de colores podrían mostrarse con una pantalla lo suficientemente grande y una paleta base apropiada, pero en la práctica las limitaciones para lograr una precisión total significan que los dos bits menos significativos generalmente se ignoran. En general, la profundidad de color percibida de HAM8 es aproximadamente equivalente a una pantalla de color alta.
Las resoluciones de pantalla verticales para HAM8 son las mismas que para HAM6. La resolución horizontal puede ser de 320 (360 con overscan) como antes, doblada a 640 (720 con overscan) o incluso cuadriplicada a 1280 píxeles (1440 con overscan). El chipset AGA también introdujo resoluciones aún más altas para los modos de visualización plana tradicionales. El número total de píxeles en una imagen HAM8 no puede superar los 829.440 (1440×576) utilizando modos PAL, pero puede superar los 1.310.720 (1280×1024) utilizando hardware de visualización de terceros (Indivision AGA flicker-fixer ).
Al igual que el modo HAM original, una pantalla HAM8 no puede mostrar ningún color arbitrario en ninguna posición arbitraria, ya que cada píxel depende de una paleta limitada o de hasta dos componentes de color del píxel anterior. Al igual que con el modo HAM original, los diseñadores también pueden optar por "cortar" la pantalla (ver arriba) para eludir algunas de estas restricciones.
El modo HAM es exclusivo de Amiga y sus chipsets distintivos. Para permitir la representación directa de imágenes antiguas codificadas en formato HAM, se han desarrollado emuladores de HAM basados en software que no requieren el hardware de pantalla original. Las versiones anteriores a la 4.0 de AmigaOS pueden usar el modo HAM en presencia del chipset nativo de Amiga. AmigaOS 4.0 y posteriores, diseñado para un hardware radicalmente diferente, proporciona emulación HAM para su uso en hardware gráfico moderno y pesado . Los emuladores dedicados de Amiga que se ejecutan en hardware no nativo pueden mostrar el modo HAM mediante la emulación del hardware de pantalla. Sin embargo, dado que ninguna otra arquitectura de computadora utilizó la técnica HAM, ver una imagen HAM en cualquier otra arquitectura requiere una interpretación programática del archivo de imagen. Una decodificación fiel basada en software producirá resultados idénticos, dejando de lado las variaciones en la fidelidad del color entre las configuraciones de pantalla.
Sin embargo, si el objetivo es simplemente mostrar una imagen SHAM en una plataforma que no sea Amiga, los valores de color necesarios pueden calcularse previamente en función de las entradas de la paleta que se programan mediante Copperlist, independientemente de si la paleta se modifica en medio de una línea de escaneo. Siempre es posible convertir una imagen HAM o SHAM sin pérdida a una paleta de 32 bits.
Un dispositivo producido por Black Belt conocido como HAM-E fue capaz de producir imágenes con una profundidad de color HAM8 a baja resolución horizontal desde un Amiga con un chipset original. [22]
El Amiga se configuraba para producir imágenes de alta resolución (640 píxeles de ancho, 720 con overscan). Esto requería el uso de cuatro planos de bits a 70 ns por píxel. Las primeras líneas de la imagen codificaban información para configurar la unidad HAM-E. Luego, cada par de píxeles se codificaba con información para la unidad HAM-E, que convertía la información en un píxel de 140 ns (generando una imagen de 320 píxeles de ancho, o 360 con overscan, a una profundidad de color de ocho planos de bits). La calidad de HAM-E era, por lo tanto, comparable a una imagen HAM8 de baja resolución. La técnica HAM-E explotaba el hecho de que una imagen de alta resolución con cuatro planos de bits ofrece un tercio más de ancho de banda de memoria y, por lo tanto, un tercio más de datos que una imagen de baja resolución con seis planos de bits.
La técnica HAM también se implementó en los modos HAM256 y HAM8x1 de ULAplus / HAM256 / HAM8x1 para el ZX Spectrum , donde proporciona la capacidad de mostrar 256 colores en pantalla, modificando una paleta de colores base de 64. [23] [24] [25] [26]
El HAM, muy similar al HAM8 de Amiga, es parte del HGFX , un sistema basado en planos , proporcionado en forma de extensión FPGA del circuito de video original ( ULA ), para computadoras ZX Spectrum . Propuesto y probado con el emulador LnxSpectrum como HGFX/Q, realizado en la computadora eLeMeNt ZX , [27] [28] en 2021.