Er "monstruo" del Quest ataca de nuevo, con un core para NES

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Er "monstruo" del Quest ataca de nuevo, con un core para NES

Mensaje por mcleod_ideafix » 28 Sep 2015, 03:17

Pues eso, que Quest lo ha vuelto a hacer. Enlace original al post de Zona de Pruebas:
http://www.zonadepruebas.com/viewtopic. ... =20#p59799

:D :D
Bueno, esta vez voy a poner primero la foto :mrgreen:
Pero ya adelanto que no es "tan bonito como lo pintan", hay limitaciones importantes y pegas, que explico luego:

Imagen

¡La NES en el ZX-UNO! :D

Este port ha sido algo algo más difícil, y además para cargar juegos hay que hacerlo mediante un programa por puerto serie (luego lo explico). Además los juegos han de ser pequeños. Por eso decía antes, que "no es tan bonito como lo pintan" y como prueba de momento está bien, pero requeriría de un cargador de roms por SD y también del uso de la SRAM en vez de la BRAM de la FPGA para cargar juegos más grandes. Más abajo pongo un link de descarga con lo necesario para ponerlo en marcha, por si alguien tiene el material necesario y quiere probar.

El port se ha basado en el core de NES FPGA de Brian Bennett (https://github.com/brianbennett/fpga_nes), que está en Verilog. Originalmente escrito para un xc6slx16 BGA y otros ports para xc6slx45 que aún es más grande. En el nuestro (lx9) cabe justito justito. Además del habitual remapeo de pines y algún pequeño ajuste, ha habido que hacer algo para manejar los juegos, ya que el código original espera que conectemos un mando original de NES a la placa. Un usuario que lo portó a Pipistrello, puso una especie de wrapper para manejarlo con pulsadores en placa (algo incómodo ;)), y lo he readaptado para manejarlo con un mando norma Atari para poder conectarlo en nuestro ZX-UNO. Además con un mando de 2 botones (como el de Master System) podemos usar los botones A y B. Los de start y select de momento los he mapeado al conector de expansión, poniendo unos pulsadores, sirve para empezar los juegos, ya que no se usa mas que para eso.

Por otro lado, a pesar de que el original saca señal VGA, lo hace de una forma extraña, con 3 bits por color salvo en el azul, que solo usaba 2. Eso hacía que se viera todo verdoso-amarronado, ya que la paleta que pusieron originalmente está hecha para adaptarse a ese curioso modo. Lo que he hecho es adaptarlo para que use 3 bits también en el color azul, y he rehecho completamente la paleta, usando como base los valores que encontré aquí (http://www.thealmightyguru.com/Games/Ha ... ES_Palette) y adaptándolos a 3 bits redondeando por arriba o por abajo según he comprobado la cercanía de los colores. Además he aprovechado para quitar el verde-caca que tenía el borde y cambiarlo por negro.

La primera foto que he puesto es con la paleta ya arreglada y "los bits en su sitio" :D Aquí debajo pongo otra de cómo se veía antes (es con el móvil y no consigo que se vea como yo lo veo en vivo, pero para haceros la idea de cómo se veía):

Imagen

Detalles a tener en cuenta:

- Como comentaba antes, el tamaño máximo de juegos .nes que está admitiendo ahora mismo es de 41kb, debido a la limitación de la memoria BRAM interna de la FPGA, ya que este core no usa ningún tipo de memoria externa.

- Para cargar los juegos, hay que disponer de puerto serie en el ordenador + conversor de niveles, o bien un USB->serie de esos que se suelen usar para programar los arduinos y demás. Yo me tiré un par de horas probando con uno de estos últimos y la transmisión daba muchos errores, así que acabé usando el puerto COM real del ordenador y un MAX3232 para conectarlo al ZX-UNO. Como el código original traía el puerto COM fijado al 5, yo he compilado 5 ejecutables del cargador, para los que tengan puertos COM numerados del 1 al 5.

Para hacerlo funcionar en el ZX-UNO:

- Descomprimir el NES_ZXUNO.zip en una carpeta
- Meter el bitfile a la FPGA (o el mcs para la flash)
- Enchufar un joystick de Master system preferiblemente (o un norma atari con 2 botones compatible)
- Enchufar la plaquita VGA al conector J8 y conectarlo a un monitor VGA normal. (no va por vídeo compuesto, sólo VGA de momento)
- Enchufar el jack de salida de audio a unos altavoces (sólo se oirá por un lado)
- Colocar, según la imagen que adjunto aquí debajo, los pulsadores para START/SELECT en el puerto de expansión y los cables RX/TX del puerto de expansión al puerto serie del ordenador (vía coversor de señales o adaptador USB->serie que funcione bien):

Imagen

Ahora, a funcionar:

- Con todo conectado (sobre todo revisar la conexión RX/TX al puerto serie), enchufar el ZX-UNO. Saldrá en el monitor una pantalla gris con borde negro.
- Ahora, según número del puerto serie que tengáis (x = COM1, COM2, COM5...), ejecutad el cargador de roms de la carpeta RomLoader (nesdbg_COMx.exe)
- Si todo va bien, el loader reconoce la FPGA y saldrá una ventana con 2 menús (file y tools). Si da error, algo tenéis mal puesto.
- Vamos a File -> load ROM y elegimos una ROM de NES de la carpeta "roms" que he incluido (también las incluye el repositorio original, de hecho el incluye más, teneis un TXT con los compatibles en la carpeta "roms")
- Si todo va bien, tras finalizar la barra de progreso, ya tendréis el juego funcionando en el ZX-UNO :)

Descarga:
NES_ZXUNO.rar
(594.75 KiB) Descargado 335 veces
Bueno, pues de momento eso es todo.

Mis conocimientos por el momento no dan para hacer nada más usable en este port (en todo caso adaptarlo para usar un pad de megadrive y poder usar el botón Start en vez de un pulsador)

Cuando organice todos los fuentes de todo y los uba todo al repositorio (voy a necesitar días), a ver si alguien más entendido de los que estáis por aquí puede al menos intentar usar la SRAM en vez de la BRAM para cargar juegos más grandes. También intenté incorporar una ROM en el propio bitstream haciendo un BMM para inyectarla pero no lo he conseguido. Creo que trabajando un poquito en él, puede ser una pasada. Tiene la ventaja de que está escrito en Verilog :D

El port que hay para xc6slx45 (Pipistrelo) es mejor porque la FPGA es bastante más grande, y han implementado la carga por SD (de un unico juego, eso sí) metiendo para ello un core Microblaze en la FPGA (matar moscas a cañonazos, diría yo). De hecho cuando probé a portar "eso", vi que ni siquiera el Microblaze solo cabe en nuestra Spartan, es más, creo que no cabe ni la mitad :roll: así que preferí portar uno que al menos funcionara en el ZX-UNO. Creo que lo mejor para un cargador SD, es hacerlo directamente usando la CPU de la NES.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder