Merci

Le point de départ, c'est que les dumps effectués par Furrtek ont permis de découvrir quelque chose de très intéressant : il y a une backdoor intégrée dans la ROM de boot, et ce sur toutes les versions de la Wonderswan !
Voici le début de la ROM désassemblé :
cli
std
clc
mov ax, 0
mov bx, ax
mov cx, ax
mov dx, ax
mov ss, ax
mov ds, ax
mov es, ax
mov sp, 2000h
mov bp, ax
mov si, ax
mov di, ax
mov al, 4
out 0A0h, al
mov al, 0 ┓
out 0B5h, al ┃
in al, 0B5h ┃
test al, 1 ┃ backdoor ici !
jz short loc_2E ┃
jmp far ptr 4000h:0 ┃
loc_2E: ┛
Si le test de la backdoor réussit, le code présent dans la cartouche à l'adresse 4000h:0000h est exécuté immédiatement, sans vérification ni verrouillage de la ROM de boot.
Pour comprendre comment ça marche, il faut savoir que la lecture des boutons sur WonderSwan fonctionne en deux temps :
1) on active un groupe de 4 boutons à lire
2) on lit l'état de ces 4 boutons
3) rebelote pour le groupe de boutons suivant, jusqu'à avoir lu tous les boutons
Le test fait quelque chose d'à priori absurde : il désactive tous les groupes de boutons, puis lit l'état pour voir si un bouton est enfoncé. En fonctionnement normal, c'est bien sûr impossible.
Mais on peut faire réussir le test avec un peu de triche : en court-circuitant directement l'entrée correspondante à la masse, le bouton est toujours détecté comme enfoncé, même sans avoir de groupe sélectionné. C'est ce à quoi fait référence (sans le dire explicitement) trap15
dans sa série de tweets. Et c'est aussi pour ça que je parle de "79" dans le post
./51 : c'est le numéro du point de test de la Wonderswan Crystal qu'il faut mettre à la masse pour activer la backdoor

Sachant qu'on peut exécuter du code, dumper la ROM est assez trivial... en théorie. J'ai d'abord essayé la méthode la plus simple : écrire le code de dump dans la mémoire Flash d'un WonderWitch à la bonne adresse (4000h:0000h). Sauf que je n'ai jamais réussi à faire exécuter le code... je ne sais pas pourquoi exactement, peut-être un effet secondaire du fait que la cartouche n'est pas initialisée quand on active la backdoor, contrairement à un boot normal.
Du coup, j'ai fini par trouver une autre méthode. C'est très low-tech sur le plan matériel : il n'y a pas besoin de FPGA, ni même de puce mémoire

Les ingrédients :
- une Wonderswan dont on veut dumper la ROM
- le code de dump kivabien
- une cartouche qui permet d'exécuter ce code (WonderWitch ou tout autre linker, même une simple cartouche officielle dont on a remplacé la ROM par une mémoire Flash programmée d'avance)
- deux boutons-poussoir
- un circuit intégré avec 8 buffer tri-state (j'ai utilisé un SN74LVC245A, mais on doit pouvoir faire pareil avec un 74HC244/245 ou équivalent par exemple)
- un câble série pour relier la Wonderswan au PC
La recette :
- souder le premier bouton poussoir entre le point commun aux boutons X1 et Y1 d'un côté, et la masse de l'autre. Ça se repère facilement au multimètre.
- souder le second bouton poussoir entre la broche /RESET du port cartouche et la masse.
- exécuter le code de dump, qui va faire plusieurs choses :
1) se copier en RAM interne
2) faire pointer les 256 vecteurs d'interruption vers une routine qui lit la ROM interne et envoie le résultat sur le port série
3) attendre dans une boucle infinie
- enlever la cartouche (oui, à chaud. Je sais, c'est pas bien

), et connecter le buffer au connecteur cartouche. J'ai utilisé le WonderLyzer de Godzil parce que c'est pratique, mais on peut aussi utiliser une cartouche quelconque dont on a retiré la ROM. Le buffer doit être connecté comme suit : broches d'alim reliées à 3.3 V et à la masse, broche /OE reliée au signal /RD, broches de données reliées à de façon à envoyer la valeur 0xCD sur les lignes D0 - D7.
4) lancer le programme qui va réceptionner le dump sur le PC
5) tout en maintenant le premier bouton enfoncé, appuyer brièvement sur le second bouton.
6) la console reboote. Note importante : la RAM interne n'est pas effacée !
7) la console détecte que la backdoor est activée, et exécute le JMP 4000h:0000h
8) le CPU lit la première instruction sur le bus. Grâce au buffer, il récupère 0xCD et un second octet quelconque (vu que rien n'est connecté à D8 - D15).
9) le CPU décode l'instruction : INT xxx, xxx étant la valeur du second octet
10) le CPU lit le vecteur correspondant dans la table d'interruption et saute à l'adresse indiquée. On ne sait pas quel est le vecteur qui sera utilisé, mais ça n'a aucune importance vu qu'ils pointent tous à la même adresse

11) le code de dump (qui est resté dans la RAM interne) s'exécute et dumpe la ROM sur le port série
12) profit !
13) optionnel : si la WonderSwan est un modèle rare qu'on a emprunté à un collectionneur, on dessoude proprement les deux boutons-poussoir, on remonte le tout soigneusement et on nettoie consciensieusement la coque avec une lingette microfibres pour qu'il ne s'aperçoive de rien

PS : si on veut être encore plus minimaliste, il est possible que ça fonctionne en remplaçant le buffer par de simples résistances, ou même carrément en reliant directement D0 à D7 à VCC/GND... mais j'ai pas osé pousser le vice jusque là
