Phát nhạc Atari trên Amiga với mức tiêu thụ CPU bằng 0: Một bài học về tối ưu hóa phần cứng
Bài viết này kể lại hành trình kỹ thuật đầy thú vị nhằm đáp trả lời thách thức từ cộng đồng Amiga bằng cách phát nhạc chip Atari ST trên máy Amiga mà không tiêu tốn bất kỳ tài nguyên CPU nào. Bằng cách tận dụng các tính năng ít được biết đến của chip âm thanh PAULA và đồng xử lý COPPER, tác giả đã không chỉ giả lập thành công chip YM2149 mà còn phá vỡ kỷ lục hiệu ứng đồ họa sin-dots.

Phát nhạc Atari trên Amiga với mức tiêu thụ CPU bằng 0: Một bài học về tối ưu hóa phần cứng
Trong thế giới của demoscene—nơi các lập trình viên và nghệ sĩ kỹ thuật số đẩy các hệ máy cũ đến giới hạn cuối cùng—sự cạnh tranh đôi khi diễn ra rất khốc liệt nhưng cũng đầy tính sáng tạo. Bài viết này là câu chuyện về cách tôi đáp trả một lời "thách thức" vui vẻ từ một huyền thoại Amiga, bằng cách tạo ra một trình giả lập âm thanh Atari ST trên máy Amiga mà không tiêu tốn một chu kỳ xử lý (CPU cycle) nào.
Chip âm thanh YM2149 và PAULA
Bối cảnh: Cuộc chiến sin-dots
Câu chuyện bắt đầu với demo "Cycle-Op" của tôi, nơi tôi đã trình diễn hiệu ứng sin-dots (chấm dot chuyển động theo hàm sin) với tốc độ 50 FPS trên Amiga 500, hiển thị 6405 chấm. Hai năm sau, Hannibal—một huyền thoại của cộng đồng Amiga—đã phát hành demo 3D Demo 3 với hiệu ứng sin-dots của riêng ông, vượt qua kỷ lục của tôi với con số 6682 chấm.
Điều thú vị nhất nằm ở thông điệp mà Hannibal để lại trong demo, một lời trêu chọc đầy thâm ý: "Chào Leonard, cậu đã tối ưu hóa các chấm dot khá tốt cho một lập trình viên Atari. Nhưng còn hàng trăm chấm dot nữa nếu cậu tối ưu hóa như một chuyên gia Amiga."
Là một người đam mê công nghệ, tôi không thể bỏ qua lời nhận xét này. Tôi quyết định phải phá vỡ kỷ lục mới của Hannibal, và để "trả đũa" đúng chất, tôi sẽ làm điều mà một "lập trình viên Atari" sẽ làm: phát nhạc Atari trên máy Amiga trong khi chạy hiệu ứng đồ họa đó.
Biểu diễn phong bì âm thanh trên YM2149
Thách thức kỹ thuật: Giả lập YM2149 trên PAULA
Mục tiêu của tôi là phát nhạc từ chip âm thanh YM2149 (của Atari ST) trên máy Amiga (sử dụng chip PAULA). Vấn đề là để tái tạo chính xác các hiệu ứng âm thanh hiện đại của Atari như SID voices hay Sync Buzzer, tôi cần giả lập cả bộ đếm thời gian (timer) phần cứng của Atari. Việc này cực kỳ tốn kém tài nguyên, tiêu tốn khoảng 50% thời gian khung hình (frame time) trên CPU 68000, khiến việc vừa chạy hiệu ứng đồ họa nặng vừa phát nhạc là bất khả thi.
Tôi cần một giải pháp triệt để hơn: Phát nhạc Atari mà không dùng CPU nào cả.
Sự khác biệt giữa hai chip âm thanh
Trên giấy tờ, YM2149 và PAULA hoàn toàn khác nhau.
- YM2149: Một chip đơn giản với 3 kênh âm thanh, chỉ tạo ra sóng vuông (square waves), có bộ tạo nhiễu giả ngẫu nhiên và một bộ điều khiển độ lớn (envelope) phần cứng cơ bản.
- PAULA: Một chip phát mẫu PCM (PCM sample playback) tiên tiến cho thời điểm năm 1985. Nó có 4 kênh độc lập, phát trực tiếp mẫu âm thanh 8-bit từ bộ nhớ chính với tốc độ và độ lớn riêng biệt.
Ý tưởng ban đầu và thử nghiệm
Hầu hết nhạc Atari dựa vào sóng vuông, vì vậy ý tưởng đầu tiên của tôi rất đơn giản: Lưu một chu kỳ sóng vuông vào bộ nhớ và phát nó lặp lại bằng một kênh PAULA. Tuy nhiên, kết quả lại khá tẻ nhạt, giống như tiếng bíp bíp của game Buggy Boy thời xưa, không đủ "hoành tráng" để đi kèm với một kỷ lục thế giới.
Tôi cần một thứ gì đó phức tạp hơn, cụ thể là kỹ thuật "MadMax Buzzer".
Kỹ thuật MadMax Buzzer
Vào cuối những năm 1980, các nhạc sĩ demoscene như Jochen Hippel (MadMax) đã tìm ra cách khai thác tối đa YM2149. Thay vì dùng envelope để điều chỉnh độ lớn của sóng vuông, họ dùng chính envelope làm nguồn âm thanh. Kết hợp một sóng tam giác (từ envelope) với một sóng vuông bị lệch tần số nhẹ (detuned), họ tạo ra những âm thanh rền vang, biến đổi đầy tính biểu cảm mà chip Atari đơn giản lẽ ra không thể làm được.
Giả lập kỹ thuật này trên PAULA
Chip PAULA có một tính năng ít được biết đến gọi là "attached voice" (kênh gắn kết). Trong chế độ này, một kênh PAULA có thể dùng để điều chỉnh độ lớn (volume) của kênh khác. Tương tự như cách YM2149 dùng envelope cho sóng vuông, tôi định dùng 3 kênh PAULA để phát sóng vuông và kênh thứ 4 làm bộ điều chỉnh độ lớn.
Tuy nhiên, kết quả đầu tiên rất thất vọng. Âm thanh bị vỡ, không mượt mà như bản gốc. Nguyên nhân là do tốc độ dữ liệu của bộ điều chỉnh độ lớn chỉ bằng một nửa tốc độ mẫu âm thanh, khiến sóng tam giác bị mất độ phân giải, trở nên thô ráp.
Tài liệu kỹ thuật về PAULA
Khoảnh khắc "Eureka"
Một đêm nọ, khi đang nằm trên giường, tôi có một ý nghĩ chợt lóe lên. Nếu các nhạc sĩ Atari đã dùng sai mục đích tính năng envelope của YM2149, tại sao tôi không làm điều tương tự với PAULA?
Thay vì dùng sóng tam giác làm bộ điều chỉnh (vốn yêu cầu độ phân giải cao), tôi sẽ đảo ngược vai trò:
- Lưu sóng tam giác dưới dạng mẫu PCM 8-bit (có độ phân giải cao).
- Dùng sóng vuông làm tín hiệu điều chỉnh độ lớn (sóng vuông không cần độ phân giải cao, chỉ cần bật/tắt).
Chỉ cần vài dòng code thay đổi, và kết quả thật kỳ diệu. Âm thanh trên Amiga giờ đây nghe gần như y hệt bản gốc trên Atari, với hiệu ứng rền vang đặc trưng của MadMax.
Đạt được mục tiêu 0% CPU
Bây giờ tôi đã có cách phát nhạc Atari rất nhẹ nhàng (chỉ tốn ít hơn một dòng quét raster), nhưng tiêu đề bài viết hứa hẹn "0% CPU". Làm thế nào để đạt được điều đó?
Amiga sở hữu một đồng xử lý (coprocessor) cực kỳ mạnh mẽ gọi là COPPER. COPPER chạy song song hoàn toàn với CPU 68000. Nhiệm vụ của nó chỉ là ghi giá trị vào các thanh ghi của chip tùy chỉnh (custom chips) hoặc chờ đến một vị trí cụ thể trên màn hình.
Giải pháp của tôi là tạo ra hàng loạt danh sách lệnh (COPPER list) nhỏ, mỗi danh sách cho một khung hình nhạc. Các danh sách này tự động cập nhật các thanh ghi của PAULA để thay đổi cao độ và độ lớn âm thanh. Nhờ COPPER có thể tự cập nhật con trỏ đến danh sách tiếp theo, toàn bộ quá trình phát nhạc diễn ra hoàn toàn tự động mà không cần một lệnh nào của CPU 68000.
Kết quả cuối cùng
Trình giả lập YM2149 của tôi thực sự tiêu tốn 0% CPU. Không một chu kỳ xử lý nào bị đánh đổi cho âm thanh.
Kết quả là một kỷ lục mới: Tôi đã hiển thị được 7210 chấm dot, vượt qua kỷ lục 6682 của Hannibal, đồng thời phát nhạc Atari chất lượng cao với hiệu ứng MadMax Buzzer hùng tráng. Đây là một minh chứng tuyệt vời cho việc hiểu sâu sắc về phần cứng có thể tạo ra những giải pháp tối ưu hóa không tưởng.
Đối với những người yêu thích retro computing hay lập trình hệ thống cấp thấp, câu chuyện này là một lời nhắc nhở rằng đôi khi cách tốt nhất để giải quyết vấn đề là nhìn vào những tính năng bị lãng quên của phần cứng và sử dụng chúng theo những cách mà ngay cả nhà sản xuất cũng không ngờ tới.
Bài viết liên quan

Công nghệ
Cerebras, đối tác thân thiết của OpenAI, sẵn sàng cho đợt IPO kỷ lục định giá tới 26,6 tỷ USD
04 tháng 5, 2026

Công nghệ
Cảnh sát bắt giữ nghi can được cho là "ông trùm" của trang web buôn bán ma túy Dream Market
14 tháng 5, 2026

Công nghệ
Microsoft giới thiệu Surface Pro 12 và Surface Laptop 8: Sức mạnh chip Intel, giá thành gây sốc
19 tháng 5, 2026
