Pruebas scandoubler para ZX-Uno

Sinclair QL, ZX81, +2, +3, 128K ...
Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Pruebas scandoubler para ZX-Uno

Mensajepor mcleod_ideafix » 16 Oct 2014, 20:46

Decíamos en el otro hilo...

...Dado que la frecuencia de lectura depende así de la frecuencia de origen, y ésta es PAL, estamos hablando de que en la salida VGA, una línea durará la mitad que en PAL, esto es, 32us, que nos da a su vez una frecuencia horizontal de 31,25kHz. La frecuencia vertical es la misma que PAL, 50Hz. Este scandoubler no realizará desentrelazado de señales que provengan de modos "interlaced" (se verán, pero con mucho parpadeo).

En resumen: el scandoubler que puedo implementar con mis conocimientos y el hardware del que disponemos en el ZX-Uno es uno que dará una señal VGA de 704x576 puntos, a 31,25kHz horizontal y 50Hz vertical. Probablemente pueda recortar la imagen para mostrar sólamente 640x480 a costa de comer un poco de borde por los cuatro lados.

Bueno, pues estoy haciendo pruebas. En principio lo que he hecho es implementar una mira electrónica. Una mira electrónica es un dispositivo que genera una señal de video y que se usa para probar televisores, o para probar qué tal se modula/demodula esa señal en RF. Esta que he implementado genera una señal para monitor VGA con estas características:
- Resolución efectiva: 800x600
- Frecuencia de barrido horizontal: 31,25kHz
- Frecuencia de barrido vertical: 50Hz
- Señal progresiva (no entrelazada)
- Reloj de pixel de 28MHz.

La imagen que se ve es un patrón que muestra todas las tonalidades de rojo, verde y azul que puede sacar el dispositivo (8 tonalidades de rojo y verde, y 4 de azul). Este patrón ocupa 512x384 píxeles, justo lo que ocuparía el área de "paper" del Spectrum, visto en la VGA. Rodeándolo hay un borde de color magenta. La imagen con el borde ocupa 704x576. Rodeando a este borde magenta hay otro amarillo (no visible en la segunda foto, que se hizo antes de implementar dicho borde, pero sí en la primera) para "rellenar" hasta los 800x600. Así puedo ver si la imagen está bien centrada. En el scandoubler final, ese borde amarillo será en realidad negro.

La idea es de aquí, sacar un cuadro centrado de 704x576 puntos, que será la pantalla del Spectrum. Cada pixel original del Spectrum son en la VGA un cuadradito de 2x2 píxeles. De esta forma, la resolución real que obtenemos en pantalla es de 352x288 puntos, que es la nativa del Spectrum (¡el borde también cuenta!)

La he implementado en una pequeña placa FPGA que alimento por USB, y que lleva salida VGA con el mismo esquema de color que el ZX-Uno, esto es, 3-3-2 . La idea era llevármela por los laboratorios de mi departamento a la busca y captura de monitores, para pinchar la plaquita en ella, alimentarla con el USB del PC más cercano, y ver qué pasa.

He podido probarla en 10 monitores, tanto de tubo como TFT:
- Monitor TFT Philips 220SW: panorámico, 22'' con DVI, VGA y HDMI: imagen perfecta, una vez que le hemos dado al ajuste automático.
- Monitor TFT panorámico de 22'' con VGA, HDMI y DVI del cual no recuerdo la marca: imagen perfecta, una vez que le hemos dado al ajuste automático.
- Monitor TFT Benq FP767, 17'' 4:3, con VGA: imagen perfecta.
- Monitor TFT LG Flatron L1715S 4:3 con VGA: error de imagen fuera de rango. No se ve nada, salvo el cartelito del OSD.
- Monitor TFT AOC 17'' (sin número de modelo visible) 4:3 con VGA y DVI: aparece la imagen, desplazada un poco a la izquierda. Sobreimpresionada a ella, un cartel del OSD indicando "entrada inválida" (pero la imagen se ve)
- Monitor TFT Asus panorámico 17'' (sin número de modelo visible) con VGA: aparece la imagen, desplazada un poco a la izquierda. Sobreimpresionada a ella, un cartel del OSD indicando "entrada inválida" (pero la imagen se ve).
- Monitor TFT Philips A170 17'' 4:3: error de imagen inválida. No se ve nada, salvo el cartelito del OSD.
- Monitor CRT Samsung SyncMaster 753DFX 17'' 4:3 con VGA: imagen perfecta, una vez que se ha accedido al menú de opciones para centrar la imagen.
- Monitor CRT AOC 17'' 4:3 con VGA: imagen perfecta, una vez que se ha accedido al menú de opciones para centrar la imagen.
- Monitor CRT IBM PS/1 12'' 4:3 con VGA: imagen casi perfecta. Hay una banda de color a la derecha de la imagen, que creo que se debe a la elección de los parámetros del back porch y el front porch. Según los valores que use, la banda es más o menos prominente, o incluso desaparece.

