Cuộc hành trình phục hồi mã nguồn huyền thoại "Juggler" trên máy tính Amiga năm 1987

Công nghệ03 tháng 6, 2026·11 phút đọc

Bài viết kể về quá trình phục hồi mã nguồn của đoạn hoạt hình "Juggler" nổi tiếng năm 1987 trên máy Amiga. Tác giả đã trích xuất các tệp từ hình ảnh đĩa ADF cũ bằng công cụ Python tự viết và nhận được sự cho phép của tác giả gốc để công bố lên GitHub nhằm bảo tồn lịch sử đồ họa máy tính.

Cuộc hành trình phục hồi mã nguồn huyền thoại "Juggler" trên máy tính Amiga năm 1987

AlphaPixel thường xuyên tham gia vào việc hiện đại hóa và cập nhật các mã nguồn đồ họa cũng như hiệu năng cũ. Đôi khi, đây là những công việc bí mật theo hợp đồng NDA, nhưng cũng có lúc đó là những cuộc phiêu lưu thú vị trong lĩnh vực tò mò, bảo tồn và giải quyết bài toán thực tế là đưa dữ liệu cũ vào dạng có thể đọc và sử dụng trên máy hiện đại.

Hôm nay, hãy cùng nói về Amiga Juggler.

Đoạn hoạt hình Juggler từng là một bước đột phá ngoạn mục và gây chấn động. Ngay cả những người tạo ra máy Amiga (Commodore) cũng không tin rằng nó được tạo ra trực tiếp trên chiếc máy này. Họ nghi ngờ rằng phần tính toán thực tế phải được thực hiện trên một máy chủ (mainframe), sau đó kết quả mới được chuyển đổi và hiển thị trên Amiga.

Juggler đã để lại ấn tượng mạnh mẽ đối với tôi. Đó là một phần lý do khiến tôi mua một chiếc Amiga, và chiếc máy Amiga này lại là một phần lý do đưa tôi vào ngành đồ họa máy tính. Gần đây, tôi nhận ra rằng mã nguồn của Juggler không dễ dàng tiếp cận với đại đa số mọi người trên mạng, bởi nó nằm gọn trong một tệp ADF của Amiga mà hầu hết các công cụ lưu trữ không phân tích được. Ngoài ra, một số tài liệu tham khảo chính thống (như dottyflowers.com) đã không còn truy cập được. Vì vậy, tôi muốn tạo ra một kho lưu trữ mã nguồn hạng nhất để lưu giữ cho hậu thế.

Tìm kiếm các tệp dữ liệu

Đã có những tài liệu tham khảo về mã nguồn trình dò tia (raytracer) của Juggler. Các trang của Ernie Wright đã chỉ đến một bản sao đĩa ADF của Eric với giá "gửi tôi 15 đô la" tại một URL thuộc dottyflowers.com. Tuy nhiên, liên kết đó hiện đã không còn hoạt động và không được lưu trữ trên archive.org.

May mắn thay, dữ liệu ảnh đĩa tương tự đã được tìm thấy trên archive.org dưới dạng một tệp ADF nén. Tệp lưu trữ 7z này chứa một ảnh đĩa Amiga, không phải một thư mục tệp đơn giản. Điều này là bình thường với tài liệu Amiga cũ, nhưng nó có nghĩa là có thêm một bước nữa trước khi nội dung có thể đọc được trên hệ thống hiện đại. (Điều này cũng gây khó khăn cho hầu hết các công cụ AI khi muốn huấn luyện hoặc kiểm tra dữ liệu vì chúng không hiểu cách trích xuất ADF).

Trích xuất ADF

Công cụ trích xuất gốc mà tôi sử dụng làm tham chiếu là extract-adf của Michael Steil. Công cụ này được viết bằng C, một lựa chọn xuất sắc vào thời điểm đó. Nó trích xuất các tệp từ ảnh đĩa ADF OFS của Amiga, bao gồm cả những ảnh đĩa bị hỏng hoặc có thể phục hồi một phần. Nó cũng cố gắng giữ nguyên cấu trúc thư mục và dấu thời gian.

Đối với kho lưu trữ này, tôi muốn có một phiên bản Python có thể được giữ cùng với các tệp đã phục hồi và chạy mà không cần biên dịch chương trình C gốc. Hầu hết các nhà phát triển đều có thể tiếp cận dễ dàng với Python, và chạy một tập lệnh Python nhanh hơn nhiều so với việc thiết lập môi trường phát triển, cấu hình và biên dịch một tệp thực thi gốc. Hơn nữa, trình thông dịch Python dễ dàng và vô hại hơn để sửa đổi và gỡ lỗi. Tôi đã yêu cầu OpenAI Codex tạo ra một bản port Python cho nhiệm vụ này.

Bản port này giữ nguyên các chức năng cơ bản của phiên bản C, ít nhất là ở mức độ tôi cần cho bài tập này. Nó hỗ trợ các tệp ADF thô, tệp gzip/ADZ và tệp ZIP chứa ADF. Nó trích xuất các hệ thống tệp AmigaDOS dòng OFS. Nó không triển khai trình giải nén DMS của phiên bản C gốc và không hỗ trợ ảnh FFS.

ADF là một vùng chứa ảnh đĩa thô. Hệ thống tệp bên trong nó là một lớp mã hóa thứ hai. Công cụ extract-adf gốc chỉ nhắm vào OFS, không phải FFS (vì FFS ít khi được dùng trên đĩa mềm anyway), và bản port Python này vẫn giữ nguyên giới hạn đó.

Ảnh đĩa ADF của Juggler đã được trích xuất sạch sẽ.

Kiểm tra công cụ trích xuất

Sau khi trích xuất ADF của Juggler, tôi không muốn giả định rằng bản port Python là chính xác chỉ vì nó hoạt động một lần. Dưới chỉ đạo của tôi, Codex đã thiết kế và chạy một số bài kiểm tra xác thực thêm.

Nó đã tạo ra các biến thể kiểm tra nén của cùng một ảnh:

  • gzip/ADZ.
  • ZIP chứa ADF.

Cả hai đều được trích xuất chính xác.

Đối với dữ liệu kiểm tra bên ngoài, nó đã sử dụng các ảnh đĩa kiểm tra có sẵn miễn phí từ ADFlib. Các tạo tác này bao gồm một số ảnh ADF được sử dụng để kiểm tra hệ thống tệp. Công cụ trích xuất Python đã trích xuất thành công các ảnh dòng OFS bao gồm arccsh.adf, blank.adf, cache_crash.adf, ffdisk0049.adf.gz, g1a30c.adf và testofs.adf.

Bộ ADFlib cũng bao gồm các ảnh dòng FFS. Công cụ trích xuất phát hiện những tệp này từ khối khởi động (bootblock) và từ chối chúng một cách rõ ràng thay vì tạo ra kết quả đầu ra trống hoặc gây hiểu lầm.

Hai tệp tham chiếu của ADFlib đã được so sánh từng byte (byte-for-byte):

  • arccsh.adf so với CSH.
  • testofs.adf so với MOON.GIF.

Cả hai đều khớp hoàn toàn.

Tôi không khẳng định điều này sẽ giải mã mọi ảnh đĩa/hệ thống tệp Amiga có thể, nhưng nó đủ để xác thực cho nhiệm vụ này: phục hồi ADF Juggler, làm cho quá trình trích xuất có thể lặp lại và tránh các lỗi thầm lặng trên các hệ thống tệp không được hỗ trợ rõ ràng.

Dữ liệu và mã nguồn của Eric Graham đã phục hồi

Thư mục đã phục hồi chứa mã nguồn C gốc, một phiên bản BASIC (về cơ bản khá giống phiên bản C), các tệp thực thi Amiga (tôi chưa thử kiểm tra dưới giả lập), các tệp mô tả cảnh .dat, siêu dữ liệu Workbench và dữ liệu hoạt hình nén. Các tệp nguồn C chính là:

  • rt1.c: trình dò tia cốt lõi.
  • rt2.c: thiết lập cảnh và chuyển đổi pixel HAM.
  • rt3.c: hỗ trợ màn hình/cửa sổ và đồ họa Amiga.

Cũng có raytrace.a, phiên bản Amiga BASIC của trình dò tia, và raytrace.BAK, bản sao lưu của mã nguồn BASIC đó. Các tệp mô tả cảnh bao gồm dragon.dat, ele.dat và robot.dat. Đĩa cũng bao gồm movie, movie2 và các tệp .data tương ứng của chúng, là các tệp thực thi Amiga và dữ liệu khung hình nén cho các trình chiếu hoạt hình dò tia.

Đáng chú ý, mã rt?.c thực tế chỉ triển khai việc dò tia một quả cầu "DULL" (nhàm chán) có bán kính 3.0 đơn vị. Hình học thế giới trông giống như:

w->sp[0].pos[0]=0.0;
w->sp[0].pos[1]=0.0;
w->sp[0].pos[2]=2.0;
w->sp[0].radius=3.0;
w->sp[0].type=DULL;
w->sp[0].color[0]=1.0;
w->sp[0].color[1]=0.7;
w->sp[0].color[2]=0.7;

Có các tệp cảnh được bao gồm cho 'robot', 'dragon' và 'ele'(phant), tương ứng với các cảnh được hiển thị trong tạp chí AmigaWorld, nhưng mã nguồn của công cụ thực tế phân tích và dò tia các cảnh đó (được gọi là "SSG: Scene Simulation Generator") không được bao gồm.

Tôi đã thêm một kê khai (manifest) vào README của kho lưu trữ để các tệp đã phục hồi không chỉ là một đống tên. Các tệp nguồn, tệp cảnh, trình phát phim và tệp bản đồ thư viện có thể được mô tả từ nội dung và chuỗi ký tự nhúng của chúng.

Xin phép

Tìm và trích xuất các tệp là phần kỹ thuật của nhiệm vụ.

