Game & Watch: Super Mario Bros

Game & Watch: Super Mario Bros. (G&W) es una consola lanzada por Nintendo el 13 de noviembre de 2020. Se trata de una revisión de la consola original Game & Watch de 1980, relanzada para celebrar el 35.º aniversario de Super Mario Bros.

A diferencia de la consola original, la Game & Watch Super Mario Bros. incluye una pantalla LCD en color y un pad direccional similar al del mando de la NES además de un botón extra.

A nivel de software se incluyen los juegos Super Mario Bros., Super Mario Bros.: The Lost Levels y Ball (versión Mario) además de un reloj digital repleto de huevos de pascua. Todo esto ocupando un total de 1 Mb, memoria total disponible en la consola.

La consola dispone de un puerto de carga USB C y una batería estimada de 8 horas. Este puerto tan sólo tiene habilitadas la líneas de voltaje y de tierra con lo que no es posible conectarlo a un ordenador para poder realizar modificaciones. La única forma de modificar la consola por tanto pasa por abrirla y comunicarnos directamente con el procesador mediante los puertos de debug de la placa.

La G&W monta un procesador con arquitectura STM32 bloqueada contra escritura. Por suerte la scene ha conseguido desbloquear este procesador por lo que actualmente es posible realizar lecturas y escrituras en la flash sin problemas.

Debemos recordar que la consola dispone tan sólo de 1 Mb de memoria flash aunque como veremos más adelante esto se puede cambiar si se reemplaza el chip de memoria por otro mayor.

Contenido

Primeros pasos

Aviso: la modificación de la consola conlleva la pérdida de la garantía del fabricante y además puede dejarla inutilizable. Aunque se trata de un proceso bastante seguro es necesario realizar conexiones directas entre un programador y los puertos de debug de la placa; cualquier contacto mal hecho o cualquier cruce de cables puede freir la consola y romperla sin posibilidad de reparación. Por supuesto no nos responsabilizamos de nada de lo que pueda ocurrir al usar estos tutoriales.

Tal y como se ha comentado, el chip de la consola viene bloqueado de origen, lo que imposibilita la instalación de software casero. Por ello, el primer paso a realizar antes de instalar homebrew es el de desbloquear el procesador de la G&W.

Aclaración: En la guía se va a explicar cómo modificar la consola usando un programador STLink y una Raspberry Pi. En ambos casos se usará Linux como sistema operativo pero como las arquitecturas son diferentes se van a dar instrucciones distintas para cada caso. Empezamos.

Instalando el software principal en ordenador

Es necesario instalar una serie de programas y librerías en Linux que se usarán en todos los procesos de modificación de la consola (tanto en la liberación como en la instalación de homebrew). Esta primera instalación hay que realizarla independientemente de lo que se vaya a realizar en la consola.

Debido a que si se utiliza un PC la arquitectura es amd64 y en cambio si se utiliza la Rpi la arquitectura es ARM, el software que hay que instalar es distinto. Elige la instalación que más se adapte al método que vas a usar.

Aclaración: durante los tutoriales se hace referencia siempre a la carpeta ~ (por ejemplo mediante cd ~). Esta carpeta apunta a la carpeta home del usuario, es decir (/home/<usuario>/). Por otro lado, se manejan dos carpetas opt. En primer lugar una situada en /home/<usuario>/opt que es donde se guardarán los scripts y programas necesarios para flashear la consola. En segundo lugar se menciona una carpeta opt situada en la raíz del sistema. En esta carpeta se guardará la versión parcheada del openocd y no es necesario acceder a ella para nada.

PC + STLink

Esta parte del tutorial es una adaptación resumida de estas instrucciones. Se recomienda utilizar una instalación limpia del sistema operativo para evitar incompatibilidades aunque no es imprescindible.

IMPORTANTE: Según la versión de Linux (Ubuntu,Debian) que se utilice, por defecto los repositorios de terceros (multiverse, restricted,universe) estarán deshabilitados. Para activarlos nos vamos dentro de Ubuntu a Software & Sources y los habilitamos como en esta imagen.

Desde la consola de linux ejecutamos la siguiente orden para instalar parte del software necesario:

sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install binutils-arm-none-eabi python3 libhidapi-hidraw0 libftdi1 libftdi1-2 git python3-pip
cd ~
mkdir opt
cd opt
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
tar xvf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
rm gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2

