Tipos de cartuchos de NES

De WikiNES-77
Saltar a navegación, buscar

Contenido

Introducción

He creado algunas para que el describir como funciona una NES sea más fácil. Intenté usar nombres convencionales cuando fue posible, pero no pude evitar crear algunos términos nuevos. Cuando sea posible, usare las palabras que usaba Nintendo como MMC, CHR ROM, etc.

He puesto algunos nombres genéricos para describir de forma más fácil partes de la NES.

CIRAM: Es la RAM interna de la PPU y que se encuentra situada en 0000-1FFF (2K). Es la abreviatura de "Character Internal RAM'

P-ROM: es lo mismo que la PRG ROM, o VROM.

C-ROM: lo mismo que CHR ROM.

C-RAM: equivale a CHR RAM.

Acceso a la PPU: se hace mediante A0-A13, /A13, D0-D7, /WR i /RD. A13 normalmente esta conectada a /CE de la CIRAM para así hacerla visible en las direcciones 0000-1FFF. De cualquier modo, /A13 normalmente se usa apra habilitar la C-ROM o C-RAM que hay en el cartucho (la cual se mapea en 2000-3FFF).


La CIRAM también esta relacionada con la PPU. Como se puede ver hay dos lineas de la misma para usarla. Hay muchas formas de hacerlo...


Asignación de terminales del conector del cartucho

PINS CART.PNG


Asignación de terminales del conector de expansión

PINS EXP.PNG


Asignación de terminales del conector del pad

PINS PAD.PNG


D0, D3 y D4 están conectados al bus a través de un buffer triestado 74368. La linea strobe va conectada al terminal 39 de la CPU. El terminal CLK va conectado al terminal /OE del buffer que a su vez esta conectado al terminal 35 de la CPU (36 si es el pad 2). Dentro de cada pad hay un registro de desplazamiento de 8 bits (4021). Para leer el estado de los botones hay que primero poner el pin 39 en alto y luego en bajo:

Después de esto se debería de leer $4016 (o $4017 para el jugador 2) para obtener el estado de un botón (cada lectura desplaza un bit el registro para que el siguiente bit este presente en la siguiente lectura). Algunos juegos necesitan obligatoriamente que el valor devuelto al ejecutar LDA $4016 sea o $40 o $41, esto es debido a mala programación ya que solo hay conectados D0-D4, por lo que los tres bits superiores se suponen indeterminados. Sin embargo, si se analiza detenidamente que es lo que esta pasando se puede ver porque devuelve $40 o $41. Como las entradas a los buffers triestado pasan a nivel alto a través de unas resistencias y como el buffer es inversor, se puede ver como los 5 bits más bajos serán 0 cuando son leídos. Como D4-D1 normalmente no se usan (solo los usan la pistola y el conector de expansión) y D0 es la entrada de datos del pad, los 5 bits más bajos serán o 00000b o 00001b, dependiendo de si el botón esta pulsado (1) o no (0). Así pues, ese hecho solo se preocupa por D0-D4 ya que D5-D7 no están relacionados con la lectura del pad y por lo tanto no deberían de leerse, pero por lo visto al leerse se obtiene "010xxxxxb" (donde xxxxx es la parte del pad). Terminaremos de entender lo que pasa si analizamos los opcodes (codigos de operación) que el procesador ejecuta:

8100: $A9 ;opcode para LDA
8101: $16 ;bit bajo de la dirección
8102: $40 ;bit alto de la dirección

Como se puede ver, el ultimo byte que se pone en el bus de datos justo antes de que se pueda leer es $40 - el mismo valor que se ve cuando se lee el pad!. Esto es así debido a que las capacitancias de la linea de datos "guardan" el ultimo valor que había en ellas. La prueba de esta afirmación es bastante sencilla. En vez de ejecutar LDA $4016 , ejecutemos un LDA indirecto:

8100: LDA #$16
8102: STA $80
8104: LDA #$40
8106: STA $81
8108: LDA ($80)