Mã nguồn đã cũ (và gần như bị lãng quên), nhưng tuổi tác không làm cho mã nguồn trở thành phạm vi công cộng (về mặt kỹ thuật là tuổi thọ của tác giả cộng thêm 70 năm, nhưng Eric vẫn còn sống khỏe, nên điều đó không thành vấn đề). Các tệp đã phục hồi bao gồm các thông báo bản quyền.

Copyright 1987 Eric Graham Permission is granted to copy and modify this file, provided that this notice is retained.

Các thông báo này cấp quyền sao chép và sửa đổi hạn chế, nhưng điều đó không giống như sự cho phép rõ ràng để phân phối lại/công bố mã nguồn trên GitHub.

Vì vậy, tôi đã liên hệ với Eric Graham vào ngày 10 tháng 2 năm 2026 và hỏi trực tiếp:

"Tôi hy vọng có thể đưa mã lên GitHub cho hậu thế, và tôi nhận ra không có giấy phép rõ ràng hoặc sự từ bỏ bản quyền đối với mã này. Tôi tự hỏi liệu anh có sẵn lòng tuyên bố cụ thể một giấy phép hoặc sự từ bỏ bản quyền để nó hợp pháp trên GitHub hay không."

Eric đã trả lời vào cùng ngày:

"Vâng, tôi rất sẵn lòng! Thật trớ trêu khi được biết đến nhiều nhất vì một điều gì đó tôi đã làm trong một ngày! Xét cho đến mức độ tôi quan tâm, bất kỳ ai cũng có thể làm bất cứ điều họ muốn với mã này, miễn là tôi được nhắc đến!"

Điều đó làm rõ vấn đề đủ tốt. Mã nguồn này nên được coi là phạm vi công cộng với một yêu cầu ghi nhận nguồn. Việc ghi nhận nguồn không khó để thực hiện.

Công bố kho lưu trữ

Kho lưu trữ chứa bản sao ADF gốc đã nén và các tệp đã trích xuất.

README ghi lại nơi ADF đến từ đâu, sự cho phép của Eric Graham, các liên kết đến tài nguyên Juggler liên quan và kê khai của các tệp được phục hồi từ ảnh đĩa.

Tổng kết

Mã nguồn C văn bản của trình dò tia gốc của Eric Graham đã khó tìm thấy trực tuyến. ADF đã tồn tại, nhưng một số liên kết chính thống đến nó đã bị phân hủy, và ADF không hữu ích bằng một cây mã nguồn có thể đọc được đối với những người muốn nghiên cứu mã nhưng không có giả lập Amiga sẵn có. Điều này cũng giữ cho tài liệu lưu trữ đĩa gốc hiển thị và sẵn có dư thừa. Tệp ADF .7z nằm trong kho lưu trữ để quá trình trích xuất có thể được lặp lại hoặc kiểm tra sau này, nhưng các tệp đã trích xuất ở đó để thuận tiện và khả năng đọc (và công cụ trích xuất được công bố riêng vì nó có thêm tiện ích).

Trong tương lai, tôi sẽ cập nhật nó để nó có thể chạy trên hệ thống hiện đại và cố gắng tái tạo một số tài sản bị mất, chẳng hạn như triển khai công cụ SSG thực sự có thể phân tích và tái tạo lại các cảnh Juggler (robot), rồng và voi.

AlphaPixel giải quyết các vấn đề khó khăn mỗi ngày cho khách hàng trên toàn thế giới. Chúng tôi đã làm những việc phi thường, như khôi phục bằng chứng video pháp lý đã xóa khỏi thẻ SD, tân trang lại ổ cứng cũ để cứu dữ liệu quan trọng, kỹ thuật ngược các định dạng dữ liệu độc quyền để giải phóng thông tin quý giá bị cô lập, thậm chí hàn gỡ các chip bề mặt và hút não bộ của chúng bằng thiết bị khai thác phần cứng.

Con đường cứu mã và dữ liệu cũ và làm cho nó hữu ích again là một hành trình, thường giống như việc xây dựng một cây cầu treo dây thừng từng tấm ván một, trong khi lơ lửng giữa không trung. Đôi khi trong khi bị tấn công bởi người bản địa, kiểu như Indiana Jones. Thường có những vấn đề gà và quả trứng liên kết với nhau, nơi giải pháp hiển nhiên sẽ không hoạt động vì một vấn đề nhỏ, sau đó lan truyền và tuyết lở thành các vấn đề lớn. Không phải là hiếm khi tìm thấy lỗi hoặc sự thiếu sót trong một công cụ cũ bạn cần sử dụng, và khi bạn sửa chữa nó, bạn thấy rằng công cụ không còn được biên dịch bởi các chuỗi công cụ hiện đại, làm cho cần thiết phải tái tạo một môi trường phụ chỉ để sửa vấn đề đang chặn bạn trong nỗ lực chính. Chúng tôi đã đùa gọi thuật ngữ "Khảo cổ học phần mềm" (Software Archaeologist) trong một số bối cảnh như thế này.

Nếu bạn có một vấn đề khó khăn đang đối mặt và không tự tin vào việc tự giải quyết, hãy gọi cho chúng tôi. Chúng Tôi Giải Quyết Các Vấn Đề Khó Khăn Của Bạn.

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