9 điểm bởi GN⁺ 2025-11-22 | 1 bình luận | Chia sẻ qua WhatsApp
  • Nhờ môi trường mã nguồn mở AthenaEnv, giờ đây có thể chạy mã JavaScript trên PlayStation 2
  • Môi trường này tích hợp sẵn engine QuickJS để thông dịch JavaScript và cung cấp API phục vụ phát triển game như render, input, âm thanh, xử lý tệp
  • Nhà phát triển có thể viết game chỉ với cấu trúc tệp cơ bản như main.js, athena.ini, athena.elf, và chạy trên trình giả lập PCSX2
  • Dự án hoàn chỉnh có thể được đóng gói thành tệp .iso để phân phối dưới dạng một tệp duy nhất; bài viết cũng giới thiệu quy trình chuyển đổi từ zip sang iso
  • Đây là một ví dụ cho thấy sự kết hợp giữa phát triển console retro và công nghệ web, gợi mở khả năng mở rộng của phát triển game dựa trên JavaScript

Tổng quan về dự án AthenaEnv

  • AthenaEnv là môi trường chạy JavaScript cho PS2, cung cấp môi trường phát triển xoay quanh API thay vì một game engine truyền thống
    • Bên trong, dự án chỉnh sửa và nhúng QuickJS để thông dịch mã JavaScript
    • Chương trình native trên PS2 (viết bằng C) được cấu hình để chạy mã JavaScript
  • Các API được cung cấp bao gồm render, nạp asset, xử lý input, nhập xuất tệp, phát âm thanh
    • Mức trừu tượng tương tự p5.js hoặc Raylib, nên các phần như phát hiện va chạm hay quản lý scene vẫn cần tự triển khai

Quy trình chạy game JavaScript trên PS2

  • Việc chạy sử dụng trình giả lập PCSX2, và cần bật tùy chọn “Enable host filesystem” trong phần cài đặt
  • Thư mục dự án bao gồm các tệp sau
    • athena.elf: tệp thực thi Athena
    • athena.ini: cấu hình như điểm vào (main.js), thiết lập logo khởi động, v.v.
    • main.js, src/, assets/: mã game và tài nguyên
  • Khi chạy athena.elf trong trình giả lập, game sẽ khởi động; sau khi sửa mã JavaScript, chỉ cần reset là có thể áp dụng ngay

