1 điểm bởi GN⁺ 2024-11-23 | 1 bình luận | Chia sẻ qua WhatsApp
  • ChipWits, một trong những trò chơi đầu tiên trên Macintosh năm 1984, đã nhân dịp kỷ niệm 40 năm để phát hành mã nguồn FORTH cho Mac và Commodore 64 dưới dạng mã nguồn mở
  • Mục tiêu của việc công bố là bảo tồn di sản của trò chơi và chia sẻ cách phát triển đa nền tảng đã được thực hiện trên các máy vi tính 8-bit vào năm 1984
  • Dữ liệu được khôi phục từ các đĩa 40 năm tuổi do Doug Sharp lưu giữ; dù có một số sector lỗi, phần lớn đĩa vẫn được đọc bình thường
  • Toàn bộ mã nguồn bản Mac chỉ khoảng 3.000 dòng FORTH, trong khi bản port hiện đại hóa đã lên tới 35.000 dòng C#, cho thấy mức độ cô đọng và các ràng buộc của mã thời đó
  • Dự án đã công khai image đĩa gốc và mã trích xuất trên GitHub, đồng thời muốn cùng cộng đồng thực hiện việc xác định mã nguồn mới nhất, viết cách build và trích xuất sprite

Công bố mã nguồn gốc của ChipWits

  • Nhân dịp kỷ niệm 40 năm ChipWits, mã nguồn FORTH gốc cho Mac và Commodore 64 đã được phát hành dưới dạng mã nguồn mở
  • Mã nguồn gốc đã khôi phục và image đĩa được tổng hợp tại chipwits/chipwits-forth
  • Mục đích công bố là bảo tồn di sản của ChipWits và chia sẻ kinh nghiệm phát triển đa nền tảng cho máy vi tính 8-bit năm 1984
  • Những người quen thuộc với các hệ thống nguyên bản có thể tham gia khám phá và sắp xếp lại mã nguồn; dự án kêu gọi cộng tác qua ChipWits Discord Server

Vì sao FORTH được chọn vào năm 1984

  • ChipWits là một trong những trò chơi đầu tiên phát hành trên Macintosh năm 1984
  • Đồng sáng tạo Doug Sharp và Mike Johnston đã thiết kế ChipWits, trò chơi gốc đầu tiên của họ, sau khi port các trò chơi giáo dục giữa nhiều máy vi tính 8-bit
  • Trò chơi là một game lập trình robot, chịu ảnh hưởng từ các trò chơi lập trình cùng thời như Rocky’s Boots, Logo
  • Môi trường phát triển cho Mac năm 1984 còn hạn chế, và cách phát triển chủ yếu là mua Apple Lisa
    • Giá gốc của Apple Lisa là $9,995, tương đương $30,373 theo giá trị hiện nay
    • Đây là mức chi phí mà một studio game indie khó có thể gánh nổi, nên Doug và Mike đã phát triển bằng MacForth Plus chạy trực tiếp trên Mac
  • Khi đó có nhiều biến thể FORTH trên các máy vi tính 8-bit khác nhau, nên đây là lựa chọn ngôn ngữ phù hợp nếu tính đến việc port về sau
  • Việc phát triển bắt đầu vào tháng 4/1984, và mất khoảng 7 tháng để hoàn thành bản đầu tiên và xuất bản kịp mùa Giáng sinh

Port sang Commodore 64 và Apple II

  • Epyx dự kiến sẽ là nhà phát hành của ChipWits, và Commodore 64 là thị trường lớn nhất
  • Epyx không có game Mac nào, còn Brainworks nhắm tới thị trường giáo dục nơi Apple khi đó rất mạnh, nên Epyx chỉ phát hành phiên bản Commodore 64
  • Bản port C64 hoàn thành năm 1985 và được viết bằng Super Forth 64
  • Việc port sang Commodore 64 rất khó vì phải giữ nguyên thiết kế UI tổng thể giống bản Mac
    • Cần phát triển hệ thống menu pull-down vận hành bằng joystick thay vì chuột
    • Bổ sung đồ họa màu và âm thanh từ chip SID
    • Phải nhét toàn bộ trò chơi vào đĩa 165KB thay vì đĩa Mac 400KB
    • Phải dùng 64KB RAM và bộ xử lý chậm hơn thay vì 128KB RAM như trên Mac
  • Sau thành công của phiên bản Commodore 64, một phiên bản Apple II cũng được tạo ra, và bản này cũng viết bằng một biến thể FORTH