Así se ve en el SyncMaster, uno de los que he probado donde mejor se ve :) La info que da el menú OSD muestra la frecuencia horizontal y vertical que se usan.
Imagen

En mi despacho he podido montar algo parecido al escritorio de Matrix, con cuatro de los monitores listados, para probar. De los cuatro, tres muestran la imagen (Philips 220SW, IBM PS/1 y Benq FP767), así que son los que salen en la foto. La foto es en realidad un montaje fotográfico combinando tres fotos, hechas desde el mismo sitio, enchufando la mira electrónica a cada monitor por separado en cada una:

Imagen

En los dos casos (cuatro si contamos los dos monitores que muestran la imagen pero aún así dicen que está fuera de rango), no tengo ninguna pista de cuál de los parámetros de la señal es el que está fuera de rango. En realidad, y por lo que al monitor se refiere, los únicos parámetros que conoce son la frecuencia horizontal y la vertical.

La frecuencia vertical (50Hz) no es negociable, so pena de usar un scandoubler de frame completo, y eso no lo tenemos disponible con los recursos de que disponemos en la placa. Recordemos que el scandoubler de línea funciona enviando la imagen a la VGA a una frecuencia que debe ser 2 veces, 4 veces, 8 veces, etc, la frecuencia original, para que en el mismo tiempo que la ULA genera una línea (64us), el scandoubler envíe 2,4,8, o las que sea, haciendo por tanto que el tamaño vertical de un pixel crezca en la misma proporción. Para que la relación de aspecto del pixel siga siendo 1:1, habrá también que duplicar, cuadruplicar, etc, la resolución horizontal.

La frecuencia horizontal (31,25kHz) podría multiplicarse por 2, y obtener 62,5kHz. Esto supondría implementar un modo de pantalla del doble de píxeles horizontales y verticales respecto a como está ahora. Si parto de la resolución inicial, de 800x600, tendría que subirlo a 1600x1200, y eso lo haría inviable para practicamente cualquier monitor actual. Si parto de una resolución de 640x480 (la cual puedo conseguir cortando el borde por los lados), obtengo otra de 1280x960, que entra dentro del rango representable en un monitor de 17'' TFT o CRT.

Si los errores de fuera de rango lo son por la frecuencia horizontal, y no por otra cosa, es posible que de esta forma se solucionen. Si vienen por la frecuencia vertical, no es posible cambiarla, salvo que cambies la ULA entera y los timmings dejen de ser compatibles con el Spectrum que conocemos.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Pruebas scandoubler para ZX-Uno

Mensajepor antoniovillena » 16 Oct 2014, 23:54

No sé si te valdrá pero he encontrado este calculador de timings:

http://www.abramovbenjamin.net/calc.html

Si pones VGA to TV converter 640x480 50Hz (PAL) y le das a Calculate te dice los tiempos, las frecuencias y las duraciones de los pulsos de sincronismo.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: Pruebas scandoubler para ZX-Uno

Mensajepor mcleod_ideafix » 17 Oct 2014, 00:52

antoniovillena escribió:No sé si te valdrá pero he encontrado este calculador de timings:

http://www.abramovbenjamin.net/calc.html

Si pones VGA to TV converter 640x480 50Hz (PAL) y le das a Calculate te dice los tiempos, las frecuencias y las duraciones de los pulsos de sincronismo.


Precisamente ese es el que uso :D Y precisamente he probado con esos modos, pero no tal cual están ahí, sino acomodando la frecuencia de reloj a 28MHz. Si te fijas, de hecho el VGA to converter para 640x480 y para 800x600 usan los mismos timmings horizontales y verticales que ya había calculado antes en el hilo anterior :) (31,25kHz H, 50Hz V )
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Pruebas scandoubler para ZX-Uno

Mensajepor antoniovillena » 17 Oct 2014, 00:59

mcleod_ideafix escribió:Precisamente ese es el que uso :D Y precisamente he probado con esos modos, pero no tal cual están ahí, sino acomodando la frecuencia de reloj a 28MHz. Si te fijas, de hecho el VGA to converter para 640x480 y para 800x600 usan los mismos timmings horizontales y verticales que ya había calculado antes en el hilo anterior :) (31,25kHz H, 50Hz V )


He buscado fuentes en Verilog/VHDL que muestren algo por VGA a 50Hz pero de momento no ha habido suerte, bueno sí el clon de Mike Stirling pero estoy buscando algo más sencillo. Lo suyo es encontrar algo que funcione en todos o casi todos los monitores.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: Pruebas scandoubler para ZX-Uno

Mensajepor mcleod_ideafix » 17 Oct 2014, 01:11

