NES para sistemas Arcade

De WikiNES-77
Saltar a: navegación, buscar

La idea (Introducción)

En donde trabajaba teníamos una competición de Super Mario Bros en su versión arcade (Unisystem VS). Como mi record era pequeño decidí entrenar usando una versión en mi casa. Después de jugar unos pocos minutos decidí que había muchas diferencias entre ambas versiones.

En la versión arcade hay menos setas, flores y vidas extras. Esto se suele reemplazar por monedas o por nada. Algunos mostruos cambian y hay más precipicios. Por culpa de esto hay niveles muy diferentes. Como no me gustaba usar el emulador decidí hacer un mod a la consola NES. Con esto, los juegos arcades podrían correr allí. Podría también hacer un cartucho pero es más divertido modificar la consola y de paso con esto aprendo más.

El resultado: Una consola VS. del Super Mario Bros sin un cartucho (no habrá contactos malos) y con botones en el frontal para cambiar ciertos aspectos del juegos (con una versión de los dip del arcade). En los siguientes puntos verás fotos y explicaciones de como obtener estos resultados. Todo es electrónica...


Diferencias entre la consola y la versión arcade

Para compararlas, aquí hay unas fotos: Consola VS Arcade


La placa arcade del Unisystem VS es como dos NES con la misma placa sin cartuchos (las roms están en la placa).

Algunas cosas que tienen en común la NES y el Unisystem:

  • Tienen la misma CPU. (La 2A03 es una 6502 modificada)
  • El PPU es un registro compatible.
  • Mismo mapa de memoria.
  • Los botones del mando son iguales.


Algunas diferencias:

  • La paleta de colores de la PPU es diferente. La NES usa una PPU 2c02. El Unisystem otra PPUs como las 2c03, 2c04 o 2c05. Todo esto provoca diferentes paletas de colores (creo que la 2c02 y la 2c03 son similares).
  • La PPU del arcade tienen salida RGB.
  • La placa base del arcade tienen botones dip para configurar el juego (número de vidas, créditos por moneda...).
  • El unisystem tiene un conector para aceptar monedas.
  • Los dos sistemas en la placa base Unisystem pueden comunicarse.
  • El Unisystem no tiene un chip CIC.

La arquitectura NES es un poco mas flexible. El cartucho puede tener componentes adicionales para permitir el uso de roms mas grandes o memoria adicional, dependiendo de los requerimientos del juego.

Esto no es posible en un Unisystem porque las roms están instaladas directamente en placa. Los juegos deben usar los recursos de la placa. Aquí está lo que hay disponible:

  • ROM programable de la $8000 a la $FFFF. (como la NES)
  • Memoría adicional de la $6000 a la $7FFF. (algunos juegos de NES permiten esto)
  • 2x16Kb ROM para la PPU, se puede seleccionar por la CPU usando una salida extra. (posiblemente ningún juego de NES usé esto)
  • Hay 4Kb de memoria instalada para el PPU en vez de 2Kb. (algunos juegos de NES permiten esto)


Desactivar el chip CIC

Mirar aquí.


Memoria adicional para la PPU

Como he dicho anteriormente, debería de haber una PPU de 4kb. El chip de memoria (U4) debe ser reemplazado por otro más grande.

El pin de salida usado por diferentes chips de memoria es usualmente similar. Esto nos permite soldar otro mayor donde estaba, con un número mínimo de cables y pines. La linea de dirección adicional A11 debe de ser conectada a la PPU por el pin #27. Si usas un chip mayor de 4Kb, conecta todos los pines sobrantes a tierra o a VCC.

En una placa base 486 encontré un As7c256 32K SRAM chip. Para asegúrate de no cometer equivocaciones hice un diagrama para comparar los pines a la memoria de 2Kb (LH5216) con este nuevo chip.


Memoria adicional para la CPU

El Unisystem da 2Kb de memoria adicional a la CPU. Pillé el chip de 2Kb (LH5216) que quité de la PPU en el pasó anterior y lo soldé justo debajo de la otra memoria CPU (U1) doblando todos los pines adyacentes.

El pin del CE no está soldado desde esa memoria así que había que hacerlo accesible desde $6000 y la $7FFF. El pin#7 del 74ls139 presente en la placa base de la NES ayuda a estar por debajo de este rango por lo que conecte a la memoria adicional el pin del CE.

Nesvscpu extraram.jpg


ROM para la CPU (PRG-ROM)