Aquí debes cambiar <usuario> por tu nombre de usuario

export GCC_PATH=/home/<usuario>/opt/gcc-arm-none-eabi-10-2020-q4-major/bin/
echo export GCC_PATH=/home/<usuario>/opt/gcc-arm-none-eabi-10-2020-q4-major/bin/ >>~/.bashrc

Una vez terminado hay que instalar una versión personalizada de openocd, que será el software encargado de flashear los archivos a la consola. Para ello, ejecutamos lo siguiente:

wget https://nightly.link/kbeckmann/ubuntu-openocd-git-builder/workflows/docker/master/openocd-git.deb.zip
unzip openocd-git.deb.zip
sudo dpkg -i openocd-git_*_amd64.deb
sudo apt-get -y -f install
echo export OPENOCD=/opt/openocd-git/bin/openocd >>~/.bashrc
export OPENOCD="/opt/openocd-git/bin/openocd"

En las versiones antiguas del tutorial se utilizaba el openocd original, pero se ha sustituido por la versión parcheada de kbeckmann. De todas formas, si alguien lo quiere instalar, es posible hacerlo de la siguiente forma. Esto vale tanto para RPI como para PC.

OJO. No instalar por instalar; no es necesario. Tan sólo se incluyen estas instrucciones como recordatorio.

sudo npm install -y -global xpm@latest
xpm install --global @xpack-dev-tools/openocd@latest

Rpi

Existe un magnífico script que se encarga de preparar la Rpi para poder ejecutar hombrew en la G&W. De todas formas tiene un par de líneas que han quedado desactualizadas. Por ello, a continuación añado una versión modificada y adaptada a los nuevos cambios.

Como siempre, se recomienda usar una versión limpia de Raspberry Pi OS. Los pasos a seguir son los siguientes:

sudo apt update -y
sudo apt upgrade -y
sudo apt install -y binutils-arm-none-eabi python3 libftdi1 lz4 git npm python3-pip clang cmake
mkdir -p ~/opt
cd ~/opt
wget https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v10.2.1-1.1/xpack-arm-none-eabi-gcc-10.2.1-1.1-linux-arm.tar.gz
tar xvf xpack-arm-none-eabi-gcc-10.2.1-1.1-linux-arm.tar.gz xpack-arm-none-eabi-gcc-10.2.1-1.1 
rm xpack-arm-none-eabi-gcc-10.2.1-1.1-linux-arm.tar.gz
cd ~/opt
git clone https://github.com/kbeckmann/ubuntu-openocd-git-builder
cd ubuntu-openocd-git-builder/
./build.sh
sudo dpkg -i *.deb
export GCC_PATH=/home/pi/opt/xpack-arm-none-eabi-gcc-10.2.1-1.1/bin/
export OPENOCD=/opt/openocd-git/bin/openocd
export ADAPTER=rpi
export adapter=rpi
echo export GCC_PATH=/home/pi/opt/xpack-arm-none-eabi-gcc-10.2.1-1.1/bin/ >>~/.bashrc
echo export OPENOCD=/opt/openocd-git/bin/openocd >>~/.bashrc
echo export ADAPTER=rpi >>~/.bashrc
echo export adapter=rpi >>~/.bashrc

Instalando el software de apoyo

En el paso anterior instalamos el software principal en el ordenador y en la Rpi. Ahora instalaremos los programas que nos van a permitir modificar la consola.

Aclaración

Dado que el proyecto de modificación de la G&W es abierto y el código está disponible para su modificación existen varias "ramas" o modificaciones del proyecto principal. Pese a que rama tiene sus características particulares, la instalación, compilación y uso de todas ellas es muy similar. En este tutorial se va a utilizar la rama de kbeckmann (la principal y sobre la que se apoyan el resto) pero a continuación se detallan las características de otras dos ramas importantes:

  • kbeckmann: Rama principal. Es la persona que realizó el port de Retro-go desde la versión ducalex para Odroid-go. Sus versiones suelen ser sólidas y sin muchos bugs, pero actualmente son las más desactualizadas. Ha comentado que va a dejar la scene de Game & Watch durante un tiempo; esta es la razón de haber añadido esta sección.
  • olderzeus: Se trata de un fork de la rama principal de kbeckmann. Incorpora las últimas características, aunque se centra principalmente en mejorar la interfaz de usuario (no modifica los core de los emuladores). Suele actualizarse cada poco tiempo y en su web de github va añadiendo las últimas mejoras. Destaca por añadir carátulas a los juegos, permitiendo distintos modos de visualización. Puedes utilizar make help para ver todas las opciones disponibles.
  • bzhxx: Fork del creador del emulador de Game & Watch para Retro-go. Suele incluir las mejoras de interfaz de olderzeus pero añade mejoras en los emuladores, principalmente en el de Game & Watch. Es la versión recomendada para cacharrear con las roms de Game & Watch y con su conversor, LCD-Game-Shrinker.

Aclarado esto, se continúa con el tutorial. Si no quieres liarte, lo mejor es ir siguiente el tutorial paso por paso, usando la versión original de kbeckmann. De esta forma podrás tener los emuladores funcionando perfectamente y de forma sólida (prácticamente sin bugs). En cambio, si te gusta cacharrear, puedes clonar los repos de olderzeus o de bzhxx en cualquier otra ubicación y probar sus versiones. Para cualquier duda, tienes el foro de Game & Watch.


Continuamos con el tutorial

cd ~
cd opt
git clone https://github.com/ghidraninja/game-and-watch-backup.git
git clone https://github.com/ghidraninja/game-and-watch-flashloader.git
git clone --recurse-submodules https://github.com/kbeckmann/game-and-watch-retro-go
git clone https://github.com/bzhxx/LCD-Game-Shrinker
git clone https://github.com/BrianPugh/game-and-watch-patch
cd game-and-watch-retro-go
pip3 install -r requirements.txt

-----  Si usas una RPI 3, para aquí la ejecución de comandos y lee la aclaración que hay abajo -----

----- En caso contrario, sigue con los comandos -----

cd ..
cd game-and-watch-patch
pip3 install -r requirements.txt
make download_sdk
cd ~

Si usas una Raspberry Pi 3 seguramente durante la instalación el paso anterior falle. Se debe a que la Rpi 3 no tiene memoria suficiente para compilar el componente "keystone-engine" necesario para Game-and-watch patch. El fallo se produce al ejecutar la orden "pip3 install -r requirements.txt" que aparece tras "cd game-and-watch-patch". Por ello, para poder instalar el software en una Rpi3 debes hacer lo siguiente.

  • Evitar ejecutar la orden "pip3 install -r requirements.txt". Si la has ejecutado, reinicia la RPI.
  • Ejecutar "sudo raspi-config" y seleccionar Opción 4, luego opción P2 y pon 16. Luego Ok, Finish y reinicia.
  • Tras reiniciar, ejecutar lo siguiente:
git clone https://github.com/keystone-engine/keystone
cd keystone/bindings/python/
sudo python3 setup.py install
  • Este paso tardará como 15 minutos. Es normal.
  • Una vez instalado, continuar la instalación desde este punto:
cd ..
cd game-and-watch-patch
pip3 install -r requirements.txt
make download_sdk
cd ~

Recuerda que las instrucciones de arriba son sólo para RPI 3.

Instalando conversor de roms G&W

Lo que viene a continuación es opcional y sólo se debe instalar si también quieres transformar las roms de Game & Watch normales de mame a roms que la G&W pueda entender.

sudo apt update
sudo apt install snapd libopenjp2-7 libtiff5 libxslt-dev libatlas-base-dev
sudo reboot
sudo snap install core
sudo snap install inkscape
cd ~
cd opt
cd LCD-Game-Shrinker
pip3 install -r requirements.txt

Con esto el software está instalado. Ahora toca conectar el hardware.

Actualizando el software de apoyo

El software instalado está en continuo desarrollo. Por ello es interesante ir actualizando el código de vez en cuando. Para hacer esto hay que hacer lo siguiente:

git pull --recurse-submodules

Este comando debe introducirse en la carpeta/programa que quieres actualizar. Por ejemplo, para actualizar Retro-go, se debe escribir lo siguiente:

cd~
cd opt
cd game-and-watch-retro-go
git pull --recurse-submodules

Si por casualidad haz hecho algún cambio en el código no te va a permitir aplicar los cambios. En este caso debes hacer lo siguiente (de nuevo, se usa Retro-go como ejemplo):

cd game-and-watch-retro-go
git reset --hard
git pull --recurse-submodules

Conectando la consola al programador

