1 points par GN⁺ 3 시간 전 | 1 commentaires | Partager sur WhatsApp
  • Wake up! 16b est une intro DOS x86 en mode réel de 16 octets, dévoilée à l’Outline Demoparty, qui génère simultanément un fractal de Sierpinski et du son via le tampon texte
  • Avec int 10h et le réglage ds=0xb800, il utilise le motif initial de l’écran en mode texte 40x25 comme espace de calcul, où les octets d’espace et de couleur influencent le rendu
  • xor [si], al se comporte comme une addition sans retenue, créant la structure de Sierpinski du bit 1, tandis que le même octet est envoyé au haut-parleur PC via out 61h, al
  • La boucle réelle se déplace de -56 octets à chaque itération puis se réinitialise après 8 192 étapes ; le son descend d’une octave et l’écran montre un motif cisaillé en 10 colonnes de caractères
  • Des éléments comme le patch 0xB000 pour MDA/Hercules et les différences d’état du BIOS ou de la RAM modifient le résultat, faisant des artefacts matériels naturels une partie du sizecoding

Structure essentielle d’une intro x86 de 16 octets

  • Wake up! 16b est une intro en assembleur DOS x86 en mode réel de 16 octets, présentée en mai 2026 à l’Outline Demoparty d’Ommen, aux Pays-Bas
  • Elle utilise le tampon texte VGA/CGA comme espace de calcul pour dessiner à l’écran un fractal de Sierpinski infini, tout en envoyant les mêmes données vers le port du haut-parleur PC pour produire du son
  • Le code complet tient sur 16 octets
    int 10h          ; 2 octets
    mov bh, 0xb8     ; 2 octets
    mov ds, bx       ; 2 octets
    L:
    lodsb            ; 1 octet
    sub si, byte 57  ; 3 octets
    xor [si], al     ; 2 octets
    out 61h, al      ; 2 octets
    jmp short L      ; 2 octets
    
  • Pendant le développement, l’auteur a exploré l’usage d’un automate cellulaire à la fois pour les graphismes et le son, ainsi que des techniques de sizecoding comme une instruction d’assembleur polymorphe où add [bx+si],al devient 0x0000, ou encore la réutilisation d’octets et d’opcodes via des sauts au milieu des instructions
  • Une œuvre antérieure, "M8trix", était une intro de 8 et 7 octets de 2014 qui faisait se propager à l’écran des caractères pseudo-aléatoires ; dans Wake up! 16b, le son arrive d’abord, puis l’effet visuel s’y imbrique

L’écran texte initialisé

  • int 10h règle le mode vidéo 0, créant une grille de texte 40x25
  • mov bh, 0xb8 et mov ds, bx positionnent le segment de données ds sur 0xb800, l’adresse du tampon texte VGA/CGA
  • Lorsque le BIOS efface l’écran, il ne remplit pas la mémoire avec des zéros : il écrit dans les 2 000 emplacements de caractères l’octet de caractère 0x20 (espace) et l’attribut de couleur 0x07 (gris clair sur fond noir)
  • L’écran semble vide, mais la mémoire conserve un motif uniforme, et cet état initial influence la sortie sonore et visuelle
  • Les données avant et après la mémoire vidéo visible, ainsi que la manière dont l’initialisation se fait après un « clear screen », se retrouvent aussi dans le résultat, produisant un son plus rugueux et singulier qu’on pourrait l’attendre

Sommes cumulées et structure binomiale

  • Si l’on ne regarde que la structure mathématique, on peut supposer un état initial à 0 au lieu de 0x20, utiliser add à la place de xor, avancer de 16 octets à la fois, et démarrer al à 2
  • Un segment DOS fait exactement 65 536 octets, et avec un déplacement de 16 octets il faut 4 096 étapes pour parcourir tout le segment
  • Comme 4 096 est un multiple de 256, la taille d’un registre 8 bits, les retenues se réalignent quand le segment reboucle, et al revient à 2 au début de chaque balayage
  • En additionnant continuellement les valeurs entre cellules, on obtient une somme préfixe, et les valeurs se déploient comme une suite de coefficients binomiaux mise à l’échelle par 2
  • Si l’on observe plusieurs passages sur les 16 premières cellules, les valeurs s’accumulent ligne par ligne ; comme il s’agit de valeurs sur 8 bits, tout ce qui dépasse 256 reboucle et réapparaît sous forme de petites valeurs