El Unisytem VS usa 4x8Kb rom para la CPU (PRG-ROM). No quise instalar 4 socket y cientos de cables por lo que decidí usar una eprom de 32Kb. Para su mejor instalación solo soldé en la parte superior de la memoria del chip de la CPU (U1). La señal del /CE esta conectada al pin#3 al 74ls139 (U3) por lo que la rom es accesible desde $8000 a $FFFF.

Como la anterior vez usé un diagrama para comparar los pines. Ten cuidado con este diagrama es para una eprom 27128 (16K) en vez de una 27256. En una 27256, el pin #1 es A14 y en el 27128, el pin #1 es VPP.


ROM para la PPU (CHR-ROM)

El Unisystem tiene 2x8Kb roms para la PPU. EL pin#37 de la CPU controla que rom se usará. Para ahorrar el cableado y no usar dos socket decidí usar una eprom 16kb. Para esto conecté el pin#37 de la CPU al A13. La señal de la CE esta conectado a la señal A13 de la PPU directamente.

Soldé la ROM a la parte superior de la memoria de la PPU. Otra vez usé otro diagrama para comparar la rom con los pines de la memoria.


Cableado adicional debido a la ausencia del cartucho

  1. La señal de la memoria CE usualmente se controla desde la señal A13 (invertida por U9, pines 5 y 6) y que pasa a través del cartucho. Esto permite un cartucho tener su propia memoria PPU deshabilita la memoria interna. Como no tenemos ningún cartucho con los contactos #58 (CHR/A13) debe estar conectado al contacto #57 (ciram CE).
  2. La señal que va de la memoria de la PPU no viene directamente a la PPU. Va al cartucho también. Para conectar la señal A10 a la PPU A10 o A11, el cartucho puede elegir entre hacer mirroring vertical y horizontalmente. Al tener una memoria de 4Kb, esto no se puede hacer. Para hacerlo solo hay que conectar la #62 (CHR A10) al contacto @22 (CIRAM A10)


Botón para insertar monedas

El Unisystem tiene una entrada normalmente conectada a un aceptor de monedas. Electrónicamente la moneda es similar al botón.

El monitor del juego en el bit5 en la dirección $4016 (la misma dirección que el primer mando) para pulsos del aceptor de monedas. Cuando la dirección $4016 es leída, el pin de la CPU #36 baja y el 74hc368 (U7) toma el control de algunas señales de datos en el bus. D5 sin embargo se queda en suspenso.

En orden para seguir con el D5, podemos usar una puerta de repuesto para U7. Corta la pista que conecta el pin#6 a tierra e instala una resistencia pull-up de 10k allí. Ahora conecta el pin a un switch (o a un aceptor de monedas real) que se conectará a tierra cuando sea presionado. Finalmente, conecta el pin 7 del U7 a la señal D5 de la CPU.

Coin button.jpg

Aquí hay una foto explicando esos pasos. Consulta el Unisystem VS y los circuitos internos de la NES para más detalles.


Botones DIP

La placa Unisystem tienes botones dip para configurar los parámetros del juego. El juego puede leer esos botones usando las direcciones $4016 y $4017, un bit por botón. Aquí hay una tabla que muestra que bit y dirección es usada para cada botón, donde podemos conectarlos y ver que hacen en el Super Mario Bros VS.

Dip Dirección Bit Punto de conexión Función
Dip 1 $4016 Bit 3 P4, pin #7 Fija el ratio monedas/créditos: 3/1, 2/1, 1/1, 1/2, 1/3, 1/4, 1/5 o juego libre
Dip 2 $4016 Bit 4 P4, pin #6
Dip 3 $4017 Bit 2 U8, pin #10
Dip 4 $4017 Bit 3 P5, pin #6 Vidas de un nuevo juego 2 ó 3.
Dip 5 $4017 Bit 4 P5, pin #7 Número de monedas que se requieren para obtener una nueva vida.
Dip 6 $4017 Bit 5 Usa un buffer que está en un tri-estado cuando el pin #35 de la CPU no esta pulsado y se conecta a la salida de los pin D5, D6 y D7 de la CPU. Usé un 74ls125 pero un 74ls244, 74ls240 o 74hc368 de otra NES debería de funcionar también.
Dip 7 $4017 Bit 6 Velocidad del tiempo. Lento o Rápido.
Dip 8 $4017 Bit 7 Vidas después de continuar. 3 ó 4.


