Wake up! 16b
(hellmood.111mb.de)- Wake up! 16b é uma intro DOS x86 em modo real de 16 bytes, apresentada na Outline Demoparty, que gera ao mesmo tempo um fractal de Sierpinski e som usando o buffer de texto
- Com
int 10he a configuraçãods=0xb800, ela usa o padrão inicial da modo texto 40x25 como espaço de cálculo, e os bytes de espaço e cor influenciam a saída xor [si], alfunciona como uma soma sem carry, criando a estrutura de Sierpinski no bit 1, e o mesmo byte é enviado ao alto-falante do PC comout 61h, al- O loop real avança -56 bytes a cada repetição e é reiniciado após 8.192 passos; o som desce uma oitava e o padrão aparece na tela inclinado em 10 colunas de caracteres
- O patch
0xB000para MDA/Hercules e diferenças no BIOS e no estado da RAM mudam o resultado da execução, tornando os artefatos naturais do hardware parte do sizecoding
Estrutura central de uma intro x86 de 16 bytes
- Wake up! 16b é uma intro em assembly DOS x86 de 16 bytes em modo real, apresentada em maio de 2026 na Outline Demoparty, em Ommen, na Holanda
- Ela usa o buffer de texto VGA/CGA como espaço de cálculo para criar um fractal de Sierpinski infinito na tela e envia os mesmos dados para a porta do alto-falante do PC para gerar som
- O código completo tem 16 bytes
int 10h ; 2바이트 mov bh, 0xb8 ; 2바이트 mov ds, bx ; 2바이트 L: lodsb ; 1바이트 sub si, byte 57 ; 3바이트 xor [si], al ; 2바이트 out 61h, al ; 2바이트 jmp short L ; 2바이트 - No processo de desenvolvimento, foram exploradas técnicas de sizecoding como usar autômatos celulares tanto nos gráficos quanto no som, a instrução polimórfica de assembly
add [bx+si],al, que vira0x0000, e a reutilização de bytes e opcodes por meio de saltos para o meio de instruções - O trabalho anterior, "M8trix", era uma intro de 8 bytes e 7 bytes de 2014 que espalhava caracteres pseudoaleatórios pela tela; em Wake up! 16b, o som vem primeiro e depois o efeito visual se encaixa
A tela de texto inicializada
int 10hdefine o modo de vídeo 0, criando uma grade de modo texto 40x25mov bh, 0xb8emov ds, bxajustam o segmento de dadosdspara o endereço do buffer de texto VGA/CGA,0xb800- Quando a BIOS limpa a tela, ela não preenche a memória com zero; em vez disso, preenche os 2.000 slots de caractere com o byte de caractere
0x20(espaço) e o atributo de cor0x07(cinza-claro sobre fundo preto) - A tela parece vazia, mas um padrão uniforme permanece na memória, e esse estado inicial afeta a saída sonora e visual
- Dados antes e depois da memória de vídeo visível, além do próprio método de inicialização após o “clear screen”, acabam entrando no resultado e produzem um som mais áspero e peculiar do que o esperado
Soma acumulada e estrutura binomial
- Considerando apenas a estrutura matemática, pode-se assumir que o estado começa em 0 em vez de
0x20, queaddé usado no lugar dexor, que o avanço é de 16 bytes por vez e quealcomeça em 2 - Um segmento DOS tem exatamente 65.536 bytes, e avançar 16 bytes por vez exige 4.096 passos para percorrer o segmento inteiro
- Como 4.096 é múltiplo de 256, o tamanho de um registrador de 8 bits, o carryover se alinha quando o segmento dá wrap, e
alvolta para 2 no início de cada varredura - Ao continuar somando os valores entre as células, forma-se uma soma prefixada (prefix sum), e os valores se expandem como uma sequência de coeficientes binomiais escalada por 2
- Observando vários passes das 16 primeiras células, os valores se acumulam por linha e, como são valores de 8 bits, tudo o que passa de 256 dá wrap e reaparece como valores pequenos
XOR e a estrutura de Sierpinski
- Pelas propriedades combinatórias módulo 2, surge o triângulo de Sierpinski, e esse bit é enviado diretamente ao alto-falante do PC
- No nível de bits, soma sem carry é XOR, por isso o código usa
xor [si], alem vez deadd - O valor inicial 2 é o binário
00000010, então apenas o bit 1 alterna entre0x00e0x02 - Esse padrão corresponde à rule 60 dos autômatos celulares elementares
- Pelo teorema de Lucas, esse padrão coincide com o bit 1 da tabela de adição, e na tabela as posições com o bit 1 ativado aparecem como
2
Como os dados viram som
out 61h, alenvia o byte calculado para a porta61h, ligada ao alto-falante do PC- O bit 1 da porta
61hdetermina se o cone do alto-falante é empurrado para fora ou puxado para dentro - O código calcula o fractal com XOR, grava o resultado na memória e em seguida envia imediatamente o mesmo byte para a porta do alto-falante
- Os 1s e 0s gerados pelo fractal formam uma onda quadrada (square wave) com largura de pulso e frequência variando naturalmente; reproduzida linha a linha, ela vira um bytebeat auto-semelhante e quase invariável em relação ao tempo
- O som de saída mistura não só o buffer de texto, mas também os demais bytes do segmento de 64 KB, e por causa do código da video ROM BIOS sombreada ali presente, o resultado fica diferente do esperado Sierpinski line-based overlayed rectangle wave bytebeat, com um som mais áspero e funky
Passo de 56 bytes: oitava e cisalhamento diagonal
- O código real não avança 16 bytes por vez; com a combinação de
lodsbesub si, byte 57, ele recua 56 bytes a cada repetição - Esse deslocamento preenche a tela de forma esparsa sem deixar o buffer de som grande demais, e foi usado para recriar um efeito visual como o de M8trix
-
Áudio
- 56 não divide 65.536 exatamente
- O código visita apenas offsets múltiplos de 8 e só se reinicia depois de 8.192 passos, após dar wrap 7 vezes
- Como o comprimento do ciclo dobra, a frequência fundamental cai pela metade e o som desce uma oitava
-
Visual
- Numa tela de 80 bytes de largura, mover -56 bytes equivale a avançar 24 bytes, ou seja, 12 colunas
- Apenas 10 colunas distintas são visitadas
- O fractal não aparece como uma imagem preenchida, mas cisalhado na diagonal em 10 colunas de caracteres que se movem para a parte superior da tela
- O triângulo real tem largura de 8.192 “pixels”, mas uma linha de caracteres tem só 80 bytes, então é possível perceber o movimento, mas difícil ver diretamente a estrutura inteira
- Se os pixels fossem desenhados de uma vez, sem pular posições, ou em uma tela muito maior, daria para ver o triângulo
Execução em hardware real
- O scener miragept executou a intro em hardware real, aplicando um patch no endereço de
0xB800para0xB000, usado por MDA, para obter texto verde mais apropriado a MDA/Hercules - O equipamento usado não era um IBM exato, mas um 286 com placa EGA capaz de emular MDA/Hercules e um monitor MDA real
- No áudio capturado, entrou o ruído contínuo da própria máquina, e o monitor IBM 5151 tem persistência longa de fósforo, o que o torna pouco adequado para exibição muito rápida
- A mudança do byte de endereço alterou ligeiramente o som, mas o programa funcionou como pretendido, e na parte final a estrutura de Sierpinski aparece melhor do que na versão original
- Dependendo do emulador e da versão da BIOS, os artefatos que ficam na RAM variam, e como o código faz XOR sobre esse estado de memória, a saída é sensível ao ambiente de execução
- É possível obter uma saída uniforme limpando a memória antes, mas isso exigiria bytes adicionais; aceitar o estado natural do hardware continua sendo parte do charme do sizecoding
Materiais relacionados
- Nanogems - Lista curada de excelentes tiny intros da demoscene
- HellMood's productions on Pouet
- Capture on a 286/MDA/Hercules - Captura em hardware real feita por miragept
- Sizecoding Wiki
- "Rainbow Surf" - Intro x86 de 16 bytes de Plex
- "M8trix" - Intro de 8 bytes de HellMood
1 comentários
Comentários do Hacker News
https://youtu.be/b-Fa6HtvGtQ?si=LpQszgA9_K-m3V3-
Os dois são espirituosos e experimentais. Parker pende mais para a matemática tradicional, enquanto Mould transita por várias áreas e acerta em cheio nessa vontade de fazer experimentos/DIY
Se você gostar deste vídeo, recomendo fortemente ver mais dos dois canais
https://www.youtube.com/@standupmaths
https://www.youtube.com/@SteveMould
Aquela demo nem tinha som
Isto é um trabalho realmente impressionante, uma obra-prima digna de servir como trabalho de aposentadoria. Sendo mais realista, porém, provavelmente vão atrás disso de novo em outra arquitetura
Bravo
https://www.youtube.com/watch?v=QKLhH_ANwIc
Nossa comunidade de size coding achava que já tinha descoberto todos os truques de autômatos celulares anos atrás, mas aí apareceu Plex e mostrou que não ♥
Não sei se já houve algum texto sobre a obra anterior chamada m8trix, mas eu dei uma analisada nela quando saiu, em 2014: https://scot.tg/2014/05/31/amazing-code-density/
É tudo bonito demais, verdadeira arte. É uma pena que, na indústria, com tanto foco em IA e afins, normalmente quase não haja chance de fazer coisas desse tipo