Como este modo de hacerlo necesita más sitio en memoria y más ciclos para ejecutarse que un simple LDA $4016, el método indirecto no se usa. Eso si, puede ser usado para detectar si el programa esta siendo ejecutado en un emulador o no ;-) El modo correcto para leer el pad es:

8100: LDA $4016
8103: AND #$01

Esto se deshará de todos los bits inválidos y anulara cualquier posibilidad de error. El modo en que *yo * leería los pads sería este:

8100: LDY #$08 ;numero de repeticiones
8102: LDX #$01
8104: STX $4016 ;pongo a 1 el " strobe "
8107: DEX
8108: STX $4016 ;pongo a 0 el "strobe"
810B: LDA $4016 ;leo el botón
810E: ROR ;lo transfiero al bit de acarreo.
810F: TXA
8110: ROL
8111: TAX ;roto a la izquierda X, guardando el bit en la posición más baja.
8112: DEY
8113: BNE 810B ;repito 8 veces para leer los 8 botones.
8115: RTS ;devuelvo el acumulador con el estado de los 8 botones.

Este trozo de código primero hace que se "congelen" los valores de los botones pulsados, entonces recoge el estado del primer botón y el efecto de la rotación queda registrado en el bit de acarreo. Después, el registro X, se transfiere al acumulador de modo que que el valor del botón pueda ser desplazado en el. Luego se devuelve a X, y el registro y se decrementa en una unidad. Todo este proceso se repite 8 veces para crear un byte a partir del estado de los 8 botones.


Asignación de terminales en los mappers MMCX

El tipo de señales aparece entre paréntesis:


MMC 1

Utiliza encapsulado de 24 PIN DIP. Tiene varias variantes: MMC1, MMC1A, MMC1B2, etc

PINS MMC1.PNG


MMC 2

Utiliza encapsulado de 40/42 PIN DIP. Los pins marcados con X son opcionales y solo se usarían si el chip tuviese 42 terminales en vez de 40. Sólo existe una variante MMC2 RD387-001

PINS MMC2.PNG


MMC 3

Utiliza encapsulado QFP de 44 PIN. Hay 3 variantes: MMC3A, MMC3B y MMC3C.

PINS MMC3.PNG

Notas:

- *n el Gauntlet no se usa.

- *1: Hay veces que el pin 1 y 2 están unidos entre si, en caso contrario el pin 1 queda sin conectar

- *2: Hay veces que el pin 16 va conectado a masa y otras en las que simplemente esta "al aire". Parece ser que los pins 1,2 y 16 están relacionados entre si; si el 1 y el 2 están cortocircuitados entonces el 15 y 16 también lo estarán. Si los pines 1 y 2 están sin conectar, también lo estarán el 15 y el 16. Nunca he visto, por ejemplo, que los pines 1 y 2 estuviesen conectados entre si, mientras que el pin 16 estaba desconectado o viceversa. Sospecho que están relacionados con la RAM extra de la sección de la CHR.


MMC 4

No se sabe de ningún cartucho que lo use.


MMC 5

Utiliza encapsulado QFP de 100 PIN. Solo existe una única versión; la MMC5.

PINS MMC5.PNG


Notas - #: la asignación de estos pins aún no ha sido confirmada y su uso se ha sacado observando los pins vecinos.

- *1: PINS 1,2,3 y 100 parecen ser algún tipo de entrada de datos. En esta placa en concreto (Castlevania 3) están sin usar y su finalidad es desconocida; sin embargo el terminal #54 del cartucho esta conectado a esta circuiteria extra y este terminal solo va al puerto de expansión que hay debajo de la NES, así que dudo que este fuese utilizado alguna vez en algún cartucho.

- *2: los pines 94 a 98 sirven para poner el cartucho en modo SL o CL. No tengo ni idea de cual es la difrencia entre los dos modos, el cartucho que he usado (Castlevania 3) estaba en modo CL.