Para realizar el proceso es necesario un programador ST-Link V2; se recomienda que sea original aunque también es posible conseguirlo en webs chinas (en este caso suelen ser clones). También puede realizarse el proceso con una Raspberry Pi (3 o 4).

Estos son los puntos de conexión de la consola.

Esquemaconexiongw.jpg

Debes llevar mucho cuidado con el VDD, dado que la es entrada de corriente. EN NINGÚN CASO debes conectar nada a este punto o podrías freir la consola. Para la programación sólo se van a utilizar los puntos SWCLK, SWDIO y GND. Se recomienda soldar conectores a estos pines para hacer que la conexión entre el programador y la consola sea más estable, aunque también puedes usar sondas o cables dupont.

Recuerda también que aunque en los primeros tutoriales de desbloqueo y flasheo de la Game & Watch se recomendaba desconectar la batería y usar el cable USB para alimentar la consola durante el proceso, se ha descubierto que la tensión proporcionada por el USB no es estable y puede dar fallos durante el proceso. Por esta razón es muy recomendable desconectar el cable USB y utilizar únicamente la batería para el proceso. Además, si el proceso falla o no se inicia correctamente, se recomienda mantener pulsado el botón POWER de la consola hasta que empiece el flasheo.

En esta imagen podemos ver el preestañado de los puntos de conexión. Podeis estañar todos o solo los necesarios (en la imagen se aprecia un punto estañado que no es necesario)

Gw presoldado.jpg

En la siguiente imagen vemos unos conectores DUPONT hembra con sus cables soldados a los puntos de conexión. Estos conectores nos facilitan la conexión y desconexión al programador STLINK o RPI. Conviene aislar con cinta Kapton, electríca o pegamento caliente los puntos de soldadura una vez comprobemos que funcionan. Así evitaremos stress en los mismos y posibles problemas.

Gw conectores dupont.jpg


Usando STLink

Antes de hacer nada con la consola es necesario actualizar el firmware del programador a la última versión. Puedes hacerlo utilizando estos links:

Drivers del STlink: https://www.st.com/en/development-tools/stsw-link009.html#get-software

Programa para actualizar el STLink: https://www.st.com/en/development-tools/stsw-link007.html

Para realizar el flasheo de la consola es necesario conectar los cables de la siguiente forma:

ST-Link 2: SWCLK-> Game & Watch SWCLK
ST-Link 4: SWDIO-> Game & Watch SWDIO
ST-Link 6: GND -> Game & Watch GND

Usando la Raspberry Pi

Si utilizar la Rpi para programar, debes usar el siguiente esquema:

GPIO24 (pin 18) -> SWDIO
GPIO25 (pin 22) -> SWCLK
GND (pin 39) -> GND

Conexionesrpigw.jpg

Desbloqueando la G&W

Una vez hemos realizado la instalación del software y la conexión por hardware podemos proceder a desbloquear el procesador de la consola para poder instalar homebrew. Se recomienda realizar el proceso con la batería cargada al 100% para evitar sustos.

El proceso de liberación consta de 5 pasos. Cada uno se encarga de un proceso vital en la liberación y no se debe saltar al paso siguiente hasta haber completado el actual. En algunos pasos el ordenador nos dará instrucciones sobre como proceder. Es importante seguirlas tal y como se exponen. Por cierto, en algunos momentos puede parecer que el proceso se ha parado pero no es así; algunos pasos pueden tardar hasta 5 minutos en completarse.

Para liberar usando STLink escribimos lo siguiente.

cd ~
cd opt
cd game-and-watch-backup
./1_sanity_check.sh
./2_backup_flash.sh stlink
./3_backup_internal_flash.sh stlink
./4_unlock_device.sh stlink
./5_restore.sh stlink

Si en cambio estamos usando una Raspberry Pi, las instrucciones son estas:

cd ~
cd opt
cd game-and-watch-backup
./1_sanity_check.sh
./2_backup_flash.sh rpi
./3_backup_internal_flash.sh rpi
./4_unlock_device.sh rpi
./5_restore.sh rpi

Una vez realizados estos pasos, la consola debería estar liberada. Si durante alguno de los pasos os da error y os indica que no se puede conectar con la consola, mantened pulsado el botón de encendido durante el proceso. Recordad además hacer una copia de los archivos del firmware de la consola que se han creado en la carpeta backups (internal_flash_backup.bin y flash_backup.bin). Os vendrán bien si luego queréis generar un firmware personalizado.

