1 puan yazan GN⁺ 16 일 전 | 1 yorum | WhatsApp'ta paylaş
  • Wake up! 16b, Outline Demoparty'de tanıtılan 16 baytlık x86 gerçek mod DOS introsudur; metin tamponunda aynı anda Sierpinski fraktalı ve ses üretir
  • int 10h ve ds=0xb800 ayarıyla 40x25 metin modunun başlangıç ekran desenini hesaplama alanı olarak kullanır; boşluk ve renk baytları çıktıyı etkiler
  • xor [si], al, elde olmadan toplama gibi davranarak bit 1'in Sierpinski yapısını oluşturur ve aynı baytı out 61h, al ile PC hoparlörüne gönderir
  • Gerçek döngü her yinelemede -56 bayt ilerler ve 8.192 adım sonra sıfırlanır; ses bir oktav düşer, ekranda ise 10 karakter sütununa diyagonal kesilmiş bir desen görünür
  • MDA/Hercules için 0xB000 yaması ve BIOS/RAM durumu farkları gibi çalıştırma ortamı sonucu değiştirir; doğal donanım artifaktları sizecoding'in bir parçası haline gelir

16 baytlık x86 intronun temel yapısı

  • Wake up! 16b, 2026 Mayıs'ında Hollanda'nın Ommen kentindeki Outline Demoparty'de yayımlanan 16 baytlık x86 gerçek mod DOS assembly introsudur
  • VGA/CGA metin tamponunu hesaplama alanı olarak kullanarak ekranda sonsuz Sierpinski fraktalı oluşturur ve aynı veriyi PC hoparlör portuna göndererek ses çıkarır
  • Tüm kod 16 bayttan oluşur
    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바이트
    
  • Geliştirme sürecinde hücresel otomatları hem grafik hem de ses için birlikte kullanma, add [bx+si],al ifadesinin 0x0000 olan polimorfik assembly komutu olması ve komut ortasına atlayarak baytları ve opcode'ları yeniden kullanma gibi sizecoding teknikleri araştırıldı
  • Önceki çalışma "M8trix", 2014'te sözde rastgele karakterleri ekrana yayan 8 baytlık ve 7 baytlık introlardı; Wake up! 16b'de önce ses gelir, ardından görsel efekt onunla kenetlenir

Başlatılmış metin ekranı

  • int 10h, video modu 0'ı ayarlayarak 40x25'lik bir metin modu ızgarası oluşturur
  • mov bh, 0xb8 ve mov ds, bx, veri segmenti ds'yi VGA/CGA metin tamponu adresi olan 0xb800 değerine ayarlar
  • BIOS ekranı temizlerken belleği 0 ile doldurmaz; bunun yerine 2.000 karakter yuvasını karakter baytı 0x20 (boşluk) ve renk niteliği 0x07 (siyah zemin üzerinde açık gri) ile doldurur
  • Ekran boş görünür ama bellekte tekdüze bir desen kalır ve bu başlangıç durumu sesi ve görsel çıktıyı etkiler
  • Görünür video belleğinin önündeki ve arkasındaki veriler ile “clear screen” sonrasındaki başlatma biçimi de sonuca karışır; bu da beklenenden daha pürüzlü ve kendine özgü bir ses üretir

Kümülatif toplam ve binom yapısı

  • Yalnızca matematiksel yapıya bakılırsa durumun 0x20 yerine 0 olduğu, xor yerine add kullanıldığı, her seferinde 16 bayt ilerlediği ve al'nin 2 ile başladığı varsayılabilir
  • DOS segmenti tam olarak 65.536 bayttır ve 16 baytlık adımlarla ilerlemek tüm segmenti dolaşmak için 4.096 adım gerektirir
  • 4.096, 8 bitlik register boyutu olan 256'nın katı olduğu için segment sarıldığında carry hizalanır ve her sweep başlangıcında al yeniden 2 olur
  • Hücreler arasındaki değer sürekli toplandığında kısmi toplam (prefix sum) oluşur ve değerler 2 ile ölçeklenmiş binom katsayı dizisi gibi açılır
  • İlk 16 hücrenin birden çok geçişine bakıldığında değerler satır bazında birikir; 8 bitlik değer oldukları için 256'yı aşan kısımlar sarılır ve yeniden küçük değerlere döner