Para ponerlo en modo CL hay que conectar CHR A0, A1, A2 de la NES a A0, A1, A2 respectivamente. Después de esto hay que conectar entre si los pines 97 y 98 y dejar los pines 94,95 y 96 sin conectar. Si lo que queremos es dejar el cartucho en modo SL entonces hemos de conectar el pin 94 del MMC5 a A0 de la CHR ROM, el 95 al A1 de la CHR ROM y la 96 a A2 de la CHR ROM. Para finalizar dejaremos el pin 97 al aire y el 98 lo conectaremos a masa.


MMC 6

Utiliza encapsulado QFP de 64 PIN. Actualmente se conoce únicamente la versión MMC6B, pero sospecho que hay una versión A.

PINS MMC6.PNG


Nota: A10 y A11 no se conectan a este chip. Threshold: va conectado a un divisor resistivo entre +5V y GND. La resistencia con los 5V a uno de sus extremos es de 180 ohmios y la otra que tiene un extremo a masa, es de 470 ohmios.


Intercambio de bancos mediante LS161 ( LS161 Bankswitching )

Hay más cartuchos de los que parece que usan el intercambio de bancos de memoria basado en el uso de un chip LS161, o en una combinación de este y de otro chip que puede ser o bien un LS32 o bien un LS02.

Los dos tipos principales de cartuchos que usan solo un chip LS161 son los siguientes:

PINS 161.PNG


PINS 161.PNG


PINS 161.PNG


Asignación de terminales en la CPU

Los pins 39, 38 y 37 corresponden respectivamente a los bits D0, D1 y D2 de STA $4016. El pin 36 y 37 pasan a estado bajo durante un LDA $4016 y LDA $4017, respectivametne. Las etiquetas Audio 1 y Audio 2 marcan la salida de los dos canales cuadrados de audio y la de los canales de triangulo, ruido y PCM, respectivamente.

PINS CPU.PNG


Asignación de terminales en la PPU

PINS PPU.PNG


Tablatiposcartuchos.png


Placas bases usadas en los cartuchos

Placas sin intercambio de bancos


Placas con intercambio de bancos basado en el chip LS161


Placas con MMC1


Placas con MMC2


Placas con MMC3


Placas con MMC5


Placas con MMC6


Placas de terceras compañías


Placas de terceras compañías con el chip LS377

Entre ellas se encuentran las usadas en cartuchos de Color Dreams, AGCI, Wisdom Tree, Bunch Games, etc..


Placas de American Video Entertainment (AVE)

Nota: la misma compañía que diseño las placas de AVE también diseño las de SEI.


Lista de cartuchos

Nintendo

Tablanintendo.jpg


Colour Dreams (y también Wisdom Tree)

Tablacolordream.PNG


AGCI, SEI/AVE, Camerica/Code Masters

Tablacamerica.PNG


La zona de CHR universal debería ser:

8K de RAM en las posiciones 0000-1FFF intercambiables en bancos de 2K o 4K. Se debe permitir acceso con A10/A11/A12 y CE. 8K de RAM en las posiciones 2000-3FFF con acceso permitido a través de A10/A11/A12/CE/WE/OE. 12024K de C-ROM en 2000-3FFF con intercambio de bancos. Se debe permitir su intercambio en fragmentos de 2K, 4K, 8K, 16K, 32K, 64K, 128K, 256K, 512K y 1024K.

La zona universal de PRG debería de ser:

12K de RAM intercambiable en 5000-7FFF. Se debería poder desactivar segmentos de 256 bytes . 1024K de ROM intercambiable en bancos de 2K a 1024K. El controlador de intercambio de bancos debería de ser uno de estos: cualquier MMC de Nintendo, un LS377, cualquiera que use un LS161 o uno de los dos controladores de Camerica.


Notas del traductor

Todo este texto que has leído ha sido traducido directamente de lo que ha entendido el traductor cuando leyó el documento original por lo que no es una traducción literal. Es aconsejable que si tienes un nivel de ingles aceptable te leas el original ya que la traducción seguramente tendrá algún que otro error, y bueno no es necesario decir que si encuentras alguno no dudes en ponerte en contacto con él. Espero que os haya parecido interesante el documento.

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas