Pokémon Emerald chạy gốc trên vi điều khiển RP2350 giá 6 đô — không cần giả lập
Một nhà phát triển đã biên dịch lại bản decompilation của Pokémon Emerald từ ARMv4T sang Cortex-M33 và tái hiện phần cứng video của GBA bằng phần mềm trên lõi thứ hai của RP2350. Toàn bộ trò chơi, 60 fps, xuất HDMI, lưu vào flash.

Chạy một trò chơi Game Boy Advance đầy đủ trên vi điều khiển giá 6 đô mà không cần giả lập nghe như một trò ảo thuật. Dự án pokeemerald-rp2350 của Matt Deeds biến điều đó thành hiện thực: Pokémon Emerald, được biên dịch lại từ bản decompilation pret từ ARMv4T sang Cortex-M33, chạy gốc trên WeAct Studio Core2350B (RP2350B, 16 MB QSPI flash). Toàn bộ trò chơi — mã, đồ họa, bản đồ, âm nhạc — là một tệp 11.7 MB được thực thi trực tiếp từ flash.
Cách hoạt động
Bản port dựa trên tripplyons/pokeemerald-wasm, vốn đã tách mọi phụ thuộc vào phần cứng GBA thật ra sau #if WASM. Việc tái sử dụng các điểm nối đó thành #if WASM || RP2350 có nghĩa là công việc gỡ bỏ phần cứng đã hoàn tất; bản port này chỉ cần thêm phần dành riêng cho MCU.
Bản đồ bộ nhớ GBA vẫn được giữ nguyên. Trò chơi vẫn ghi DISPCNT, VRAM, OAM và RAM bảng màu tại địa chỉ gốc — giờ chúng chỉ là SRAM thường. RAM trực tiếp khoảng 378 KB trong 520 KB của RP2350. ROM nằm trong QSPI flash qua XIP, với địa chỉ gốc 0x08000000 được ánh xạ lại thành 0x10000000.
PPU là một bộ raster hóa phần mềm trên lõi 1, được port từ web/app.js của host WASM và được xác thực chính xác từng byte so với nó. Phiên bản đầu tiên chạy ở 909 ms/frame; bảng tra cứu palette theo frame, mặt nạ cửa sổ theo dòng quét, các khối tile 8 pixel và bước affine tăng dần đã đưa tốc độ lên 60 fps — nhanh hơn khoảng 45 lần. Các vòng lặp chuyên dụng sau đó giảm các cảnh điển hình xuống còn ~12 ms.
Quá trình quét không cần CPU. Một vòng DMA control-block cấp cho bộ nối tiếp HSTX một khung 525 dòng đầy đủ mà CPU không bao giờ chạm vào đường tái lập. Ngắt chỉ mang tính tham khảo. Đây là điều làm cho màn hình miễn nhiễm với các dừng nhiều mili giây mà ghi flash gây ra khi lưu — và phải mất việc loại bỏ một lỗi rớt HDMI khoảng 0,8 lần mỗi phút mới đạt được.
Trạng thái và hạn chế
Có thể chơi từ đầu đến cuối theo như đã kiểm tra: khởi động, chạy intro, bắt đầu trò chơi mới, đi lại trong thế giới, chiến đấu và lưu. Mọi cảnh giữ 60 fps ổn định ngoại trừ đoạn phim giới thiệu cửa sổ OBJ. Danh sách trung thực những gì còn thiếu:
- Âm thanh chưa hoàn thiện. Engine m4a đã được port và nhạc phát được, nhưng các nhạc cụ DPCM và phát ngược là các stub im lặng. Trộn âm gắn với tốc độ khung hình, nên bất kỳ cảnh nào dưới 60 fps sẽ bị thiếu.
- Không có cáp link hoặc không dây. Các đường RFU và multiboot bị stub. Trao đổi, chiến đấu và đường tải mã Mystery Gift không hoạt động.
- RTC là đồng hồ hộp mực chết. Thời gian đọc bằng không và màn hình cài đặt đồng hồ trong trò chơi báo "đồng hồ đã dừng." Sự phát triển của quả mọng và các sự kiện theo thời gian khác bị ảnh hưởng.
- Đoạn phim giới thiệu cửa sổ OBJ chạy ở 20–25 ms/frame, dưới 60 fps. Đây là cảnh duy nhất không có đường tăng tốc.
Xây dựng và xác thực
Quá trình xây dựng đơn giản: make tools && make modern, sau đó vài script để tạo tài nguyên âm thanh và xây dựng trò chơi, rồi CMake/Ninja cho dự án Pico SDK. Kho lưu trữ cũng xây dựng các mục tiêu bring-up độc lập (hstx_test, psram_test, i2s_test, display_test, ppu_display_test, emerald_hwtest) dùng để xác thực từng hệ thống con trên silicon trước khi tích hợp.
Bản WASM được giữ lại có chủ đích làm tham chiếu PPU. rp2350/ppu_validate.sh chạy trò chơi trong trình duyệt, đổ bộ nhớ GBA cùng các khung tham chiếu từ bộ raster hóa JavaScript, kết xuất cùng trạng thái với rp2350/ppu.c và so sánh từng pixel giữa hai bản. Harness đó là lý do duy nhất khiến PPU có thể được gọi là chính xác từng byte, và nó đã bắt được các lỗi thật trong mỗi lần tối ưu.
Thư mục rp2350/ là tác phẩm gốc dưới MIT; phần còn lại là bản decompilation pret không có giấy phép từ dự án này. Không yêu cầu hoặc bao gồm ROM.
Bản đồ bộ nhớ GBA vẫn được giữ nguyên. Trò chơi vẫn ghi DISPCNT, VRAM, OAM và RAM bảng màu tại địa chỉ gốc — giờ chúng chỉ là SRAM thường.