lunes, 11 de febrero de 2019

Memoria y mapas

Bienvenido a la segunda parte (apenas) de mi tutorial para programar en varias consolas de SEGA al mismo tiempo...

Ya que vimos los registros y condiciones, ahora veamos la memoria:
  • ROM: Memoria de solo lectura, si tratas de escribir aqui, no se moverá nada
  • RAM: Memoria de acceso al azar, aqui puedes leer y escribir datos, se usa para almacenar datos comunes como los puntos, las vidas, el nivel... en otros casos también se puede correr codigo desde aqui
  • Stack: Es una sección reservada en la memoria RAM para empujar y jalar datos que necesitemos guardar 
  • Puertos: Son como unos "puentes" para comunicar otras partes de la consola, como el chip de video o de sonido (que luego veremos después)

Cada CPU tiene su "mapa" de memoria, dependiendo si es el procesador es el principal o secundario (o hasta más)

    Nuestro cartucho


    Primero, estas tablas representan lo que un juego normal de Genesis (en 68000) puede ver dependiendo de cada add-on insertado:

    • Negro: Sección siempre disponible para usarse
    • Azul: Se puede utilizar pero está cerrado por algun flag o registro de memoria
    • Rojo: No tocar esa sección

    Nuestro codigo irá en la sección ROM desde 000000 hasta 3FFFFF, El tamaño maximo visible es de 4MB (dos paginas visibles de 2MB)
    Pero si tu programa rebasa la segunda pagina (200000) y deseas guardar una partida en el cartucho: deberás cambiar de banco en la segunda pagina con un registro de memoria, perderás temporalmente el acceso a la pagina del ROM desde 200000 a 3FFFFF hasta que vuelvas a modificar el registro de nuevo después de guardar tus datos

    Si el Sega CD está conectado: Es posible utilizar el CD para musica, datos extras del disco, 8 canales más de sonido y los graficos de escalado y rotación (Stamps)*
    Solo un juego oficial lo hace: FLUX (Europa). Este modo nunca fué tan usado debido a que el sistema operativo del Sega CD se encuentra en direcciones diferentes de cada revisión del BIOS...

    Si el 32X está conectado: Se reporta que el add-on está conectado pero NO se puede utilizar, es *posible* arrancarlo manualmente pero no es recomendado**

    * No puedo confirmar lo de la rotacion y el sonido, pero si hay juegos que reproducen musica de discos CDDA
    ** Tampoco puedo confirmar esto

    OPCIONAL: Si quieres juegos aún más grandes, está disponible el sistema de "bankswitch" que cambia paginas de nuestro codigo por bloques de 512KB de la sección de ROM, solo que el mecanismo es por separado y por ahora nos quedaremos con el limite de 4MB


    Ahora estos son los mapas por si deseas que tu juego sea exclusivo para Sega CD o Sega 32X:


    Para Sega CD nuestro codigo (y datos) estarán en el disco, en varios archivos de CD-ROM con el standard ISO 9660 (formato 8.3), o también se pueden leer leer sectores del disco directamente (pero rompería las reglas del estanard)

    El tamaño maximo de nuestro juego ahora es de 700MB aproximadamente, pero con varias limitaciones:
    La sección que era para cartuchos es usada para el reproductor (la pantalla con animaciónes) y solo tendremos 2 nuevos lugares para correr nuestro codigo:
    • WORD-RAM (MAIN-CPU: 200000)
      • 256KB en modo normal, solo un CPU puede accesarlo a la vez
      • 128KB en modo compratido, ambos CPUs tienen la mitad de memoria en cada uno, se pueden intercambiar de datos por medio de un flag de memoria
    • RAM interno del Genesis (FF0000)
      • Este espacio es limitado para codigo, en casos extremos es la unica sección disponible por si deseas usar el sistema de Stamps (Escalado y Rotación)
      • Otra limitación de RAM es que 100 bytes (FFFD00-FFFE00) son usados por el reproductor, y modificarlos puede causar errores en el programa
    Para Sega 32X nuestro codigo será en cartucho, con el mismo de limite de 4MB, nuestro codigo en 68000 se mudará a dos nuevas direcciones:
    • 880000: Se mostrarán los primeros 512KB del cartucho, no se puede cambiar de pagina
    • 900000: En esta sección se mostrará una pagina de 1MB del cartucho, y puede cambiar por medio de un registro de memoria

    La sección original del ROM (000000-3FFFFF) ahora le pertenece a SH2 (en 20000000-203FFFFF) PERO debido a una limitación del DMA (Direct Memory Access) usado por el VDP, hay un bit en donde temporalmente regresa la habilidad de leer el ROM desde su posición original para que el DMA vuelva a funcionar correctamente, pero haciendolo cerrará el acceso a las nuevas direcciónes de 68000 (880000 y 900000) y también cierra el acceso al ROM desde SH2.
    Si en 68000 estabamos corriendo nuestro codigo desde 880000, y pedimos que regrese el ROM en 000000-3FFFFF para poder transferir graficos por DMA, se estropeará el sistema justo de despues de haber escrito el bit, para cualquier transferencia de graficos por DMA tendremos que poner nuestro codigo en RAM y modificar el bit desde ahí, cambiando el bit no afectará el RAM
    En el lado de SH2, si por ejemplo estabamos en medio de una lectura de ROM (como por ejemplo: leyendo texturas), se corromperán los datos
    Los emuladores ignoran esto.

    Nota para ambos add-ons: Es posible hacer un juego de Sega CD que utilize el 32X, en el disco tendrá un codigo especial que arranca el 32X "en el aire", pero en este tutorial no hablaremos de eso (yo nunca lo he intentado...) y digo que es muy exagerado, ya que cada uno de estos add-ons necesita su propia fuente de luz...


    Los otros CPUs

    En estas tablas muestran lo que los otros CPUs pueden ver en su propia memoria:
    • Mapa 1: El Z80 dentro del Genesis
    • Mapa 2: El 68000 del Sega CD
    • Mapa 3: Los 2 procesadores SH2 de 32X, el mapa es el mismo para cada uno

    Del lado de Genesis tenemos el Z80, para los juegos en 16-bit es usado para controlar el sonido, pero es posible controlalrlo con ambos procesadores (68000 y Z80), también es usado para la compatibilidad con juegos de Master System (con cartuchos originales usando el Power Base Converter o sin convertidor con Flashcart)

    En el Sega CD tenemos otro 68000 (con el nombre de "Sub-CPU"), este contiene su "Sistema operativo", en donde controla sus partes y caracteristicas dependiendo de su revisión (Model 1 o Model 2)
    Y abajo del OS, en la dirección 6000 se encontrará el programa del usuario, aquí podremos controlar las nuevas caracteristicas del Sega CD: Leer datos del disco, usar sus 8 canales PCM de sonido, escribir nuestra memoria de guardado (Backup RAM) y utilizar el sistema de escale y rotación de graficos llamados "Stamps"
    Este CPU NO puede tocar los componentes del Genesis (video, audio y controles)

    Y en 32X tenemos 2 procesadores SH2: uno es "Master" y el otro es "Slave", Estos procesadores son para ayudar al Genesis en las nuevas caracteristicas añadidas: un nuevo VDP y 2 canales de sonido PWM. (Izquierdo y Derecho)
    También se puede hacer la logica de nuestro juego en SH2, pero ahora nos quedaremos con el 68000
    El Genesis también puede controlar los nuevos chips de video* y sonido desde 68000, pero el SH2 NO puede tocar los componentes del Genesis (video, audio y controles)

    *El nuevo chip de video solo puede ser controlado por un CPU a la vez: el CPU es escojido por un registro de memoria


    Ahora vamonos a 8-bit: Este es el mapa para el Game Gear (y Master System)
    En este sistema usaremos un mapper: Nuestro ROM irá en los paginas 0000, 4000 y 8000, Tamaño maximo visible de 12KB, cada una es intercambiable cuando modifiquemos los valores en las direcciones FFFD, FFFE y FFFF (pero en la primera pagina los primeros 400 bytes no se pueden cambiar)
    La pagina 2 (8000) También se puede usar como RAM adicional dentro del cartucho al del sistema
    La dirección FFF8 solo aplica para los lentes 3D del Master System

    Si te preguntas donde como controlas el VDP, el sonido, I/O y otros: estos se usan de diferente manera que en 16-bit, en otra sección llamada "puertos", estos se leen y escriben con una instrucción diferente del Z80, luego los explicaré...

    Hey, ya quiero ver algo que se mueva

    Pues, como viste ya me tomó mucho explicar bien como funciona la memoria, tendrás que esperarte otra entrada del blog para que ya pueda explicar -bien-como programar en ensamblador, luego enseñaré como usar los graficos, leer los controles, talvez hacer musica (aunque yo no soy compositor ni nada), es que si no seguimos bien las reglas de la memoria, luego nuestro juego tendrá errores dificiles de reparar.
    (Ya me ha pasado y es horrible)

    Links para mas info:
    http://john.ccac.rwth-aachen.de:8000/as/as_EN.html Manual oficial de AS
    https://segaretro.org/Mega_Drive_official_documentation Varios documentos oficiales
    http://www.smspower.org/Development/Index?sid=953020d1e424c9ec5e73c4278f29c0bd
    Mucha información para el desarrollo en el Master System y Game Gear