1 điểm bởi GN⁺ 2025-12-12 | 1 bình luận | Chia sẻ qua WhatsApp
  • Phiên bản được port riêng cho PlayStation (PSX) dựa trên dự án decompile Super Mario 64 dành cho Nintendo 64
  • Bao gồm nhiều chỉnh sửa quy mô lớn để phù hợp với phần cứng PS1 như hỗ trợ rung DualShock, chuyển đổi sang toán học fixed-point, và tối ưu hóa render
  • Bổ sung các tính năng cải thiện hiệu năng như trình tiền xử lý đồ họa, nén texture, và tối ưu bộ nhớ animation
  • Tồn tại nhiều lỗi đã biết như điều khiển camera chưa hoàn thiện, vấn đề va chạm và crash, không thể build nhạc
  • Là một thử nghiệm port game cổ điển giữa các nền tảng, mang ý nghĩa như một trường hợp nghiên cứu đáng chú ý cho phát triển console legacy và nghiên cứu reverse engineering

Tổng quan dự án

  • Mã nguồn này là một nhánh fork của bản decompile đầy đủ của Super Mario 64 (J/U/E/SH), chỉ nhắm tới PSX và PC (để debug)
    • Không còn hỗ trợ build cho Nintendo 64
    • Hiện tại chỉ có thể build ROM phiên bản Mỹ (US)
  • Bản build game không bao gồm tài nguyên gốc; cần trích xuất tài nguyên từ ROM chính hãng

Tính năng chính

  • Thêm đồ họa tương thích DualShock™, mô phỏng dòng hiển thị “Rumble Pak Compatible” gốc
  • Hỗ trợ cả tín hiệu rung analog cho motor lớn của DualShocktín hiệu số cho motor nhỏ
  • Triển khai soft-float độ chính xác thấp cho PSX để giảm thiểu suy giảm hiệu năng khi tính toán số thực dấu chấm động
  • Thay thế mã bằng toán học fixed-point, dùng vector và ma trận số nguyên 16-bit vốn là chuẩn trên PSX
  • Đơn giản hóa và viết lại render graph walker
  • Chia nhỏ đa giác (tối đa 2 lần) để giảm vấn đề với polygon lớn
  • Chuyển đổi RSP display list sang định dạng tùy biến bằng JIT, giúp tăng tốc độ xử lý
  • Trình tiền xử lý display list để loại bỏ lệnh không cần thiết và tối ưu mesh
  • Nén animation của Mario (580,632 → 190,324 byte) và đặt trực tiếp vào VRAM
  • Bổ sung profiler tùy biếnbộ mã hóa texture 4bpp
  • Thay bằng bóng đổ hình lục giác để phù hợp với giới hạn độ trong suốt của PSX
  • (Dự kiến) xoay camera bằng cần analog phảiviết lại subsystem Goddard

Các vấn đề đã biết

  • Cây lơ lửng, một số animation không hoạt động hoặc gây crash
  • Không thể build nhạc, thiếu hiệu ứng âm thanh hoặc phát âm bất thường
  • Điều khiển camera chưa hoàn thiện, crash khi vào một số màn nhất định
  • Không tải được chuỗi ending, Lakitu không xuất hiện, cột không hoạt động
  • Thời gian tải dài do nạp texture riêng lẻ, texture bị méo do giới hạn của PSX
  • Cần cải thiện trình tiền xử lý đồ họa, lỗi render ở một số texture, màn hình tiêu đề chưa hoàn thiện, menu tạm dừng không hoạt động

Cách build

Linux

  • Cài toolchain mipsel-none-elf-gcc rồi clone kho lưu trữ
  • Đặt file baserom.us.z64 vào thư mục gốc
  • (Tùy chọn) thêm các file soundtrack .wav (0~37) vào thư mục .local
  • Chạy make để tạo ảnh ISO (build/us_psx/sm64.us.iso)
  • Phiên bản benchmark (make BENCH=1) chỉ tạo ELF/EXE, không tạo ISO, và cần PSX RAM 8MB

Windows (chưa kiểm chứng)

  • Cài MSYS2 rồi cấu hình gói mingw-w64
  • Cài mipsel-none-elf-gcc và clone kho sm64-psx
  • Đặt file baserom.us.z64 rồi chạy make
  • Kết quả build được tạo ở cùng đường dẫn như trên Linux

Khắc phục sự cố

  • Nếu gcc không được nhận diện, hãy kiểm tra có đang chạy sai môi trường MSYS2 hay không
  • Nếu thiếu baserom.us.z64, hãy kiểm tra vị trí file
  • Nếu không tìm thấy Makefile, hãy kiểm tra đường dẫn thư mục
  • Nếu gặp lỗi gói, hãy cập nhật bằng pacman -Syupacman -Su
  • Có thể kiểm tra mipsel gcc hoạt động hay không bằng lệnh mipsel-none-elf-gcc -v
  • Khi chuyển nền tảng, cần biên dịch lại tool bằng make -C tools clean

Cấu trúc dự án

  • actors: hành vi object, geo layout, display list
  • assets: animation và dữ liệu demo
  • src: mã nguồn C cốt lõi của game (audio, engine, game, menu, port, v.v.)
  • textures, text, levels: dữ liệu đồ họa và màn chơi
  • tools: công cụ build
  • lib: bao gồm mã từ N64 SDK