XOR et structure de Sierpinski

  • En raison des propriétés combinatoires modulo 2, un triangle de Sierpinski apparaît, et ce bit est envoyé directement au haut-parleur PC
  • Au niveau des bits, une addition sans retenue correspond à un XOR, d’où l’usage de xor [si], al dans le code à la place de add
  • La valeur initiale 2 vaut 00000010 en binaire, donc seul le bit 1 alterne entre 0x00 et 0x02
  • Ce motif correspond à la rule 60 des automates cellulaires élémentaires
  • D’après le théorème de Lucas, ce motif coïncide avec le bit 1 de la table d’addition ; dans le tableau, les positions où le bit 1 est actif apparaissent comme 2

Comment les données deviennent du son

  • out 61h, al envoie l’octet calculé au port 61h relié au haut-parleur PC
  • Le bit 1 du port 61h détermine si la membrane du haut-parleur est poussée vers l’extérieur ou tirée vers l’intérieur
  • Le code calcule le fractal avec XOR, écrit le résultat en mémoire, puis envoie immédiatement ce même octet au port du haut-parleur
  • Les 1 et les 0 issus du fractal produisent une onde carrée (square wave) dont la largeur d’impulsion et la fréquence varient naturellement ; lue ligne par ligne, elle devient un bytebeat auto-similaire, presque invariant en tempo
  • Le son de sortie mélange non seulement le tampon texte, mais aussi le reste des octets du segment de 64 Ko ; à cause notamment du code BIOS vidéo ROM présent en shadow, le résultat diffère du bytebeat en onde rectangulaire superposée basé sur les lignes de Sierpinski auquel on pourrait s’attendre, et conserve un caractère rugueux et funky

Pas de 56 octets : octave et cisaillement diagonal

  • Le code réel n’avance pas de 16 octets à chaque tour : la combinaison de lodsb et sub si, byte 57 le fait reculer de -56 octets par itération
  • Ce pas remplit l’écran de façon plus clairsemée tout en évitant que le tampon sonore ne devienne trop grand, et il sert à reproduire un effet visuel proche de M8trix
  • Audio

    • 56 ne divise pas exactement 65 536
    • Le code ne visite que des offsets multiples de 8 et ne se réinitialise qu’après 8 192 étapes et 7 rebouclages
    • Comme la longueur du cycle double, la fréquence fondamentale est divisée par deux, ce qui fait descendre le son d’une octave
  • Visuel

    • Sur un écran large de 80 octets, un déplacement de -56 octets équivaut à avancer de 24 octets, soit 12 colonnes
    • Le nombre de colonnes distinctes visitées n’est que de 10
    • Le fractal n’apparaît donc pas comme une image pleine, mais comme un motif cisaillé en diagonale dans 10 colonnes de caractères qui montent à l’écran
    • Le triangle réel fait 8 192 « pixels » de large, mais une ligne de texte ne contient que 80 octets ; on perçoit donc le mouvement, sans pouvoir facilement voir directement toute la structure
    • Si l’on dessinait tout d’un coup sans sauter de pixels, ou avec un écran bien plus grand, le triangle deviendrait visible

