Avancement de jsnesAI
Version 1.2.5y — fork JavaScript de jsnes orienté compatibilité des mappers. Dernière mise à jour : 27 octobre 2026.
État des chantiers
| Chantier | État | Détail |
|---|---|---|
| Mappers 67 (Sunsoft-3), 87 (J87) et correction du 71 (Codemasters) | TERMINÉ | Fantasy Zone II (67) et The Goonies (87)
démarrent et se jouent. Le 67 mappe une fenêtre PRG de
16 Kio à $8000, la dernière banque fixe à
$C000, quatre fenêtres CHR de 2 Kio décodées
par adresse & $F800, le miroir V/H/1 écran
à $E800 et un compteur d'IRQ 16 bits en
cycles CPU (deux écritures à
$C800, armé par le bit 4 de
$D800, acquitté par $8000).
Le 87 garde 32 Kio de PRG et sélectionne une banque CHR
de 8 Kio par une écriture dans $6000-$7FFF,
avec les deux bits croisés (bit 0 = A14,
bit 1 = A13), donc écrire 2 choisit la banque 1. Le 71
est corrigé : c'est une carte UNROM
(fenêtre de 16 Kio à $8000, dernière banque
fixe à $C000, 8 Kio de CHR-RAM), pas deux
fenêtres commutables ; Dizzy, qui écrit ses
banques à $FFF0/$FFF1, déplaçait la banque
fixe et restait sur un écran gris.
14 tests pour les 67/87 et
4 pour le 71 ; suite à
418 tests verts (1 ignoré sans BIOS). |
| Mapper 1 (MMC1) — écritures RMW et mode 32 Kio | TERMINÉ | Ninja Cop Saizou se figeait sur un JAM à
$F8 après une pluie de BRK : trois écarts de la
puce expliquaient le détour. Le port série
rate l'écriture résultat d'une instruction
lecture-modification-écriture (le CPU pose d'abord l'octet
d'origine, le résultat arrive un cycle plus tard et la puce
ne le voit pas) — le jeu envoie ses numéros de banque par
des INC $FFF6, alors que le moteur n'émettait
que le résultat incrémenté. Une écriture au bit 7
force les bits 2-3 du registre de contrôle
(mode PRG 3) quelle que soit la fenêtre visée, et non plus
seulement $8000-$9FFF. Enfin le mode 32 Kio
compte des pages de 16 Kio : le registre 2
mappe les banques 2 et 3, pas 4 et 5, ce qui envoyait le jeu
dans une banque vide au premier changement depuis la banque 0.
Le 5e bit PRG des cartes 512 Kio (SUROM) vient du registre CHR
écrit en dernier. 4 tests dédiés (plus la
mise à jour du test des modes 32 Kio) ;
Ninja Cop Saizou validé sur ROM réelle jusqu'à son
écran-titre, Zelda et Mega Man 2 non
régressés ; Dragon Warrior IV (SUROM) garde son
plantage propre à $B911, chantier séparé. |
| Mapper 77 (Irem LROG017) | TERMINÉ | La seule écriture à $8000-$FFFF verrouille
[CCCC PPPP] : banque PRG de 32 Kio et fenêtre
CHR de 2 Kio à $0000 — sous conflit
de bus, le registre capture l'ET de la valeur
écrite et de l'octet de la ROM au même endroit (le jeu
réécrit l'octet de sa propre table pour que les deux
coïncident). 6 Kio de CHR-RAM à $0800-$1FFF
et les quatre tables de noms indépendantes de
l'en-tête four-screen. Le titre de
Napoleon Senki se vérifie à l'écran.
3 tests dédiés. |
| Mapper 141 (Sachen 8259A) | TERMINÉ | Le 141 quitte l'ancien rôle d'alias Jaleco JF-14 (le 140
conserve le câblage fonte) pour le
Sachen 8259A : registres
$4100/$4101 (rejoints partout où l'adresse
répond à $C101), banque PRG de 32 Kio, quatre
fenêtres CHR de 2 Kio au câblage variante A
(registre décalé d'un bit, PPU A11 réinjecté dans les bits
bas en 1,0,1), mirroring cadré sur regs[7]
(V / H / 0,1,1,1 / 1 écran A) et mode simple. Les titres
de Rockball, Po Po Team,
Super Pang et Super Pang 2 (dont le mur
de lettres « PANG » du fond) se vérifient à l'écran.
4 tests dédiés. |
| Mapper 227 (Hexin 1200-in-1) | TERMINÉ | C'est l'adresse d'écriture qui porte tout :
5 bits de banque en mots de 16 Kio, drapeaux M (modes
NROM-128 et NROM-256 de 32 Kio), S, L (la fenêtre
$C000 garnie des bits bas,
bank|7) et O (+32 au numéro, jusqu'à 1 Mo),
le tout re-verrouillé à chaque écriture
$8000-$FFFF, mirroring H/V au bit 1 et
8 Kio de CHR-RAM non bancé. Le menu du
1200-in-1 se vérifie à l'écran ; la variante RPG
de Waixing à WRAM batterie n'est pas modélisée.
8 tests dédiés. |
| Mapper 19 (Namco 163) | TERMINÉ | Le numéro 19 s'appelait « Namcot 106 », mais cette puce
n'a jamais été trouvée sur une carte : les cartes
portent une Namco 163. La carte avait
été implémentée avec une carte de registres entièrement
fausse (les registres à $F000-$F007 au lieu
de $E000, $E800,
$F000 et $F800), si bien que
Namco Classic II partait dans un
JMP $FFFF dès le reset. Maintenant :
trois fenêtres PRG de 8 Ko et le dernier banc fixe à
$E000, huit fenêtres CHR de 1 Ko, la RAM de
la puce affichable dans les tables de motifs, le choix
de la page de nametable pour chacune des quatre zones
d'écran, la RAM externe de $6000-$7FFF avec
sa protection d'écriture, l'IRQ en cycles CPU et le son
de la puce (trois canaux, table d'onde de 4 bits dans
les 128 octets de la puce). 11 tests
dédiés ; les douze jeux mapper 19 de la collection
démarrent, dont Namco Classic II qui va
jusqu'à son écran de titres. |
| Mappers 21 et 22 (Konami VRC4 / VRC2) | TERMINÉ | Le VRC4 (numéro 21, câblages VRC4a et VRC4c) et le VRC2a
(numéro 22) partagent le même plan de registres ; ce qui change,
c'est le câblage des lignes d'adresse qui choisissent le
registre et la présence d'une IRQ. Le décodeur répond aux
deux câblages du VRC4 (A1/A2 pour le VRC4a,
A6/A7 pour le VRC4c), qui ne se recouvrent pas. Deux fenêtres
PRG de 8 Ko avec les deux derniers bancs fixes, huit fenêtres
CHR de 1 Ko (numéro de banque divisé par deux sur le VRC2a),
miroir complet, IRQ 16 bits en cycles CPU sur le VRC4 seul,
verrou microwire d'un bit à $6000 sur le VRC2.
19 tests dédiés ; validé sur
Ganbare Goemon Gaiden 2 (VRC4c),
Wai Wai World 2 (VRC4a) et TwinBee 3
(VRC2a). |
| Mapper 23 (Konami VRC2b / VRC4e) | TERMINÉ | Les deux derniers câblages de la famille VRC : le VRC2b
prend ses registres sur A0/A1 dans l'ordre naturel, le
VRC4e les a déplacés sur A2/A3, et le décodeur « ou »
répond aux deux, comme le fait le numéro 21. Mêmes
fenêtres PRG/CHR que les mappers 21/22, IRQ en cycles CPU
restée branchée (le numéro porte aussi le VRC4e — les jeux
écrits pour le VRC2b n'écrivent jamais dans
$F000-$F003) et verrou microwire à
$6000. 11 tests dédiés ;
validé sur les cinq jeux mapper 23 de la collection :
Ganbare Goemon 2, Wai Wai World,
Boku Dracula-kun, Dragon Scroll et
Getsufuu Maden, jusqu'à leur écran-titre. |
| Mapper 62 (Super 700-in-1) | TERMINÉ | Premier numéro pirate dont l'écriture de registre
entièrement codée dans l'adresse :
n'importe quelle écriture à $8000-$FFFF
porte la page PRG sur A13-A8 plus son bit 7 à A6 (A7
est le bit de miroir, A5 le mode : paire de 32 Ko ou
une page de 16 Ko doublée), la page CHR de 8 Ko sur
A4-A0 et ses deux bits bas sur les bits 1-0 de la
valeur écrite. Décodé d'après les notes de Disch et
du Mapper62 de Mesen 2, qui concordent
bit pour bit. Sans registre interne : la cartouche
est sans état, et l'allumage mappe les pages PRG 0 et
1 (celles du menu), pas un banc fixe en haut.
7 tests dédiés ; aucun ROM mapper 62
dans la collection, validé sur des images synthétiques
uniquement. |
| Mappers 153 et 159 (Bandai FCG) | PARTIEL | Le numéro 153 ajoute au FCG 8 Ko de WRAM à pile, du CHR-RAM, un mirroring sur batterie et l'IRQ LZ93D50 : le code est en place et testé, mais Famicom Jump II ne démarre pas encore. Le numéro 159 remplace l'EEPROM 24C02 par une X24C01 de 128 octets en little-endian ; Magical Taruruuto-kun 1 et 2 démarrent et affichent leur générique. Ces deux jeux sont annoncés mapper 16 dans leur en-tête iNES, il faut les re-marquer pour les tester. |
| Asterix : couleurs et PAL automatique | TERMINÉ | La table de couleurs héritée de vNES est rangée en BGR alors
que la PPU la lit en RGB : le tampon d'image sortait avec le
rouge et le bleu inversés. La page échangeait ensuite ce
tampon à l'envers en l'écrivant dans le canvas, si bien que
les deux erreurs s'annulaient et que le jeu avait l'air
correct — mais tous les outils qui lisent le tampon
directement (captures, tests) voyaient les mauvaises
couleurs. La palette est convertie à la source, la page
écrit maintenant le tampon en 0xAABBGGRR, et les
trois bits d'emphase du PPU sont enfin appliqués aux deux
bonnes canaux. Asterix (E) est
aussi une cartouche PAL : son en-tête NES 2.0 — ou le CRC du
PRG pour les vieux dumps iNES — le déclare, et la frame passe
à 312 lignes sans que le joueur ait à activer quoi que
ce soit ; la boucle d'affichage cadence alors 50
images par seconde. |
| Mapper 16 (Bandai FCG / LZ93D50) | TERMINÉ | Deux ASIC sous un même numéro iNES. PRG de 16 Ko à
$8000 avec le dernier banc fixe à $C000,
huit fenêtres CHR de 1 Ko, miroir complet. Registres dans
$6000-$7FFF (FCG-1/2, compteur d'IRQ direct) ou
$8000-$FFFF (LZ93D50, compteur à verrou), IRQ 16 bits
en cycles CPU maintenue jusqu'à l'acquittement par $A.
EEPROM série 24C02 de 256 octets (pages de 8)
modélisée au niveau I2C sur $800D : SCL bit 5, SDA
bit 6, sortie sur le bit 4 des lectures $6000-$7FFF,
avec sauvegarde batterie. 12 tests dédiés. |
| Mapper 20 (Famicom Disk System) | PARTIEL | Le FDS n'est pas un circuit de banques mais un lecteur : 32 Ko de
RAM à $6000-$DFFF, BIOS 8 Ko à $E000,
registres $4020-$4033, IRQ timer, et un lecteur qui
reconstruit les blocs, les marques et les CRC d'une face. Les images
.fds (avec ou sans en-tête) se chargent, se lisent,
s'écrivent et s'exportent ; la BIOS, protégée, est fournie par
l'utilisateur. 19 tests dédiés, dont un démarrage
réel de la BIOS quand un dump est présent. Audio d'expansion
$4040-$4098 encore absent, comme pour le MMC5. |
| Mapper 37 (PAL-ZZ, triple cart Nintendo) | TERMINÉ | Trois jeux MMC3 sur une seule cartouche, isolés par un registre
externe $6000-$7FFF : Q2 = PRG/CHR A17, Q0·Q1 forcent
A16 haut. Implémenté comme une traduction par-dessus le MMC3 (ses
tables et ses fenêtres câblées restent intactes), avec le verrou
piloté par $A001 bit 1. 13 tests
dédiés. |
| Mapper 47 (NES-QJ, V'Ball + World Cup) | TERMINÉ | Même montage que le 37 en plus simple : un bit de sélection de bloc
dans $6000-$7FFF, qui devient PRG/CHR A17 sans forcer
A16 (des blocs de 128 Ko, donc). Même verrou $A001
bit 1. 10 tests dédiés. |
| Mapper 205 (JC-016-2, multicarts 15-in-1 / 3-in-1) | TERMINÉ | MMC3 plus un registre de bloc de 2 bits dans $6000-$7FFF :
quatre blocs, dont deux de 256 Ko (où l'A17 du MMC3 sert encore) et
deux de 128 Ko. Transcription directe de la table AND/OR des notes
NESdev, recoupée avec le RTL MiSTer. 13 tests
dédiés. |
| VRC6 (mappers 24 / 26) | TERMINÉ | Réécrit selon la doc NESdev : banking PRG/CHR, miroir, IRQ compteur
$F000, décodage $F003, swap A0/A1 du mapper 26.
Akumajou Densetsu (J) démarre et s'affiche correctement. |
| Audio d'expansion VRC6 | TERMINÉ | Deux canaux impulsion + dent de scie, conformes au matériel
(horloges 16/14, accumulateur). Écritures $9000-$B002 vérifiées
sur cartouche réelle. |
| MMC5 (mapper 5) — fluidité | TERMINÉ | Cause : la carte garde deux jeux de registres CHR
(sprites $5120-$5127, fond $5128-$512B) et
l'ancien code redécodait 8 Ko de CHR à chaque bascule, soit
462×/frame et 1 863 re-rendus partiels par frame.
Chaque jeu est maintenant décodé une fois dans sa propre vue et la
bascule n'est plus qu'un échange de pointeur.
CV3 (U) : 285-325 fps, Gemfire : ~317 fps
(contre 43-55 avant). |
| MMC5 — son d'expansion | TERMINÉ | Deux impulsions identiques aux carrés du 2A03, sans l'unité
de balayage ($5001 sans effet) : enveloppe et
compteur de longueur cadencés à un 240 Hz
fixe — la puce n'a pas de séquenceur de trame,
même en mode 5 trames — table NTSC du wiki identique au
$4015 sauf l'index $1C, bit 7 de
$5003/$5007 pour couper un canal,
$5015 du côté CPU. Le canal PCM 8
bits : $5010 (mode + IRQ),
$5011 (écriture brute ; $00
laisse la sortie et déclenche l'IRQ), et le mode lecture
où toute lecture $8000-$BFFF devient un
échantillon. Modèle calqué sur le
MMC5Audio de Mesen. 13 tests dédiés ; dans
la collection, les jeux ne font qu'un octet d'init
(Gemfire, Uncharted Waters) ou configurent puis se
taisent (SDF, Just Breed) : aucun jeu audible ne pilote
les canaux, la validation reste synthétique pour l'oreil. |
| MMC5 — attributs étendus | TERMINÉ | Le mode $5104 = %01 est fait : l'octet de
l'ExRAM à la position de la tuile (carte miroir
1 écran, la même pour les quatre tables de
noms) porte la palette 2 bits (bits 7-6) et
la banque de motifs 4 Kio (bits 5-0,
complétés par le $5130 en direct, jusqu'à
1 Mo de CHR). Mode CHR et banques $5120-$512B
ignorés pour ces fetches, et substitutions coupées quand
le PPU ne rend pas (bits 4/3 de $2001 tous
deux à 0). Le PPU interroge le cartouche à chaque tuile de
fond. CHR-RAM garde la voie ordinaire. En pratique :
Gemfire (le portrait de la reine, 7 couleurs à
l'écran), Just Breed et Uncharted Waters
passent d'un bruit de tuiles à leurs vrais écrans,
CV3 et SDF inchangés. |
| Astérix (E) — affichage | TERMINÉ | La palette de vNES était rangée en BGR et le tampon d'image attend du RGB : le rouge et le bleu étaient inversés dans tous les jeux (ciel orange, tronc bleu sur Astérix). La conversion est faite à la source, bits d'accentuation compris. La cartouche est PAL et les vieux dumps iNES mentent sur la région : le PAL s'active maintenant tout seul (en-tête NES 2.0, octets de l'iNES historique, ou CRC du PRG). Vérifié dans le navigateur à 50,0 images/s. |
| Punch-Out — public/ring | TERMINÉ | Verrou CHR du MMC2 rappelé par le PPU à chaque accès de motif, avec l'adresse exacte, et cache de tuiles invalidé par ligne de balayage. Comparé à FCEUmm : public et tapis identiques. Détails ci-dessous. |
Ports manettes ($4016/$4017) |
TERMINÉ | Protocole du 4021 aligné sur le matériel : le strobe maintenu haut recharge
le registre (chaque lecture renvoie l'état de A sans avancer), et après le
8e bit une manette officielle renvoie 1 indéfiniment (open bus
$40 compris, donc $41) au lieu de 0 puis d'un
bouclage à 24 lectures. D3/D4 du port 2 ne sont plus pilotés quand aucun
Zapper n'est branché. Le Port Test Controller NES-INP-01
(jig d'usine du cartouche « Port Test ») est émulé en option.
10 tests dédiés. |
| Rangement du dépôt | TERMINÉ | 48 scripts de diagnostic déplacés à la racine vers tools/,
chemins relatifs réécrits, index dans tools/README.md. |
Bugs d'affichage connus
Astérix (E) — corrigé
- Ce qui se voyait : le ciel orange au lieu du bleu, et le tronc du chêne bleu au lieu du brun, dès la palissade du premier décor.
- Cause : la table de palette de vNES est rangée en BGR alors que le tampon d'image attend du RGB. Le rouge et le bleu étaient inversés dans tous les jeux, depuis toujours ; sur la page d'origine, l'écriture dans le canvas annulait l'inversion par coïncidence, ce qui cachait le bug. La conversion est faite à la source, et les bits d'accentuation du PPU assombrissent les bons canaux.
- La région, ensuite : Astérix est une cartouche PAL
dont les vieux dumps iNES prétendent être NTSC. Le PAL s'active
maintenant tout seul : en-tête NES 2.0 (octet 12), puis octets 9/10
de l'iNES historique, puis une table de CRC connus PAL — le CRC du
PRG d'Astérix (
0xED77B453) correspond aux deux dumps. La première enquête avait le bon constat (pal: trueà elle seule ne suffit pas) mais la mauvaise conclusion : le PAL donne bien le bon tempo, et ce sont les couleurs qui étaient cassées. - Vérifié : ciel
#3CABFF, tronc#B15400, et 50,0 images/s au chrono dans le navigateur. L'optionpal: truereste un moyen de forcer la région, pas un correctif de couleur.
Punch-Out — corrigé
- Cause : le verrou CHR du MMC2 n'était pas sollicité au bon
moment. La cartouche ne voit que les accès du PPU aux tables de motifs, et
c'est l'octet de poids fort qui porte l'adresse de déclenchement :
$0FD8exactement pour la fenêtre gauche (une seule ligne de tuile, celle du haut) et la plage$1FD8-$1FDFpour la fenêtre droite (à chaque ligne). - Le PPU synthétise désormais cette adresse pour chaque tuile de fond et pour
chaque sprite :
(table + tuile) * 16 + ligne + 8. Le comportement par ligne tombe tout seul des plages du mapper, sans cas particulier. - Les accès de sprites sont eux aussi signalés, y compris en 8×16 : la table est choisie par le bit 0 du numéro de tuile, et le déclenchement était appliqué avant le dessin (le sprite qui bascule doit encore utiliser l'ancienne banque) et sur toutes les lignes du sprite au lieu de sa première.
- Le cache de motifs par ligne de tuile est invalidé à chaque ligne de balayage
pour ces cartouches : sinon la tuile
$FD/$FEgardait le motif de la ligne précédente et le public se réduisait à des bandes plates. - Vérifié contre FCEUmm (EmulatorJS local) : mêmes lignes de cordes, même épaisseur de public, même départ de tapis (ligne 80). Sortie rendue indépendante du découpage du compositeur (0 pixel d'écart).
- Bug au passage : la fenêtre
$FD/$FEdemapper9.jsutilisait des plages$0FD8-$0FDF/$0FE8-$0FEFau lieu des adresses exactes de la documentation NESdev — sans effet visible, mais faux.
Punch-Out — ancien état (pour mémoire)
- Le public et le ring s'affichaient en tuiles répétées et fausses (bandeau du haut corrompu).
- Cause : le verrou CHR du MMC2 (mutateur
$FD/$FE) ne basculait pas au bon moment.
Mappers reconnus
Chaque mapper vit dans son propre fichier et n'est chargé qu'au moment où une ROM le déclare. Un numéro inconnu retombe sur NROM plutôt que de refuser de démarrer.
→ Voir les 256 numéros de mappers NES, un par un (désignation, exemples de jeux, état de l'émulation dans jsnesAI).
0 NROM · 1 MMC1 · 2 UxROM · 3 CNROM · 4 MMC3 · 5 MMC5 · 6 FFE F4xxx · 7 AxROM · 8 MROM · 9 MMC2 · 10 MMC4 · 11 Color Dreams · 12 MMC6 · 13 CPROM · 14 SL-1632 · 15 Multicart · 16 Bandai FCG / LZ93D50 · 17 Bandai FCG + WRAM · 18 UNROM variant · 19 Namco 163 · 20 Famicom Disk System · 21 VRC4a / VRC4c · 22 VRC2a · 24/26 VRC6 · 25 VRC4 · 34 BNROM · 37 PAL-ZZ (multicart) · 38 PCI556 · 47 NES-QJ (multicart) · 65 Irem H-3001 · 77 Irem LROG017 · 66 GxROM · 69 Sunsoft FME-7 · 71 Codemasters · 79 NINA-03/06 · 85 VRC7 · 90 J.Y. Company · 91 Shenzhen JY · 94 UN1ROM · 118 TxSROM · 119 TQROM · 140 Jaleco JF-11/JF-14 · 141 Sachen 8259A · 153 Bandai FCG + WRAM · 159 Bandai FCG + X24C01 · 27 VRC4 variant · 28 UNROM · 29 RET-CUFROM · 30 UNROM 512 · 31 NSF · 32 Irem G-101 · 33 Taito TC0190FMC · 180 UNROM · 193 → 11 · 205 JC-016-2 (multicart) · 227 Hexin 1200-in-1 · 228 Action 52 · 240 Jing Ke · 241 BxROM
Non couverts, rencontrés dans la collection : 23, 40, 41, 60, 64, 67.
Historique
-
27 OCTOBRE 2026Mapper 33 (Taito TC0190FMC / TC0350FMR) — Insector X et Don Doko Don 2 démarrentLe mapper était enregistré mais la première ébauche se trompait de taille de fenêtre : les deux bancs PRG commutables de
$8000et$A000font 8 Kio, et les passer àloadRomBank()(16 Kio) copiait deux fois trop et écrasait$A000avec la moitié basse de la banque 0. Les deux jeux restaient sur un écran gris parce que le code de reset n'était jamais atteint dans une banque cohérente. Les fenêtres passent maintenant parload8kRomBank(), et le couple fixe$C000/$E000est la dernière banque de 16 Kio.Le décodeur répond àaddress & $A003sur$8000-$BFFF—$8004ou$9000touchent donc le registre 0 comme sur la puce — et les écritures à$C000-$FFFFsont ignorées au lieu de retomber sur le chemin NROM, qui corrompait la copie de la ROM fixe.$8000est.mpppppp: miroir au bit 6, banque PRG sur 6 bits ;$8002/$8003sont des bancs CHR de 2 Kio (valeur brute, contrairement au MMC3) et$A000-$A003quatre bancs de 1 Kio. Huit tests couvrent la carte, le miroir, les fenêtres CHR, le masque et la sauvegarde d'état ; la suite passe à 403 tests verts. Insector X (J) affiche son écran-titre (« 1 PLAYER / 2 PLAYERS / OPTION », Taito 1990) puis le premier niveau, et Don Doko Don 2 (J) son écran-titre (« PUSH START », Taito 1992). -
29 ET 30 OCTOBRE 2026Mappers 31 (NSF) et 32 (Irem G-101)Mapper 31 : lecteur NSF simplifié (PRG/CHR du format). Mapper 32 : Irem G-101, registres $8000-$FFFF, PRG 16 Ko, CHR-RAM.
-
29 ET 30 OCTOBRE 2026Mappers 29 (RET-CUFROM) et 30 (UNROM 512)Mapper 29 : registres $8000/$C000, PRG 16Ko switchable, CHR 1Ko ($4Kh-ROM). Mapper 30 : 5 bits de banque PRG (512 Ko max), CHR-ROM communable si présent. Les deux enregistrés et réécrits selon le pattern UNROM du codebase.
-
25 OCTOBRE 2026Mappers 10 (MMC4), 17 (Bandai FCG + WRAM), 28, 27 (VRC4) et 18 (UNROM variant)Mapper 10 (MMC4 / FxROM) terminé : IRC A12, bancage PRG/CHR et sauvegarde d'état fonctionnels. Mapper 17 (Bandai FCG + 8 Ko WRAM à $6000-$7FFF) créé avec registres $8000-$800F et IRQ 16 bits en cycles CPU. Mapper 27 (VRC4 variant, World Hero) enregistré (IRQ A12, mirroring $9000, 8 fenêtres CHR 1 Ko). Mapper 28 (UNROM, 16 Ko fixe $8000 / commutable $C000) créé. Mapper 18 (UNROM variant, deux fenêtres PRG commutables) créé. Tous référencés dans
src/mappers/index.js. -
24 OCTOBRE 2026MMC1 : écritures fantômes des RMW, reset bit 7 et pages de 16 Kio — Ninja Cop Saizou démarreLe plantage était une pluie de BRK dans la page zéro, terminée par un JAM à
$F8: le CPU exécutait de la RAM, donc une banque de code avait disparu sous ses pieds. Le décorticage du protocole d'amorçage (SEI,INC $FFD7,JMP $FFB0) a montré deux choses. D'abord le jeu écrit ses numéros de banque avec desINCsur la fenêtre MMC1 : la puce reçoit l'octet d'origine (écriture fantôme de l'instruction lecture-modification-écriture) et ignore le résultat qui suit un cycle plus tard. Le CPU pose maintenant les deux écritures, et le mapper 1 jette celle qui suit une écriture fantôme. Ensuite le mode 32 Kio du MMC1 compte en pages de 16 Kio : le registre 2 mappe les banques 2 et 3, là où le code passait la valeur à une fonction qui comptait des banques de 32 Kio et installait les banques 4 et 5. Le premier saut hors de la banque 0 atterrissait dans une banque vide ($FC50y contientJSR $0000au lieu de l'appel réel).Au passage, une écriture au bit 7 force désormais les bits 2-3 du registre de contrôle (mode PRG 3) depuis n'importe quelle fenêtre, comme la puce, et non plus seulement$8000-$9FFF: c'est ce que font les jeux qui remettent le port série à zéro en incrémentant un octet de la ROM. Le 5e bit PRG des cartes 512 Kio (SUROM) est aussi modélisé, pris au bit 4 du registre CHR écrit en dernier. Ninja Cop Saizou affiche son titre complet (logo, « PUSH START BUTTON », ©1989 KYUGO) ; Zelda et Mega Man 2 sont inchangés. Dragon Warrior IV plante toujours à$B911, avant comme après ce correctif : c'est un autre problème, à traiter séparément. -
23 OCTOBRE 2026Mappers 77, 141 et 227 : Irem LROG017, Sachen 8259A et le 1200-in-1Trois circuits, trois façons de commuter
$8000. Le 77 d'Irem verrouille[CCCC PPPP]— 32 Kio de PRG, 2 Kio de CHR à$0000— derrière un conflit de bus (l'ET de l'octet de la ROM à l'adresse écrite), fournit 6 Kio de CHR-RAM et ses quatre tables de noms indépendantes ; Napoleon Senki bascule ses banques par des lectures et unJMP ($0000)dans la fenêtre swappable, ce qui a forcé un décorticage du code d'amorçage pour trouver l'écran-titre.Le 141 change seulement de famille : il restait un alias Jaleco JF-14 depuis la lecture des vieux en-têtes, le numéro appartient aujourd'hui au Sachen 8259A — quatre jeux de la collection tiennent leur écran-titre : Rockball, Po Po Team, Super Pang et Super Pang 2 (le mur de lettres « PANG » du titre). Enfin le 227, la multicartes Hexin : l'adresse d'écriture repart la configuration entière à chaque écriture, et le menu des 1200-in-1 s'affiche. -
22 OCTOBRE 2026MMC5 — son d'expansion et attributs étendusLes deux chantiers restants du MMC5 sont fermés d'un coup. Le son
$5000-$5015entre dans l'APU comme un module d'expansion (VRC6, Namco 163) : deux canaux impulsion identiques à ceux du 2A03, sans l'unité de balayage, avec l'enveloppe et le compteur de longueur cadencés à un 240 Hz fixe, le bit 7 de$5003/$5007pour couper un canal,$5015du côté CPU, et le canal PCM 8 bits avec son IRQ$5010/$5011et son mode lecture.Les attributs étendus : en mode$5104 = %01, chaque octet de l'ExRAM porte la palette 2 bits et la banque de motifs 4 Ko de sa tuile, à la position miroir 1 écran, quelle que soit la table de noms : chaque 8x8 rejoint sa propre variante de couleur et son propre banc de CHR. Le PPU demande la réponse au cartouche tuile par tuile. Effet mesuré à l'écran : Gemfire (le portrait de la reine, 7 couleurs), Just Breed et Uncharted Waters passent du bruit de tuiles à leurs écrans réels, quand CV3 et Uchuu Keibitai SDF restent identiques. -
22 OCTOBRE 2026Mapper 23 (VRC2b / VRC4e), et Astérix officiellement corrigéLe numéro 23 réunit les deux derniers câblages de la famille VRC de Konami : le VRC2b prend ses registres sur A0/A1, le VRC4e les a déplacés sur A2/A3, et un décodeur « ou » répond aux deux, comme pour le 21. L'IRQ est celle du VRC4 ; les jeux écrits pour le VRC2b ne l'arment jamais, donc le même code sert aux deux. Verrou microwire à
$6000comme sur le 22.Les cinq jeux mapper 23 de la collection démarrent jusqu'à leur écran-titre : Ganbare Goemon 2, Wai Wai World, Boku Dracula-kun, Dragon Scroll et Getsufuu Maden. Et la ligne « Astérix — non corrigé » du tableau ci-dessus, restée en place depuis l'enquête d'avant le correctif, est passée à TERMINÉ. -
21 OCTOBRE 2026Un dossier pour les sauvegardes, et une sauvegarde qui le dit« Sauvegarder » passait par un téléchargement, dont le seul signe était une ligne dans la console du navigateur : le téléchargement peut être avalé sans rien dire, et le bouton semblait ne rien faire. Le panneau affiche maintenant ce qui s'est passé.Le nouveau bouton « Dossier des sauvegardes » ouvre le sélecteur de dossier du navigateur, et le dossier est retenu d'une session à l'autre : la sauvegarde part directement dedans, et le chargement y lit par défaut, la liste des sauvegardes étant affichée dans le panneau. Sans dossier, les deux boutons gardent leur comportement d'avant.
-
21 OCTOBRE 2026Le son de la Namco 163 ne casse plus le jeu suivantLe module de son était enregistré dans l'APU et lit la RAM de la puce à travers le mapper. Quand une autre cartouche était chargée, le module restait enregistré alors que le mapper qu'il lisait avait été remplacé : il levait une exception à l'image suivante, et le jeu chargé après un jeu mapper 19 ne démarrait plus. L'APU oublie désormais les modules de la cartouche précédente.
-
21 OCTOBRE 2026Mapper 19 : la Namco 163 pour de bonLe numéro 19 portait le nom de « Namcot 106 », une puce qui n'a jamais existé sur une carte : le vrai circuit est une Namco 163. La carte était implémentée avec une carte de registres entièrement fausse, si bien que Namco Classic II plantait sur un
JMP $FFFFau reset, et que les onze autres jeux de la collection ne montraient qu'un écran noir.Les registres sont maintenant à leur place — un bloc de$800par registre, à partir de$E000pour les trois fenêtres PRG de 8 Ko,$8800à$B800pour les huit fenêtres CHR de 1 Ko,$C000à$DFFFpour l'arrangement des écrans,$F800pour la protection d'écriture et le port d'adresse des 128 octets de la puce. L'IRQ arrive quand l'octet bas du compteur boucle : Namco Classic II l'arme juste là où il veut sa ligne de découpe, et avec la lecture NESdev du compteur sur quinze bits l'interruption arrivait des dizaines de milliers de cycles trop tard, et le jeu attendait une interruption déjà passée. -
20 OCTOBRE 2026Mappers 21 et 22, Asterix en couleurs, et le PAL automatiqueLe VRC4 et le VRC2 de Konami partagent leurs registres ; seul le câblage des lignes d'adresse change. Le numéro 21 doit donc répondre au VRC4a et au VRC4c, dont les adressages ne se recouvrent pas, et le numéro 22 au VRC2a, dont le numéro de banque CHR est lu sans son bit de poids faible. Les IRQ sont comptées en cycles CPU, comme sur le VRC4 déjà présent.Asterix, lui, sortait avec le ciel orange et le tronc bleu : la palette de vNES est rangée en BGR et le tampon d'image attend du RGB. Le rouge et le bleu étaient donc inversés dans tous les jeux, depuis toujours. Asterix est en outre une cartouche PAL dont les vieux dumps iNES mentent sur le système vidéo ; la détection se fait sur l'en-tête NES 2.0 ou sur le CRC du PRG, et la frame passe à 312 lignes toute seule.
-
20 OCTOBRE 2026Mapper 16 : Bandai FCG / LZ93D50, EEPROM 24C02 compriseLe numéro 16 recouvre deux circuits Bandai qui partagent le même plan de banques : PRG de 16 Ko à
$8000(quatre bits de registre), dernier banc fixe à$C000, et huit fenêtres CHR de 1 Ko. Le FCG-1/2 place ses registres dans$6000-$7FFFet écrit son compteur d'IRQ directement ; le LZ93D50 les place dans$8000-$FFFFet passe par un verrou. Les deux plages sont décodées, et la dernière utilisée choisit le mode du compteur — aucun mélange n'existe sur une vraie carte.
Le compteur descend à chaque cycle CPU et l'IRQ part quand il vaut déjà zéro, puis la ligne reste basse jusqu'à l'écriture d'acquittement dans$A: c'est la formulation retenue par Mesen pour que le même compteur convienne aux trois familles Bandai (16, 153 et 159).
L'EEPROM 24C02 est modélisée au niveau des fronts I2C, pas comme un tableau d'octets : START/STOP, adresse de composant, ACK au neuvième coup, pages de 8 octets qui rebouclent, START répété pour relire. Les écritures sont recopiées dansbatteryRamDataet rechargées au reset. 12 tests danstest/mappers.spec.js.npm test: 300 verts, 1 ignoré. -
20 OCTOBRE 2026Débordement de page en zéro page : cpu_test5 passe ses 11 testsLe vrai
cpu.nesde blargg s'arrêtait au test 07-ind_x puis verrouillait le CPU sur un JAM à$0200. La cause était le rebouclage des pointeurs en zéro page : pour(zp,X)et(zp),Y, l'octet haut du pointeur était lu à$0100(la pile) quand le pointeur commençait à$FF, au lieu de$00. Le test place justement son pointeur à$FF:STA ($FF,X)écrivait donc à$00FF, écrasait le pointeur avec A, puis écrivait à$0002, et le modèle d'instruction copié en$0200finissait par contenir un JAM.
src/cpu.jsutilise maintenantload16bitZeroPage()pour ces deux modes : l'addition(zp + X)et la lecture du pointeur rebouclent dans la zéro page. Un test de pénalité de page mort a été retiré (le mode(zp,X)n'en a pas). Le bug de page deJMP ($xxFF)était déjà correct, donc 11-special passe aussi.
4 tests de régression danstest/cpu.spec.js(lecture et écriture par pointeur rebouclé pour les deux modes).cpu.nesaffiche désormais « All tests complete » ;apu_test.nesreste à 8/8.npm test: 288 verts, 1 ignoré. -
20 OCTOBRE 2026Horloge APU au cycle près et DMC : apu_test 8/8Le compteur de frames ne se contente plus d'avancer d'un cran tous les 14915,5 demi-cycles : il suit le calendrier du matériel (NESdev), en cycles CPU depuis la remise à zéro. Les horloges quart/demi-frame tombent donc exactement à 7457, 14913, 22371 et 29829 cycles, le drapeau d'IRQ est armé sur trois cycles consécutifs (29828-29830) et la gigue est reproduite : une écriture dans
$4017prend effet 3 ou 4 cycles plus tard selon la phase de l'horloge APU.
Le DMC suit maintenant les mêmes règles :$4013ne change que la longueur du prochain échantillon (rechargée au démarrage ou à chaque bouclage), une écriture de$4015avec le bit 4 est ignorée tant qu'il reste des octets, le tampon d'un octet est rempli immédiatement au démarrage (d'où l'IRQ instantanée d'un échantillon d'un octet), une boucle recharge son compteur dès que le dernier octet est lu, et une lecture de$4015n'efface plus le drapeau d'IRQ DMC.
apu_test.nespasse ses 8 tests, y compris la gigue, les timings de longueur et les 19 sous-tests DMC. Les sauvegardes d'état antérieures à cette version relancent proprement la séquence de frames au chargement. -
20 OCTOBRE 2026APU : longueurs de note, drapeau d'IRQ et opcodes non documentés
apu_test.neséchouait au test 1 : l'APU n'était cadencé que siemulateSoundétait actif, ce qui gelait le compteur de frames, les compteurs de longueur et l'IRQ de frame quand le son était coupé. Il tourne désormais toujours. Le triangle et le bruit rechargeaient leur longueur même quand$4015les avait désactivés (le matériel ignore la recharge), et une écriture dans$4017effaçait le drapeau d'IRQ sans condition : seul le bit 6 l'acquitte. Les tests 1 (longueur), 2 (table) et 3 (drapeau) passent ; le test 4 (gigue d'horloge) s'arrête au sous-test 5 et les tests 5-6 demandent une horloge APU au cycle près, le test 7 (DMC) reste partiel.
Côté CPU, les 256 opcodes étaient déjà décodés, mais deux sommes de contrôle decpu_test5étaient fausses : AXS ($CB) modifiait V (il ne touche qu'à N, Z, C) et SHY/SHX ($9C/$9E) utilisaient le poids fort de l'adresse indexée au lieu de l'adresse littérale, sans la corruption de page du matériel. Les tests 02-immediate et 06-abs_xy ne signalent plus d'erreur. -
20 OCTOBRE 2026Diagnostic des faux .nes + aide visible pour le Port TestDeux fichiers
apu_test.nesetcpu.nesrefusaient de se charger : ce n'étaient pas des ROMs mais les pages GitHub du dépôt nes-test-roms enregistrées avec l'extension.nes(elles commencent par<!DOCTYPE html>). Le diagnostic de la page reconnaît maintenant le HTML (et affiche le titre de la page), le ZIP et le GZip, et explique qu'il faut cliquer sur « Raw » avant d'enregistrer.
Le cartouche Port Test affichait toujoursINPUT PORT ERROR 00 00 00 00: c'est le résultat d'une console nue, le jig NES-INP-01 restant une option. Une note sous la case à cocher et un rappel dans la ligne d'état de la ROM expliquent désormais que INPUT PORT OK demande de la cocher (ce qui réinitialise la console). -
19 OCTOBRE 2026Mapper 20 : Famicom Disk SystemLe FDS complet : 32 Ko de RAM, BIOS 8 Ko, registres
$4020-$4033, IRQ timer et lecteur de disquette (blocs, marques, CRC, faces, écriture). Les images.fdsse chargent depuis la page, la face se choisit et le disque modifié s'exporte ; la BIOS n'est pas livrée, l'utilisateur fournit sondisksys.rom(champ dédié, localStorage ou fichier à côté de la page). 19 tests mocha, dont un démarrage réel de la BIOS avec un disque synthétique. -
19 OCTOBRE 2026Ports manettes fidèles au matériel + Port Test Controller (NES-INP-01)Le cartouche Nintendo World Class Service — Port Test affichait
INPUT PORT ERROR 00 00 FF 00. Ce n'était pas un bug de l'émulateur : désassemblé, son test lit huit fois$4016puis$4017en échantillonnant les bits 3 et 4 (D3/D4 du bus, exposés sur les ports manettes) et compare à$D5/$55/$2A/$AA: c'est la signature du Port Test Controller NES-INP-01, le boîtier de test d'usine qui pilote D3/D4 sur les deux ports. Sans ce jig, une vraie console nue affiche la même erreur, les lignes restant non pilotées.
Corrigé au passage deux vraies imprécisions du protocole : le strobe maintenu haut recharge le registre (les lectures avançaient au lieu de renvoyer l'état de A), et après le 8e bit une manette officielle renvoie 1 indéfiniment ($41, open bus compris) au lieu de 0 puis d'un bouclage à 24 lectures. D3/D4 de$4017ne sont plus forcés par le Zapper quand aucun Zapper n'est branché — l'affichage du cartouche passe de00 00 FF 00à00 00 00 00, exactement ce que montre une console nue. Le jig s'active en option (nes.opts.portTestController, case à cocher dans le panneau, désactivée par défaut) : le cartouche affiche alors INPUT PORT OK. 10 tests dédiés. -
19 OCTOBRE 2026Mapper 37 (PAL-ZZ, le triple cart Nintendo) implémentéSuper Mario Bros. + Tetris + Nintendo World Cup (Europe) est trois jeux MMC3 sur une seule cartouche, isolés les uns des autres par un registre de banque externe que le MMC3 ne voit que comme sa PRG-RAM :
$6000-$7FFF,xxxx xQBB. Q2 devient PRG/CHR A17, et Q0·Q1 forcent A16 haut — d'où trois « cellules » de 64 Ko et une de 128 Ko. La traduction est appliquée aux deux fonctions de chargement de banques du MMC3, ce qui règle aussi les fenêtres câblées$C000/$E000sans réécrire ses tables. Le verrou est piloté par le bit 1 de$A001(comme une écriture vers la PRG-RAM), n'est pas relisible, et le bouton Reset le remet à zéro comme la ligne/RESETdu CIC. 13 tests dédiés ; le détail de la formule A16 a été vérifié contre le RTL MiSTer (mapper 37 = « European Triple Cart »). -
19 OCTOBRE 2026Mapper 47 (NES-QJ, V'Ball + World Cup) implémentéMême famille, forme minimale : Super Spike V'Ball + Nintendo World Cup range deux jeux MMC3 de 128 Ko derrière un seul bit dans
$6000-$7FFF. Ce bit est PRG/CHR A17, sans aucune ligne forcée : l'A16 du MMC3 traverse tel quel, d'où des blocs de 128 Ko (seize banques de 8 Ko) au lieu de cellules de 64 Ko. Même traduction par-dessus le MMC3 que le 37, même verrou$A001bit 1, même remise à zéro au Reset, même registre non relisible. 10 tests dédiés. -
19 OCTOBRE 2026Mapper 205 (JC-016-2, multicarts 15-in-1 / 3-in-1) implémentéLe troisième de la famille MMC3-multicart, et le seul avec un vrai câblage propre : deux bits de sélection de bloc dans
$6000-$7FFF, soit quatre blocs dont deux de 256 Ko — dans ceux-là, l'A17 du MMC3 circule encore et c'est l'A18 qui est fourni par le registre — et deux de 128 Ko. Les notes NESdev donnent le mapper sous forme de table masque/OU (PRG$1F/$00,$1F/$10,$0F/$20,$0F/$30; CHR$FF/$000…$7F/$180) : elle est transcrite telle quelle, et elle explique aussi pourquoi chaque bloc finit sur sa propre dernière banque — c'est ce qui donne à chaque jeu son vecteur de reset. Recoupée avec le RTL MiSTer (mêmes deux lignes d'A17/A18). 13 tests dédiés. -
17 OCTOBRE 2026MMC2 corrigé (Punch-Out) et MMC5 accéléréMapper 9 : le verrou CHR est rappelé par le PPU à chaque accès de motif — tuiles de fond et sprites — avec l'adresse exacte (
$0FD8pour la fenêtre gauche,$1FD8-$1FDFpour la droite) au lieu d'une plage, l'ordre « après le fetch » est respecté, et le cache de tuiles est invalidé par ligne de balayage. Le public, les cordes et le tapis de Punch-Out sont maintenant identiques à FCEUmm. Mapper 5 : les deux jeux de registres CHR sont décodés une fois chacun et la bascule n'est plus qu'un échange de pointeur — 43-55 fps → ~300 fps sur CV3 et Gemfire. Correction au passage d'un rognage des sprites 8×16 (la borne de plage utilisait+8au lieu de+16et les trois bornessrcy2étaient décalées d'une ligne), ce qui rend le rendu indépendant du découpage du compositeur. -
17 OCTOBRE 2026 — diagnosticAnalyse de performance MMC5 (mapper 5)Profilage V8 : 45 % du temps CPU part dans le changement de banques CHR (462
updateChrBanks()/frame → 3 700load1kVromBank()), et 29 % dans les re-rendus partiels de sprites qu'il déclenche (1 863/frame au lieu d'un seul). CV3 (E) tombe à 43 fps, sous les 60 requis. Diagnostic : le MMC5 bascule ses deux jeux de registres CHR (fond / sprites) deux fois par ligne, et chaque bascule recopie 8 Ko. -
SESSION PRÉCÉDENTEVRC6 (mappers 24 / 26) et son audio réécritsImplementation conforme à la doc NESdev. Akumajou Densetsu (J) et ses traductions démarrent, affichent le logo, l'écran de mot de passe et la saisie de nom. Plus de plantage
PC -1. -
SESSION PRÉCÉDENTERangement du dépôt48 scripts de diagnostic déplacés de la racine vers
tools/, chemins relatifs réécrits,tools/README.mdajouté. -
OCTOBRE 2026Mappers 12, 13, 14, 38, 79, 119, 140 et correctionsMMC6, CPROM, SL-1632, PCI556, NINA-03/06, TQROM et Jaleco JF-11/JF-14. Correction du mapper 66 (bancs PRG de 32 Ko) et du mode 1 Ko du Namcot 106.
-
OCTOBRE 2026Page
index-nes.htmlet manette mobileNouvelle interface d'émulateur, pavé tactile, configuration clavier et manette, sauvegarde d'état.