Đóng góp

  • Hoan nghênh Pull Request
  • Khuyến nghị tạo Issue để thảo luận trước với các thay đổi lớn

1 bình luận

 
GN⁺ 2025-12-12
Ý kiến trên Hacker News
  • Nếu thích bản port này, có lẽ bạn cũng sẽ thấy thú vị với dự án tái triển khai hoàn toàn SM64 trên GBA
    Xem video trên YouTube

    • Vì đây là HN nên nhất định phải nhắc tới. Bản port GBA này được viết bằng Rust
      Bài viết liên quan: The Impossible Port – Super Mario 64 on the Game Boy Advance
    • Thú vị thật. Không biết GBA có kham nổi một phiên bản nhẹ kiểu Minecraft hay không
      N64 có vẻ cũng khá hợp, và tôi muốn kiếm được một chiếc SummerCart64 vào lúc nào đó để thử nghiệm
    • Có ai biết mã nguồn của dự án này không? Có vẻ như đã bị gỡ rồi
    • Rất ấn tượng, nhưng cá nhân tôi thấy hơi khó nhìn
      Dù vậy, hoàn thành được đến mức này thật sự rất đáng nể
  • Đây thực sự là một thành tựu đáng kinh ngạc
    Tôi từng sở hữu cả hai hệ máy, và khi nhìn bản port này lại càng cảm nhận rõ N64 vào năm 1996 đã tái hiện tốt đến mức nào cảm giác ‘SGI trong phòng khách’
    Cú sốc khi lần đầu nhìn thấy Mario 64 trên chiếc N64 hàng nhập khẩu từ Nhật vẫn còn rất rõ trong ký ức
    Nó cũng gợi nhớ tới bối cảnh game đầy đa dạng của thời kỳ mà những trò như Wipeout trên PSX phát triển theo một hướng hoàn toàn khác

  • Họ nói “Tessellation (tối đa gấp 2)” sẽ giảm vấn đề polygon lớn, nhưng trong video biến dạng texture vẫn rất rõ
    Có lẽ mức gấp 2 là chưa đủ, hoặc phải làm lại level geometry

    • Tôi cũng thấy biến dạng texture, nhưng lại không thấy hiện tượng rung geometry đặc trưng của game PS1
      Có lẽ vì đang xử lý phép toán dấu phẩy động bằng phần mềm nên perspective-correct mapping sẽ gây gánh nặng lên framerate
    • Hiện tại gần như không có bước tiền xử lý nào cho polygon của level
      Khi được triển khai sau này, các polygon lớn sẽ được chia nhỏ để giải quyết cả vấn đề giới hạn tọa độ texture
    • Ngay trong phần lỗi đã biết cũng ghi rõ rằng “Tessellation chưa đủ”
      Cảm giác thô ráp của 3D đời đầu thời PS1 vẫn còn đó
  • Tôi tò mò không biết có video chạy thực tế hay ảnh chụp màn hình nào không. Tôi cũng hiểu vì sao GitHub không có

  • Nhiều người phàn nàn về biến dạng texture, nhưng dù sao đây vẫn là một tác phẩm cực kỳ ấn tượng

  • Không thể không nhắc đến Kaze
    Anh ấy là người đã tối ưu Mario 64 theo đủ cách trong nhiều năm, và nếu bạn quan tâm tới giao điểm giữa game retro và lập trình thì rất đáng xem
    Kênh YouTube của Kaze

    • Trong một video đăng vào tháng 8, anh ấy đã phân tích Mario 64 lãng phí RAM đến mức nào, và lần đầu nhắc đến khả năng port sang PS1 vào lúc đó
      Tôi không ngờ điều này lại thành hiện thực nhanh đến vậy
      Xem video liên quan
    • Anh ấy thật sự rất ghê gớm (và còn rất vạm vỡ)
      Nếu có ai đó hiểu PS1 ở trình độ như Kaze, thì có lẽ những dự án như Mario 32 cũng khả thi
  • Gần đây các dự án decompile bùng nổ mạnh, nên tôi tò mò về nguyên nhân phía sau

    • Lý do chính là nhờ sự phát triển của tooling hỗ trợ decompile khớp byte 1:1
      Ví dụ tiêu biểu là các công cụ như decomp.me
      Những công cụ này cho phép tái dựng mã khớp chính xác với binary gốc, giúp các dự án mới có thể khởi động nhanh hơn
      Ngoài ra, sự xuất hiện của lớp porting mô phỏng API SDK của console cũng góp phần quan trọng
      Tuy vậy, để đạt được mức khớp hoàn hảo, vẫn cần nỗ lực khổng lồ như phải tái hiện lại hành vi bất thường của các toolchain cũ
    • Có lẽ cũng vì AI khiến việc decompile trở nên dễ hơn
    • Chắc là do AI thôi
    • Việc ngày càng nhiều người dùng Ghidra cũng có ảnh hưởng
  • Gần đây còn có bản port Dreamcast, và Star Fox 64 cùng Mario Kart 64 cũng đã được port sang nhiều nền tảng
    Danh sách liên quan: awesome-game-decompilations

    • Bản port Star Fox 64 cũng vừa mới hoàn thành
  • Tiếc là không có ảnh chụp màn hình

  • “Cuối cùng thì, Super Mario 32