Viết mã Z80 Assembly sau 4 thập kỷ: Hồi sinh đồ họa 3D trên ZX Spectrum
Một lập trình viên đã quay lại với chiếc máy tính ZX Spectrum 48K thời thơ ấu để viết mã Z80 Assembly tối ưu hóa cho đồ họa 3D. Bằng cách sử dụng các kỹ thuật lập trình cấp thấp và bảng tra cứu thông minh, ông đã biến một dự án "vô bổ" thành bài học thú vị về tối ưu hóa hiệu năng, đạt tốc độ khung hình vượt trội so với ngôn ngữ C.

Hành trình này bắt đầu từ chiếc ZX Spectrum 48K+ (hay còn gọi thân thương là Speccy) - món quà tuyệt vời nhất mà tác giả nhận được khi 13 tuổi. Sau cả một sự nghiệp dài, thói quen "chơi đùa" với đồ họa 3D chỉ dùng phần mềm (software-only) vẫn còn đó. Trước đây, tác giả từng port logic chính sang vi điều khiển ATmega328P để điều khiển màn hình OLED độ phân giải 128x64.
ZX Spectrum 48K
Thử thách đặt ra là làm cho nó hoạt động trên Speccy. Và kết quả là trong kho lưu trữ này, bạn có thể tìm thấy các tệp statue.tap và sphere.tap để chạy trên trình giả lập FUSE.
Tối ưu hóa với Z80 Assembly và Toán học
Vì "bộ não" của ZX Spectrum (chip Z80) còn nhỏ bé hơn cả ATmega328P, tác giả phải thực hiện các điều chỉnh mạnh tay. Thay vì xoay bức tượng, vòng lặp tính toán được thay đổi để xoay điểm nhìn (viewpoint) xung quanh mô hình. Điều này dẫn đến các phương trình đơn giản nhất có thể, loại bỏ các phép nhân và dịch bit, chỉ còn lại hai phép chia và một vài phép cộng/trừ.
Tuy nhiên, để thực sự tận dụng sức mạnh của Z80 sau gần 4 thập kỷ, tác giả đã viết lại mã bằng Z80 Assembly thuần túy thay vì dùng C. Việc này cho phép sử dụng thanh ghi (register) hiệu quả hơn nhiều so với bất kỳ trình biên dịch C nào. Đặc biệt, hai phép chia tốn kém đã được thay thế bằng các phép nhân sử dụng bảng tra cứu nghịch đảo (reciprocal lookup table).
Kết quả là tốc độ khung hình tăng vọt:
- Phiên bản C: 6.2 khung hình/giây (fps)
- Phiên bản Assembly tối ưu: 14.0 fps
Mô hình 3D trên ZX Spectrum
Tính toán trước (Pre-computing) để đạt tốc độ tối đa
Tác giả cũng tò mò về việc tính toán trước toàn bộ các đường dẫn và thao tác ghi vào bộ nhớ màn hình. Phiên bản này (trong nhánh precompute) chạy nhanh hơn 4 lần, đạt tới 40 fps. Mặc dù mất vài phút để tính toán trước, nhưng tại thời điểm chạy, vòng lặp nội tại (inner loop) gần như không phải làm gì ngoài việc trích xuất tọa độ truy cập bộ nhớ từ 16 bit/pixel.
Trong phiên bản này, số học dấu phẩy cố định (fixed-point arithmetic) 8.8 được sử dụng cho các phương trình đầy đủ. Đáng chú ý là phiên bản "blitter" viết bằng Assembly nội tuyến (inline assembly) nhanh hơn phiên bản C tới 3.5 lần.
Giải thích toán học cho những người đam mê kỹ thuật
Dưới đây là cách thức hoạt động của phép chiếu 3D từ dữ liệu thô đến điểm ảnh trên màn hình ZX Spectrum:
-
Dữ liệu nguồn: Mô hình bức tượng gồm 153 điểm 3D, được chuyển đổi từ số thực (float) sang số nguyên (integer) để tránh tính toán dấu phẩy động trên Z80.
-
Tiền xử lý: Các tọa độ được thay đổi trục (axis swap) và chuyển đổi sang không gian dấu phẩy cố định "sẵn sàng cho màn hình" để tối ưu hóa hiệu suất runtime.
-
Phương trình chiếu: Cuối cùng, các phương trình thực hiện phép chiếu đơn giản nhất có thể tại thời điểm chạy:
wxnew = X' - mcos y = 96 - Z' / wxnew x = 128 + (Y' + msin) / wxnewĐây thực chất là các phương trình chiếu 3D tiêu chuẩn, trong đó
msinvàmcosđiều chỉnh điểm nhìn của camera theo vòng quay.
Minh họa toán học
Kết luận
Bây giờ, tất cả những gì cần làm là chờ đến ngày nghỉ hưu để sử dụng kiến thức điện tử hồi sinh chiếc Speccy thực thụ và kiểm thử mã này trên phần cứng thật, chứ không chỉ trên trình giả lập. Hoặc có lẽ, chính bạn, độc giả thân mến, sẽ là người thử nghiệm trên chiếc Speccy của mình?
Cheers!
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ệ
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
Công nghệ
Trang web ngăn chặn tự tử tại Hà Lan bị phát hiện chia sẻ dữ liệu người dùng cho các công ty công nghệ
13 tháng 5, 2026
