antoniovillena escribió:Para modo único el 128x96x8 es más sencillo que el 128x96x4 ya que no tienes porqué implementar la paleta. Inconvenientes: el doble de memoria de video y por tanto rutinas gráficas más lentas.
Eso es cierto si no estuviera implementada ya la ULAplus, pero es que lo está, así que puedo usarla. El modo que estoy implementando, 128x96x4 bits, lo he diseñado de forma que afecte lo menos posible a la ruta de datos existente. Así, para habilitarlo, hay que habilitar también ULAplus (es decir, para habilitar el modo radastaniano hay que hacer):
El bit 0 del registro 64 activa la ULAplus, como siempre, y el bit 1 activa el modo radastaniano.
Cuando el modo radastaniano se activa (para ver esto es conveniente tener el dibujo de la ruta de datos al lado), sólo se usa como registro de entrada desde la VRAM el registro
AttrData. Este es cargado con los contenidos de la memoria una vez cada cuatro ciclos de pixel original (es decir, el reloj de pixel de 7MHz que nos da los 256 pixeles originales). El byte (dos píxeles) viaja hasta la LUT de la paleta, donde un nuevo multiplexor (que se ha añadido para este modo) redirige 4 bits del pixel hacia un bus de direcciones de la paleta, y los otro 4 bits al otro.
La señal AttrOutpuLoad ahora en este modo se actualiza también mucho más deprisa: en el ciclo de reloj siguiente a que se hayan cargado los bytes de la VRAM. Eso da tiempo al que el byte cargado se propague por la ruta de datos hasta la salida de la LUT. La LUT da dos salidas de 8 bits, que son dos colores. Originalmente son los colores de paper y tinta, pero ahora son los colores del pixel izquierdo y derecho del byte.
El multiplexor que elige un color u otro, en este modo no está gobernado por la señal Pixel, sino que está gobernado por el bit 1 del contador de líneas horizontales: esto hace que se seleccionen alternativamente uno u otro color, a una cadencia de 1 cambio por cada dos ciclos de reloj de pixel original.
La salida va como en la ULAplus al multiplexor final, que lo saca hacia afuera. Para que dicho multiplexor elija este modo, ULAPlusEnabled debe ser igual a 1, o lo que es lo mismo, el bit 0 del registro de configuración de la ULAplus debe ser 1.
Así es a grandes rasgos. Estoy terminando de hacer pruebas. De momento no pinta bien (en el sentido literal de la palabra

) ya que debo haber liado bits por algún sitio, y cuando pokeo en memoria.... ¡se pinta el borde!
-- Actualizado 01 Mar 2014, 04:52 --
¡Ea! Ya pinta bien. Esta es la pantalla que Radastan hizo como moco de un posible juego basado en este modo, vista en el ZX-Uno (video compuesto):

En el repositorio del ZX-Uno vereis un nuevo core,
test9_radastan, que contiene los aditamentos al core del
test9 que se le han hecho a la ULA para este modo. No se ha tocado el resto de módulos

Dentro de este directorio hay otro "software" que contiene un visor simple de ficheros BMP. Para usarlo, simplemente coge una imagen, escálala a 128x96, reduce el número de colores a 16, y grábala como fichero BMP de 4 bpp sin comprimir. El fichero debe tener 6262 bytes. Vereis un fichero ASM para ensamblar con PASMO. Al final del todo, en la línea con el incbin, pon el nombre del fichero convertido. Ensambla para obtener un TAP y cárgalo en el ZX-Uno

El modo "radastaniano" tiene las siguientes características:
- Resolución de 128x96 píxeles cuadrados, aspect ratio de la pantalla: 4:3
- Direccionamiento lineal en memoria en el rango 16384-22527
- Dentro de cada byte, los bits 4 a 7 contienen el color del pixel más a la izquierda, y 0 a 3, el color del pixel de más a la derecha
- Los colores se toman de las 16 primeras entradas (0 a 15) de la paleta de ULAplus
- El color del borde se toma de las entradas 0 a 7 de la paleta. (¿se prefiere así, o que tome el color de otras entradas distintas, tales como desde la 16 a la 23 para que el color del borde pueda hacerse independiente del de la pantalla?)
- No hay contención del Z80 en ningún momento.
- 4 páginas de pantalla disponibles: 4000h, 6000h, C000h, E000h. Estas dos últimas, en el banco 7 de memoria. Para cambiar de pantalla, por ejemplo de la 4000h a la 6000h, o de la C000h a la E000h, hay que poner un 1 en el bit 0 del puerto $FF (ya que esta característica está heredada de los modos de Timex implementados)
Como se usa:
- Establece los colores que vayas a usar en las entradas 0-15 de la paleta de ULAplus
- Activa el modo radastaniano junto con el de ULAplus, metiendo el valor 3 en el registro 64 de ULAplus
Efectos secundarios: si se activa únicamente el modo radastaniano sin activar ULAplus (es decir, poniendo un 2 en el registro 64 de ULAplus), la ULA se comportará de una forma no prevista, y que viene a ser lo siguiente:
- Resolución de 64x96 píxeles (pixeles el doble de largos que altos)
- Cada pixel se corresponde con un byte de memoria en el rango 16384-22527, direccionamiento lineal.
- El color de un pixel viene dado por el valor leido de memoria, interpretando los colores como en los atributos estándar (flash, brillo, paper, ink)
- Dado que el serializador de píxeles no está funcionando durante el modo radastaniano, el único valor que saca es 0, por lo que el color que siempre se escoge para el pixel es el que esté establecido como paper. Dicho de otra forma: los 3 bits menos significativos del byte leído no se usan para nada. El brillo y el flash se usan como de costumbre.
- El color del borde... bueno, el efecto colateral éste que comento hace que el borde presente como color el codificado en el atributo 0 B2 B1 B0 0 0 0 0. Es decir, que si pones OUT 254,7 el color que aparece es amarillo brillante. Como la componente de azul siempre es 0, los colores disponibles son negro, rojo, verde, y amarillo; con y sin brillo.
-- Actualizado 01 Mar 2014, 05:08 --
Otro ejemplito. Esta vez es un fotograma de la película Gravity.
