Nuevo core: Nintendo NES (II)

Avatar de Usuario
DistWave
Mensajes: 183
Registrado: 14 Oct 2015, 19:24
Ubicación: Zaragoza

Nuevo core: Nintendo NES (II)

Mensaje por DistWave » 08 Ene 2016, 21:08

Como os habéis portado muy bien, los reyes magos os traen hoy otro regalo más: una versión preliminar del nuevo core de NES :mrgreen:

Este core es distinto al que portó Quest inicialmente y está en un estado más avanzado, soporta varios mappers que mejoran la compatibilidad. Me ha costado bastante tiempo porque no había tocado Verilog hasta ahora, pero como mi principal objetivo es aprender... pues sarna con gusto no pica. :lol:

El core sólo soporta salida VGA y utiliza timings poco rigurosos, es posible que de problemas en algunos monitores. En el que uso por ejemplo no funciona correctamente el control de auto ajuste de imagen y tengo que centrar la imagen a mano.

Como añadido, el core viene con dos filtros de imagen: el core original de NES lleva de serie un filtro HQ2X que "despixeliza" la imagen. A mi no me gusta el resultado pero como hay espacio en la FPGA lo he dejado, con la posibilidad de activarlo o no desde el módulo de control. He hecho lo mismo con el fitro de scanlines que trae el módulo de control.

El core utiliza el reloj de la NES NTSC, por tanto funcionan correctamente las ROMs USA. Las ROMs PAL van más rapido de lo que deberían.

Lo que se ha hecho, a grandes rasgos, ha sido:
- Adaptar el core para utilizar los 512 KB de SRAM del ZX-UNO. Se ha dividido la memoria en 2 bancos de 256 KB, uno para PRG_ROM y otro para CHR_ROM. Por tanto, las ROMs que utilizan más de 256 KB para CHR o PRG no funcionan. Evidentemente cualquier ROM mayor de 512 KB tampoco.
- Eliminar el cargador de ROMs via UART
- Añadir y adaptar el modulo de control de Retro Ramblings, que permite cargar roms de la SD, activar los filtros del core y activar los botones Start y Select.
- Adaptar el puerto de joystick al joystick 1 del core.
- Eliminar la parte del codec de sonido y añadir un conversor sigma delta

Lo que falta por hacer o mejorar:
- Velocidad de carga: ahora mismo las roms se cargan a una velocidad similar a la carga por UART porque si acelero la carga se producen errores. Tengo que investigar la causa.
- A veces, tras cargar varias roms, el mecanismo de carga empieza a fallar. Hay que recargar el core para solucionarlo.
- Añadir soporte de teclado fuera del módulo de control, para controlar el segundo joystick de la NES.
- Guardar y cargar los datos de la SRAM de cartucho (PRG_RAM) en la SD, para no perder las partida guardada en las ROMs que lo soportan.
- Una vez esté todo funcionando se puede intentar incrementar la compatibilidad añadiendo y mejorando mappers.

Recursos utilizados en la FPGA por el momento:
Slice LUTs: 4,699 / 5,720 (82%)
Number of RAMB16BWERs: 19/32 (59%)
Number of RAMB8BWERs: 6/64 (9%)

Unas fotos del core en funcionamiento:

Imagen
Modulo de control con el filtro HQ2X activado.

Imagen
Filtro scanlines activado.

Imagen
Sin filtros

Instrucciones:
El modulo de control se maneja con el teclado: con la tecla Escape para mostrarlo u ocultarlo y los cursores, avpag, repag y enter para navegar entre las opciones.

Descarga: (el bitfile del prototipo v2 no está probado)
NES_ZXUNO_ALPHA.zip
(230.16 KiB) Descargado 290 veces

Avatar de Usuario
Quest
Mensajes: 900
Registrado: 27 Sep 2015, 00:20

Re: Nuevo core: Nintendo NES (II)

Mensaje por Quest » 08 Ene 2016, 22:02

Solo puedo decir una cosa: :plasplas: :plasplas: :plasplas: :plasplas: :mario: :lenguafuera:

En cuanto acabe de cenar lo pruebo ipso-facto, se me va a atragantar la comida :mrgreen: que currada...
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
Quest
Mensajes: 900
Registrado: 27 Sep 2015, 00:20

Re: Nuevo core: Nintendo NES (II)

Mensaje por Quest » 08 Ene 2016, 22:41

Probado con el Super Mario Bros 3, va muy bien :D tras pasarme un par de pantallas no podía parar de jugar... :silbando:

Solo 1 pequeño detalle: los controles están invertidos (botones del joystick A y B)

Ya tengo ganas de ver esos fuentes para ver cómo has hecho lo de la SRAM, que yo fui incapaz, y querría aprender :D :D
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
DistWave
Mensajes: 183
Registrado: 14 Oct 2015, 19:24
Ubicación: Zaragoza

Re: Nuevo core: Nintendo NES (II)

Mensaje por DistWave » 10 Ene 2016, 14:30

Me apunto lo de intercambiar botones A y B. Como tengo un pad de master system conectado simplemente mapeé el botón A con el 1 y el B con el 2, pero no me di cuenta de que en el pad de NES el botón A es el de la derecha y el B el de la izquierda :lol:

Avatar de Usuario
Quest
Mensajes: 900
Registrado: 27 Sep 2015, 00:20

Re: Nuevo core: Nintendo NES (II)

Mensaje por Quest » 11 Feb 2016, 12:57

Subida revisión del core para v4/v4.1 al SVN :) (con alguna mejora)

Antes de nada, agradecer de nuevo a Distwave la subida de los fuentes de este magífico port. No te haces idea de lo que estoy aprendiendo con esto :D

Como necesitaba probar todos los cores posibles en las nuevas placas v4/v4.1, al llegar a este por fin y resintetizarlo con los pineados correspondientes debo decir que funciona perfectamente.

De paso, he revisado un poco el código y me he tomado la libertad de hacer alguna mejora. Distwave, tu código original (test1) lo he dejado intacto, para no interferir, y he subido la carpeta test1_v4 con mis cambios (y preparado ya para v4/v4.1, sólo basta cambiar el UCF para otras placas).

Las pequeñas mejoras son:

1) Mejorada la velocidad de carga de las ROMs. Ahora cargan 16 veces más rápido. Encontré el problema de los fallos que daba al subir la velocidad. Simplemente era que el módulo IPCore del buffer FIFO estaba mal configurado. Estaba configurado para ser simétrico (32 entrada / 32 salida), mientras que por lo que veía en el código del módulo principal, debería ser asimétrico (32 entrada / 8 salida) había que aumentar la profundidad del buffer FIFO. A 1024/4096, parece estable y rápido. Lo he cambiado, y así he podido cambiar satisfactoriamente los divisores de reloj del buffer y del gameloader por los correspondientes, desplazando 4 bits el contador para obtener un máximo de 16x de velocidad estable. (clk_fifo y clk_gameloader).

Por tanto ahora, juegos como el Super Mario Bros 3 que cargaba en 1 minuto y 15 segundos, ahora carga en aproximadamente 5 segundos. Super Mario Bros 1, antes = 8 segundos, ahora = 0,5 segundos.

Como "efecto colateral" de este cambio, también se ha solucionado el problema de que tras cargar varias roms las cargas se corrompían. Ahora ya no lo hacen.

2) Pequeños cambios en el Firmware / OSD. No se si es una mejora o no, sólo lo he cambiado por comodidad personal: He modificado el Firmware del ZPUFlex para que 1) Tras cargar la ROM, cierre el menú OSD (evitando así una pulsación extra en el teclado para cerrarlo) y 2) He mapeado las teclas del teclado "1" y "2" para que sean los botones START y SELECT respectivamente. Funcionan con el OSD cerrado, así que nada más cargar la ROM, ahora con el OSD cerrado por defecto, pulsamos "1" (start) para empezar una partida en SMB por ejemplo.

Y por último una pequeña reorganización del módulo principal del core, simplemente he sacado módulos que estaban en el Top a archivos independientes para tenerlo más organizado (memorycontroller, gameloader).

Saludos! :chocala!:
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
antoniovillena
Mensajes: 2603
Registrado: 27 Sep 2015, 20:41

Re: Nuevo core: Nintendo NES (II)

Mensaje por antoniovillena » 11 Feb 2016, 13:33

Enhorabuena DistWave y Quest por el port del core y las mejoras. La NES es una consola mítica y por tanto este es uno de los cores más esperados. Me preguntaba si no hay un mecanismo para evitar enchufar el teclado y pulsar 1 y 2 para SELECT y START. Por ejemplo usando el tercer botón del puerto de joystick

Avatar de Usuario
Quest
Mensajes: 900
Registrado: 27 Sep 2015, 00:20

Re: Nuevo core: Nintendo NES (II)

Mensaje por Quest » 11 Feb 2016, 13:39

