Tutorial de desarrollo del emulador NES 04 - Cartucho NES
En el Capítulo 04, aprendimos sobre la estructura de archivos de NES. Los archivos de NES son esencialmente información descargada del casete. Por lo tanto, primero debemos simular el casete y cargar el programa y otros datos en la memoria. Continuando con la operación en un solo paso
Mapper ha aparecido muchas veces en artículos anteriores, aprendamos más sobre esto ahora
El artículo 03 mencionó que en el bus NES, el rango de direccionamiento de PRG es. 0x8000 - 0xFFFF, el rango de direcciones de CHR es 0x0000 - 0x2000, sus tamaños son 32K y 8K respectivamente. Para juegos grandes, un espacio tan pequeño está lejos de ser suficiente. Obviamente, Nintendo también tuvo esto en cuenta al diseñar, por lo que utiliza Mapper. extensiones
Mapper no se encuentra en el host, sino en el cartucho. Cada casete corresponde a un Mapper. En el formato NES 1.0, puede representar hasta 256 tipos de Mapper.
Cada Mapper se comporta de manera diferente. Por ejemplo, algunos Mappers agregan chips de audio para mejorar el rendimiento del audio. aumenta el tamaño del programa de extensión de registro, y algunos también tienen la función de contar interrupciones
Por ejemplo, Mapper2 agrega un registro de selección de banco para controlar el mapeo de diferentes bancos a 0x8000 - 0xFFFF, expandiendo así la capacidad del juego p>
Después de comprender el papel de Mapper, primero eche un vistazo al Mapper más simple: Mapper0. Este Mapper no tiene capacidades de expansión, por lo que su ROM máxima es de solo 32K 8K = 40K
. solo uno Lo que hay que tener en cuenta es:
Después de comprender la función de Mapper, puede comenzar a definir la API
Primero defina la interfaz ROMInfo, que representa la información del encabezado analizada desde el archivo NES
Además, se necesita un objeto Mapper para representar diferentes Mappers. Para la CPU, solo debemos preocuparnos por las capacidades de lectura y escritura del Mapper, por lo que debemos definir las interfaces de escritura y lectura
Finalmente, solo se necesitan dos instancias de Info y Mapper en Cartucho
Aquí hay un ejemplo de cómo simular un Cartucho (solo se enumera la lógica central, y usted mismo completará otra lógica simple)
Un *** requiere dos clases, un Cartucho y un Mapper0
p>
Archivo cartucho.ts
Archivo mapper0.ts