Échecs sur silicium · 65C02 · 4,9152 MHz
ShahMatic Neo6502
Si on avait su en 1987…
La question de ShahMatic Neo6502 tient en une phrase : qu’est-ce que les algorithmes modernes peuvent apporter à une machine d’échecs dédiée sur le vieux matériel qui l’a vue naître ? Autrement dit, sans détour : un « Stockfish sur 6502 » bat-il un Novag Super Expert C — sur le même 6502 ? Pour y répondre, on prend un moteur aux standards de 2026 et on le comprime dans le silicium d’un Mephisto modulaire de 1987, pour le coter contre les programmes d’époque sur exactement ce matériel.
Télécharger Shahmatic Neo6502 v16
Le programme complet pour Windows 64 bits, prêt à jouer, sans rien installer : la ROM Neo65 v16 et son module d’ouvertures HG440, dans MessChess (MAME 0.220 de Franz Huber), avec la façade de la page en ligne.
Shahmatic_Neo_v16.zip (13 Mo). Dézippez le dossier où vous voulez, clé USB comprise, puis double-cliquez sur Shahmatic Neo.bat.
MAME peut signaler que le CRC de la ROM ne correspond pas à celle du Mephisto Rebel dont on emprunte le pilote : c’est normal, appuyez sur une touche. Pour jouer sans rien télécharger : Shahmatic Neo6502 en ligne, la même ROM dans le navigateur.
Ce que fait Shahmatic Neo v16
- Le vrai code, instruction par instruction. La ROM de 32 Ko et le module d’ouvertures HG440 (2 603 positions) tournent sur le 65C02 émulé du Mephisto MM IV, à 4,9152 MHz avec 8 Ko de RAM, exactement comme ils tourneraient sur la machine.
- Jouer à la souris. Cliquez la pièce puis la case d’arrivée. Neo réfléchit, montre son coup par les diodes et le joue lui-même sur l’échiquier.
- ENT fait jouer Neo pour le camp au trait (pour lui laisser les Blancs) ; pendant sa réflexion, il le fait jouer tout de suite.
- Niveaux : LEV, un chiffre (case A1 = 1 … H8 = 8, 9 = analyse), puis ENT : de 1 s à 60 s par coup.
- Reprise du dernier coup, nouvelle partie avec les pièces remises en place, mise en place d’une position (vider l’échiquier, POS, réserve de pièces), promotion au choix.
- Afficheur de 4 × 20 caractères : coup envisagé et évaluation, niveau, et deux pendules par camp (coup en cours, temps total) en temps de la machine émulée. Un panneau donne la profondeur, l’évaluation, le temps du coup, les nœuds, les nœuds par seconde et la variante principale.
- Vue Noirs en bas (Tab, Video Options) et commandes au clavier (Suppr = CL, P = POS, L = LEV, Entrée = ENT…).
Performances et évolution, en bref
Chaque version est mesurée en gauntlet contre les mêmes huit machines dédiées de 1986-1990, émulées à leur fréquence d’origine : Super Expert C (1880), MM V (1822), Forte A (1803), MM IV (1787), Simultano (1747), Par Excellence (1725), Prisma (1724), Turbo 16K (1437).
| Version | Ce qui change | Perf. au gauntlet |
|---|---|---|
| v1 (27 oct.) | moteur moderne complet, trop lent pour le 6502 | ≈ 1 300 (1 sur 10 contre le Forte A) |
| v2 à v9 | recherche réaccordée pour 3-4 plis, tables d’évaluation, SEE bon marché, pions passés, livre | 1727 (v9, 74 parties) |
| v10 (7 nov.) | ROM de 32 Ko pour le vrai MM IV | 1702 ±15 (575 p.) |
| v11 | tables d’évaluation réglées | 1753 ±14 (602 p.) |
| v12, v12b, v14, v15 | vitesse et évaluation fine (v15 : 16 % de cycles en moins) | 1733 à 1780 |
| v15b | livre corrigé par Stockfish, module HG440 | 1815 ±22 (283 p.) |
| v16 (9 nov.) | table de transposition de 512 entrées dans 8 Ko de RAM, coups inutiles filtrés avant d’être joués | 1848 ±18 (423 p.) |
Le résultat de la v16 adversaire par adversaire est plus bas, dans « Où en est la v16 ». Le détail de chaque version, de chaque mesure et de chaque idée abandonnée est dans la chronique de Neo65, en bas de cette page.
En 1987, ce matériel, c’était 32 Ko de ROM, un module d’ouvertures, 8 Ko de RAM et un 65C02 à 4,9 MHz. Les meilleurs programmes de l’époque — Spracklen, Schröder, Kittinger, Lang — étaient le fruit de plusieurs années de sueur en assembleur. L’idée est de leur opposer, sur leur propre puce, quarante ans de théorie accumulée depuis.
Pas en trichant sur le matériel. Neo6502 n’est pas une version « turbo ». Il tourne sur le même 65C02 émulé, à la même fréquence d’origine (le matériel du Mephisto MM IV : 4,9152 MHz, 8 Ko de RAM, ROM de 32 Ko et module d’ouvertures HG440), et il est coté contre les programmes dédiés de l’époque sur ce même matériel. Un Mephisto MM IV ou MM V, un Novag Super Expert C, un Fidelity Par Excellence : tous des 65C02 à ~5 MHz. C’est un combat à armes strictement égales — seul le code change.
La règle du jeu : la vérité au cycle près
Un programme moderne qui prétend jouer « comme en 1987 » doit prouver qu’il vit vraiment dans les contraintes de 1987. Toute la chaîne de Neo6502 est bâtie là-dessus. Le moteur a une référence C bit-à-bit identique à l’assembleur 65C02, revérifiée à chaque modification : le simulateur vboard, fidèle au cycle, sert d’arbitre à la fois de l’identité (même coup, mêmes nœuds) et du coût (cycles réellement dépensés). La ROM déployée est reconstruite exactement par les sources. Chaque idée est tranchée par des matchs au budget de nœuds réel, avec un aléa de ±15 % pour éviter les parties dupliquées que donnent des moteurs déterministes sur un livre fini.
Cette discipline n’est pas de la coquetterie : elle est la seule façon de savoir si un « progrès » moderne en est vraiment un une fois ramené dans un espace où le cycle d’horloge se compte.
v1 — le mur de la lenteur
La première version porte tout l’attirail d’un moteur contemporain : élagages, recherche de calme, table de transposition, évaluation effilée. Résultat du premier gauntlet contre un Novag Constellation Forte A : 1 sur 10, environ 300 Elo en dessous. Il réfléchit pourtant bien son temps — mais il perd par la tactique, en finissant les parties à dix ou vingt pions de retard.
Le diagnostic est la clé de tout le projet. À 5 s par coup, le 65C02 n’abat qu’environ 700 nœuds par seconde : à peine 4 000 nœuds, soit une profondeur 3 complète et une profondeur 4 jamais terminée. Les dédiés de 1987, bien plus rapides par nœud, atteignaient 5 à 6 demi-coups. Neo tombait donc dans des fourchettes à 2-3 plis que ses adversaires voyaient. Pire : 83 à 93 % des nœuds partaient dans la recherche de calme. Le moteur était moderne ; le silicium, lui, était de 1987, et il ne pardonnait rien.
v2 à v4 — réaccorder la recherche pour trois plis
Première leçon, contre-intuitive : beaucoup de techniques « modernes » sont réglées pour des recherches profondes et deviennent nuisibles à 3 plis. Il a fallu les désaccorder, une à une, mesure à l’appui.
- Désactiver les réductions tardives (LMR) : +45. À profondeur 3-4, réduire, c’est rater des tactiques.
- Utiliser l’itération interrompue : +71. Avant, l’itération de profondeur 4, jamais finie, était jetée — soit ~60 % du temps de réflexion perdu.
- Futilité à la frontière : +33 à temps fixe.
Bilan v4 contre v1, à temps égal : +61 Elo. Aucune idée neuve, seulement des réglages adaptés à la profondeur réelle. Et une série de pistes séduisantes sur le papier mais écartées après mesure (extension de reprise −34, tri à deux étages gratuit en nœuds mais nul en cycles…) : sur ce matériel, ce que dit la théorie ne compte pas, seul compte ce que dit le chronomètre.
Ce que Stockfish 11 avait à nous apprendre
Pour choisir les apports suivants, plutôt que de deviner, on a interrogé un maître. Stockfish 11 (évaluation classique) a été recompilé avec 24 interrupteurs : chaque version amputée d’un élément a joué 600 parties contre le Stockfish complet, à 1 500 nœuds par coup — l’équivalent de Neo6502 à 15 s sur le 6502. On obtient ainsi, pour chaque idée, un Elo « rapporté », qu’on croise avec son coût en cycles sur 65C02.
Le classement est net. En or, pas cher : la futilité inverse (coût nul), l’élagage SEE de la recherche de calme et des coups vers une case attaquée (coût moyen), les pions passés dynamiques (quasi gratuits avec des masques de pions incrémentaux). Trop chers pour le 6502 : la sécurité du roi, la mobilité. Inutiles ou nuisibles à cette profondeur : extension singulière, ProbCut, élagages par nombre de coups ou contre-coups. Une mesure résume l’écart de régime : un nœud de Stockfish vaut environ sept nœuds de Neo6502.
v5 à v9 — la montée
À partir de là, chaque version ajoute un apport choisi pour son rapport Elo-par-cycle, et chacun est confirmé par match natif au budget réel.
| Version | Apport | Gain |
|---|---|---|
| v2–v4 | Recherche réaccordée (sans LMR, itération partielle, futilité) | +61 |
| v5 | Tables d’évaluation effilées, réglées sur des positions étiquetées par Stockfish | +40 |
| v6 | Futilité inverse (marge 120/pli, prof. ≤ 3) | +16 |
| v7 | SEE complet + carte des cases attaquées + élagage avant de jouer | +39* |
| v8 | Pions passés dynamiques en finale (masques incrémentaux) | +38* |
| v9 | Livre d’ouvertures tiré de parties réelles, vérifié par Stockfish | livre |
* gains mesurés à temps égal — le test le plus sévère, voir ci-dessous.
La v7 illustre la tension centrale du projet. Ajouter le SEE au complet rapporte beaucoup à nombre de nœuds égal — mais il ralentit le nœud de 22 %, et à temps égal ce ralentissement mangeait tout le gain (−3). Il a fallu le rendre bon marché : une carte des cases attaquées calculée une fois par nœud (treize fois moins de balayages), puis un élagage effectué avant de jouer le coup. Alors seulement le SEE bascule de −3 à +39 à temps égal. C’est tout le projet en miniature : sur ce silicium, une bonne idée ne vaut que ce que coûtent ses cycles.
Où en est la v16
La v16, du 9 novembre, a joué le même gauntlet que toutes les versions : les huit machines dédiées du panel, émulées à leur fréquence d’origine, 15 s de machine par coup. À 423 parties, elle marque 273,5 points (64,7 %) pour une moyenne d’adversaires de 1743, soit une performance de 1848 ±18 sur la liste maison. C’est la meilleure de toutes les versions de Neo.
| Adversaire (cote) | Score de Neo v16 |
|---|---|
| Novag Super Expert C (1880) | 46 % |
| Mephisto MM V (1822) | 59 % |
| Novag Constellation Forte A (1803) | 61 % |
| Mephisto MM IV (1787) | 55 % |
| Saitek Simultano (1747) | 84 % |
| Fidelity Par Excellence (1725) | 48 % |
| Saitek Prisma (1724) | 75 % |
| Saitek Turbo 16K (1437) | 96 % |
Neo reste un peu intransitif : il bat nettement le MM V et le Forte A, qui lui résistaient à 70 % jusqu’à la v15, mais rend encore des points au Par Excellence, pourtant moins bien coté. À ces profondeurs, le style de l’adversaire compte presque autant que sa force. Il marque autant avec les Noirs (65,9 %) qu’avec les Blancs (63,4 %).
La réponse à la question de départ est donc : presque. Sur le même 65C02, Neo passe devant le MM IV, le Forte A et le MM V. Seul le Novag Super Expert C (1880) reste devant, et Neo lui prend déjà 46 % des points.
Une partie : le Forte A démonté
Une moyenne cache les éclairs. Le plus net de la campagne est une victoire en 24 coups sur le Novag Constellation Forte A (1803), l’un des plus forts du panel. Défense française Winawer ; au dixième coup, le fou blanc se visse en f6 et fige le roque noir ; puis l’attaque déferle sur h7 et s’achève par un sacrifice de dame : 21.Dxh7+ Rxh7 22.Th3+ Dh6 23.Txh6+ Rg8 24.Th8#. Un final de manuel — trouvé par un moteur qui tourne sur un 65C02 à 4,9 MHz. La partie est rejouable coup à coup dans l’échiquier ci-dessous.
Premières conclusions — code neuf contre code ancien
Le chiffre qui compte n’est pas 1848. C’est qu’il aura fallu environ un an — debout sur quarante ans de théorie — pour venir frapper à la porte de machines mûries sur plusieurs années par quelques-uns des meilleurs programmeurs d’échecs du monde, et parfois les bousculer. C’est court. Et ça dit quelque chose.
Ce que le code neuf apporte, c’est de la vitesse d’arrivée et de la rigueur. Quarante ans de théorie — élagages principiels, SEE, évaluation effilée réglée par un moteur moderne, bon ordre des coups, table de transposition — amènent très vite à un niveau d’amateur sérieux, chaque pas étant mesuré, réversible, et l’assembleur prouvé identique au C. On ne tâtonne pas : on sait quoi ajouter, et combien ça rapporte.
Ce que le code neuf ne fait pas tout seul, c’est renverser les meilleurs programmes de 1987 sur leur propre puce. Trois raisons, qui se répondent. D’abord la lenteur brutale du 6502 écrase la profondeur : à 3-4 plis, la moitié de l’arsenal moderne, pensé pour des recherches profondes, perd sa valeur. Ensuite les programmes d’époque étaient taillés à la main pour cette puce — plus de nœuds par seconde, et des décennies de connaissance échiquéenne spécifique cuite dans l’ordre des coups. Enfin, et c’est la leçon qui revient à chaque version : sur un matériel minuscule, le coût par cycle commande tout, et le code générique moderne paie une taxe par nœud qu’il faut regagner, un nœud à la fois.
Autrement dit : la connaissance moderne vous conduit aux portes du gratin en quelques jours ; pour y entrer, il faut payer le vieux prix, celui qui faisait la grandeur du code ancien. C’est ce qu’ont fait les versions 10 à 16 : une ROM de 32 Ko pour le vrai MM IV, 16 % de cycles en moins en v15, un livre corrigé coup par coup, puis en v16 une table de transposition de 512 entrées tassée dans 8 Ko de RAM et des coups inutiles filtrés avant d’être joués. Résultat : 1848, devant le MM IV, le Forte A et le MM V. Seul le Super Expert C reste devant.
La suite est donc écrite d’avance, et elle est de 1987 : tables d’attaque incrémentales, génération des prises par victime, make/unmake allégé. Pour passer devant le dernier d’entre eux, le Super Expert C, Neo6502 devra faire ce qui a fait les maîtres.
ShahMatic · chess.lumn.eu — Neo6502 v16 sur le matériel du Mephisto MM IV, 65C02 à 4,9152 MHz. Toutes les cotes sont issues de parties jouées sur la liste maison.
Une partie · 6502 · 4,9152 MHz
Neo6502 démonte le Forte A
ShahMatic · chess.lumn.eu — partie du gauntlet maison, Neo6502 (Blancs) contre Novag Constellation Forte A, 15 s/coup. Cliquez un coup, ou flèches ← →.
Chronique de Neo65, du 27 octobre au 9 novembre 2026
Un programme d’échecs écrit avec ce qu’on sait en 2026, comprimé dans les 32 Ko de ROM et les 8 Ko de RAM d’un Mephisto modulaire de 1987, et coté contre les programmes de l’époque sur le même matériel émulé. Toutes les étapes, toutes les mesures, ce qui a été gardé et ce qui a été jeté.
1. La cible et la règle du jeu
Le point de départ, le 27 octobre, s’appelait « si on avait su en 1987 » : prendre les algorithmes qui font la force des programmes d’aujourd’hui, les écrire en C puis en assembleur 65C02, et les faire tenir dans un Mephisto modulaire. La première cible était le pilote MAME mm4rebel (65C02 à 4,9152 MHz, 8 Ko de RAM, 48 Ko de ROM). Le 7 novembre, Valter a resserré : la seule cible est « Shahmatic Neo » sur le matériel du vrai MM IV, ROM de 32 Ko en 0x8000-0xFFFF, la fente du module HG440 (0x4000-0x7FFF) laissée libre ou occupée par un module de notre fabrication, et la version qui joue en ligne sur chess.lumn.eu doit être la même ROM. Tout ce qui n’était pas conforme (les ROM de 48 Ko, v1 à v9) a été effacé.
Trois contraintes gouvernent tout le reste :
- Le temps. À 15 s par coup, la machine voit 7 000 nœuds environ. Une fonction d’évaluation qui coûte 10 % de cycles coûte 10 % de nœuds, et à cette profondeur un nœud vaut cher : tout gain « à nœuds égaux » doit être repayé en vitesse.
- La mémoire. 8 Ko de RAM pour l’échiquier, les piles, l’historique, la table de transposition (256 entrées, 2 Ko) ; 32 Ko de ROM pour le code, les tables et, jusqu’à la v13, le livre d’ouvertures.
- La mesure. Les adversaires du gauntlet sont huit machines dédiées de 1986-1990 cotées sur la liste du labo (Super Expert C 1880, MM V 1822, Forte A 1803, MM IV 1787, Simultano 1747, Par Excellence 1725, Prisma 1724, Turbo 16K 1437), émulées sous MAME avec leur fréquence d’origine. Le gauntlet accroche Neo à cette liste ; il ne départage pas deux versions voisines.
2. La méthode
Un seul programme, deux formes
Neo65 existe en C de référence et en assembleur 65C02 (prim.s, recherche.s), et les deux sont tenus identiques au bit près : même nombre de nœuds, même score à chaque profondeur, sur des positions de milieu et de finale, vérifié dans un émulateur 65C02 du MM IV (NMI à 600 Hz acquittée en 0x3800) à chaque changement. Le C se compile aussi sur PC : c’est l’instrument de mesure, et depuis le 8 novembre un moteur UCI à part entière (Neo65 v14-UCI).
Chaîne
llvm-mos pour le C 65C02, édition de liens 0x8000-0xFFFF, patch_reel.py pour la variante du vrai MM IV (double lecture des capteurs par JSR $FFF0). Émulateur Node pour les cycles par fonction (mesure2.py, agg.py) et pour l’identité ROM/natif (cmp32.py). Réglage des tables par méthode de Texel sur 143 311 positions calmes de vraies parties, cibles Stockfish 16 profondeur 9 (80 %) et résultat (20 %).
Trois instruments, trois usages
| Instrument | Précision | Sert à |
|---|---|---|
| Match natif, 2 000 parties, budget de nœuds calé sur les cycles par nœud mesurés | ±8 Elo | départager deux versions à temps machine égal, en 40 min |
| Gauntlet Mac, 8 adversaires, émulation ×10, 1,5 s réelles = 15 s machine par coup, 6 parties de front | ±14 (600 p.) · ±6 (3 040 p.) | fixer l’altitude sur la liste de cotes |
| Étiquetage Stockfish de positions réelles, régression des résidus | — | trouver quoi évaluer ; jamais pour décider (voir v13) |
Règle fixée le 8 novembre : rien n’entre dans Neo sur la foi d’un étiquetage ou d’un raisonnement ; seulement sur un match natif à temps égal, et à ≥ +8 Elo mesurés.
3. Les versions, une à une
Les gains « natif » sont à budget de nœuds ou de temps machine égal, 1 000 à 2 000 parties. Les performances de gauntlet sont celles du Mac, cotes de la liste du labo.
v1 — le point de départ
Le moteur de base : échiquier 0x88, listes de pièces, génération, alpha-bêta avec table de transposition (256 entrées), tueurs et historique, recherche de calme, réductions tardives, livre de 1 806 positions, ROM 48 Ko. Premier gauntlet à 5 s par coup : 1,0 / 10, quelque 300 Elo sous le Forte A. Diagnostic : à ~700 nœuds par seconde il voit la profondeur 3 complète, jamais la 4 ; 83-93 % des nœuds sont dans la recherche de calme ; il tombe dans des tactiques à deux plis.
v2, v3, v4 — régler la recherche pour la profondeur réelle
- v2 : sans réductions tardives (LMR), +45 ±10. À profondeur 3-4, LMR rate des tactiques.
- v3 : l’itération interrompue est utilisée (
PARTIEL), +71 ±11. Avant, 60 % du temps de réflexion était jeté avec l’itération jamais finie. - v4 : futilité à la frontière (marge 150, profondeur 1), +33 ±11 à temps fixe. Total v4 contre v1 : +61 ±11.
Écartés après mesure : calme bornée, coup nul (neutre), prises égales seulement (−34 à −53), parades en échec (−13), extension de reprise (−34), tri à deux étages (+13 à nœuds égaux mais 0 cycle gagné). Tous conservés en macros, désactivés.
v5 — premières tables réglées
Tables pièce-case ajustées par Texel sur les premières parties du labo. Tournoi Mac à 15 s par coup : 9,5 / 47, performance ≈ 1590. La table laissait un défaut qu’on ne verra qu’en v10 : une tour en g1 valait 31 cp de plus qu’en h1, d’où des Tg1/Tg8 précoces.
L’ablation de Stockfish 11 : savoir quoi copier
Stockfish 11 (évaluation classique) compilé avec 24 interrupteurs, chaque élément retiré joue 600 parties contre la version complète à 1 500 nœuds par coup (l’équivalent de Neo à 9 000). Ce qui rapporte à ce budget : fenêtres d’aspiration (−112 sans), élagage de la calme (−107), futilité inverse (−97), élagage SEE (−75), échecs calmes (−41) ; en évaluation, pions passés (−82), sécurité du roi (−63), menaces (−58). Ce qui ne sert à rien ou nuit : structure de pions (−4), mobilité (−3), LMR (0), élagage au nombre de coups (+40), contre-coups (+97). Un nœud de Stockfish 11 vaut environ sept nœuds de Neo.
v6, v7 — futilité inverse et SEE
- v6 : futilité inverse (profondeur ≤ 3, marge 120 par pli), +16 ±8, et le nœud passe de 8 300 à 7 050 cycles.
- SEE (échange statique) : dans la calme +28, élagage des prises perdantes +25, élagage des coups tranquilles vers une case attaquée : +65 ±8 à nœuds égaux. Mais la première version (v8, 9 030 cycles par nœud) ne gagnait rien à temps égal : le ralentissement de 22 % mangeait tout.
- v7 : SEE allégé par une carte des cases attaquées (13 fois moins de balayages) et élagage avant
joue(): +39 ±11 à temps égal contre v6. Deux bogues trouvés par la comparaison C/asm (retour Z=1 pour un attaquant en a1, variable partagée).
v9 — pions passés, et la ROM de 32 Ko
Évaluation dynamique des pions passés (le premier terme de l’ablation), v9 en ROM 48 Ko. Gauntlet Mac : 605 parties, perf 1699. Les 4 novembre naissent les premières ROM de 32 Ko pour le vrai MM IV (mm4tk, 0x8000) : on découvrira le 8 novembre, par comparaison binaire, qu’elles avaient été reliées à partir des sources du 2 novembre, sans les pions passés, et que leurs sources n’existaient plus. Une version à 18 MHz a aussi été essayée puis écartée : Valter veut que le 6502 se mesure à sa fréquence d’origine.
v10 — le livre tiré des parties
Première version officiellement « MM IV 32 Ko » : patch binaire de la ROM du 4 novembre. Livre de 706 positions (7 013 octets) : 220 corrections Stockfish aux positions où Neo perdait 50 cp dès la sortie, les 402 positions jouées dans 630 parties repondérées selon les résultats, le haut de l’arbre complet jusqu’au niveau 8, consultation permanente. Le livre complet (livre3, 2 026 positions) ne tenait pas dans la ROM. Gauntlet : 258 / 575, perf 1702 ±15. Les pertes viennent des six premiers coups hors livre, et se répètent parce que les adversaires sont déterministes.
v11 — les tables réglées sur 143 311 positions
Seule la table ptab change (1 209 octets). Réglage prudent (régularisation vers v5) : natif +51 à 4 000 nœuds sur les ouvertures d’entraînement, mais +30 ±8 à 9 000 nœuds sur des ouvertures neutres, qui est le vrai chiffre. Gauntlet : 312 / 602, perf 1753 ±14, soit +51 ±20 sur la v10. Plus gros gains contre le MM IV (+19 %), le Par Excellence (+13 %), le Forte A et le Turbo 16K (+12 %).
v12 — cinq termes d’évaluation, et la ROM reconstruite
Analyse des 602 parties v11 : Neo perd 30 cp par coup hors livre contre 35 pour ses adversaires ; il est meilleur qu’eux du coup 20 au coup 90 et moins bon en finale ; 99 fois Tb1/Tb8 dans les 40 premiers plis parce que la colonne ouverte n’était pas évaluée. D’où cinq termes sur les masques de pions déjà tenus à jour : tour sur colonne ouverte ou semi-ouverte, pions doublés, isolés, bouclier du roi. Natif à nœuds égaux : +40 ±11.
Pour la mettre en ROM 32 Ko il a fallu, dans la nuit du 7 au 8, reconstituer la variante 32 Ko des sources (éditeur de liens, machine.c en taille minimale, plus d’analyseur FEN, seuil du livre sans division) : il manquait 2 Ko. Coût réel des termes : +10 à 15 % de cycles par nœud, pas les 0-2 % estimés la veille. Gauntlet : 323,5 / 602, perf 1766 ±14, +13 ±20 sur la v11 : dans le bruit.
v12b — la vitesse
Mêmes coups, même évaluation, 11 046 → 10 394 cycles par nœud (−5,9 %) : SEE par listes de pièces au lieu de huit rayons, table ptab réorganisée pour que le passage à la famille suivante soit un seul INC, pm_bascule réécrit (95 cycles au lieu de 115), structure et tours en cache. Le gauntlet long (3 040 parties, ±6) est lancé : à 1 597 parties, 50 %, perf 1737.
v13 — finales de pions abandonnée
Constat : dans 76 finales de pions pures du gauntlet v12, Neo marque 30 %. 5 431 positions de finales de pions étiquetées par Stockfish 11 ; deux termes (pion passé imprenable par la règle du carré, +600 ; chaque pion +200 en finale de pions) ramènent l’erreur statique de 451 à 205 cp. Natif : +12 ±11 sur 1 000 parties. Il ne restait que 65 octets de ROM.
Le soir, le doute de Valter sur la v12b a conduit au tableau toutes-rondes (section 4) : v13 contre v12b −4 ±8 en parties entières, −4 ±8 depuis des finales, −10 ±8 depuis des finales de pions pures, son propre terrain. Trois mesures, même signe : une évaluation statique plus juste au sens de Stockfish qui ne gagne pas une partie de plus. La recherche faisait déjà le travail et les bonus déforment le choix ailleurs. Abandonnée, et avec elle le principe de décider sur un étiquetage.
v14 — le livre quitte la ROM pour le module HG440 validée
Base : les sources v12b, moteur inchangé. Le livre d’ouvertures va dans un module de 16 Ko en 0x4000 : 2 026 positions, 2 611 coups (le livre3 complet, dont la v10 n’était qu’un extrait) en 12 415 octets, format à index de 257 entrées et enregistrements compacts (clé 24 bits, coups pondérés). La ROM garde un livre de secours de 115 positions (8 premiers plis, 915 octets) : une seule ROM joue avec ou sans module. 6 288 octets de ROM libérés. Vérifié en natif (les 2 026 positions retrouvées, tous les coups conformes, 15 faux positifs sur 100 000 clés au hasard) et dans l’émulateur ; identité ROM/natif confirmée sur deux positions. Déployée sur le Mac (pilote neo65mm4v14, -cart), gauntlet de 3 040 parties prêt avec un pré-vol qui vérifie que MAME lit bien le module. Image du module pour une EPROM 27C128 dans une coque de module, pour le vrai MM IV.
Gauntlet Mac du 9 novembre (mêmes huit adversaires, ×10, 1,5 s), arrêté à 376 parties pour libérer le Mac : 208 / 376 (55 %), perf 1780 ±18, contre une moyenne pondérée des adversaires de 1742. C’est la meilleure performance de Neo à ce jour, +14 ±23 sur la v12 (1766) : le moteur est celui de la v12b, la différence tient au livre complet et au bruit. Par adversaire : Turbo 16K 86 %, MM IV 64 % (perf 1888), Simultano 68 % (1881), Prisma 64 % (1823), Super Expert C 39 % (1799), Par Excellence 56 % (1764), Forte A 38 % (1718), MM V 29 % (1664). Les deux points faibles restent le MM V et le Forte A. Ces 376 parties tiennent lieu de mesure de la v14.
v15 « évaluation » — dix termes de plus abandonnée
Treize termes candidats calculés sur les 143 311 positions, réglés par Texel en gardant la v14 figée ; dix retenus (pions soutenus, en phalange, arriérés, tour derrière son passé, avant-postes de cavalier et de fou, colonnes sans pion devant le roi, mauvais fou, pion passé imparable). En natif : +18 ±15 à nœuds égaux, +10 ±7 sur 6 000 parties en retirant un coût estimé à 6 %. Porté en assembleur (variante légère, évaluations et arbres identiques au C), le coût réel est de +13 % de cycles par nœud : le recalcul de la structure de pions tombe dans 58 % des évaluations, car elle change à chaque coup de pion et à chaque annulation. Déjà à 4 % de coût la variante légère ne faisait plus que +3 : abandonnée. Leçon : sur ce processeur, un terme doit coûter moins d’environ 1 % de vitesse par point d’Elo qu’il rapporte.
v15 « vitesse » — le même programme, 16 % plus rapide au gauntlet
Mêmes coups, même évaluation, même arbre que la v14 (vérifié nœud pour nœud contre le C sur 63 positions et dans la ROM complète jusqu’à la profondeur 9 ; deux parties entières avec le module). Dans l’émulateur du MM IV, interruptions comprises : 10 397 → 8 738 cycles par nœud (−16 %), soit 19 % de nœuds de plus dans le même temps. Le match natif équivalent (la même machine avec 6 190 nœuds contre 5 202) donne +38 ±10 Elo.
D’où viennent les cycles : le test « case attaquée » passe par les listes de pièces au lieu de 24 balayages (−5 %) ; les variables chaudes vont en page zéro (−3,6 %) ; l’échiquier est aligné sur une page mémoire (0x0300) ; les rayons des pièces à longue portée, du cavalier et du roi sont déroulés dans la génération des coups, l’échange de pièces (SEE) et la carte des cases attaquées ; le choix du meilleur coup ne rebalaye plus toute la liste quand plusieurs coups ont le même score ; les caches de l’évaluation savent quand rien n’a bougé ; la phase de jeu est recalculée à l’annulation, ce qui rend 36 octets de RAM. Le déroulement coûte environ 4 Ko de ROM : il en reste 2 100. Conséquence pratique : l’échiquier n’est plus en 0x07FC mais en 0x0300 ; l’octet de version de la ROM passe à 15 et le greffon de la façade (v1.2) choisit la bonne adresse.
Gauntlet Mac, point à 416 parties (9 novembre, 15 h 21) : 225 / 416 (54 %), perf 1769 ±17 contre une moyenne pondérée de 1741. Par adversaire : Turbo 16K 83 %, Simultano 68 %, Par Excellence 62 %, Prisma 59 %, MM IV 53 %, Super Expert C 48 %, Forte A 30 %, MM V 30 %. C’est dans la marge de la v14 (1780 ±18 à 376 parties) : les +38 attendus de la vitesse ne se voient pas encore, et ne se verront peut-être qu’au millier de parties. Les deux points faibles sont les mêmes qu’avant : Forte A et MM V, à 30 % chacun, soit une centaine de points au-dessous de ce que Neo fait contre le reste du panel.
v15b — même ROM, livre corrigé par Stockfish au gauntlet : 1815 à 283 parties
Le moteur ne change pas d’un octet (ROM v15, md5 a52062b1 ; le livre de secours compilé dans la ROM non plus). Seul le module HG440 change : livre v14 + 577 corrections = 2 603 positions, 3 188 coups, 15 300 octets (1 084 libres). Méthode : toutes les parties des gauntlets Mac v10 à v15 sont rejouées ; chaque position où Neo sort du livre (huit premiers coups après la sortie) est comptée avec ses occurrences et son score ; Stockfish 16 à 400 000 nœuds note le meilleur coup et le coup de Neo (4 189 positions). Une correction est retenue si Neo perd au moins 50 centipions sur le meilleur coup et que son score dans la position ne dépasse pas 60 % (ou si la perte atteint 150). Le coup de Stockfish entre seul, au poids maximal. Perte moyenne évitée 127 cp ; les positions corrigées sont revenues 3 263 fois dans les gauntlets, d’abord contre Forte A (524), Super Expert C (520), MM V (513) et Par Excellence (470), c’est-à-dire exactement là où Neo souffre.
Contrôle dans l’émulateur du MM IV : sur 25 positions corrigées tirées au hasard et rejouées depuis la position initiale, la ROM v15 avec le nouveau module joue la correction 24 fois (la 25e est une position à deux dames que le banc ne reconstitue pas). Le gain ne peut se mesurer qu’au gauntlet, puisque le moteur est identique : gauntlet_neo65_v15b_x10.command, mêmes adversaires et même cadence que la v15 ; il attend la fin du gauntlet v15 s’il tourne encore. Ce qu’il faut en attendre : quelques dizaines de points au mieux, et surtout une lecture du poids réel de l’ouverture dans les défaites contre Forte A et MM V.
Gauntlet Mac, point à 283 parties (9 novembre, 18 h 44) : 174 / 283 (61 %), perf 1815 ±22 contre une moyenne pondérée de 1734 — +46 sur la v15 au même stade, et exactement là où le livre devait porter : Forte A 46 % (30 % en v15), MM V 47 % (30 %), Super Expert C 41 % (48 %), Par Excellence 65 %, Prisma 62 %, MM IV 54 %, Simultano 82 %, Turbo 16K 89 %. À 283 parties la barre est encore large, mais le signe est net : la moitié « glissement positionnel dès l’ouverture » des défaites contre Forte A et MM V était une affaire de livre. Les 577 corrections sont des coups de Stockfish aux positions que les adversaires déterministes répètent ; la boucle (gauntlet → positions perdantes hors livre → corrections → module) est à refaire après chaque gauntlet.
Une ombre : depuis la v14 (livre dans le module -cart), un cinquième des parties de Neo s’arrête (« s’est arrêté » : le relais meurt) et est rejouée — v12b 61 incidents sur 2 196 parties, v14 78/376, v15 67/416, v15b 74/283. Ce n’est pas le livre (10 arrêts sur 74 en position de livre, pli médian 56). Les résultats restent valides (les parties rejouées comptent), mais 20 % du temps de gauntlet est perdu ; cause à trouver (MAME, relais ou ROM) avec un relais journalisé.
v16 — la table de transposition était le verrou au gauntlet : 1848 à 423 parties
Journée partie pour « inventer des algorithmes » et finie sur une mesure simple : la table de transposition de 256 entrées est trop petite. En natif à nœuds égaux, 512 entrées : +16 ±8 ; 1 024 : +35 ±8 ; 4 096 : +35. Le gain vient des coupures par transposition, pas des coups de table (une table de coups seuls de 1 024 entrées ne vaut rien : +1). Dans 8 Ko de RAM, 512 entrées tiennent avec une entrée de 5 octets : vérification 15 bits, profondeur plafonnée à 7, score sur 8 bits (quart de pion), coup et borne logés dans les bits libres des cases 0x88 ; un score hors de ±508 (mats) n’est gardé que pour son coup. Une vérification sur 8 bits a été essayée : −38, les fausses coupures tuent. La RAM a été rendue par ailleurs à arbre quasi identique : profondeur maximale 32 → 24 (le pli 20 n’est atteint que dans 0,06 % des nœuds à 15 s, jamais le 24), pile de coups 384 → 352, historique 120 → 100 avec remise à zéro à chaque coup irréversible (ce qui corrige au passage la détection des répétitions au-delà de 120 plis).
Deuxième gain, à arbre strictement identique : en comptant, Neo jouait puis défaisait 44 000 coups sur 139 000 qui étaient soit illégaux à coup sûr (en échec, un coup qui ne pare pas ; roi vers une case attaquée), soit élagués par la futilité juste après. Filtres avant joue() en C puis en asm, plus un cache de l’évaluation statique par nœud : −32 % d’appels à joue(), −4,9 % de cycles. Le joue() asm rejetait déjà vite les coups illégaux, d’où un gain plus petit que les 12 % de cycles comptés en C. Avec la table compacte (qui coûte ~1,5 %), la ROM v16 tourne à 8 420 cycles par nœud contre 8 762 (−3,9 %).
Essayé et abandonné le même jour, natif, 1 000 à 2 000 parties : calme bornée par le SEE (−9 et −31 : 75 % des nœuds de calme ne sont que l’évaluation d’horizon) ; oracle à la racine façon 1987 (sécurité du roi par proximité, avant-postes, mauvais fou, tour en 7e : +5, et pire en forçant les poids) ; tempo (+3) ; historique replié (−8) ou supprimé (−15). Les 49 défaites v15 contre Forte A et MM V passées à Stockfish : 22 glissements positionnels sans bourde dès les plis 11-40, 27 bourdes nettes au pli 61 en plein milieu — moitié connaissance, moitié horizon. Le protocole du labo met l’émulation en pause entre les coups pour toutes les machines : pas de cerveau permanent possible.
Match natif à temps égal contre v15 (budgets 8 622 et 8 400 nœuds d’après les cycles mesurés, 2 000 parties) : +28 ±8 (les filtres seuls : +8 ±8). Règle des +8 : adoptée. Identité ROM = C vérifiée (banc 15 positions × 20 000 nœuds, ROM complète jusqu’à la profondeur 8, deux parties avec le module). ROM tk md5 4167caf6, mm4reel 98f753da, octet de version 16, greffon neoauto v1.2 compatible ; module v15b inchangé ; Neo65 v16-UCI natif pour Windows, Mac et Linux.
Gauntlet Mac (9 novembre, mêmes huit adversaires, ×10, 1,5 s) : 273,5 / 423 (64,7 %), perf 1848 ±18 contre une moyenne pondérée de 1743. C’est la meilleure performance de Neo, +33 sur la v15b et +79 sur la v15, un peu au-delà des 1 840 attendus en additionnant le livre (+46) et le moteur (+28). Par adversaire : Turbo 16K 96 %, Simultano 84 %, Prisma 75 %, Forte A 61 %, MM V 59 %, MM IV 55 %, Par Excellence 48 %, Super Expert C 46 %. Les deux points faibles de toujours passent au-dessus de 50 % pour la première fois : Forte A 30 % en v15, 46 % en v15b, 61 % en v16 ; MM V 30 %, 47 %, 59 %. Le livre a fait la moitié du chemin, la table de transposition et les filtres l’autre. Seul recul visible, le Par Excellence (65 % → 48 %, 63 parties) : près de deux écarts-types, à surveiller sur la suite du gauntlet. Neo marque désormais autant avec les Noirs (65,9 %) qu’avec les Blancs (63,4 %), quand la v10 faisait 50 % et 40 %.
4. Ce que valent les versions entre elles
Tableau toutes-rondes natif du 8 novembre : dix paires, 2 000 parties chacune, budget de nœuds par coup égal à 11 s de machine à 4,9152 MHz divisées par les cycles par nœud mesurés de chaque ROM (v11 10 156, v12 11 046, v12b 10 394, v13 10 315 ; v10 non mesurable, budget de la v11). Échelle ajustée par moindres carrés, résidus 8,6 Elo, cohérents avec la barre d’erreur.
| Version | Elo relatif (natif, temps machine égal) | Gauntlet Mac | Ce qui a changé |
|---|---|---|---|
| v10 | 0 | 1702 ±15 (575 p.) | livre de 706 positions, ROM 32 Ko |
| v11 | +41 | 1753 ±14 (602 p.) | tables réglées — la vraie marche |
| v12 | +51 | 1766 ±14 (602 p.) | cinq termes d’évaluation, +10 réels |
| v12b | +62 | 1733 ±7 (2 196 p.) | même programme 6 % plus vite : +11 par la seule vitesse |
| v13 | +58 | — | finales de pions : rien de mesurable, abandonnée |
| v14 | = v12b | 1780 ±18 (376 p., arrêté) | moteur v12b, livre dans le module |
| v15 vitesse | ≈ +100 (v14 + 38 ±10) | 1769 ±17 (416 p.) | même programme, 19 % de nœuds en plus par seconde |
| v15b | = v15 (moteur identique) | 1815 ±22 (283 p.) | même ROM, livre du module corrigé par Stockfish (577 positions) : +46 au gauntlet, Forte A et MM V de 30 % à 46-47 % |
| v16 | ≈ +128 (v15 + 28 ±8 à temps égal) | 1848 ±18 (423 p.) | v15b + TT 512 entrées (5 octets), filtres avant joue(), cache d’évaluation ; même module que la v15b |
De la v15 à la v16, en deux marches : le livre (v15b, +46 au gauntlet à 283 parties, moteur identique) puis le moteur (v16, +28 ±8 au match natif à temps égal, livre identique) ; si les deux tiennent, la v16 devrait se mesurer autour de 1 840 au gauntlet. C’est ce qui s’est passé : 1848 ±18 à 423 parties. Cohérence avec les gauntlets : v10 → v12 fait +64 au gauntlet et +51 au natif ; v11 → v12 fait +13 et +10. Le 1733 ±7 final de la v12b (2 196 parties) contre 1766 ±14 pour la v12 tient au bruit et aux séries d’adversaires déterministes (2 σ) : à nœuds égaux les deux programmes sont identiques (−4 ±8).
La progression au gauntlet, de la v10 à la v16
Huit gauntlets en trois jours, du 7 au 9 novembre, contre les mêmes huit machines à leur fréquence d’origine (moyenne pondérée des adversaires entre 1734 et 1743 selon les tirages), soit 5 473 parties. Chaque point est la performance de la version sur la liste du labo ; les barres sont à ±1 σ.
| Version | Parties | + | = | − | Score | Blancs | Noirs | Perf. | Écart sur la précédente |
|---|---|---|---|---|---|---|---|---|---|
| v10 | 575 | 213 | 90 | 272 | 44,9 % | 50,2 % | 39,5 % | 1702 ±15 | |
| v11 | 602 | 241 | 142 | 219 | 51,8 % | 54,0 % | 49,7 % | 1753 ±14 | +51 |
| v12 | 602 | 267 | 113 | 222 | 53,7 % | 54,2 % | 53,3 % | 1766 ±14 | +13 |
| v12b | 2196 | 896 | 380 | 920 | 49,5 % | 51,3 % | 47,6 % | 1733 ±7 | −33 |
| v14 | 376 | 178 | 60 | 138 | 55,3 % | 56,9 % | 53,7 % | 1780 ±18 | +47 |
| v15 | 416 | 191 | 68 | 157 | 54,1 % | 55,2 % | 52,9 % | 1769 ±17 | −11 |
| v15b | 283 | 148 | 52 | 83 | 61,5 % | 65,3 % | 57,6 % | 1815 ±22 | +46 |
| v16 | 423 | 242 | 63 | 118 | 64,7 % | 63,4 % | 65,9 % | 1848 ±18 | +33 |
Trois marches se détachent, et ce sont celles que les matchs natifs annonçaient : les tables réglées (v11, +51), le livre corrigé par Stockfish (v15b, +46 sur la v15, moteur identique) et la table de transposition avec les filtres (v16, +33 sur la v15b, livre identique). Entre deux, les versions de vitesse ou d’évaluation fine (v12, v12b, v14, v15) restent dans une bande de 1733 à 1780 que le gauntlet ne sait pas départager : leurs écarts réels, mesurés en natif, sont de 10 à 40 points, de l’ordre de la barre d’erreur. De la v10 à la v16 : +146 points en trois jours, sur le même processeur à la même fréquence et à la même cadence.
Adversaire par adversaire
| Adversaire (cote) | v10 | v11 | v12 | v12b | v14 | v15 | v15b | v16 |
|---|---|---|---|---|---|---|---|---|
| Super Expert C (1880) | 32 % | 30 % | 39 % | 33 % | 39 % | 48 % | 41 % | 46 % |
| MM V (1822) | 38 % | 43 % | 34 % | 22 % | 29 % | 30 % | 47 % | 59 % |
| Forte A (1803) | 30 % | 42 % | 44 % | 40 % | 38 % | 30 % | 46 % | 61 % |
| MM IV (1787) | 31 % | 50 % | 71 % | 54 % | 64 % | 53 % | 54 % | 55 % |
| Simultano (1747) | 48 % | 50 % | 75 % | 55 % | 68 % | 68 % | 82 % | 84 % |
| Par Excellence (1725) | 54 % | 67 % | 38 % | 52 % | 56 % | 62 % | 65 % | 48 % |
| Prisma (1724) | 51 % | 47 % | 55 % | 55 % | 64 % | 59 % | 62 % | 75 % |
| Turbo 16K (1437) | 72 % | 85 % | 75 % | 82 % | 86 % | 83 % | 89 % | 96 % |
Pourcentage marqué par Neo. En vert, 60 % et plus ; en rouge, moins de 40 %.
Le tableau raconte la même histoire que la courbe, adversaire par adversaire. Le Turbo 16K (1437) n’a jamais été un problème et tombe à 96 %. Les progrès des tables (v11) se voient surtout contre le MM IV et le Par Excellence. Le Forte A et le MM V, les deux machines contre lesquelles Neo plafonnait à 30 % jusqu’à la v15, ne cèdent qu’au livre corrigé puis à la table de transposition : leurs défaites étaient pour moitié des sorties de livre perdantes, pour moitié des bourdes d’horizon. Depuis la v15b, plus aucun adversaire n’est sous 40 % ; avec la v16, il n’en reste que deux sous 50 % : le Super Expert C (1880), le plus fort du panel, et le Par Excellence.
Et avant la v10 ?
Les versions 48 Ko ne sont pas sur la même échelle (livre différent, pas de pions passés dans les premières 32 Ko), mais l’ordre de grandeur est connu : v1 à 10 % contre le panel, v4 +61 natif sur v1, v5 à 20 % à 15 s par coup (≈ 1590), v6-v7 +55 environ à temps égal, v9 à 1699. Du 27 octobre au 8 novembre, quelque 400 à 450 Elo sur le même matériel.
5. Tout ce qui a été essayé
Les Elo sont ceux des matchs natifs (1 000 à 2 000 parties, ±8 à ±11). « Réserve » : code présent, désactivé par macro.
| Élément | Mesure | Décision | Pourquoi |
|---|---|---|---|
| Itération interrompue utilisée (PARTIEL) | +71 ±11 | gardé | 60 % du temps était jeté |
| Sans réductions tardives (LMR) | +45 ±10 à 4k ; +7 à 16k, −21 à 256k | gardé | à profondeur 3-5, LMR rate des tactiques ; à revoir si la profondeur monte (UCI natif) |
| Futilité à la frontière (150, prof. 1) | +33 ±11 (temps fixe) | gardé | |
| Futilité inverse (prof. ≤ 3, 120/pli) | +16 ±8, nœud −15 % de cycles | gardé | premier élément de l’ablation transposé |
| SEE : calme, prises perdantes, coups tranquilles vers case attaquée | +65 ±8 à nœuds égaux ; +39 ±11 à temps égal une fois allégé | gardé | la première version (+22 % de cycles) ne gagnait rien |
| Extensions d’échec | −55 à −61 sans elles | gardé | essentielles |
| Pions passés dynamiques | −82 dans Stockfish ; présent depuis v9 | gardé | absents par erreur des ROM 32 Ko du 4/11, rétablis en v12 |
| Tables réglées (Texel, 143 k positions, régularisées) | +30 ±8 (9k, ouvertures neutres) | gardé (v11) | le réglage libre faisait +53 à 4k mais +14 à 9k : sur-apprentissage |
| Tour colonne ouverte / semi, doublés, isolés, bouclier | +40 ±11 à nœuds égaux, +10 à temps égal | gardé (v12) | coût +10-15 % de cycles |
| SEE par listes, ptab +256, pm_bascule, caches | −5,9 % de cycles, +11 Elo | gardé (v12b) | |
| Livre dans le module HG440, 2 026 positions | jeu identique, 6,3 Ko de ROM libres | gardé (v14) | gauntlet 1780 ±18 |
| Dix termes d’évaluation (structure de pions, avant-postes, roi, mauvais fou, passé imparable) | +18 à nœuds égaux ; coût réel +13 % de cycles | abandonné | le recalcul des pions tombe dans 58 % des évaluations |
| Case attaquée par les listes de pièces, page zéro, plateau aligné, rayons déroulés, caches « sales », choisit avec compte des égalités | −16 % de cycles, +38 ±10 | gardé (v15) | même arbre que la v14 ; gauntlet 1769 ±17 à 416 p. |
| Livre du module corrigé par Stockfish : 577 positions des gauntlets où Neo perdait ≥ 50 cp en sortant du livre | gauntlet 1815 ±22 à 283 p. (v15 : 1769) ; Forte A et MM V de 30 % à 46-47 % | gardé (v15b) | 2 603 positions, 1 084 octets libres ; boucle à refaire après chaque gauntlet |
| Finales de pions : passé imprenable +600, pion +200 | −4 / −4 / −10 ±8 | abandonné | plus juste au sens de Stockfish, pas plus fort en jeu |
| Évaluation riche EVAL_PLUS (v4-v5) | +75 à nœuds égaux, −23 à −72 à temps égal | abandonné | ×1,83 par nœud ; ses termes utiles sont revenus un à un, allégés, en v12 |
| Texel sur auto-parties | régression | abandonné | sur-apprentissage ; il faut de vraies parties |
| Parades en échec dans la calme (Q_EVASIONS) | −13 | réserve | trop de nœuds à ce budget |
| Calme bornée (Q_MAX 4 / 6) | +43 seule, +2 avec sans-LMR ; Q_MAX 6 : rien | réserve | |
| Coup nul (R=2), razoring, futilité prof. 2 (350) | −7 / — / +6 | réserve | neutres |
| Futilité inverse 160 / 90 | −12 / 0 | réserve | |
| Aspiration 25, IID prof. 3 / 4 | +2 / +2 / −11 | réserve | |
| Table de transposition 512 entrées, entrée de 5 octets (vérif. 15 bits, score/4) | +16 ±8 à nœuds égaux ; 1 024 : +35 ; 4 096 : +35 | gardé (v16) | le gain vient des coupures, pas des coups de table (+1) ; vérif. 8 bits : −38 |
| Filtres avant joue() : parades en échec, roi vers case attaquée, futilité avant joue (légalité certaine) ; cache d’évaluation par nœud | arbre identique, −32 % de joue(), −4,9 % de cycles | gardé (v16) | +8 ±8 à temps égal |
| Calme bornée par SEE (quota 8 / 2 + swap-off) | −9 / −31 | abandonné | 75 % des nœuds de calme sont l’évaluation d’horizon |
| Oracle à la racine (pré-processeur 1987 : roi, avant-postes, mauvais fou, 7e, cibles) | +5 ±11 ; ×2 −1 ; ×3 −20 | abandonné | infrastructure gardée (oracle.c, SPSA) |
| Tempo 12 / 20 ; historique replié / supprimé ; TT 384 repliée | +3 / −1 ; −8 / −15 ; −18 | abandonné | |
| Extension de reprise (RECAP), tri à deux étages, sortie anticipée de choisit | −34 / +13 mais 0 cycle / +0,1 % de cycles | abandonné | |
| Q_ENTREE (pas de génération en calme si la plus grosse prise ne remonte pas alpha) | −39 % de générations en finale de dames, −1,5 % en milieu | réserve | à réserver aux phases basses |
| Version 18 MHz (TurboKit) | gauntlets faits | abandonné | décision de Valter : fréquence d’origine seulement |
| Tablebases dans la fente HG440 | — | abandonné | seule une bitbase KPK tiendrait, pour 14 parties sur 602 |
| Corrections de livre ciblées (v10) | 220 positions | gardé | biais assumé : elles exploitent le déterminisme des adversaires du labo |
6. Les leçons
- À ce budget, la vitesse vaut autant que l’idée. Deux fois (SEE v8, EVAL_PLUS) un gain net à nœuds égaux a été annulé par son coût en cycles ; la v12b gagne autant par 6 % de vitesse que la v12 par cinq termes d’évaluation.
- Mesurer au bon budget et sur des ouvertures neutres. À 4 000 nœuds sur les ouvertures d’entraînement, les réglages paraissent deux fois meilleurs qu’ils ne sont.
- Le gauntlet n’est pas un comparateur. ±14 Elo pour 600 parties ; les versions diffèrent de 10 à 30. Le match natif à temps machine égal, 2 000 parties en 40 minutes, est l’instrument.
- Un étiquetage n’est pas une preuve. La v13 divisait par deux l’erreur statique mesurée contre Stockfish et perdait des parties. Seul le match compte.
- Garder les sources de chaque ROM. La perte des sources 32 Ko du 4 novembre a coûté une nuit de reconstruction et caché pendant trois jours l’absence des pions passés.
- Les adversaires déterministes trompent. Un changement d’évaluation déplace les lignes de sortie de livre, et des séries entières basculent dans un sens ou l’autre : d’où les gauntlets de 3 040 parties.
7. État des lieux au 9 novembre, 11 h
ROM et module
- v14 :
neo65_v14_mm4tk.rom(md5 f553b8eb),_mm4reelpour le vrai MM IV (7b32b798), moduleneo65_v14_module_hg440.bin(e3ffcdae). Texte 0x803B-0xC26F, ptab 0xC300, rodata jusqu’à 0xE76A. - v15 :
CHESS\Neo65\v15\—neo65_v15_mm4tk.rom(md5 a52062b1),_mm4reel(b94085ae), même module, sources, greffon neoauto v1.2. Plateau en 0x0300, octet de version 15. - v16 :
CHESS\Neo65\v16\—neo65_v16_mm4tk.rom(md5 4167caf6),_mm4reel(98f753da), module v15b,neo65_v16_uci.exe/_mac_arm64/_linux, sources (patch_asm.pyapplique les blocs asm àrecherche_v15.s), LISEZMOI. RAM : bss 0x1E79, pile min 0x1EE1. - v15b :
CHESS\Neo65\v15b\— même ROM, moduleneo65_v15b_module_hg440.bin(md5 57be46ce), sources du livre (extrait.py,analyse_sf.py,construire.py, analyses Stockfish), LISEZMOI. - Mac : gauntlet v14 arrêté à 376 parties (perf 1780) ; gauntlet v15 en cours (1769 à 416 parties) ; v15b installée (
module_v15b.bin, entrée « Neo65 v15b MM IV »,gauntlet_neo65_v15b_x10.command), elle démarre seule à la fin de la v15. - PC et site : moteur « Shahmatic Neo6502 » encore en v11 ; v14 préparée (
neo_uci.jsavec module embarqué), à déposer quand le PC sera relié. - Vrai MM IV : ROM
_mm4reelde chaque version ; contact pris avec Gerardo pour la gravure et une coque de module.
Neo libéré du 6502
Neo65 v14-UCI : le même programme compilé pour le PC (Windows x64), le Mac (arm64) et Linux. Il joue 2 à 4 millions de nœuds par seconde, profondeur 9-10 en 3 s, avec gestion du temps, variante principale complète, évaluation, nœuds et nœuds par seconde à chaque itération. La recherche est inchangée (vérifié : même nombre de nœuds que la référence à profondeur fixe). Sa table de transposition de 256 entrées, taillée pour 8 Ko de RAM, est son principal handicap à cette vitesse ; c’est voulu : il mesure les algorithmes de Neo, pas une autre machine.
Usage prévu : quatrième membre d’Orion+ (Forte A + MM IV + Designer 2100 + Neo), dans le même gauntlet qu’Orion, pour voir si Neo apporte des coups que les trois autres ne trouvent pas.
8. Les dérivés de Neo : où il joue, ce qu’il faut répercuter
Neo n’est pas un programme mais une ROM, et cette ROM vit à neuf endroits. À chaque version, chacun doit être mis à jour ou, au moins, on doit savoir qu’il ne l’a pas été. Le tableau est la liste de contrôle ; la colonne « version » dit où en est chaque dérivé au 8 novembre.
| Dérivé | Où | Forme | Version | À répercuter à chaque version |
|---|---|---|---|---|
| ROM du vrai MM IV | CHESS\Neo65\rom_mm4_reel\ (PC), CHESS/neo65/ (Mac) | neo65_vNN_mm4tk_mm4reel.rom (double lecture des capteurs) + image du module _module_hg440.bin (27C128) | v14 | patch_reel.py sur la ROM ; même module. Gravure et coque de module : Gerardo. |
| Gauntlet Mac (la mesure officielle) | cbemu_mac/neo65/, pilote neo65mm4vNN dans mess_uci.py, machines_mac.tsv, lanceur, gauntlet_neo65_vNN_x10.command | ROM dans MAME mm4 + -cart neo65/module_v14.bin | v14 prêt ; v12b en cours | ROM, pilote, ligne tsv, lanceur, .command avec pré-vol du module. |
| Shahmatic Neo6502 (moteur PC coté dans la liste) | cb-emu_UCI\machines\Shahmatic Neo6502\ | neo_uci.js (émulateur Node, ROM embarquée, premier octet 0x05 = niveau 5), node.exe | v11 | Entrée cotée de la liste du labo : ne bascule qu’avec une décision, puisque la cote change d’objet. La v14 est à côté, dans Shahmatic Neo6502 v14. |
| Shahmatic Neo65 v14 (membre d’Orion+) | machines\Shahmatic Neo6502 v14\, Banksia, candidats_orion_plus.tsv | neo_uci.js avec module embarqué, --sansmodule, --module, rejeu en mode édition après un désaveu | v14 | ROM + module dans le .js ; le rejeu est indispensable à tout méta-moteur. |
| Shahmatic Neo65 v14-UCI (natif, libéré du 6502) | machines\Neo65 v14-UCI\, Banksia ; Mac neo65_v14_uci_mac_arm64 | uci_pc.c + sources C, compilé zig cc pour Windows, macOS, Linux | v14 | Recompiler à chaque version ; même nombre de nœuds que la référence à profondeur fixe (contrôle). |
| Orion+ (méta-moteur) | machines\trio\Orion+ v14\uci.bat, gauntlet_orion_plus_2050_2350.bat, Banksia « Shahmatic Orion+ » | Forte A + MM IV + Designer 2100 + Shahmatic Neo65 v14, arbitre Stockfish 18 | v14 | Changer le membre Neo dans candidats_orion_plus.tsv et l’option Trio. |
| Jouer en ligne (site, page Neo6502) | ARTICLES\en_ligne\neo6502\index.html → chess.lumn.eu par FileZilla | Émulateur dans la page, ROM et module embarqués (base64), mention « By Valter Drazic – vNN » sur l’afficheur | v14 préparée, à mettre en ligne | ROM_B64, MODULE_B64, la mention de version ; sauvegarde index.sauvegarde_v11.html. |
| Match en ligne (site, page Match) | ARTICLES\en_ligne\match\index.html + data.js, qui charge ../neo6502/neo65.js en Worker | neo65.js (même ROM et module que la page Neo) ; data.js déclare « Shahmatic Neo6502 · 4,9 MHz » (1709) et « · 18 MHz » (1868) | v14 préparée, à mettre en ligne | neo65.js ; les cotes de data.js ; la variante 18 MHz y figure encore alors qu’elle est abandonnée : à retirer ou à assumer. |
| Version bureau (installateur Windows) | CHESS\Neo65\bureau\Installer_Shahmatic_Neo6502_v14.exe | La page du site rendue autonome (chess.js inclus, ROM et module embarqués), installée dans %LocalAppData%\Shahmatic Neo6502, raccourcis, entrée Programmes, fenêtre Edge en mode application | v14 | Regénérer Shahmatic_Neo6502.html depuis la page du site, recompiler l’installateur (installeur.c, zig). |
| MSI (gauntlet ×5) | cb-emu_UCI du MSI | Même moteur Node que le PC, 8 adversaires « x5 » | v12 | Sans objet depuis le tableau natif ; le MSI ne tient pas ×5 à plus de 2 parties. |
Règle : une version n’est « livrée » que lorsque les six premières lignes sont à son numéro ; les pages du site suivent dès la mise en ligne ; la version bureau et le moteur coté suivent sur décision.
9. Perspectives
Court terme
- v16 mesurée : 1848 ±18 à 423 parties (attendu ≈ 1 840). La pousser au millier de parties pour ±12 et confirmer le recul contre le Par Excellence ; puis refaire la boucle du livre sur les gauntlets v15b et v16 (positions où Neo sort du livre en perdant ≥ 50 cp).
- Trouver la cause des arrêts de Neo depuis la v14 (20 % des parties rejouées) : relais journalisé (
CBEMU_LOG=1) sur quelques parties avec-cart. - Orion+ v14 et Neo65 v14-UCI dans le gauntlet d’Orion dès que le PC est relié ; en parallèle, la variante à vitesse 6502 (« Shahmatic Neo6502 v14 ») comme quatrième membre, à armes égales avec les trois machines.
- Kit Mac
match_natif.command: compiler les versions, jouer les paires, écrire le tableau, pour que la mesure interne se refasse en une demi-heure à chaque version.
La ROM a de la place : étape 2 de la v14
Les 6 288 octets libérés servent à des algorithmes, un par un, chacun admis à ≥ +8 Elo au match natif à temps égal. Dans l’ordre où l’ablation et les parties les désignent :
- Finales : le vrai point faible (30 % dans les finales de pions, 26,6 cp par coup contre 20,8 en finale). Pistes côté recherche plutôt qu’évaluation : profondeur ou extensions en finale, Q_ENTREE en phase basse, roi actif.
- Menaces bon marché (pièces en prise, −58 dans l’ablation) et sécurité du roi (−63, mais chère : cartes d’attaque).
- Pions arriérés, candidats, passés liés ou protégés : la structure de pions était à −4 dans Stockfish ; à n’essayer que parce que les masques existent déjà et que le coût est faible.
- Aspiration (−112 dans l’ablation, +2 mesuré chez Neo : à comprendre).
- Vitesse : faite en v15 (−16 % de cycles, +38) et v16 (−3,9 %). Ce qui reste est la sauvegarde d’état à chaque coup joué et le balayage du tri : quelques pour cent au plus.
- RAM : c’est elle qui limite maintenant (1 024 entrées de TT vaudraient +35, il n’y a plus que 104 octets de marge). Pistes : entrée de 4 octets sans coup de table (les coups de table valent peu) pour 640-768 entrées, pile de coups 320, un seul coup tueur par niveau.
- Refonte des tables d’attaque (le ×1,5-×3 de 1987) : seule voie restante vers le pli manquant des bourdes du milieu de partie ; prototype chiffré en C d’abord.
Plus loin
- Module HG440 : fait en v15b (1 084 octets encore libres) ; la suite du livre passera par de nouvelles parties, ou par du code dans le module si la ROM se remplit.
- Gravure et test sur le vrai MM IV ; la page en ligne avec la même ROM et le module.
- Neo680xx : la même démarche sur les modules Mephisto 68000/68020 à fréquence d’origine (le même C coûte 31 570 cycles par nœud sur 68000 : un 68000 à 12 MHz vaut ×1,2 le 6502 à 4,9 MHz).
- Pour Neo65-UCI, un jour, une variante « grande table » pour voir ce que valent les algorithmes sans la contrainte des 8 Ko : ce serait un autre programme, et il faudra le dire.