Đánh giá sau phát hành và chạy lại bản gốc

  • Sau khi phát hành, ChipWits nhận được nhiều bài đánh giá và giải thưởng
  • MacUser Editor’s Choice 1986 Award đánh giá ChipWits là “màn nhập môn thú vị nhất về các khái niệm lập trình”, đồng thời khen ngợi ngôn ngữ dựa trên biểu tượng và thiết kế giáo dục của trò chơi
  • Macazine dự đoán ChipWits sẽ trở thành một tác phẩm được yêu thích kiểu cult với người dùng Macintosh và trẻ em
  • MacWorld nhận xét rằng nếu bạn thích lập trình thì bạn sẽ thích ChipWits
  • Creative Computing để lại một bài review có cảnh chửi một robot hoạt hình lúc 4 giờ 30 sáng
  • Năm 2008, Maclife.com đưa ChipWits vào danh sách Top 10 Apple II / Mac Games mọi thời đại
  • Các bản gốc đang được chuẩn bị để có thể chạy trong trình giả lập trên trình duyệt thông qua dự án mã nguồn mở EmularityApple2js

Khôi phục các đĩa 40 năm tuổi

  • Trong quá trình làm phiên bản ChipWits mới, Doug Sharp đã tìm thấy các đĩa gốc mà ông lưu giữ
  • Đĩa mềm 3.5 inch và 5.25 inch đã được cất giữ trong môi trường gia đình suốt 40 năm, nhưng phần lớn vẫn đọc được mà không có sector lỗi
  • Việc khôi phục đĩa Commodore 64 sử dụng 1541 Commodore 64 Disk Drive mua trên eBay
    • Dữ liệu được đọc trên PC hiện đại thông qua bộ chuyển đổi USB XoomFloppy
  • Đĩa mềm Mac 3.5 inch không thể đọc theo cách tiêu chuẩn của ổ đĩa hiện đại do cách bố trí sector độc quyền của Mac
    • Mac dùng bố trí sector riêng để nâng dung lượng đĩa lên 800KB
    • PowerMac G3 WallStreet được dùng làm hệ thống cầu nối nhờ có ổ đĩa 3.5 inch và stack mạng, nhưng trên MacOS mới thì hỗ trợ 400KB đã bị vô hiệu hóa nên chỉ đọc được đĩa 800KB
    • Sau đó, theo gợi ý của người hâm mộ, nhóm đã dùng GreaseWeazle, một bộ điều khiển phần cứng tùy chỉnh cho ổ đĩa USB, và cách này hoạt động tốt
  • Tất cả đĩa đều được tạo image ở mức block rồi sắp xếp trong kho GitHub
    • Tên file dùng theo nhãn đĩa
    • Nếu phát hiện sector lỗi thì thêm tiền tố bad vào tên file
    • Để dễ đọc trên máy tính hiện đại, các block được trích xuất bằng script Python và định dạng lại thành file ASCII UTF-8
    • PETSCII, bảng mã ký tự riêng của Commodore 64, được chuyển sang ASCII

Cách phát triển thể hiện trong mã nguồn FORTH

  • Có thể xem toàn bộ image đĩa gốc và mã nguồn tại chipwits/chipwits-forth
  • Toàn bộ mã nguồn ChipWits cho Mac chỉ khoảng 3.000 dòng FORTH
  • Bản port hiện đại hóa đã lên tới 35.000 dòng C#, khiến mức độ cô đọng của mã FORTH gốc càng nổi bật
  • Bài viết riêng Forth Code for Electrocrabs in 1984 ChipWits Deciphered phân tích một “screen” mã FORTH điều khiển electrocrabs
  • FORTH là ngôn ngữ dựa trên stack, tương tự Reverse Polish Notation
    • Thay vì 1 + 1, nó được viết thành 1 1 +
    • Thay vì if random(3) == 1, nó dùng dạng 3 irnd 1 = if

