Añadir un segundo TMS9918A al MSX ganando una salida VGA de rebote

Por Palver

Rookie (21)

imagem de Palver

09-10-2019, 18:04

Siempre me han interesado las FPGA’s, se dice de ellas que pueden hablar de tú a tú con los ordenadores más rápidos sin despeinarse. Hace unos meses que tengo una placa de desarrollo, y qué mejor forma de aprender que empezar a jugar con trozos de MSX. En este caso, el TMS9918A (equivalente a nivel de registros a nuestro TMS9929A, sólo cambia la salida de video). Buscando por internet es fácil encontrar alguna versión en lenguaje VHDL. En este caso, vamos a jugar con el diseño de Speccery en github.

El objetivo es tener un TMS9918A con al menos la funcionalidad principal del circuito original, y este tiene buena pinta: Screen 0, 1 y 2, sprites, algunas funciones no documentadas y salida VGA.
Depurar todo un chip de video no es fácil. Una vez que el circuito empieza a dar señales de vida, se puede ir cambiando a mano el valor de los registros, ir dando valores a posiciones de la VRAM, de una en una, pero para hacer pruebas en condiciones hay que conectarlo a algún entorno programable. Y qué mejor entorno que un MSX.

La idea es esta: cualquier dispositivo conectado al bus del MSX puede escuchar las conversaciones entre los dispositivos que estén conectados. Una de esas conversaciones es la que tiene la CPU con el chip de video. Si ponemos a nuestro TMS sintético escuchando en el mismo puerto que el original (en un MSX1 direcciones &H98, &H99), los dos recibirán la misma información y la salida de video debería ser la misma. La única diferencia es que, a la hora de leer, sólo puede responder uno.

https://drive.google.com/open?id=1oiZ9qnNfDMVVYYpuCeDeYqdlg1...

Manos a la obra. Estas son las conexiones necesarias.
https://drive.google.com/open?id=1LUTuA3GyaQ93OkDdKd23ia1xol...
Las FPGA’s modernas no pueden trabajar con voltajes de 5V, así que hay que poner un adaptador, en este caso un par de buffers 74LVC245. Para no tener que usar un tercer buffer, se decodifica sólo una parte de la dirección: en vez de usar los pines A0..A7, se usan A0, y A4..A7. Como en mi MSX1 en el rango &H9X sólo está el VDP, no hay problema.
El SVI-728 tiene un puerto trasero del que es fácil sacar los pines.

https://drive.google.com/open?id=1IA6K5P62eQqN-_gVkCt3iC-_H2...

Después de afinar el diseño y corregir bugs, este es el resultado:

https://drive.google.com/open?id=1YoFMSMXg5h0DX_gPt9vXsbhuu-...
https://drive.google.com/open?id=1PzZ-C3r0HUo4nra9-lohZSWKg2...

Lo primero que llama la atención es lo bien que se ve la señal en el monitor VGA. Acostumbrado al viejo tubo de rayos catódicos, con el ruido del modulador de RF, es un lujo ver los píxeles quietos y con colores limpios. Una de las ventajas de este diseño es que durante todo el proceso se trabaja con señales digitales, con lo que la señal de salida es limpia.
Ahora es más fácil seguir haciendo pruebas con el chip. Sólo hay que buscar diferencias entre las dos salidas. Por ejemplo, los sprites están habilitados en el modo Screen 0 y eso no es correcto. Tampoco funciona el modo Screen 3. Algunas demos dejan ver problemas con el puntero de la VRAM. Y otros clásicos se ven muy bien.

https://drive.google.com/open?id=1GxPG706L6QzdKJNm__4SkBXf7P...
https://drive.google.com/open?id=1xZn18kShpIV4WS20daGXnjWAQX...

Aparte de para depuraciones, sacar la señal de video del slot es una forma relativamente fácil de tener una salida VGA (y pronto HDMI) sin tener que usar adaptadores. Otro uso que se le puede dar es el de dar salida de imagen a un equipo que tenga rota la parte analógica de video de su MSX, pero en el que todavía funcione la parte digital (si no hay imagen, pero se enciende y apaga CAPS-LOCK).

Los problemas son dos. Primero, se depende de que la implementación en VHDL sea buena. Y segundo, se pierde un slot.

Una pregunta a los conocedores: ¿alguien sabe de otras buenas implementaciones (públicas) del TMS9918A en VHDL/ VERILOG?

Entrar ou registrar-se para comentar

Por erpirao

Paladin (961)

imagem de erpirao

09-10-2019, 22:54

creo que está el f18A, no? que es un 9918 hipertuneado.

Por Palver

Rookie (21)

imagem de Palver

10-10-2019, 06:50

erpirao wrote:

creo que está el f18A, no? que es un 9918 hipertuneado.

Sí, pero creo que los fuentes no son públicos, o al menos no los he encontrado.

Por mohai

Paladin (841)

imagem de mohai

12-10-2019, 10:55

Hola.
Me parece muy interesante lo que estás haciendo.
Tengo una curiosidad: ¿Cómo se consigue que la señal de salida de vídeo se pueda ver en un monitor VGA?
En principio, la velocidad de refresco horizontal del VDP no es la misma que la de VGA. En principio, no es compatible.

Por Palver

Rookie (21)

imagem de Palver

12-10-2019, 11:48

Gracias mohai,

lo que he visto en el código de Speccery es que hay un buffer intermedio. Las líneas se van componiendo y se escriben en el buffer, y la vga va leyendo el buffer para generar la salida, cada uno a su ritmo.

En los juegos que he probado no se ven artefactos ni cosas extrañas, pero en las demos que juegan a escribir la vram a ritmos altos, falla. Por eso busco algún diseño más preciso. A mí, que soy un novato, me parece un problema bastante complicado.