Cómo funciona el modo AIC en el Oric, por Chema.

Como hay bastante gente que ha preguntado por esto (y silicebit me lo ha pedido), voy a intentar explicar cómo funciona el modo AIC en el Oric. De antemano pido disculpas por el rollo, pero ya os había avisado...

Ya sabéis que el Oric utiliza los atributos serie para dar colores. Esto quiere decir que cuando la ULA recorre la zona de memoria donde están los gráficos ($a000-$bf3f) toma cada byte y comprueba si se trata de información gráfica o de un atributo. Esto lo hace examinando el bit 6 (numerando los bits 76543210); si está a 1, los 6 bits menos significativos se toman como valores de pixel para dibujar, bien en color de fondo-papel (0), bien en color de primer plano-tinta (1). De ahí el que sólo se usen 6 bits por byte.

Si el bit 6 está a 0, entonces la ULA detecta que se trata de un atributo, es decir, un comando, que puede cambiar el color de papel o de tinta, pero también cambiar entre modos de alta resolución o texto (HIRES/TEXT), activar el parpadeo, cambiar al juego de caracteres alterno, etc.

Un excelente resumen de todo esto podéis encontrarlo aquí (en inglés):
Oric Hires Colour Attributes

La mayoría de los comandos que nos interesan quedan activos mientras la ULA pinta la fila y luego se restablecen al valor por defecto para la siguiente.

Pero ¿qué hace la ULA con ese byte que contiene un atributo? Porque no contiene datos gráficos… La respuesta es simple: pinta los 6 pixels en el color de papel actual.

Si queremos cambiar el color de la tinta y del papel, hay que poner dos atributos consecutivos.

¿Os preguntáis para qué sirve el bit 7? Pues sirve para indicar a la ULA que dibuje el byte actual en modo inverso, es decir, cambiando los colores de tinta y papel por sus inversos lógicos (blanco-negro, cyan-rojo,…). Esto, que sólo afecta al byte actual, y que parece algo extraño, acabó trayendo la solución. Pero lo veremos luego, volvamos con los atributos.

De esta forma se ahorra memoria y es posible, por ejemplo, tener diferentes colores de papel y tinta en líneas consecutivas, aunque en bloques de 6 pixels.

Parece un método bueno, ¿verdad?. De hecho se pueden hacer imágenes estáticas muy coloridas y con bastante calidad. Sin embargo es un regalo envenenado, porque no solo nos deja bytes (bloques de 6 pixeles) en color del papel irremediablemente, sino que además hay que tener mucho cuidado de no sobreescribir los datos, o tendremos efectos horribles en la pantalla.

Esto ha sido siempre un problema. La mayoría de los juegos clásicos tienen defectos debidos a esto. O bien los gráficos son pobres porque esconden bytes enteros con atributos, o tienen “sombras” espantosas alrededor, o directamente tienen un “color clash” horrible. Por eso, en muchos casos, se acaban haciendo en monocromo.

Tras muchos años lidiando con estas cosas, uno de los mejores desarrolladores de juegos para el Oric, Twilighte, se sacó de la manga una técnica que nos dejó a todos con la boca abierta. Gráficos coloridos, sin efectos extraños y con mucha calidad… ¿cómo diablos hacía eso?. Llamó a su técnica “AIC mode” (creo recordar que viene de Alternate+Inverse Colors, o algo similar).

Voy a intentar explicar cómo se usa, aunque necesita mucha práctica (y estar algo loco, la verdad) para hacer las cosas que hace Twiligthe.


Comencemos con una imagen en monocromo:




Algo sosa, la verdad. En el modo AIC el truco es utilizar colores alternos en cada línea. Por ejemplo dos: cian y amarillo. Estos atributos se colocan en la primera columna y a partir de ahí te olvidas de los atributos. Vamos a sacar colores con algo de magia.

Hacemos eso y tenemos:




Nada demasiado excitante, la verdad, pero ya podemos hacer cosas. ¿Os fijáis en los patrones de puntos en las paredes? Estan para dar sombreados, pero ¿qué pasa si solo ponemos puntos en líneas alternas (pares o impares)? Por ejemplo, vamos a poner un patron así en la oficina del director, de forma que sólo se vean los píxels en color cian:




Podemos hacer lo mismo para tener una habitación o pared de un color amarillento. Ya estamos dando algo de color.


Aun así, es algo soso. Vamos a mejorarlo utilizando el bit 7 (modo inverso). Hay que recordar que la inversion se hace tanto en la tinta como en el papel, de forma que los píxles en negro se vuelven blancos, los de color cian en rojo y los de color amarillo en azul.

Por ejemplo, vamos a por la ventana. Podríamos darle algo de color azul claro, como si se viese el cielo. Para ello complementamos los datos gráficos (cambiamos ceros por unos y viceversa en los 6 bits menos significativos) y ponemos a 1 el bit 7, pero sólo en las filas donde la tinta sea amarilla, así tendremos azul oscuro y blanco. ¡Tachán!:



Mucho mejor, ¿no? Se pueden usar diferentes combinaciones (invirtiendo unas filas u otras, o ambas, complementando o no,…). Con algo de imaginación y muchas pruebas se pueden conseguir resultados interesantes. Intentad imaginaros qué combinaciones se han usado en estos escudos:



Como también se puede obtener color blanco (el inverso del negro), es fácil hacer los bocadillos. El fondo es el color de tinta (negro en Skool Daze) y los bordes y las letras en color del papel (que acabará siendo cian o amarillo, depende de la fila). Luego se pone el bit 7 de todos esos datos a 1 y:



El bocadillo con el que los profesores te echan castigos es igual, pero el fondo es papel y las letras color de tinta (negro). Todo con el bit 7 puesto a 1.


Se pueden hacer muchas combinaciones y efectos. Fijaros en Skool Daze (el color rojizo del tejado, las ventanas exteriores en azul oscuro, las estanterías de libros…). Lo mejor de todo es que se guarda la información de color dentro del propio gráfico (como 1 bit) y hay muy poquito “color-clash”.

Veamos algunos ejemplos hechos por Twilighte, como los controles en 1337:




Son una pasada ¿no?, también el punto de mira usa esta técnica (fijaros que tiene zonas rojas).

Quizás el mejor exponente de esto sea Stormlord, aunque Impossible Mission también tiene gráficos alucinantes.



Hay que modificar un poco el código para pintar los sprites con sus máscaras correctamente y, sobre todo, ensayar mucho, pero los resultados merecen la pena.

Chema