antoniovillena escribió:He buscado fuentes en Verilog/VHDL que muestren algo por VGA a 50Hz pero de momento no ha habido suerte, bueno sí el clon de Mike Stirling pero estoy buscando algo más sencillo. Lo suyo es encontrar algo que funcione en todos o casi todos los monitores.

Las frecuencias horizontal y vertical que hay que usar para este scandoubler no son estándares, así que me temo que no hay solución universal que funcione en todos los monitores. El mismo problema tienen algunos convertidores TV-VGA, que no son soportados por todos los monitores. Tengo uno, ya antiguo, de AverMedia, que le pasaba lo mismo que me pasa a mi ahora.

La verdad, salvo que encontremos los números "mágicos" que hay que poner en el backporch, frontporch, pulso de sincronismo, etc, que hagan que un modo de video de 800x600 a 31,25kHz / 50Hz se vea bien en cualquier monitor que soporte esa resolución, me temo que el que quiera una salida VGA garantizada, tendrá que tirar de un conversor TV-VGA de los de DealExtreme. El scandoubler tal y como lo he pensado, se puede dejar, y si tienes la suerte de poseer un monitor que acepte esta señal no estándar, pues eso que te ahorras.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Pruebas scandoubler para ZX-Uno

Mensajepor antoniovillena » 17 Oct 2014, 01:12

En algunos sitios dicen que el problema es que no todos los monitores aceptan 50Hz porque es una frecuencia muy baja. Creo que podrías probar una señal con 55Hz o algo parecido a ver cuántos monitores te lo aceptan. Si la cosa mejora bastante pues se puede llegar a un término medio, disminuyes un poco la frecuencia base de tal forma que el spectrum corra a 3.20Mhz (y todos los timings vayan acordes). Es una desviación pequeña, de menos del 10% y probablemente ni se note. Y tampoco repercute en la carga en cinta, al menos en carga estándar en las demás no sabría qué decirte.

-- Actualizado 17 Oct 2014, 00:18 --

mcleod_ideafix escribió:La verdad, salvo que encontremos los números "mágicos" que hay que poner en el backporch, frontporch, pulso de sincronismo, etc, que hagan que un modo de video de 800x600 a 31,25kHz / 50Hz se vea bien en cualquier monitor que soporte esa resolución, me temo que el que quiera una salida VGA garantizada, tendrá que tirar de un conversor TV-VGA de los de DealExtreme. El scandoubler tal y como lo he pensado, se puede dejar, y si tienes la suerte de poseer un monitor que acepte esta señal no estándar, pues eso que te ahorras.


Bueno si de tus 10 monitores ha funcionado en 6 tampoco está tan mal la cosa, el 60% de los usuarios no se tendrán que comprar ningún conversor para verlo en VGA.

Otra cosa que se puede hacer es emplear los timings del Spectrum NTSC para tener 60Hz de refresco vertical, pero claro esto sería incompatible con muchos juegos y casi todas las demos.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: Pruebas scandoubler para ZX-Uno

Mensajepor mcleod_ideafix » 17 Oct 2014, 01:59

antoniovillena escribió:En algunos sitios dicen que el problema es que no todos los monitores aceptan 50Hz porque es una frecuencia muy baja. Creo que podrías probar una señal con 55Hz o algo parecido

Sí. Después de haber leído esto...
http://www.questronix.com.au/info/info_videotovga.htm
... se me ha ocurrido crear un modo de 800x480 que use la misma frecuencia horizontal, 31.25kHz, pero unos 63Hz en la vertical... y ese modo sí lo ha soportado uno de mis monitores que no pillaba nada que no fuera estándar.

Así que se confirma que el problema está en la frecuencia vertical. Subir esa frecuencia significa subir todos los relojes. Por ejemplo, si subimos de 50 a 56Hz de refresco vertical, todos los demás timmings deben subir de forma acorde: la frecuencia de refresco horizontal pasaría de 15.625kHz a 15.625 * 56/50 = 17.5 kHz, lo que en el scandoubler nos daría unos bonitos 35 kHz. El modo de pantalla sería SVGA 800x600 56Hz V, 35 kHz H, que es clavadito a uno de los modos estándar.

La ULA en este modo tendría que seguir contando hasta 448 pero esta vez no en 64us, sino en 1 / 17.5kHz = 57.14us, lo que da un reloj de pixel para los modos estándar de 448*17.5kHz = 7.84 Mhz, y dado que la frecuencia de la CPU es la mitad que la frecuencia de pixel, tenemos un Z80 a 3,92 MHz. La frecuencia base ya no son 28MHz, sino 31.36 MHz, que *creo* que es posible generar de forma exacta con el DCM de la Spartan partiendo de nuestro cuarzo de 50MHz :)

