RareGaZz16:(r16_12):21/10/1999 << Back To RareGaZz16


----- { R16_12 } ----------------------------------------------------------- --------- { INTRODUCCION A LOS CARTUCHOS DE GAME BOY } --------------------- --- { Aj0 } Introduccion a los cartuchos de GameBoy (tm) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0) Introduccion 1) ¿Que es realmente un cartucho de GameBoy? ¿Y una GameBoy? 2) ¿Son todos iguales? / ¿Como funcionan? 3) Especificaciones tecnicas 3.1) GameBoy 3.2) Cartucho 4) ¿Existe la posiblidad de volcarlos al ordenador? 5) ¿Es posible copiarlos? 6) ¿Puedo crear mis propios programas y juegos? ------------------------------------------------------------------------------ 0.- Introduccion ------------------------------------------------------------------------------- Para comprender este articulo es necesario tener unos conocimientos medios/avanzados de electronica digital, incluyendo conocimientos sobre memorias SRAM / Flash ROM / ROM , etc. ademas de un poco de idea sobre procesadores de 8 bits como el Z80, el Z80 preferiblemente, pero realmente los conocimientos sobre el procesador no son fundamentales siempre que no quieras ponerte a programar nada para la GameBoy. Antes de enviarme cualquier duda existencial, ten en cuenta que no dispongo de excesivo tiempo, a si que ... si tienes alguna duda, se conciso, de todas maneras intentare dejar todo lo mas claro posible. ------------------------------------------------------------------------------- 1.- Que es realmente un cartucho de GameBoy / una Gameboy ------------------------------------------------------------------------------- Bien.. comenzare primero por explicar que es realmente una GameBoy .. a primera vista... lo primero que pensamos ... es que es una video consola portatil... pero ahi no queda todo... . Realmente una GameBoy es un pequeño ordenador portatil, tiene su ROM / su S-RAM / sus perifericos... (controles, sonido, display LCD), y por supuesto... su procesador ... un autentico Z80, bueno... no es autentico del todo, algunas instrucciones han sido eliminadas y otras sustituidas, los registros de indice ya no existen, las instrucciones de intercambio han sido eliminadas, y algunas han sido añadidas: LDI (HL),#$xx LDD (HL),#$xx SWAP A through L LD A,($FFxx) y poco mas.., pero en el fondo es un Z80, con lo cual, la mayor parte del codigo ya existente era bastante portable a la GameBoy, y ya existian libros... Una pequeña delicia para cualquier programador (y jugador ;). Bueno, ahora que ya sabemos que es exactamente una GameBoy, os explicare en que consiste un cartucho de GameBoy. Un cartucho de GameBoy es simplemente una "ROM" que se conecta al bus del procesador de la GameBoy, realmente contiene mas componentes, pero para empezar eso nos basta... Los pines del conector de la GameBoy tienen cada uno la funcion tipica de un bus de 16bits de direcciones (A0 - A15) y 8bits de datos (D0 - D7), una señal de escritura (/WR), una señal de lectura (/RD), otra de reset, una de masa (GND), otra de alimentacion (VCC / +5v), y otra mas que ya explicaremos mas adelante... la cual se utiliza para los cartuchos que tienen memoria de almacenamiento (para almacenar las partidas por ejemplo. ------------------------------------------------------------------------------- 2.- ¿Son todos iguales? / Como funcionan.. ------------------------------------------------------------------------------- Realmente .. en cuanto al conector.. por supuesto que si... son todos iguales, pero en cuanto a la capacidad y añadidos (RAM para partidas) son distintos, hay ciertos estandares... MBC1 / MBC2 que ya explicare en las especificaciones tecnicas. En principio las capacidades basicas son: 32kB / 64kB / 128kB / 256kB 512kB / 1MB / 2MB Bien.. supongo que a los mas adelantados... les habra surgido ya una pequeña duda... si tenemos un bus de direcciones de 16bits / y uno de datos de 8 bits ... solo podemos almacenar 2^16 bytes = 64 kB .... ¿entonces como podemos almacenar capacidades de 128 kB/256 kB y 512 kB? , pues no es demasiado complicado, utilizando el tipico paginado de memoria que ya se usaba en los Spectrum ... un poco distinto .. pero basicamente el mismo... Bien... basicamente dividen la memoria ROM en bloques de 16kB,los primeros 16kB del direccionamiento (0000h-4000h) siempre apuntan a el primer bloque de la ROM del cartucho (los primeros 16kB) y los siguientes 16kB (4000h-8000h) apuntan al bloque que le hayamos indicado al chip controlador que se encuentra en el cartucho (MBC1 o MBC2), lo cual se consigue escribiendo el numero de bloque al que queremos acceder en cualquier direccion entre 2000h y 4000h ... normalmente se suele utilizar la 2000h. Pongamos un ejemplo... nuestro codigo... que se esta ejecutando en la direccion 0100h ... escribe el byte X en la direccion 2000h, desde ahora, cuando acceda para lectura en la direccion 4000h estara accediendo realmente a la direccion 4000h*X , cuando acceda a la direccion 4001h , estara accediendo a la direccion 4000h*X+1 en la ROM del cartucho..... supongamos que X=8, entonces despues de haberlo escrito en 2000h, si leemos de la direccion 4001h, estaremos recogiendo el dato de la ROM en la direccion 20001h. Con este sistema, tambien tenemos acceso a una memoria RAM externa, no disponible en todos los cartuchos, esta RAM se encuentra entre las direcciones A000h-C000h, y la seleccion del banco se consigue mediante la escritura en las direcciones entre 4000h-6000h, normalmente 4000h, ademas para poder acceder a la memoria RAM del cartucho, debemos escribir 0Ah entre las direcciones 0000h-2000h, y para terminar el acceso escribimos cualquier otra cosa (0 p. ej.) en ese mismo rango de direcciones, esto simplemente es un mecanismo de proteccion para evitar escrituras aleatorias cuando siendo extraido o insertado el cartucho, pues esta memoria suele estar alimentada por una pila de litio para guardar las partidas. Con esto queda explicado como tenemos acceso a toda la ROM, ahora en las especificaciones tecnicas os adjunto un mapa de memoria. ------------------------------------------------------------------------------- 3.- Especificaciones tecnicas ------------------------------------------------------------------------------- 3.1) Especificaciones de la GameBoy: CPU: 8-bit (similar al Z80) RAM: 8KBytes RAM de Video: 8KBytes Tamaño de la pantalla: 2.6 pulgadas Resolucion: 160x144 Max # de sprites: 40 Max # sprites/linea: 10 Max tamaño de los sprites: 8x16 Min tamaño de los sprites: 8x8 Frecuencia de reloj: 4.194304 MHz Sonido: 4 canales con sonido stereo Alimentacion: DC6V 0.7W 3.2) Mapa de memoria del cartucho: Registro de Activacion de Interrupciones --------------------------------------- FFFF RAM Interna --------------------------------------- FF80 Libre / Usable --------------------------------------- FF4C Puertos E/S --------------------------------------- FF00 Libre / Usable --------------------------------------- FEA0 Tabla de Attrib de los Sprites (OAM) --------------------------------------- FE00 Eco de la memoria de 8kB interna --------------------------------------- E000 RAM 8kB interna --------------------------------------- C000 RAM 8kB externa (bancos) En escritura: --------------------------------------- A000 ------------------------ RAM Video 8kB / Selector de Banco RAM --------------------------------------- 8000 / ----------------------- Banco #x de ROM 16kB 6000 --/ / Selector de Banco ROM --------------------------------------- 4000 ----/ ---------------------- Banco #0 de ROM 16kB 2000 ------/ Activacion de RAM ext. --------------------------------------- 0000 ----------------------------- Mapa de memoria detallado de la cabecera del cartucho: 0100-0103 Aqui es donde comienza la ejecucion del cartucho, suele ser un NOP seguido de un JP (salto), pero no tiene por que. 0104-0133 Logotipo de Nintendo: (NO PUEDE CAMBIAR, SI NO LA GAMEBOY NO SALTA A 0100, ES UN METODO PARA QUE LOS PROGRAMADORES TENGAN QUE PAGAR EL COPYRIGHT A NINTENDO) CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D 00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99 BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E 0134-0143 Titulo del juego (en mayusculas),lo que sobra rellenado con ceros, si el ultimo caracter del titulo es un 080h entonces es un juego para Gameboy Color (CGB). 0144 Digito Ascii del codigo de licencia (nibble alto) 0145 Digito Ascii del codigo de licencia (nibble bajo) 0146 GB/SGB (00=GameBoy, 03=Super GameBoy, la de la Super Nintendo) si aqui hay un 00, las funciones especiales de la "Super GameBoy" no se activaran... al menos eso dicen.. pero yo no he podido comprobarlo, no tengo una Super Nintendo. 0147 Tipo de cartucho: 0 - ROM ONLY 5 - ROM+MBC2 1 - ROM+MBC1 6 - ROM+MBC2+BATTERY 2 - ROM+MBC1+RAM 8 - ROM+RAM 3 - ROM+MBC1+RAM+BATTERY 9 - ROM+RAM+BATTERY FF - ROM+HuC1+RAM+BATTERY (de este no he visto ninguno) 0148 Tamaño de la ROM: 0 - 256Kbit = 32KByte = 2 banks 1 - 512Kbit = 64KByte = 4 banks 2 - 1Mbit = 128KByte = 8 banks 3 - 2Mbit = 256KByte = 16 banks 4 - 4Mbit = 512KByte = 32 banks 5 - 8Mbit = 1MByte = 64 banks 6 - 16Mbit = 2MByte = 128 banks 52 - 9Mbit = 1.1MByte = 72 banks 53 - 10Mbit = 1.2MByte = 80 banks 54 - 12Mbit = 1.5MByte = 96 banks 0149 Tamaño de la RAM: 0 - None 1 - 16kBit = 2kB = 1 bank 2 - 64kBit = 8kB = 1 bank 3 - 256kBit = 32kB = 4 banks 014A Codigo de Destino: 0 - Japones 1 - No-Japones 014B Codigo de licencia antiguo: 33 - Comprobar 0144/0145 para el codigo de licencia. 79 - Accolade A4 - Konami (las funciones de Super Gameboy no funcionaran si es distinto de $33) 014C Version de la ROM 014D Comprobacion (Suma) (en teoria, pero no estoy seguro, es un xor de todos los bytes desde el 0100 hasta el 014C, con lo cual si leemos este byte y hacemos un xor con el desde 0100 hasta 014C debe dar 00, de todas maneras hay programitas que te lo calculan si quieres programar algo) 014E-014F Checksum conseguido sumando todos los bytes del cartucho, excepto (La GameBoy ignora este valor, pero puede servir para comprobar si hemos leido adecuadamente el cartucho desde el ordenador) ------------------------------------------------------------------------------- 4.- ¿Existe la posiblidad de volcarlos al ordenador? ------------------------------------------------------------------------------- Todo depende de tu habilidad con el soldador, ;), pero en principio si, por supuesto que se puede, solo necesitas emular las señales del bus adecuadamente, para hacerlo, puedes utilizar varios metodos: a) logica convencional, para este puede servir el circuito tipico, creo que diseñado por Jeff Frohwein, es el archivo [c3p.gif] - 3 Latchs de 8 bits 74HCT374 (1 para los datos, 2 para las direcciones) - un decodificador 74HCT138 - unas puertas NAND 74HCT00 - un integrado con 4 mutiplexores de 1 bit de resolucion, como el 74HC157, - algunas otras cosas, digamos, no apto par principiantes ;). - ahh.. y un conector de GameBoy (de alguna gameboy vieja) b) Montarte algun circuito de estos con dos 8255, (o incluso con 1), que se puede conectar al puerto paralelo, y da 48 bits de E/S digital que siempre es muy util para este tipo de experimentos. ;) Para esto debes buscarte la vida, ahora mismo no tengo esquemas, seguro que puedes encontrar alguno en la red, de todas maneras, un dia de estos cuando tenga tiempo espero publicar un esquema que tengo por aqui (lo hizo busmaster), y las rutinas que tengo por aqui en C para el mismo (tambien estan las de Pascal hechas por busmaster ;) Una vez que tengas el circuito, solo necesitas el software, aqui como ves, casi todo es "Made It Yourself", asi que ... si usas el esquema C3P.gif puedes encontrar software por ahi en la pagina de Jeff, aunque ese montaje es mucho menos flexible. Si quieres hacerte el software para leerlo debes conseguir que haga lo siguiente: Para leer una direccion XXXX: 1) Pones la direccion XXXX en el bus de direcciones A0-A15 2) Bajas la linea /RD (que en reposo esta alta) (las demas lineas de control /WR /CS deben estar bajas) 3) Lees los datos que salen en D0-D7 4) Subes la linea /RD Para escribir en una direccion XXXX: 1) Pones la direccion XXXX en el bus de direcciones A0-A15 2) Pones el byte a escribir en D0-D7 3) Bajas la linea /WR (las demas altas) 4) Esperas unos nanosegundos (200 ns aprox) 5) Subes la linea /WR Y bueno.. si quieres leer algun otro banco que no sea el 0 ,recuerda que debes primero seleccionarlo escribiendo el la direccion 2000h, etc,etc,etc. Ademas, si queremos acceder a la memoria del cartucho, debemos bajar tambien la linea /CS (eso es importante). Bueno... ahi lo dejo en tus manos... ;) ------------------------------------------------------------------------------- 5.- ¿Es posible copiarlos? ------------------------------------------------------------------------------- Veamos... ¿tu que opinas? ... si tienes todos los datos de como funciona un cartucho (o al menos los mas importantes) ... solo es ingeniarselas un poco ... pero bueno... te dare unas pistas... Para hacerte un cartucho grabable de 32kB solo necesitarias una memoria. No volatil, una NVRAM o una FLASH o una EEPROM, eso a tu gusto... yo al principio utilizaba una memoria NVRAM de DALLAS (creo q la DS1234Y (no estoy seguro del modelo, miralo en la web de Dallas Semiconductors), pero ahora me he hecho un cartucho a partir de uno pirata que tenia, que traia una eeprom, y se la he cambiado por una flash de AMD de 128kB a la cual le he acortado las patillas [ver el cart128k.jpg] , en concreto una AM29F010, tambien adjunto un esquema (el cual no he probado, aunque si he comprobado el patillaje, y deberia funcionar, aunque ahi si que no aseguro nada, tambien de nuestro amigo Jeff ;) [c3cart.gif] y [c3guts.jpg]. Tienen un inconveniente, tienes que o hacerte la placa y programarte una pal para que funcione como un MBC1 o MBC2 y que quepa todo dentro del cartucho, o pillar un cartucho, desoldar la ROM, y soldar la FLASH. Luego ademas necesitas el software, puedes programartelo tu a partir de los datasheets de AMD (o de la FLASH que uses) .. con un poco de maña se puede conseguir.. no es execesivamente complicado (o si... ;-). De nuevo... si usas el esquema de Jeff.. puedes utilizar el software que hay en su web, que creo recordar que graba en las memorias AMD con el montaje c3p.gif y c3cart.gif. ------------------------------------------------------------------------------ 6.- ¿Puedo crear mis propios programas y juegos? ------------------------------------------------------------------------------ ¡Por supuesto que si!, tienes en la red varios ensambladores y un compilador de C con suficientes librerias y utilidades, lo cual lo hace muy sencillo... ademas ... puedes probarlo con cualquiera de los emuladores y luego volcarlo a tu cartucho grabable ;) Te recomiendo que busques el GBSDK. Para terminar... si te ha parecido interesante este tema, y quieres seguir con el, buscar mas informacion etc, te recomiendo la pagina de Jeff, en http://hiwaay.net/~jfrohwei/gameboy/ Tambien te recomiendo el tutorial de programacion pandoc.txt, donde puedes encontrar informacion mas detallada sobre la estructura del cartucho y la memoria.