XOR ve Sierpinski yapısı

  • Mod 2 kombinatorik özellikleri nedeniyle Sierpinski üçgeni ortaya çıkar ve bu bit doğrudan PC hoparlörüne gönderilir
  • Bit düzeyinde elde olmadan toplama XOR olduğundan, kodda add yerine xor [si], al bulunur
  • Başlangıç değeri 2, ikilikte 00000010 olduğundan yalnızca bit 1, 0x00 ile 0x02 arasında değişir
  • Bu desen, temel hücresel otomatların rule 60 kuralına karşılık gelir
  • Lucas teoremine göre bu desen toplama tablosunun bit 1'iyle örtüşür ve tabloda bit 1'in açık olduğu yerler 2 olarak görünür

Verinin sese dönüşme biçimi

  • out 61h, al, hesaplanan baytı PC hoparlörüne bağlı 61h portuna gönderir
  • 61h portunun bit 1'i, hoparlör konisinin dışarı itilmesini ya da içeri çekilmesini belirler
  • Kod, XOR ile fraktalı hesaplar, sonucu belleğe yazar ve aynı baytı hemen hoparlör portuna yollar
  • Fraktaldan çıkan 1'ler ve 0'lar, darbe genişliği ve frekansı doğal olarak değişen bir kare dalga (square wave) üretir; satır satır çalındığında kendi kendine benzer ve tempodan neredeyse bağımsız bir bytebeat'e dönüşür
  • Çıkan seste yalnızca metin tamponu değil, 64 KB segmentin geri kalan baytları da karışır; içlerindeki gölgelenmiş video ROM BIOS kodu nedeniyle beklenen Sierpinski satır tabanlı overlayed rectangle wave bytebeat yerine daha pürüzlü ve funkvari bir ses ortaya çıkar

56 baytlık adım: oktav ve diyagonal kesme

  • Gerçek kod 16 baytlık adımlarla ilerlemez; lodsb ile sub si, byte 57 birleşimi her yinelemede -56 bayt geri hareket eder
  • Bu adım genişliği ekranı seyrek doldururken ses tamponunun fazla büyümemesini sağlar ve M8trix benzeri görsel efekti yeniden üretmek için kullanılır
  • Ses

    • 56, 65.536'yı tam bölmez
    • Kod yalnızca 8'in katı ofsetleri ziyaret eder ve ancak 8.192 adım ile 7 kez sarıldıktan sonra sıfırlanır
    • Döngü uzunluğu iki katına çıktığı için temel frekans yarıya iner ve ses bir oktav aşağı düşer
  • Görsel

    • 80 bayt genişliğindeki ekranda -56 bayt ilerlemek, ileri doğru 24 bayt yani 12 sütun kaymaya eşdeğerdir
    • Ziyaret edilen farklı sütun sayısı yalnızca 10'dur
    • Fraktal, dolu bir görüntü olarak değil, ekranın üstüne doğru hareket eden 10 karakter sütununa diyagonal olarak kesilmiş halde görünür
    • Gerçek üçgen 8.192 “piksel” genişliğindedir ama bir satırdaki karakterler yalnızca 80 bayttır; bu yüzden hareket hissedilse de tüm yapı doğrudan görülmesi zordur
    • Pikseller atlanmadan tek seferde çizilse ya da çok daha büyük bir ekran kullanılsa üçgen görülebilir

Gerçek donanımda çalıştırma

  • Scener miragept, MDA/Hercules'e uygun yeşil metin için adresi 0xB800'den MDA'nın kullandığı 0xB000 değerine yamalayarak bunu gerçek donanımda çalıştırdı
  • Kullanılan ekipman tam bir IBM bilgisayar değildi; fakat MDA/Hercules emülasyonu yapabilen EGA kartlı bir 286 ve gerçek bir MDA monitörüydü
  • Kaydedilen seste makinenin kendi sürekli gürültüsü de vardı ve IBM 5151 monitörünün uzun fosfor kalıcılığı, çok hızlı görüntülemeler için dezavantaj oluşturdu
  • Adres baytının değişmesi nedeniyle ses biraz farklılaştı ama amaçlandığı gibi çalıştı; son kısımda Sierpinski yapısı orijinal sürümden daha iyi görünür hale geldi
  • Emülatöre ve BIOS sürümüne göre RAM'de kalan artifaktlar değişir; kod bu bellek durumuna XOR uyguladığı için çıktı çalışma ortamına duyarlıdır
  • Bellek önceden temizlenirse daha tekdüze çıktı alınabilir, ancak bu ek bayt gerektirir; doğal donanım durumunu kabul eden yaklaşım sizecoding'in cazibesinin bir parçası olarak kalır

İlgili materyaller

1 yorum

 
GN⁺ 16 일 전
Hacker News yorumları
  • Bunun peşine düşünce kendimi bir saatlik bir tavşan deliğinde buldum; sonunda da iki kişinin özyinelemeli bir PowerPoint sunumuyla Sierpinski üçgeni yaptığı videoyu izlerken kaldım
    https://youtu.be/b-Fa6HtvGtQ?si=LpQszgA9_K-m3V3-
    • Matt Parker ve Steve Mould, YouTube’daki en iyi STEM eğitimcileri arasında
      İkisi de espritüel ve deneysel. Parker daha çok saf matematik tarafına yakınken, Mould disiplinler arasında gezip deney/DIY merakını tam yerinden kaşıyor
      Bu video hoşunuza gittiyse iki kanala da mutlaka daha fazla göz atmanızı öneririm
      https://www.youtube.com/@standupmaths
      https://www.youtube.com/@SteveMould
  • Daha önce gördüğüm 32 byte demonun, bir ikiliyi bu kadar küçük tutarken hâlâ göze hoş gelebildiği sınır olduğunu gerçekten düşünüyordum
    O demoda ses bile yoktu
    Bu gerçekten inanılmaz bir iş ve emeklilik eseri sayılabilecek bir başyapıt. Gerçekçi olmak gerekirse muhtemelen başka mimarilerde de bunun peşine düşülecek
  • Böyle aşırı küçük üretken kod görünce insanın “bu bir cadı!” diye bağırası geliyor
    Bravo
  • Bağlantısı verilen demolar arasında rainbow surf beni tamamen büyüledi
    https://www.youtube.com/watch?v=QKLhH_ANwIc
    • "wake up"ın yaratıcısı o. Evet, beni yeniden sahaya döndüren demo da oydu
      Bizim size coding topluluğu, hücresel otomat numaralarının hepsini yıllar önce bulduğunu sanıyordu ama sonra Plex çıkıp öyle olmadığını gösterdi ♥
  • Gerçekten harika
    m8trix adlı öncül çalışma hakkında bir yazı var mı bilmiyorum ama çıktığı zaman, yani 2014’te, ben biraz kurcalamıştım: https://scot.tg/2014/05/31/amazing-code-density/
  • Teknoloji konusunda bizi heyecanlandıran şey işte böyle harika üretimler
  • İlk başta bunun bir 16 byte demo değil de 16B parametreli bir LLM olduğunu sandım
    • Ben de öyle sandım. Ama bu çok daha havalı
    • Arada 9 basamaklı fark var
  • Gerçekten hayran kaldım. Programlama ve hesaplamayı sevmemin sebebi tam da böyle şeyler
    Hepsi çok güzel, tam anlamıyla sanat. Sektörde ise AI falan derken insanın genelde böyle şeyler yapma fırsatı pek olmuyor, buna üzülüyorum
    • Bunu Electron ile yapsalardı herhâlde 300MB indirme ister, RAM’den de 1GB kadar yerdi
  • Bunun mümkün olduğunu daha yeni yeni idrak ediyorum