Nhìn vào ví dụ mã để thấy cách làm game năm 1984

  • Mã di chuyển robot trong bản Mac không tách riêng vòng lặp render theo từng frame như phát triển game hiện đại
    • Logic game và render đồ họa được trộn lẫn với nhau trong mã lệnh kiểu mệnh lệnh
    • Hoạt ảnh được triển khai bằng cách render trực tiếp pixel bên trong vòng lặp
    • Việc đi sang ô sàn trống, đâm vào tường hay chạm bom đều được xử lý chỉ bằng vài từ mã
    • Định nghĩa ?boom còn quyết định cả việc trò chơi có kết thúc khi chạm bom hay không
    • Dựa trên vị trí robot, mã cộng thêm 0 điểm vào điểm số để buộc vẽ lại phần hiển thị điểm có thể đã bị robot đi qua và xóa mất
  • Định nghĩa sprite trong bản Commodore 64 cho thấy cách mã và dữ liệu asset từng được trộn lẫn với nhau
    • Mã nguồn FORTH không được lưu thành file mà thành các screen được đánh số, rồi nạp theo thứ tự cần thiết
    • Sprite đơn sắc của C64 có kích thước 24×21 pixel, và mỗi màn hình chỉ dùng được 8 sprite
    • Nếu chọn sprite 4 màu thì độ phân giải giảm xuống còn 12×21, và pixel sẽ rộng gấp đôi
    • Nhân vật ChipWit được render bằng cách chồng nhiều sprite lên nhau, tương tự hoạt hình cel kiểu cổ điển
    • Lựa chọn này dùng nhiều sprite sẵn có cho ChipWit hơn, đổi lại có hình ảnh sắc nét hơn và cho phép hoạt ảnh theo từng bộ phận
  • Bảng điểm vật phẩm trong bản Mac được nén dữ liệu để vừa trong một screen
    • Ký hiệu như ( 110584 dws) là dấu thời gian của screen; 110584 nghĩa là ngày 5/11/1984, còn dws là viết tắt của Douglass Walter Sharp
    • Screen đó có vẻ là một trong những screen được chỉnh sửa cuối cùng trước bản phát hành chính thức, và screen thay đổi sau cùng là ngày 8/11
    • d, được định nghĩa để lưu giá trị sau khi nhân 10, nên 150 điểm có thể được biểu diễn như 15 d
    • Cách này giúp giữ thẳng hàng bảng dữ liệu mà vẫn vừa trong một screen, đồng thời có thể giúp dễ điều chỉnh toàn bộ giá trị điểm khi cân bằng game trước phát hành

Bản reboot và công việc cộng đồng

  • Ngoài việc công bố phiên bản FORTH gốc, nhóm cũng đang thực hiện một bản ChipWits hiện đại hóa
  • Bản reboot hướng tới việc giữ nguyên sự thú vị và tính chặt chẽ mang màu sắc khoa học máy tính của nguyên tác, đồng thời cải thiện nhiều khía cạnh từ độ dốc học tập đến bảng xếp hạng toàn cầu mang tính cạnh tranh
  • Nếu thêm ChipWits vào wishlist trên Steam, bạn sẽ nhận được thông báo khi bản hoàn chỉnh phát hành
  • Các mục tiêu trước mắt trong issue GitHub hiện tại liên quan đến mã FORTH gốc gồm:
    • xác nhận đã trích xuất hết mã nguồn liên quan từ raw disk image hay chưa
    • sửa vấn đề căn lề của một số file mã nguồn
      • một số file rộng 40 ký tự, một số rộng 64 ký tự
    • xác định đĩa nào chứa mã nguồn mới nhất
    • viết cách build từ mã nguồn trên Mac và C64
    • trích xuất raw sprite và hình ảnh từ đĩa rồi chuyển thành file .png
  • Mục tiêu cuối cùng là một phiên bản ChipWits FORTH do cộng đồng duy trì cho PC hiện đại