Estamos hablando de un 12% más de velocidad, conservando los timmings relativos, con lo que los efectos multicolor, etc, siguen funcionando. Todos los juegos, estén o no sincronizados con el refresco vertical, irán más rápidos, un 12% más rápidos (diferente es cuando aumentas la velocidad de reloj de la CPU pero dejas intacto el refresco vertical: en ese caso los juegos sincronizados con el retrazo no irán más rápidos). ¿Es esta velocidad extra asumible?

la ventaja de tener a todos los timmings ligados es que basta con aumentar la velocidad de reloj del reloj maestro, el de 28MHz, para que todos los relojes aumenten a su vez. Así, implementar el modo VGA consiste en hacer que las salidas RGB vengan del scandoubler en lugar de la salida RGB PAL, y además cambiar los valores del multiplicador / divisor del DCM para que generen el nuevo reloj (28MHz o 31.36MHz) PEEEEEERO hay una cosa que no podemos olvidar: el tiempo de acceso a la SRAM siguen siendo 35ns, y un aumento del 12% en la velocidad de acceso a esa memoria, dado lo ajustados que están los tiempos en la máquina de estados que emula la memoria de doble puerto con ella, podría hacer que dejara de funcionar de forma fiable.

-- Actualizado 17 Oct 2014, 01:25 --

mcleod_ideafix escribió:La verdad, salvo que encontremos los números "mágicos" que hay que poner en el backporch, frontporch, pulso de sincronismo, etc, que hagan que un modo de video de 800x600 a 31,25kHz / 50Hz se vea bien en cualquier monitor que soporte esa resolución...


A lo más que me he acercado es a esto: 800x600. 31.25kHz H, 53.42Hz V. El monitor rebelde de casa lo pilla. Supone un incremento del 6,84% de velocidad. La CPU por ejemplo iría a 3.74MHz. El reloj maestro pasaría a ser de 29,9512 MHz, que probablemente pueda redondear a 30MHz (en este caso, mejor redondear a más que a menos) :)
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Pruebas scandoubler para ZX-Uno

Mensajepor antoniovillena » 17 Oct 2014, 02:29

Yo había hecho todas las cuentas comparando con 60Hz en vez de 50, por eso me salía una velocidad de CPU más baja. A ver si hay suerte y no da fallos la SRAM. La carga en cinta estándar no debería dar problemas, si acaso puedo añadir alguna opción en todas las utilidades que tengo (CargandoLeches, Gentape, Tap2Wav) para generar WAVs/TZXs acordes a 3.92Mhz.

-- Actualizado 17 Oct 2014, 01:33 --

mcleod_ideafix escribió:A lo más que me he acercado es a esto: 800x600. 31.25kHz H, 53.42Hz V. El monitor rebelde de casa lo pilla. Supone un incremento del 6,84% de velocidad. La CPU por ejemplo iría a 3.74MHz. El reloj maestro pasaría a ser de 29,9512 MHz, que probablemente pueda redondear a 30MHz (en este caso, mejor redondear a más que a menos) :)


Pues mucho mejor, has reducido el desvío a casi la mitad. Esto creo que ya no es apreciable por nosotros y esperemos que tampoco para la SRAM. Para las cintas aparte de las estándar funcionarán las turbo normales.

Avatar de Usuario
DistWave
Atari 1040 STf
Atari 1040 STf
Mensajes: 750
Registrado: 15 Ene 2011, 09:08
Sistema Favorito: PC
primer_sistema: PC
consola_favorita: Nintendo SNES
Primera consola: Atari 2600
Ubicación: Zaragoza
Gracias dadas: 3 veces
Gracias recibidas: 58 veces

Re: Pruebas scandoubler para ZX-Uno

Mensajepor DistWave » 17 Oct 2014, 10:59

Me encanta ver un monitor PS/1 por ahí :D Eso si, el mio no hay forma de que muestre más de 640x480... (y además tiene algún componente tocado, hasta que no se calienta no pilla sincronía vertical salvo a 640x480)

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: Pruebas scandoubler para ZX-Uno

Mensajepor mcleod_ideafix » 17 Oct 2014, 23:47

mcleod_ideafix escribió:A lo más que me he acercado es a esto: 800x600. 31.25kHz H, 53.42Hz V. El monitor rebelde de casa lo pilla. Supone un incremento del 6,84% de velocidad. La CPU por ejemplo iría a 3.74MHz. El reloj maestro pasaría a ser de 29,9512 MHz, que probablemente pueda redondear a 30MHz (en este caso, mejor redondear a más que a menos) :)


Nueva mejor aproximación: mismos parámetros que el scandoubler original, pero subiendo el reloj de video a 29MHz (en lugar de los 28MHz originales). Esto supone un incremento de velocidad del 3,57% . La velocidad del Z80 sería de 3,625MHz. En dos pantallas TFT que tengo aquí, se lo traga y se ve perfectamente. Tengo una tercera pantalla que intentaré probar en breve...
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 18 invitados