Para parámetros que usan más de un switch, usé un botón rotatorio. Circuitos de simples diodos convirtiendo el botón de salida a binario. Para tener suficiente espacio para todos esos botones en el panel frontal tuve que cortar un poco el plástico.


Patch para la paleta

La PPU usada en la versión arcade del Super Mario Bros (2c05) no es la misma que la de la NES. Ellos son compatibles pero la paleta es diferente. En las fotos se ve una versión arcade en una PPU de una NES (2c02).

Nesvssuprmrio vsOnNes4.jpgNesvssuprmrio vsOnNes0.jpg

Los registros de la PPU van desde del $3f00 al $3f1f (con una copia del $3f00 al $3fff) que mantienen los 16 colores para el fondo y los 16 colores para los sprites. Cada byte representa un número del color Sus significados difieren entre las diferentes PPU. Ejemplo: Color $1a en una 2c05 es azul mientras que en una 2c02 es verde.

Para corregir este problema, cree un patch que asegura poner los colores adecuados de la PPU. Para hacer esto:

  1. Convertí el ROM del Unisystem a un .NES en orden para permitir usarlos con emuladores y debuggers (NOTA: Usé la mapper 99)
  2. Usé No$NES (un debbuger de NES) para encontrar la subrutina que transfiere la paleta a la PPU. La subrutina empieza en la dirección $914a. Cuenta con un indicador (localizado en $0000) para transferir la estructura. Esta copia de la estructura contienen el destino de la dirección de la PPU, la longitud de la copia y de los datos.

El funcionamiento de la subrutina es:

  • Enviar la dirección de destino a la PPU.
  • Enviar todos los datos a la PPU.
  • Volver
    Nesvs3014209.png
  1. Encontré lo que creía que era una espacio en blanco en la ROM (todos los $FF durante 148 bytes) suficientemente grande como para tener mi código de conversión de paleta. Usé una tabla de conversiones del AdvanceMame mirando el código fuente.
  2. En la copia de la subrutina, inserté un salto (JMP) a mi código antes del bucle de copia. En la copia de la subrutina no sólo copia datos sino que además chequea que el destino de las direcciones. Si no está en el rango de la paleta salta a una copia normal. Si el destino está en el rango adecuado entonces mi bucle se ejecutará. Todo los datos se copian y se corrigen al vuelo usando la tabla de conversión.

Aquí hay una foto del juego antes y después de aplicar mi patch:

Nesvsssuprmrio vsOnNes6.jpgNesvscaptu013.jpg


Como aplicar mi patch:

  • Aquí hay un archivo que debes de reemplazar en la dirección $159C en el fichero mds-sm4.1d: fix_palette.bin
  • Lo siguiente, en mds-sm4.1d, reemplaza los 3 bytes $4A $4A $AA (lsr A, lsr A, txa) en las direcciones $116B por $4C $9C $95 (jmp $959c).
  • Aquí está el código fuente. Usé wla dx para poderlo usar en Linux: fix_palette.asm


Combinando las roms

Las roms de del unisystem vienen en archivos separados, justamente como las EPROMs de una placa base real. Al usar solo una EPROM, debo combinar todas los archivos de la rom en una. Es fácil, pero los ficheros tienen que estar unidos en un determinado orden.

Si te fijas en el Unisystem VS, verás que los roms están mapeados en la memoria como esto:

  • 1D: $8000 a $9FFF
  • 1C: $A000 a $BFFF
  • 1B: $C000 a $DFFF
  • 1A: $E000 a $FFFF

Esto significa que tienen que estar combinados en el orden D,C,B,A. Aquí está una forma de hacerlo en Linux:

  • cat mds-sm4.1d > mds-sm4.bin
  • cat mds-sm4.1c >> mds-sm4.bin
  • cat mds-sm4.1b >> mds-sm4.bin
  • cat mds-sm4.1a >> mds-sm4.bin

El mismo concepto se aplica a la roms de la PPU: 2B viene primero, luego 2A


Recursos

Cuando escribí este artículo, vi estos documentos y webs muy interesantes:

Documentos:

Links:


Resposabilidad

No puedo ser responsable de posibles daños que pudieran ocurrirte a ti o a tu equipo mientras haces algo de esta página. Además, NO DOY NINGUNA GARANTÍA de la corrección o de la usabibilidad de la información de esta página. Tengo que decir que todo el procedimiento ha funcionado en mi caso sin problemas o daños.

Ahora no puedes decir que no te avisé si algo va mal.



Agradecimientos: Texto extraído de aquí (2007-04-19).