Scene

Una vez instalado todo el software necesario y habiendo liberado la consola, ya es posible instalar homebrew. Actualmente hay muy poco software casero para la consola, pero por suerte, es de calidad. Básicamente nos encontramos con un emulador de múltiples consolas (G&W, GB, GG, NES, SMS, Coleco y PCE) llamado Retro-Go y con un custom firmware que nos permite tener el firmware original de la consola junto con el emulador Retro-Go.

Retro-Go

Retro-Go es un emulador para múltiples sistemas que hizo su aparición en la consola Odroid-Go de la mano de Ducalex. Kbeckmann junto con otros programadores han portado el código a la G&W y gracias a ellos podemos disfrutar de juegos clásicos en la consola portátil.

El emulador funciona con roms genéricas de los distintos sistemas (aunque se recomiendan las No-Intro) aunque hay que tener en cuenta que las roms de Game&Watch no funcionan de forma nativa y hay que convertirlas antes de copiarlas en el emulador.

Generando las roms de G&W

Las roms originales de G&W que puedes encontrar en MAME no sirven para el emulador incluido en Retro-go. Para que dichas roms funcionen hay que adaptarlas a las necesidades de memoria y a la pequeña pantalla de la consola.

Para ello es necesario utilizar el programa LCD-Game-Shrinker que previamente se ha instalado. Su uso es muy sencillo, pero es necesario disponer de dos tipos de archivos que, juntos, servirán para crear la rom adaptada.

  • En primer lugar hace falta la rom de Game&Watch que queramos transformar. Debe ser una rom del romset 0.229 de Mame, en formato No-merged.
  • Por otro lado se necesitan los artworks para Game&Watch de hydef. Por cuestiones legales no se pueden enlazar en esta wiki, pero son fáciles de encontrar por la web.

Una vez tenemos ambos archivos, debemos copiar la rom de mame en la carpeta input/rom/ y el artwork en la carpeta input/artwok/. Ambos archivos deben estar en formato zip y deben tener el mismo nombre.

Una vez hecho, hacemos lo siguiente:

cd ~
cd opt
cd LCD-Game-Shrinker
python3 shrink_it.py

El script empezará a funcionar y si todo ha ido bien creará la rom transformada en la carpeta output/.

Por supuesto se pueden transformar varias roms a la vez. Simplemente copia las roms en la carpeta rom, los artworks en su carpeta y vuelve a ejecutar el comando de arriba. El script irá transformando todas las roms una a una.


Instalando el emulador

Retro-Go es un emulador de multiples sistemas portado a la Game&Watch por Kbeckmann. Su instalación es relativamente sencilla, si bien hay que tener en cuenta que sólo disponemos de 1 Mb de memoria, por lo que hay que ser muy cuidadoso con los juegos que metemos.

Para instalarlo en la consola, lo primero es copiar las roms de los juegos que queremos instalar en su lugar correspondiente. Dentro de la carpeta game-and-watch-retro-go/roms hay diferentes carpetas, cada una para un sistema. Debemos copiar cada rom en su correspondiente carpeta. Una advertencia: Cada sistema necesita de su propio emulador. Por ello, cuantos más sistemas se utilicen, menos espacio tenemos disponible para copiar juegos. Por ejemplo, si sólo usamos el emulador de Gameboy (que ocupa unos 70 Kb), tendremos el resto de memoria para copiar juegos. En cambio, si usamos el emu de Gameboy y el de GameGear (70 Kb + 180 Kb), tendremos menos espacio disponible. Además, cada juego necesita de cierta memoria adicional para guardar su estado. Dependiendo del sistema este espacio varía de los 4 Kb en los juegos de Game&Watch a los 28Kb en los de GB. Eso significa que si copiamos 8 juegos de Gameboy necesitaremos 28672*8 = 229 Kb extras.

Todo esto es una tontería si se amplía la memoria de la consola (luego veremos esto), pero si tan sólo se dispone de 1 Mb es algo a tener en cuenta.

Una vez copiadas las roms en su sitio, instalamos en emulador en la consola haciendo lo siguiente:

cd ~
cd opt
cd game-and-watch-retro-go
make -j$(nproc) COMPRESS=lzma flash 

Justo cuando empiece el proceso de flasheo se recomienda pulsar el botón power de la consola; no es imprescindible pero ayuda si el proceso no se inicia correctamente.