1 bình luận

 
GN⁺ 2024-11-23
Các ý kiến trên Hacker News
  • Có một bài viết ghi lại lý do ChipWits được tạo bằng FORTH vào năm 1984
    https://chipwits.com/2023/04/08/forth-programming-language-g...

    • ChipWits là một trong những trò chơi đầu tiên tôi chơi trên Apple Macintosh, chiếc máy tính đầu tiên của tôi khi 6 tuổi, vào năm 1984
      Cảm ơn vì đã tạo ra trò chơi tôi yêu thích; tôi cũng đã tải bản demo mới và thêm vào danh sách mong muốn trên Steam
  • Forth là ngôn ngữ tôi đã muốn học thử suốt mấy năm nay
    Trên các máy tính cũ, nếu muốn chương trình chạy nhanh thì có lựa chọn dùng hợp ngữ, còn nếu chậm cũng được thì dùng BASIC; điều thú vị là Forth trông có vẻ khá bậc cao nhưng vẫn tồn tại như một ngôn ngữ “tốc độ trung bình”

    • Trong thời gian dài, Forth cùng với C là các ngôn ngữ tiêu chuẩn trong mảng phát triển phần cứng và driver, và hiện vẫn được dùng ở nhiều nơi
      Đây là ngôn ngữ dựa trên stack
      https://www.forth.com/starting-forth/
    • Bạn có thể mua máy tính bo mạch đơn chạy Forth native
      Chỉ cần cắm cáp USB vào máy tính và mở một chương trình terminal là có thể bắt đầu ngay, rất phù hợp để đắm mình hoàn toàn vào ngôn ngữ này
      Tuy nhiên, sản phẩm gửi từ Úc có thể mất vài tháng mới đến nơi, nên tốt nhất hãy tìm nhà cung cấp gần bạn trước
      Một cách hay khác là học như năm 1984: chạy trình giả lập như Commodore 64 hoặc Apple ][ trên máy tính hiện đại, rồi đưa môi trường phát triển Forth vào trong đó
      Tài liệu thời đó được viết cho người mới hoàn toàn nên rất dễ theo, và trên Internet cũng có nhiều bản PDF scan miễn phí
    • Tôi nghĩ tự viết một trình thông dịch Forth đồ chơi là cách tốt để học ngôn ngữ này
      Việc đó dễ và thú vị, nhưng đến một điểm nào đó thì lại dễ đến mức phi lý, nên với một số người có thể cảm thấy quá cơ bản, hoặc sẽ rất muốn vượt ra ngoài phạm vi một bản triển khai đồ chơi
    • Forth rất nhanh, thậm chí có thể nhanh hơn cả hợp ngữ viết một cách ngây thơ, nhưng hoàn toàn không phải là ngôn ngữ bậc cao
      Phải tự quản lý stack nên khá phiền, còn tự tạo FORTH thì rất thú vị. Không nhất thiết phải viết bằng hợp ngữ; trước đây tôi từng tạo một ngôn ngữ script giống Forth bằng C++
    • Các máy tính gia đình 8-bit đời cũ được thiết kế với đối tượng là thanh thiếu niên và trẻ em, và có lẽ cũng chịu ảnh hưởng của Alan Kay
      BASIC là “Beginner's All-purpose Symbolic Instruction Code”, nên rất phù hợp
      Amstrad CPC 6128 còn có một bản triển khai Logo, một phương ngữ Lisp dùng cho giáo dục, được cung cấp trên đĩa riêng; hồi nhỏ tôi đã thật sự bị sốc bởi các danh sách liên kết của nó
      Khi đó, “mã nguồn mở” chưa phải là một khái niệm phổ biến, còn compiler và interpreter của nhiều ngôn ngữ là các công cụ thương mại chuyên nghiệp
      [1] https://en.wikipedia.org/wiki/Amstrad_CPC#Other_languages
      [2] https://en.wikipedia.org/wiki/An_Open_Letter_to_Hobbyists
  • Trông rất tuyệt
    Liên quan đến chuyện này còn có http://tumbleforth.hardcoded.net/, tôi thấy cũng khá hay. Nếu có ai đã làm đến hết thì tôi tò mò trải nghiệm đó thế nào

    • Tôi đã làm được khoảng một nửa trong một tuần công việc khá rảnh, và nó làm tôi nhớ đến lớp phần cứng thời đại học
      Nó khiến tôi nghĩ về điện toán theo một cách khác
      Dù tôi vẫn còn trẻ và thiếu sót, nhưng nhìn lại thì trước đây một số abstraction được chọn vì các ràng buộc phần cứng, và trong “nhánh tiến hóa” của các ngôn ngữ lập trình hiện nay có vẻ đã tích tụ rất nhiều abstraction không già đi một cách tốt đẹp, tạo thành nhiều lớp đồ linh tinh phải gánh tải. Cũng giống các dự án kỹ thuật khác
      Collapse OS có thể không thực dụng ngày nay, nhưng nó có cảm giác giải phóng khi thoát khỏi nhiều tầng abstraction. Nó giống như một cách để tận hưởng điện toán kiểu thập niên 1960 mà không phải chịu trải nghiệm lập trình viên kinh khủng
      Dự án viển vông hiện tại của tôi là lần theo những thứ này, build Dusk OS trong máy ảo, rồi chuyển sang máy vật lý, viết một trình thông dịch Scheme cho Dusk OS bằng C, sau đó mở rộng tùy ý
      Trước khi tới được đó còn vài con sông phải vượt. Tôi đã triển khai một trình thông dịch Scheme bằng Python trong vài giờ, rồi dành thêm vài giờ cải thiện scanner/tokenizer. Hiện tôi đang đọc Crafting Interpreters để xem nên triển khai trình thông dịch Scheme bằng C như thế nào. Sau khi tạo xong trình thông dịch C, tôi định quay lại xem guide này và lao thẳng vào DuskOS
    • Tôi mới bắt đầu xem thôi, cảm ơn vì đã chia sẻ
      Tôi đã thích giọng văn của tác giả rồi
      Ví dụ:

      Much terser than the C version right?
      This little assembler crash course gives us a better understanding of what is compiled by the C compiler, but not how it compiles it. We don't know how it's ran either. To know that, we'd have to dig through software that weighs millions of lines of code. Maybe you'd have the patience to do it, I don't, so let's continue tumbling down the rabbit hole. We'll go bare metal and then build an operating system of our own, with a C compiler of our own. It's simpler this way.
      What’s a linker? Aw, forget about it, it’s another piece of overcomplicated software that has convinced the world that it’s essential. We won’t need one in what’s coming.

    • Virgil Dupras, tác giả loạt bài Tumble Forth, cũng đang làm DuskOS, một hệ điều hành được viết hoàn toàn bằng một Forth tùy biến
      Sản lượng đều đặn và khổng lồ của ông ấy thật ấn tượng. Tôi không hoàn toàn đồng ý với triết lý Collapse, nhưng mailing list của DuskOS có lượng traffic vừa đủ lý tưởng để đọc lặng lẽ
      Nhờ xem công việc của Virgil, tôi đã thử Forth một chút, và năm ngoái đã dành thời gian decompile thủ công SmithForth[1]
      Điều đáng ngạc nhiên là lượng assembly cần để bootstrap một ngôn ngữ thật sự rất ít. Tôi hoàn toàn hiểu vì sao Forth có thể cung cấp REPL trong môi trường embedded, và nó trông thú vị hơn nhiều so với chu kỳ phát triển thông thường mà ta hay nghe
      [0]:https://duskos.org/
      [1]:https://dacvs.neocities.org/SF/
    • Ban đầu đó là phản ứng của tôi khi phấn khích vì thấy một thứ thực tế dựa trên Forth
      Sau đó tôi đọc trang Wikipedia và bài blog về ChipWits, và trò chơi gốc trông thật sự rất hay. Logo trong manual trên Wikipedia cũng rất đẹp
      Gần đây tôi đang lập danh sách các game cũ/mới có yếu tố puzzle và lập trình, và tôi định đưa nó vào đó. Có thể tôi sẽ thử ngay sau khi hoàn thành “game” assembly ketman. Thật ra gọi nó là game thì cũng hơi khó
      Hy vọng ChipWits mới sẽ thành công rực rỡ
  • ValForth của Valpar là một trong những implementation FORTH đa nền tảng đầu tiên trong hệ sinh thái Atari ST, và cũng có các phần mở rộng khéo léo dành cho game
    https://www.atarimagazines.com/rom/issue1/jumping_forth.php
    Như bài viết nói, trên 8-bit cũng có FORTH của Elcomp, và có cả những cuốn sách như https://www.atarimania.com/documents/FORTH-on-the-Atari-Lear.... “Starting FORTH” của Leo Brodie đến nay vẫn là một sách nhập môn tuyệt vời
    Tất cả chúng ta đều học BASIC, nhưng những ngôn ngữ thay thế như thế này cho thấy thực sự có những ẩn dụ hoàn toàn khác để lập trình thiết bị
    Với một đứa trẻ thập niên 80, đó là một việc mở mang tầm mắt rất lớn

  • Forth trông như một trong những ngôn ngữ viết một lần rồi sau đó khó đọc, giống Perl
    Viết và tạo ra thì dễ, nhưng khoảng 1 năm sau quay lại nhìn code có lẽ sẽ không biết nó đang làm gì
    Dù vậy, nó thực sự nhanh và hiệu quả

    • Tôi cho rằng việc Perl mang tiếng như vậy là hoàn toàn bất công
      Tôi vừa mở ngẫu nhiên một chương trình Perl khá lớn mà hơn 3 năm rồi chưa đụng tới và lướt qua mã nguồn, nhưng hoàn toàn không gặp vấn đề gì trong việc hiểu nó làm gì
      Tôi không nghĩ code Perl khó đọc lại hơn phần lớn các ngôn ngữ lập trình khác. Độ khó chủ yếu phụ thuộc vào việc lập trình viên thành thạo ngôn ngữ đó đến đâu, và đã bao lâu rồi kể từ lần cuối họ viết code bằng ngôn ngữ đó
      Nếu kỹ năng với ngôn ngữ đã rỉ sét nhiều, hoặc ngay từ đầu đã không thành thạo lắm, thì với ngôn ngữ nào cũng sẽ khó xem lại code cũ
      Tất nhiên nếu không phải code của mình thì còn khó hơn, và code được viết tốt đến đâu cũng ảnh hưởng rất lớn. Ngôn ngữ nào cũng có nhiều code rác, và nếu ngay từ đầu đã là rác thì theo thời gian cũng không khá lên
    • Cá nhân tôi lại thấy ngược lại
      Tôi nghĩ Forth khó viết nhưng dễ đọc
  • Hồi nhỏ tôi chơi rất nhiều trên Commodore 64
    Đó là một game độc đáo, thú vị và vui

    • Trong game mới, chúng tôi cũng giữ gần như nguyên vẹn gameplay của bản gốc
      Tôi không muốn spam Hacker News, nhưng nếu bạn đã chơi bản gốc thì tôi rất muốn nghe phản hồi về bản reboot: https://chipwits.com
  • Hồi nhỏ tôi thực sự rất khao khát có được game này
    Nghĩ mà thấy mình già thật rồi

  • Tôi tò mò phiên bản ChipWits hiện đại được viết bằng gì

    • Theo bài viết thì là C#, và lượng code ít nhất gấp 10 lần
      Tôi từng rất thích game này. Tôi cũng có gói Forth cho C64, nhưng chưa từng liên hệ rằng game này được làm bằng nó
    • Unity và C#
  • Tôi đã mua Human Resource Machine và chơi khá vui hầu hết thời gian, cho đến khi nó trở nên quá khó
    Trông giống cùng một ý tưởng với ChipWits, tức là biến lập trình dựa trên stack thành game
    Nếu có ai đã chơi cả hai, tôi tò mò chúng so sánh với nhau thế nào