Uyanış 16b
(hellmood.111mb.de)- 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 10hveds=0xb800ayarıyla 40x25 metin modunun başlangıç ekran desenini hesaplama alanı olarak kullanır; boşluk ve renk baytları çıktıyı etkilerxor [si], al, elde olmadan toplama gibi davranarak bit 1'in Sierpinski yapısını oluşturur ve aynı baytıout 61h, alile 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
0xB000yaması 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],alifadesinin0x0000olan 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ştururmov bh, 0xb8vemov ds, bx, veri segmentids'yi VGA/CGA metin tamponu adresi olan0xb800değ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ği0x07(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
0x20yerine 0 olduğu,xoryerineaddkullanıldığı, her seferinde 16 bayt ilerlediği veal'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
alyeniden 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
addyerinexor [si], albulunur - Başlangıç değeri 2, ikilikte
00000010olduğundan yalnızca bit 1,0x00ile0x02arası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
2olarak görünür
Verinin sese dönüşme biçimi
out 61h, al, hesaplanan baytı PC hoparlörüne bağlı61hportuna gönderir61hportunun 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;
lodsbilesub si, byte 57birleş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ığı0xB000değ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
- Nanogems - demoscene'deki seçkin Tiny Intro derleme listesi
- HellMood's productions on Pouet
- Capture on a 286/MDA/Hercules - miragept'in gerçek donanım kaydı
- Sizecoding Wiki
- "Rainbow Surf" - Plex'in 16 baytlık x86 introsu
- "M8trix" - HellMood'un 8 baytlık introsu
1 yorum
Hacker News yorumları
https://youtu.be/b-Fa6HtvGtQ?si=LpQszgA9_K-m3V3-
İ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
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
Bravo
https://www.youtube.com/watch?v=QKLhH_ANwIc
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 ♥
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/
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