Tras unos minutos el nuevo firmware estará instalado.

Este emulador está en constante desarrollo y cada pocos días va incorporando novedades. Para actualizar el game-and-watch-retro-go sin perder la carpeta de roms debes hacer lo siguiente:

cd ~
cd opt
cd game-and-watch-retro-go
make clean
git pull --recurse-submodules

Custom firmware

Normalmente la instalación de Retro-Go supone la pérdida del firmware original. Al encender la consola con Retro-Go instalado volvemos al último juego ejecutado, perdiendo el reloj característico de la Game&Watch Super Mario Bros. así como los tres juegos incluidos en el pack. No obstante, gracias al custom firmware desarrollado por BrianPugh podemos tener todo en la misma consola.

Este custom firmware permite arrancar la consola en el modo G&W normal (es decir, como recién sacada de la caja) pero si pulsamos la combinación de botones Izquierda + Game saltaremos automáticamente a Retro-Go y sus emuladores.

Otra de las grandes ventajas de este firmware es que permite reducir el tamaño del firmware original, eliminando algunos huevos de pascua e incluso, si queremos, el Mario Bros. 2. Gracias a este firmware reducido es posible instalar el firmware original modificado junto con Retro-Go y algunas roms en la memoria original de 1 Mb.

La instalación de este firmware personalizado es algo más compleja que la simple instalación de Retro-Go, pero tan sólo hay que seguir unos sencillos pasos para que todo salga bien.

Pasos previos

Si has seguido todos los pasos sobre la instalación de software del tutorial deberías tener el generador de CF instalado. Su carpeta es game-and-watch-patch. Por supuesto, y por temas de copyright el programa no genera un firmware desde 0, sino que lo que hace es parchear el firmware original de la consola antes de flashearlo. Por esto, necesitamos la copia de seguridad de nuestra consola que creamos en el paso Desbloqueando la G&W. Estos archivos están en la carpeta backups de /game-and-watch-backup y se llaman internal_flash_backup.bin y flash_backup.bin. Su SHA1 es el siguiente:

internal_flash_backup.bin = efa04c387ad7b40549e15799b471a6e1cd234c76
flash_backup.bin = eea70bb171afece163fb4b293c5364ddb90637ae

Cuando hayamos localizado estos archivos debemos copiarlos en la raiz de la carpeta game-and-watch-patch para poder iniciar el proceso de flasheo.

Instalando el custom firmware

Dado que tenemos ya todo listo en la carpeta de game-and-watch-patch, podemos iniciar el proceso de flasheo. Tal y como se ha indicado antes, se puede flashear un firmware completo, igual que el original pero que nos permita arrancar Retro-go o un firmware reducido, que ocupa menos espacio. En este tutorial vamos a instalar un custom firmware reducido en la memoria original de 1 Mb.

cd ~
cd opt
cd game-and-watch-patch
make clean
make PATCH_PARAMS="--internal-only" flash_patched_int
--- AQUÍ LA CONSOLA EMPEZARÁ EL PRIMER PROCESO DE FLASHEO ---
cd ~
cd opt
cd game-and-watch-retro-go
make clean
make -j$(nproc) COMPRESS=lzma INTFLASH_BANK=2 flash

--- CON ESTE COMANDO COMENZARÁ UN NUEVO PROCESO DE FLASHEO ---

Estas instrucciones están sacadas casi directamente del repositorio de Github de BrianPugh.

Tras terminar de flashear se recomienda desconectar la batería y volver a encenderla.

En ocasiones el proceso del primer flasheo no se puede iniciar y siempre da error. Se recomienda en este caso instalar el firmware original de la consola ejecutando el punto 5 del game-and-watch-backup y luego proceder con el flasheo.

cd ~
cd opt
cd game-and-watch-backup
./5_restore.sh stlink/rpi

No ocurre siempre pero viene bien tener este as en la manga.

Reemplazo de chip flash original de 1MB por flash de 16MB

Video del proceso

La consola originalmente lleva un chip de 1MB soldado en la placa. Es un chip flash spi en formato SOP8. La comunidad ha conseguido reemplazar este chip por alternativas de mayor tamaño, permitiendo almacenar mas roms para los distintos emuladores de Retro-Go. Aunque hay muchos chips compatibles la recomendación general es el chip MX25U12835FM2I-10G de 16MB ya que es el chip de mayor tamaño disponible en el mismo package type (SOP8). En esta sección trataremos solo de la sustitución del chip stock por este modelo.