antoniovillena escribió:Enhorabuena DistWave y Quest por el port del core y las mejoras. La NES es una consola mítica y por tanto este es uno de los cores más esperados. Me preguntaba si no hay un mecanismo para evitar enchufar el teclado y pulsar 1 y 2 para SELECT y START. Por ejemplo usando el tercer botón del puerto de joystick
Lo tengo pendiente en la lista de cosas a mirar lo del joystick. Ten en cuenta que lo de los botones extra del joystick lo añadimos a partir de la v4, que de momento nadie más tiene. Además del 3º botón en adelante de los joysticks en la mayoría de sistemas estaba o bien multiplexado con otros botones o bien con selectores de señal (casos megadrive 3/6 botones, etc). A ver si puedo echarle un ojo al tema e intentar implementar la mayoría de estándares posibles dado que las placas finales tienen un header de 2x2 para configurar este tema :D

Además una vez conseguido el uso de más de 2 botones, no sólo se podrán usar Start y Select sino que se podrá usar el OSD de forma independiente, con un botón para abrir el osd, luego navegar por él para cargar las ROMs de la SD, cambiar settings, etc y poder cerrarlo-
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
DistWave
Mensajes: 183
Registrado: 14 Oct 2015, 19:24
Ubicación: Zaragoza

Re: Nuevo core: Nintendo NES (II)

Mensaje por DistWave » 11 Feb 2016, 13:42

Me alegro de que lo hayas mejorado, estaba seguro de que el problema de la velocidad de carga sería una tontería pero no he tenido nada de tiempo para mejorar el core desde que terminaron las vacaciones. Creo que la clave estaba en aumentar el tamaño del FIFO, la anchura del bus no puede ser simétrica porque se perderían bytes... además puse la FIFO precisamente para adaptar las diferentes anchuras de los buses, no tiene otra función ;)

Avatar de Usuario
antoniovillena
Mensajes: 2603
Registrado: 27 Sep 2015, 20:41

Re: Nuevo core: Nintendo NES (II)

Mensaje por antoniovillena » 11 Feb 2016, 13:58

Habría que atacar el asunto de forma global, no sólo para el core de NES y decidir cuántos botones extra hacen falta. Una vez definamos los botones extra necesarios buscar un sistema para multiplexarlos. La solución de la Megadrive con 6 botones sería una buena alternativa, pero podríamos usar cualquier otra y tomarla como estándar (a implementar en futuros joystick para el ZX-Uno). Y por último también hay que escoger una convención a la hora de darles funciones a esos botones, tanto en los botones de sistema (SELECT, START, etc...) como del OSD. No quedaría muy bonito que en un sistema el botón start esté en un sitio y en otro esté cambiado de sitio.

Avatar de Usuario
Quest
Mensajes: 900
Registrado: 27 Sep 2015, 00:20

Re: Nuevo core: Nintendo NES (II)

Mensaje por Quest » 11 Feb 2016, 14:06

antoniovillena escribió:Habría que atacar el asunto de forma global, no sólo para el core de NES y decidir cuántos botones extra hacen falta. Una vez definamos los botones extra necesarios buscar un sistema para multiplexarlos. La solución de la Megadrive con 6 botones sería una buena alternativa, pero podríamos usar cualquier otra y tomarla como estándar (a implementar en futuros joystick para el ZX-Uno). Y por último también hay que escoger una convención a la hora de darles funciones a esos botones, tanto en los botones de sistema (SELECT, START, etc...) como del OSD. No quedaría muy bonito que en un sistema el botón start esté en un sitio y en otro esté cambiado de sitio.
Sí, evidentemente no hablaba sólo del core de NES. La idea es universalizarlo lo posible. Creo que debemos darle mayor importancia a los mandos compatibles Megadrive (para el uso de más de 2 botones), ya que son los más extendidos, los más baratos y que se siguen fabricando/vendiendo, y además ¿quién no tiene uno en casa? Eso no quita que tratemos de implementar la mayoría de los estándares posibles, como decía antes.

Lo de escoger una convención lo doy por hecho. Todo dependerá ya de cada máquina implementada, ya que cada una es un mundo.
Distwave escribió: la anchura del bus no puede ser simétrica porque se perderían bytes
Ya... por eso cuando vi la configuración de la FIFO me extrañó muchísimo que llegase a funcionar. Pero lo hacía. Es posible que al leer el bus mucho más lentamente, por azares del destino :mrgreen: llegasen a procesarse los datos correctamente.. aun así no entiendo como conseguían no perderse bytes. Puedes comprobarlo, estaba a 32/32 ;)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder