जागता हुआ 16b
(hellmood.111mb.de)- Wake up! 16b Outline Demoparty में पेश किया गया 16-byte x86 real mode DOS intro है, जो text buffer के ज़रिए एक साथ Sierpinski fractal और sound बनाता है
int 10hऔरds=0xb800सेटिंग के साथ यह 40x25 text mode के शुरुआती screen pattern को computation space की तरह इस्तेमाल करता है, और space·color bytes output को प्रभावित करते हैंxor [si], alcarry के बिना addition की तरह काम करता है और bit 1 का Sierpinski structure बनाता है, जबकि वही byteout 61h, alके ज़रिए PC speaker को भेजा जाता है- असली loop हर iteration में -56 bytes आगे बढ़ता है, 8,192 steps के बाद reset होता है, sound एक octave नीचे चली जाती है, और screen पर 10 character columns में shear हुआ pattern दिखता है
- MDA/Hercules के लिए
0xB000patch और BIOS·RAM state के फर्क जैसे execution environment परिणाम बदल देते हैं, और natural hardware artifacts sizecoding का हिस्सा बन जाते हैं
16-byte x86 intro की मुख्य संरचना
- Wake up! 16b मई 2026 में Netherlands के Ommen में हुए Outline Demoparty में पेश किया गया 16-byte x86 real mode DOS assembly intro है
- यह VGA/CGA text buffer को computation space की तरह इस्तेमाल करके screen पर infinite Sierpinski fractal बनाता है, और उसी data को PC speaker port पर भेजकर sound पैदा करता है
- पूरा code 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바이트 - development process में cellular automata को graphics और sound दोनों में साथ इस्तेमाल करना,
add [bx+si],alका0x0000बनने वाला polymorphic assembly instruction, और instruction के बीच jump करके bytes और opcode को reuse करने जैसी size-coding techniques को explore किया गया - पहले का काम "M8trix" 2014 का 8-byte·7-byte intro था, जो pseudo-random characters को screen पर फैलाता था; Wake up! 16b में पहले sound आती है और फिर visual effect उससे जुड़ता है
initialized text screen
int 10hvideo mode 0 सेट करता है और 40x25 text mode grid बनाता हैmov bh, 0xb8औरmov ds, bxdata segmentdsको VGA/CGA text buffer address0xb800पर सेट करते हैं- जब BIOS screen clear करता है, तो memory को 0 से नहीं भरता; वह 2,000 character slots को character byte
0x20(space) और color attribute0x07(black background पर light gray) से भरता है - screen खाली दिखती है, लेकिन memory में एक uniform pattern बचा रहता है, और यही initial state sound और visual output को प्रभावित करती है
- visible video memory के आगे-पीछे का data और “clear screen” के बाद initialization का तरीका भी result में मिल जाता है, जिससे उम्मीद से ज़्यादा rough और unique sound बनती है
cumulative sum और binomial structure
- सिर्फ mathematical structure देखें, तो state को
0x20की जगह 0 माना जा सकता है,xorकी जगहaddइस्तेमाल किया जा सकता है, हर बार 16 bytes आगे बढ़ा जा सकता है, औरalको 2 से शुरू माना जा सकता है - DOS segment ठीक 65,536 bytes का होता है, और 16 bytes के step पर पूरे segment का चक्कर लगाने में 4,096 steps लगते हैं
- 4,096, 8-bit register size 256 का multiple है, इसलिए segment wrap होने पर carryover align रहता है, और हर sweep की शुरुआत में
alफिर 2 पर लौट आता है - cells के बीच values जोड़ते रहने से partial sum (prefix sum) बनता है, और values 2x scaled binomial coefficient sequence की तरह फैलती हैं
- पहले 16 cells के कई pass देखें, तो values row के हिसाब से accumulate होती हैं, और क्योंकि values 8-bit हैं, 256 से ऊपर का हिस्सा wrap होकर फिर छोटे values की तरह दिखता है
XOR और Sierpinski structure
- modulo 2 की combinatorial properties के कारण Sierpinski triangle दिखाई देता है, और यही bit सीधे PC speaker पर output होती है
- bit level पर carry के बिना addition, XOR होता है, इसलिए code में
addकी जगहxor [si], alहै - शुरुआती value 2 का binary रूप
00000010है, इसलिए सिर्फ bit 10x00और0x02के बीच toggle होती है - यह pattern elementary cellular automata के rule 60 से मेल खाता है
- Lucas theorem के अनुसार यह pattern addition table के bit 1 से मेल खाता है, और table में bit 1 on होने वाली positions
2के रूप में दिखती हैं
data के sound बनने का तरीका
out 61h, alcalculated byte को PC speaker से जुड़े port61hपर भेजता है- port
61hका bit 1 speaker cone को बाहर धकेलने या अंदर खींचने की स्थिति तय करता है - code XOR से fractal compute करता है, result को memory में लिखता है, और फिर उसी byte को तुरंत speaker port पर भेज देता है
- fractal से निकले 1 और 0, pulse width और frequency में प्राकृतिक बदलाव वाली square wave बनाते हैं, और linewise playback होने पर यह self-similar और लगभग tempo-invariant bytebeat बन जाती है
- output sound में सिर्फ text buffer नहीं, बल्कि 64KB segment के बाकी bytes भी शामिल हो जाते हैं; उनमें मौजूद shadowed video ROM BIOS code की वजह से अपेक्षित Sierpinski line-based overlayed rectangle wave bytebeat से अलग, rough और funky sound निकलती है
56-byte step: octave और diagonal shear
- असली code 16 bytes के step से नहीं चलता;
lodsbऔरsub si, byte 57का संयोजन हर iteration में -56 bytes पीछे ले जाता है - यह step size screen को sparse तरीके से भरती है, और साथ ही sound buffer को बहुत बड़ा होने से रोकती है; इसका इस्तेमाल M8trix जैसे visual effect को दोबारा बनाने के लिए किया गया
-
audio
- 56, 65,536 को ठीक से divide नहीं करता
- code सिर्फ 8 के multiple offsets पर जाता है, और 8,192 steps तथा 7 wraps के बाद ही reset होता है
- cycle length दोगुनी होने से base frequency आधी हो जाती है, इसलिए sound एक octave नीचे चली जाती है
-
visuals
- 80-byte width वाली screen में -56 bytes का move, आगे 24 bytes यानी 12 columns बढ़ने के बराबर है
- visit होने वाले अलग columns सिर्फ 10 हैं
- fractal एक भरी हुई image की तरह नहीं, बल्कि screen के ऊपर की ओर बढ़ते 10 character columns में diagonal shear के साथ दिखाई देता है
- असली triangle की चौड़ाई 8,192 “pixels” है, लेकिन एक line में सिर्फ 80 bytes के characters हैं, इसलिए movement महसूस होती है पर पूरी structure को सीधे देखना मुश्किल है
- अगर pixels skip किए बिना एक साथ draw किया जाए या बहुत बड़ी screen इस्तेमाल की जाए, तो triangle देखा जा सकता है
असली hardware पर execution
- scener miragept ने MDA/Hercules के अनुकूल हरे text के लिए address को
0xB800से MDA के0xB000पर patch करके इसे real hardware पर चलाया - इस्तेमाल किया गया system पूरी तरह exact IBM machine नहीं था, लेकिन उसमें MDA/Hercules emulation करने वाली EGA card के साथ 286 और असली MDA monitor था
- captured audio में machine का लगातार noise मिला हुआ था, और IBM 5151 monitor में लंबा phosphor persistence होने से बहुत तेज़ display के लिए वह अनुकूल नहीं था
- address byte बदलने की वजह से sound थोड़ी अलग हुई, लेकिन behavior intended ही रहा, और बाद के हिस्से में Sierpinski structure original version से बेहतर दिखाई दी
- emulator और BIOS version के हिसाब से RAM में बचे artifacts बदलते हैं, और code उसी memory state पर XOR करता है, इसलिए output execution environment के प्रति sensitive है
- memory को पहले clear करने से uniform output मिल सकती है, लेकिन उसके लिए extra bytes चाहिए; natural hardware state को स्वीकार करना ही sizecoding का आकर्षण बना रहता है
संबंधित सामग्री
- Nanogems - demoscene के बेहतरीन Tiny Intro की curated list
- HellMood's productions on Pouet
- Capture on a 286/MDA/Hercules - miragept का real hardware capture
- Sizecoding Wiki
- "Rainbow Surf" - Plex का 16-byte x86 intro
- "M8trix" - HellMood का 8-byte intro
1 टिप्पणियां
Hacker News प्रतिक्रियाएँ
https://youtu.be/b-Fa6HtvGtQ?si=LpQszgA9_K-m3V3-
दोनों ही witty और experimental हैं। Parker ज़्यादा पारंपरिक maths की तरफ हैं, जबकि Mould कई क्षेत्रों में घूमते हुए experiment/DIY वाली जिज्ञासा को खूब संतुष्ट करते हैं
अगर यह वीडियो पसंद आए तो दोनों चैनलों को और देखना ज़ोरदार तरीके से recommend करूँगा
https://www.youtube.com/@standupmaths
https://www.youtube.com/@SteveMould
उस demo में आवाज़ तक नहीं थी
यह सच में अविश्वसनीय काम है, और इसे retirement piece के तौर पर भी रखा जा सकता है, ऐसी masterpiece है। ज़्यादा वास्तविक रूप से कहें तो अब लोग दूसरी architectures पर भी इसका पीछा करेंगे
ब्रावो
https://www.youtube.com/watch?v=QKLhH_ANwIc
हमारी size coding community को लगा था कि cellular automata tricks हम कई साल पहले पूरी तरह खोज चुके हैं, लेकिन फिर Plex आया और दिखा दिया कि ऐसा नहीं है ♥
पता नहीं m8trix नाम की इस predecessor पर कोई लेख था या नहीं, लेकिन जब यह 2014 में आई थी, तब मैंने इसे एक बार खंगाला था: https://scot.tg/2014/05/31/amazing-code-density/
यह सब इतना सुंदर है, सचमुच कला है। अफ़सोस बस इतना है कि इंडस्ट्री में AI-वगैरह के बीच आम तौर पर ऐसी चीज़ें बनाने के मौके कम मिलते हैं