ZX-81 escribió:Repasando lo que escribió mcleod_ideafix en la página 5 de este hilo me han surgido dudas que no he visto planteadas ni resueltas en el resto del hilo. Las plantearé, porque puede que, de paso, tenga alguna idea que resulte útil. Primero, las suposiciones:
- Se está emulando algo similar al 128k, porque tenemos dos pantallas con la posibilidad de tener 4, dependiendo del bit correspondiente de 0x7FFD y del out al puerto 0xff. Si conectamos el ZX-Uno a un 48k, lo convertimos en un 128k hipervitaminado.
Dado que ya no estamos hablando de una tarjeta que se le pincha a un Spectrum, sino de un modo nativo del ZX-Uno, ya no tiene sentido hablar de conectar el ZX-Uno a nada. El ZX-Uno ES el ordenador. El ZX-Uno es un ordenador de 128K que además implementa los modos nativos Timex. Si JSpeccy no emula Timex, no tienes que preocuparte para nada del puerto $FF. Simplemente no estará implementado. Dudo mucho que Radastan necesite siquiera más de una página de video para sus juegos, mucho menos cuatro.
ZX-81 escribió:
Cuando se dice que el Z80 no tiene contención se refiere tanto a la memoria como a la I/O, incluido el puerto de ULAplus que normalmente la tiene y que en este caso tampoco la tendría.
Exacto. Nada de contención. Ni mijita. A ningún puerto. A ninguna zona de memoria.
ZX-81 escribió:
Los colores se sacan de la primera paleta (la 0) de ULAplus.
Correcto.
ZX-81 escribió:- En el Spectrum se hacen dos lecturas de la RAM de video, una para sacar el bitmap y otra para sacar el atributo y con eso se pintan 8 pixeles a razón de dos por ciclo de reloj. Ahora, esas dos lecturas son de direcciones consecutivas y con eso se pintan 4 pixeles del doble de tamaño. Esas dos lecturas no sé si verlas como una unidad indivisible, como en el Spectrum, o como dos independientes (en el 48k son una unidad indivisible).
Aquí, dado que no hay memoria dinámica, las lecturas son siempre independientes. Se realizan mucho más rápidamente que en el Spectrum normal. En el Spectrum normal lees 4 bytes en 6 ciclos de reloj de Z80 y dejas 2 sin contención. En el ZX-Uno durante el modo radastaniano, se lee un byte, me parece recordar, que cada dos ciclos de reloj. De hecho quité la contención porque, de dejarla, sería una contención mucho más restrictiva que la del Spectrum.
la secuencia sería más o menos así (los ciclos son de CPU, que equivalen a 2 ciclos de ULA, es decir, 2 píxeles usando 256 píxeles horizontales):
Ciclo 0: leo un byte (dos píxeles)
Ciclo 1: pinto el primer píxel (que ocupará el espacio de 2 píxeles originales)
Ciclo 2: pinto el segundo pixel mientras leo el siguiente byte
Ciclo 3: igual que el ciclo 1.
Por supuesto, cuando termino una línea de exploración, la siguiente se pinta usando exactamente la misma información, con lo que sí, es posible cambiar la paleta o el contenido de esa línea y tendrías más resolución vertical.
ZX-81 escribió:1.- que los colores de las líneas pares salgan de la paleta 0 y las impares de la 1 (posibilidad de doble resolución de color, por llamarlo de algún modo), o bien
2.- que los colores salgan de la paleta seleccionada vía un out a algún registro de ULAplus. Con un solo OUT entre líneas podemos sacar los colores de cualquiera de las 4 paletas y conseguir efectos de color más chulos.
Este modo se ha pensado fundamentalmente para crear juegos sin attribute-clash y que tengan, digamos, un look nuevo en el Spectrum, sin gastar CPU. Se pueden realizar virguerías del estilo que comentas, pero precisamente propuse a Radastan cosas como un modo de 128x192 y lo rechazó, precisamente porque ya no sería algo "simple" y además ocuparía más memoria. Cambiar el hardware para que en cada línea use direcciones diferentes y así tener una resolución real de 128x192 es trivialísimo. Las cosas que propones, en hardware, no son tan triviales, ya que cada multiplexor añadido en la ruta de datos "cuesta" espacio en la FPGA y se come tiempo de propagación de los datos.