Gw flash original.jpg

En esta imagen vemos el chip flash original de 1MB

Lo primero y mas complicado que debemos de hacer es retirar el chip de flash original. Todo este proceso lo haremos con la batería DESCONECTADA.Tenemos varias alternativas para hacerlo y lo recomendable es lo siguiente (para que no os pase lo que me pasó a mí, que arranqué un pad de la placa).

- Cortar con cuidado las 8 patillas del chip. Desoldar los restos de las patillas de los pads de la placa. Reestañar los pads muy sutilmente usando flux. (En esta opción el chip original quedará inservible.

- Estañar las 4 patas de cada lado juntas hasta unirlas todas. Aplicar calor a un lado y otro del las patas unidas hasta que ambos lados el estaño se encuentre liquido y podamos retirar el chip con unas pinzas. Reestañar pads con cuidado de nuevo.

- Lo mejor, usar una estación de soldadura por aire para retirar el flash chip original.


Gw flash retirada.jpg

En la imagen de arriba vemos el chip original retirado con un fallo. Uno de los pads se arrancó por error de instalación.

Si teneis problemas con el soldado, y os pasa lo anteriormente citado se puede soldar en puntos alternativos de la placa para evitar pads en mal estado. Tambien podeis usar cables para soldar el chip SOP8 tanto en los pads originales como en los puntos alternativos.

Gw puntos alternativos.jpg

Posteriormente con los pads preestañados colocamos el nuevo chip flash de 16MB con cuidado, bien alineado, lo fijamos con cinta kapton o electrica para evitar su movimiento durante la soldadura. Soldamos dos pads, opuestos en lados contrarios para fijar el chip. Procedemos a soldar el resto de patillas a los pads. En el caso de que tengas que soldar a un punto alternativo (como fue mi caso) puedes usar un cable fino para hacer el puente.

Gw flash soldada.jpg

Tras la instalación del nuevo chip lo primero que debemos de hacer es conectar la consola al programador STLINK o RPI y hacer una restauración del firmware stock, para comprobar que el chip funciona y el proceso de flash es valido.

cd ~
cd opt
cd game-and-watch-backup
./5_restore.sh stlink/rpi

Flasheo de Custom Firware (para mantener firmware stock) y Emulador Retro-GO

Una vez reinstalado el chip, flasheado el backup para ver que todo esta correcto procedemos a instalar primero el custom firware de Brian Pugh y posteriormente flashear nuestra compilación de Retro-GO.

Primero instalamos el custom firmware.

cd ~
cd opt
cd game-and-watch-patch
make clean
make flash_patched_ext
--- AQUÍ LA CONSOLA EMPEZARÁ EL PRIMER PROCESO DE FLASHEO (QUITAMOS EL PARÁMETRO PATCH-PARAMS="--slim" ya que ahora nos sobra espacio en la flash) ---
make flash_patched_int
--- AQUÍ SE REALIZARÁ EL SEGUNDO FLASHEO (QUITAMOS EL PARÁMETRO PATCH-PARAMS="--slim" ya que ahora nos sobra espacio en la flash) ---

Tras instalar el custom firmware procedemos a instalar nuestra compilación de Retro-Go con algunos parámetros modificados para la flash de 16MB.

cd ~
cd opt
cd game-and-watch-retro-go
make clean
make -j$(nproc) COMPRESS=lzma EXTFLASH_SIZE_MB=15 EXTFLASH_OFFSET=1048576 INTFLASH_BANK=2 flash

Como podemos ver con este comando hacemos lo siguiente: compilamos Retro-Go con compresión LZMA , definiendo 15MB como el tamaño disponible de nuestra extflash (aunque son 16MB el chip, el primer mega lo ocupa el firmware stock, por eso ponemos 15) con un offset de la extflash de 1048576 bytes que es mas o menos lo que ocupa el firmware stock.

Después de este proceso se habrá flasheado Retro-Go en nuestra nueva flash de 16MB. Maravilloso!

En la consola de terminal podemos ver cuanto espacio libre nos queda en la EXTFLASH después del flasheo, buscamos la siguiente linea la cual depende de la flash que tengamos y cuanto de ocupada esté nos dará el espacio libre:

extflash   925241 / 929792   (4551 bytes free (0.004 MB))