Wake Up! 16b: Cách 16 byte mã máy tạo ra fractal và âm thanh kỳ dị

Công nghệ24 tháng 5, 2026·5 phút đọc

Tác phẩm "wake up! 16b" là một kỳ tích của lập trình hợp ngữ x86, biến vỏn vẹn 16 byte mã lệnh thành một trải nghiệm đa giác quan với hình ảnh Sierpinski và âm thanh bytebeat. Bài viết phân tích sâu về những thủ thuật thuật toán, quy luật toán học và sự phụ thuộc vào trạng thái phần cứng đặc trưng của dòng demoscene.

Wake Up! 16b: Cách 16 byte mã máy tạo ra fractal và âm thanh kỳ dị

Wake Up! 16b: Cách 16 byte mã máy tạo ra fractal và âm thanh kỳ dị

Tác phẩm "wake up! 16b", ra mắt tại Outline Demoparty 2026, là một ví dụ điển hình của nghệ thuật "sizecoding" (lập trình tối dung lượng). Chỉ với vỏn vẹn 16 byte mã hợp ngữ x86, chương trình này tạo ra hình ảnh phân dạng Sierpinski trên màn hình văn bản DOS và đồng thời phát ra âm thanh phức tạp, độc đáo thông qua nguyên lý tự động tế bào (cellular automata).

Cuộc thám mật độ thuật toán

Ra mắt tại Outline Demoparty năm 2026 tại Ommen, Hà Lan, "wake up! 16b" là kết quả của quá trình nghiên cứu sâu về mật độ thuật toán trong giới hạn khắt khe của 16 byte. Tác giả, người đã từng học lập trình trên máy IBM PC cũ hơn 30 năm trước, đã tạo ra hàng trăm "tiny intro" (đoạn intro siêu nhỏ) và được truyền cảm hứng từ tác phẩm "Rainbow Surf" 16 byte của Plex để tiếp tục khai thác những bản phác thảo cũ.

Quá trình tạo ra chương trình này bao gồm việc nghịch ngợm với tự động tế bào để tạo đồ họa và âm thanh, cũng như khám phá các mẹo "sizecoding". Đáng chú ý nhất là việc sử dụng các hướng dẫn hợp ngữ đa hình (như add [bx+si],al) và việc nhảy vào giữa các hướng dẫn để tiết kiệm byte cũng như tái sử dụng mã opcode.

Màn hình demo cảnh minh họaMàn hình demo cảnh minh họa

Cơ chế vận hành và Hiệu ứng thị giác

Chương trình bắt đầu bằng một ngắt BIOS tiêu chuẩn: int 10h. Ngắt này thiết lập chế độ video 0, cung cấp lưới văn bản 40x25. Sau đó, đoạn dữ liệu (ds) được trỏ đến địa chỉ bộ nhớ 0xb800 — địa chỉ bộ đệm văn bản của VGA/CGA.

Khi BIOS xóa màn hình, nó không thực sự điền bộ nhớ bằng các số 0 tuyệt đối. Mỗi ô ký tự chiếm 2 byte: ký tự ASCII và thuộc tính màu sắc. Tất cả 2.000 ô đều được đặt thành 0x20 (dấu cách) và 0x07 (màu xám nhạt trên nền đen). Do đó, màn hình trông có vẻ trống rỗng, nhưng bộ nhớ thực chất đã được lấp đầy bởi một mẫu hình đồng nhất.

Toán học của Âm thanh: Từ Fractal đến Bytebeat

Điều thú vị nhất của "wake up! 16b" là sự giao thoa giữa thị giác và thính giác ("synesthesia") vượt xa các intro nhỏ khác. Để tách biệt các bitplane (mặt phẳng bit), tác giả sử dụng phép toán XOR thay vì ADD, vì phép cộng không nhớ giữa các bit chính là XOR.

Vì mã bắt đầu với giá trị 2 (nhị phân là 00000010), chỉ có bit 1 được bật tắt giữa 0x00 và 0x02. Điều này ánh xạ hoàn hảo tới Quy tắc 60 (Rule 60) trong nguyên lý tự động tế bào. Định lý Lucas đảm bảo sự khớp nhau này từ bảng cộng, nơi bit 1 được thiết lập khi cần thiết.

Cổng 61h được dùng để giao tiếp với loa PC. Bit 1 sẽ đẩy màng loa ra (giá trị 1) và kéo vào (giá trị 0). Chương trình tính toán fractal thông qua XOR, ghi vào bộ nhớ và đẩy trực tiếp byte đó vào cổng loa. Các số 1 và 0 từ fractal tạo ra sóng vuông tự nhiên dịch chuyển theo độ rộng xung và tần số.

"16 byte biến âm thanh Sierpinski thành cơn mưa Ma trận" sẽ là một phụ đề thích hợp cho tác phẩm này.

Khi phát theo từng dòng, nó tạo ra những âm thanh "bytebeat" tự tương đồng (self-similar), gần như không thay đổi nhịp điệu theo thời gian. Không chỉ văn bản được xuất ra loa mà cả các byte còn lại của phân đoạn 64KB, trong trường hợp này cũng chứa mã BIOS ROM bị che bóng, tạo nên âm thanh "gritty" và punky rất khác so với sóng vuông hình chữ nhật dự kiến.

Quy luật Toán học đằng sau mã

Để tóm tắt lại thành toán học thuần túy: giả sử trạng thái khởi đầu là 0 thay vì 0x20, dùng phép cộng thay vì XOR, và bước tiến 16 byte mỗi lần. Thanh ghi tích lũy al bắt đầu từ 2.

Một phân đoạn DOS có chính xác 65.536 byte. Di chuyển 16 byte mỗi bước có nghĩa là chính xác 4.096 bước để duyệt qua phân đoạn (( 65536 / 16 = 4096 )). Sau đó, si sẽ gói gọn lại về 0x0000.

Việc cộng dồn các giá trị giữa các ô tạo ra các tổng riêng. Vì 4.096 là bội số của 256 (kích thước thanh ghi 8-bit), giá trị nhớ (carryover) được căn chỉnh hoàn hảo khi phân đoạn vòng lặp, đặt lại al về 2 ở đầu mỗi lần quét. Giá trị tuân theo một dãy nhị thức được nhân hệ số 2.

Sự bất định và quyến rũ của Phần cứng

Một điểm thú vị khác là cách chương trình tương tác với phần cứng. Trình mô phỏng và các phiên bản BIOS khác nhau để lại các "tác nhân" (artifacts) hơi khác nhau trong RAM. Vì mã XOR chống lại bất kỳ giá trị nào đang có ở đó, kết quả đầu ra rất nhạy cảm với môi trường.

Việc xóa bộ nhớ trước sẽ cho kết quả đầu ra hoàn toàn đồng nhất, nhưng điều đó tốn kém những byte quý giá. Việc chấp nhận trạng thái tự nhiên của phần cứng chính là một phần của sự quyến rũ trong nghệ thuật sizecoding.

Trong khi phiên bản "M8trix" gốc từ năm 2014 đã làm mờ các ký tự giả ngẫu nhiên trên màn hình (trong 8 byte, rồi 7 byte), "wake up! 16b" đã nâng tầm nó lên bằng cách kết hợp toán học, hình ảnh và âm thanh trong một không gian mã nhớ đáng kinh ngạc.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