Exécution sur matériel réel

  • Le scener miragept a exécuté le programme sur vrai matériel en patchant l’adresse de 0xB800 vers 0xB000, utilisée par le MDA, afin d’obtenir un texte vert adapté au MDA/Hercules
  • La machine utilisée n’était pas un IBM exact, mais un 286 avec une carte EGA capable d’émuler MDA/Hercules, accompagné d’un véritable moniteur MDA
  • L’audio capturé contient un bruit de fond continu propre à la machine, et le moniteur IBM 5151 présente une longue persistance du phosphore, peu adaptée à un affichage très rapide
  • Le changement d’octet d’adresse a légèrement modifié le son, mais le programme a fonctionné comme prévu, et dans la seconde moitié la structure de Sierpinski est même plus visible que dans la version d’origine
  • Selon l’émulateur et la version du BIOS, les artefacts laissés en RAM diffèrent ; comme le code applique un XOR sur cet état mémoire, la sortie est sensible à l’environnement d’exécution
  • On pourrait obtenir un rendu uniforme en effaçant d’abord la mémoire, mais cela nécessiterait des octets supplémentaires ; accepter l’état naturel du matériel fait partie du charme du sizecoding

Ressources associées

1 commentaires

 
GN⁺ 3 시간 전
Commentaires sur Hacker News
  • En remontant ça, je suis tombé dans un rabbit hole d’une heure, et j’ai fini par regarder une vidéo de deux personnes créant un triangle de Sierpiński avec une présentation PowerPoint récursive
    https://youtu.be/b-Fa6HtvGtQ?si=LpQszgA9_K-m3V3-
    • Matt Parker et Steve Mould font partie des meilleurs vulgarisateurs STEM sur YouTube
      Ils sont tous les deux pleins d’esprit et très expérimentaux. Parker est plus du côté des maths pures, tandis que Mould touche à plusieurs domaines et satisfait parfaitement l’envie d’expériences/DIY
      Si vous aimez cette vidéo, je recommande vivement d’aller voir davantage sur leurs deux chaînes
      https://www.youtube.com/@standupmaths
      https://www.youtube.com/@SteveMould
  • J’ai sincèrement pensé qu’une démo de 32 octets que j’avais vue autrefois représentait la limite de ce qu’on pouvait faire en gardant un binaire aussi petit tout en restant agréable à regarder
    Cette démo n’avait même pas de son
    C’est vraiment un travail énorme, un chef-d’œuvre qui pourrait servir de pièce de départ à la retraite. Plus réalistement, quelqu’un essaiera sans doute de refaire la même chose sur une autre architecture
  • Quand je vois ce genre de code génératif minuscule, j’ai envie de crier « sorcellerie ! »
    Bravo
  • Parmi les démos liées, je suis resté complètement hypnotisé par rainbow surf
    https://www.youtube.com/watch?v=QKLhH_ANwIc
    • C’est la personne qui a fait "wake up". Oui, cette démo m’a redonné envie de m’y remettre
      Dans notre communauté du size coding, on pensait avoir épuisé tous les tricks d’automates cellulaires il y a des années, puis Plex est arrivé et a montré que non ♥
  • C’est vraiment superbe
    Je ne sais pas s’il y a déjà eu un article sur le prédécesseur m8trix, mais j’avais moi-même regardé ça de près à l’époque de sa sortie, en 2014 : https://scot.tg/2014/05/31/amazing-code-density/
  • C’est grâce à ce genre de créations formidables qu’on s’enthousiasme pour la tech
  • Au début, j’ai cru que ce n’était pas une démo de 16 octets, mais un LLM de 16B paramètres
    • Moi aussi. Et pourtant, c’est bien plus cool
    • Il y a neuf ordres de grandeur d’écart
  • J’ai vraiment été impressionné. C’est exactement le genre de choses qui m’ont fait aimer la programmation et l’informatique
    Tout est si beau, c’est du véritable art. C’est dommage que dans l’industrie, avec toute la folie autour de l’IA et du reste, on ait rarement l’occasion de construire ce genre de choses
    • Si ça avait été fait avec Electron, on serait probablement sur un téléchargement de 300 Mo avec environ 1 Go de RAM consommé
  • J’essaie encore tout juste d’accepter que ce soit possible