Quy trình tạo tệp .iso

  • Bài viết giải thích cách gói dự án thành một ảnh ISO duy nhất để phân phối
    • Tệp bắt buộc: athena.elf, athena.ini, main.js, src/, ATHA_000.01, SYSTEM.CNF
    • Chọn toàn bộ tệp, nén thành zip, sau đó dùng trang mconverter.eu để chuyển sang iso
    • Sau khi chuyển đổi, có thể chạy mà không cần bật “Enable host filesystem”
  • Để tự động hóa việc chuyển đổi, bài viết giới thiệu công cụ CLI GENISO viết bằng Python (https://github.com/scottvr/GENISO)
    • Có thể chuyển zip sang iso mà không cần phụ thuộc bên ngoài

Ví dụ Hello World

  • Ví dụ cơ bản triển khai nạp phông chữ và hình ảnh, xây dựng game loop, animation sprite, xử lý input, render văn bản
    • Sử dụng các module tích hợp sẵn của Athena như Screen, Font, Image, Pads
    • Chạy vòng lặp theo từng frame bằng phương thức Screen.display()
    • Phát hiện input từ tay cầm bằng Pads.get(0)
    • Điều khiển animation theo từng frame bằng các thuộc tính của sprite như startx, endx
    • In FPS hoặc văn bản bằng font.print()
  • Việc lật sprite được thực hiện bằng cách đặt giá trị âm cho width, và cần tính offset để bù lại vị trí

Hỗ trợ 3D và phát triển trong tương lai

Kết luận

  • AthenaEnv là một môi trường đột phá cho phép tạo game PS2 chỉ bằng JavaScript
  • Nó giúp cả các lập trình viên web cũng có thể tiếp cận phát triển game cho console retro, đồng thời
    cho thấy tính mở rộng và khả năng tương thích của hệ sinh thái JavaScript

1 bình luận

 
GN⁺ 2025-11-22
Ý kiến trên Hacker News
  • Có cảm giác các dự án do Fabrice Bellard tạo ra thực sự có ảnh hưởng rất rộng
    Thật tuyệt khi nhờ QuickJS mà việc hồi sinh homebrew trên những hệ thống cũ như PS2 trở nên khả thi thông qua AthenaEnv

    • Tôi gần như không có kỹ năng Photoshop nên không làm được, nhưng đã muốn chèn vào meme xkcd 2347 câu kiểu “được Fabrice Bellard hiện thực chỉ để chứng minh điều gì đó trong lúc nửa ngủ nửa thức”
      Ở đâu đó trong chuỗi phụ thuộc của vô số dự án FOSS đều có mã của ông ấy
  • Thấy tác giả nhắc đến sự bất tiện khi dùng website chuyển ZIP sang ISO, tôi đã tự làm một script Python đa nền tảng không có phụ thuộc bên ngoài
    Có thể xem tại ZIP2ISO.py
    Điều gây ấn tượng là nó được “vibe-code” bằng Gemini3 Pro mà không cần đọc đặc tả ISO9660

    • Có vẻ cũng có thể làm việc tương tự bằng mkisofs
  • AthenaEnv khá thú vị. Có vẻ nó dùng QuickJS làm trình thông dịch JS và bọc các thư viện hệ thống native của PS2
    Tôi tò mò liệu có dự án tương tự nào để phát hành game JS Canvas(WebGPU/WebGL) trên các máy console hiện đại (Switch/2, PS5, Xbox) hay không
    SDK của console đều bị ràng buộc bởi NDA nên gần như không có thông tin công khai, và phần lớn game dùng Unreal hoặc Unity
    Trên PC hoặc di động thì tương đối đơn giản hơn vì có thể chạy dễ dàng bằng Electron hoặc WebView

    • Có trường hợp game Cross Code làm bằng JS đã được port sang console. Quy trình chi tiết được tổng hợp trong bài blog này
    • Tôi nhớ là SDK của Nintendo 3DS và Wii U từng có một framework giống Electron dựa trên công nghệ web, nhưng trên Switch thì đã bị ngừng
      Applet trình duyệt WebKit của Switch bị vô hiệu hóa JIT, nên chỉ dùng cho các mục đích hạn chế như e-manual
  • Tôi thắc mắc nếu muốn chạy trên console thật thì có cần ghi ISO ra đĩa hay không

    • Có vẻ sẽ làm được nếu kết hợp với FreeDVDBoot
    • Cách phổ biến là dùng FreeMcBoot trên thẻ nhớ + USB flash drive. Cũng giúp giảm hao mòn ổ đĩa quang
    • Muốn ghi đĩa để chạy thì cần hack console, nhưng cũng có thể dùng USB. Chỉ là có thể vẫn muốn ghi ra để có cảm giác đĩa thật
    • Cũng có ý kiến cho rằng dùng chế độ giả lập ổ đĩa quang sẽ tốt hơn là dùng đĩa vật lý
  • Một dự án tương tự dùng QuickJS là nx.js dành cho Nintendo Switch

    • Dự án này hiện chỉ hỗ trợ canvas2d, nhưng về lý thuyết có thể tạo một lớp chuyển đổi game WebGPU hoặc WebGL sang Switch
      Tuy vậy nếu đổi từ engine v8/JIT sang QuickJS thì hiệu năng sẽ giảm đáng kể
  • Giờ thì ngay cả PS2 cũng không thể thoát khỏi bàn tay của JavaScript

  • AthenaEnv là dự án kế thừa của Enceladus dùng Lua, cũng do cùng nhà phát triển tạo ra
    Nó được dùng nhiều không chỉ cho game mà cả ứng dụng homebrew; ở Enceladus có các ví dụ như RETROLauncher và POPSLoader, còn ở Athena thì có OSD-XMB

  • Tôi tự hỏi liệu có thể làm một trình duyệt web cho PS2 rồi mở game dưới dạng website hay không

    • Nhưng yêu cầu bộ nhớ tối thiểu của Chrome là 4GB, nên để vừa với 32MB RAM của PS2 thì phải thu nhỏ xuống 1/128
  • Tôi đã tìm thứ như thế này, đúng là một dự án rất ngầu, cảm ơn

  • Người ta làm đủ mọi cách để không phải dùng .gdscript hay Godot

    • Tôi thích Godot, nhưng nó không thể chạy trên PS2
    • Thực ra build bằng Godot rồi xuất ra PS2 không phải chuyện đơn giản đâu