Tìm hiểu về cách hoạt động của băng Game Boy chi tiết đến mức bạn có thể sẽ không muốn biết
(abc.decontextualize.com)- Để tự chế tạo băng Game Boy, tác giả đã trải qua nhiều năm nghiên cứu và thiết kế
- Bài viết này hệ thống hóa các thông tin kỹ thuật cốt lõi cần để tạo băng Game Boy tùy biến theo cách tiếp cận dành cho người mới bắt đầu
- Game Boy là một nền tảng hấp dẫn với cộng đồng phát triển game retro và hack phần cứng nhờ cấu trúc phần cứng đơn giản nhưng có khả năng mở rộng cao
- Băng có thể tích hợp dữ liệu game và phần cứng bổ sung (ví dụ: RTC, cảm biến, v.v.), từ đó đem lại chức năng mới cho Game Boy
- Thông qua mạch bộ điều khiển bank bộ nhớ (MBC), hệ thống có thể mở rộng dung lượng và truy cập bộ nhớ có chọn lọc, cho phép game được chạy theo nhiều cách khác nhau
Giới thiệu và mục tiêu
- Tác giả đặt ra mục tiêu cá nhân là tự chế tạo hoàn toàn một băng Game Boy mới
- Kiến thức về cấu trúc bên trong và nguyên lý hoạt động của băng Game Boy được tổng hợp và công bố dưới dạng mã nguồn mở
- Mục đích của bài viết là tái cấu trúc các thông tin kỹ thuật khó theo góc nhìn của người mới, để ai cũng có thể theo kịp
- Bài viết tập trung giải thích các hành vi (behavior) có thể quan sát từ bên ngoài, thay vì nguyên lý vận hành nội bộ của phần cứng
- Phần giải thích lấy SoC của DMG (Game Boy đời đầu) làm chuẩn, và giao diện băng cơ bản của các thiết bị trong họ Game Boy nhìn chung là tương tự nhau
Điều đặc biệt của nền tảng Game Boy
- Nhờ sự đơn giản và tính trực quan trong thiết kế, cấu trúc phần cứng và phần mềm của Game Boy rất dễ hình dung trong đầu
- Với đặc tính di động và tiêu thụ điện năng thấp, cùng cấu trúc không có cơ chế bảo vệ phức tạp hay khóa vùng, bất kỳ ai cũng có thể phát triển cho nền tảng này
- Có một lượng lớn tài liệu kỹ thuật, sơ đồ phần cứng và tư liệu từ cộng đồng đã được tích lũy
- Thư viện game chính thức/phi chính thức rất đồ sộ, đồng thời các toolchain mã nguồn mở và công cụ scripting trực quan cũng được duy trì tích cực
- Không chỉ có trình điều khiển phần cứng, hệ sinh thái còn mở rộng mạnh với trình giả lập chính xác và các triển khai FPGA
Cấu trúc cơ bản của băng Game Boy
- Ở các máy console đời cũ, ranh giới giữa phần mềm và phần cứng thường không rõ ràng
- Game Boy không có hệ điều hành hay bộ nhớ lưu trữ không mất dữ liệu tích hợp. Toàn bộ mã thực thi và phần cứng bổ sung đều nằm trong băng
- Vì vậy, băng phải hoạt động hoàn chỉnh thì Game Boy mới có thể khởi động và vận hành
- Đầu nối cạnh 32 chân ở đáy băng là giao diện trung tâm để trao đổi tín hiệu với máy
- Giữa băng và máy, các tín hiệu được chia thành nguồn điện, điều khiển (đọc/ghi/chọn chip), bus địa chỉ (16-bit), bus dữ liệu (8-bit)
Bus và nguyên lý hoạt động
- Bus là cấu trúc trong đó nhiều linh kiện cùng chia sẻ một nhóm đường tín hiệu để truyền dữ liệu
- CPU của Game Boy đưa địa chỉ mong muốn lên bus địa chỉ và dữ liệu lên bus dữ liệu
- Vì cấu trúc bus là song song (parallel), mỗi bit tương ứng với một chân vật lý thực tế
- Cấu trúc này có lợi về tốc độ, nhưng vì bus được dùng chung nên có nguy cơ xung đột/contention (ghi đồng thời)
- Nếu nhiều IC cùng lúc xuất dữ liệu, có thể gây đoản mạch (nguy cơ quá nhiệt và hỏng hóc), nên luôn chỉ được phép có một IC hoạt động tại một thời điểm
Các loại bộ nhớ chính của Game Boy
- Game Boy có thể gắn tối đa 4 loại IC bộ nhớ (RAM tích hợp, video RAM, ROM băng, RAM băng)
- Trên thực tế, video RAM dùng bus độc lập nên thường được loại khỏi các giải thích tổng quát
- Bộ ba RAM tích hợp/RAM băng/ROM băng dùng chung cùng bus địa chỉ và bus dữ liệu
- Mỗi lần bắt buộc chỉ có một chip duy nhất thực hiện thao tác đọc/ghi trên bus dữ liệu
- Trong thực tế, chúng cũng thường được gọi là RAM tích hợp (WRAM), RAM băng (SRAM), video RAM (VRAM), RAM tốc độ cao (HRAM)
Chip Select và cấu trúc mạch
- Mỗi chip bộ nhớ đều có chân tín hiệu chọn chip (CS/CE, Chip Select/Chip Enable)
- Tùy theo trạng thái của tín hiệu chọn chip, chỉ chip tương ứng mới có thể truy cập bus dữ liệu
- Để chọn chip, Game Boy tái sử dụng 3 bit địa chỉ cao (A15, A14, A13) của bus địa chỉ và chân _CS của CPU
- Cách nối này đảm bảo không có từ hai chip trở lên cùng được kích hoạt
- Ví dụ, chip ROM chỉ được kích hoạt khi A15 bằng 0, còn RAM được kích hoạt theo logic riêng
Memory Map và góc nhìn của lập trình viên
- Trạng thái địa chỉ/chân ở mức phần cứng được trừu tượng hóa, nên lập trình viên chỉ cần nhận biết memory map logic
- Trong không gian địa chỉ 16-bit, dải địa chỉ 0x0000–0x7FFF được ánh xạ tới ROM băng, 0xA000–0xBFFF tới RAM băng, còn 0xC000–0xDFFF tới RAM tích hợp
- Khi truy cập một địa chỉ cụ thể, vùng bộ nhớ tương ứng sẽ tự động được kích hoạt và các vùng còn lại sẽ bị vô hiệu hóa
- Tài liệu memory map là nguồn tham chiếu rất quan trọng trong hệ tài liệu Game Boy
Bộ điều khiển bank bộ nhớ (MBC; Memory Bank Controller)
- MBC là mạch cốt lõi cho phép băng Game Boy dùng ROM lớn hơn 32KB và kết nối thêm RAM/thiết bị ngoại vi
- Đã có nhiều loại MBC được thương mại hóa, nhưng ở đây bài viết giải thích dựa trên MBC5, loại tương đối đơn giản và phổ dụng
- MBC5 hỗ trợ tối đa 8MB ROM và 128KB RAM băng thông qua kỹ thuật chuyển bank (banking)
- Nó cũng có thể điều khiển quyền truy cập RAM và phần cứng riêng như cảm biến ngoài/RTC
- Trong các chân địa chỉ ROM của băng, các bit cao (A22~A14) được MBC5 điều khiển động, còn các bit thấp được nối trực tiếp với bus địa chỉ của máy
Nguyên lý ROM banking
- CPU của Game Boy có không gian địa chỉ tối đa 64KB, nhưng trên thực tế chỉ dùng 32KB (16KB+16KB) cho truy cập ROM
- MBC5 trực tiếp điều khiển các địa chỉ ROM cấp cao (chọn bank) để ánh xạ đoạn 16KB mong muốn vào không gian địa chỉ của CPU
- Về mặt phần cứng, 14 bit địa chỉ thấp (A0~A13) từ bus địa chỉ của CPU được nối trực tiếp tới chip ROM, còn các bit còn lại được lấy từ MBC5
- Trong khi game đang chạy, khi phần mềm ghi giá trị vào một địa chỉ bộ nhớ cụ thể, MBC sẽ phát hiện việc này và cập nhật nội bộ giá trị bank đang được chọn
Giao thức và cơ chế của MBC
- MBC5 thực hiện các thao tác như chọn bank ROM, chọn bank RAM, bật/tắt các chức năng khác bằng cách phát hiện các tổ hợp địa chỉ/tín hiệu điều khiển cụ thể
- Ví dụ, khi có thao tác ghi trong vùng A15=0, A13=1, A14=0 (0x2000~0x3FFF), giá trị trên bus dữ liệu sẽ được ghi làm số bank ROM
- Về phía lập trình viên, thao tác chuyển bank thực tế không được viết như điều khiển mạch mức thấp, mà chỉ giống như ghi dữ liệu vào một địa chỉ cụ thể
- Việc dùng RAM băng, cảm biến, RTC, v.v. cũng được điều khiển theo mẫu tương tự
- Kỹ thuật tái sử dụng bus này giúp giảm số lượng linh kiện và hạ giá thành
Kết luận và cách tận dụng cộng đồng
- Điểm đặc biệt trong cấu trúc băng Game Boy nằm ở giá rẻ, độ tin cậy cao và khả năng mở rộng
- Nếu muốn tự làm băng, việc hiểu chính xác cấu trúc và giao thức ở trên là điều bắt buộc
- Nếu tích cực tham khảo cộng đồng và lượng tài liệu phong phú, có thể giảm đáng kể rào cản gia nhập trong quá trình phát triển tích hợp phần cứng-phần mềm
Tài liệu tham khảo và hướng học thêm
- Bài viết Game Boy/Game Boy Color Architecture của Rodrigo Copetti
- Tài liệu kỹ thuật tại gbdev.io, Pan Docs
- Nhiều bản thiết kế băng mã nguồn mở và toolchain khác nhau (ví dụ: GBDK, RGBDS, v.v.)
- Ví dụ dự án tự chế: abc.decontextualize.com
(Phần sau của bài viết gốc còn đề cập thêm các yếu tố phức tạp hơn như biến thể thiết kế MBC, EEPROM/bộ nhớ flash, IC nhập xuất, tích hợp thiết bị ngoại vi, v.v.; tuy nhiên các mục trên là nội dung cốt lõi về nguyên lý hoạt động của băng Game Boy.)
1 bình luận
Ý kiến trên Hacker News
Muốn chia sẻ trải nghiệm dùng TXB0108 của TI: nhờ tính năng tự động nhận biết hướng nên có vẻ không cần thêm logic điều khiển hướng, nhưng thực tế thì không khuyến nghị dùng. Khi có nhiễu điện, hướng có thể bị đảo khiến đầu vào thành đầu ra. Mỗi lần như vậy thì hoặc thiết bị chịu được, hoặc nặng hơn là xuất hiện hiện tượng gọi là "khói thần kỳ". Nếu thực sự xui xẻo thì còn có thể dẫn đến sự cố trong môi trường công nghiệp. Tôi nghĩ những linh kiện kiểu này có quá nhiều rủi ro tiềm ẩn dành cho dân chuyên nên không nên bị quảng bá quá mức. Chỉ nên dùng khi hiểu chính xác các chế độ lỗi hoặc không có lựa chọn thay thế nào khác.
Mấy linh kiện này thực sự rất khó lường. Chỉ cần một hai inch trace ở đầu ra hoặc thậm chí chỉ một đầu nối thôi là ringing ở đầu ra đã có thể thường xuyên gây đảo hướng tự động. Mức độ khó dùng gần như là người không chuyên không thể đụng vào được. Trớ trêu là đúng những tình huống dễ khiến người ta muốn dùng nó thì lại càng khó dùng.
Tôi từng gặp trường hợp hướng đổi qua đổi lại liên tục ở tốc độ cực cao, tạo ra nhiễu và dao động rất nghiêm trọng. Nó cũng có khá nhiều ràng buộc liên quan đến pull-down, nhưng khi cả hai phía đều được kéo theo cùng một hướng thì còn tạm ổn.
Nhân lúc trì hoãn việc khác, tôi ghi lại vài ấn tượng đầu tiên về thiết kế abc-pcb.pdf
Tôi chỉ ước bài này đã tồn tại từ hồi mình còn làm cartridge tùy biến.
Trong game Cubeat của tôi, tôi gắn chip OPL3-L vào chân audio in của GB để tạo nhạc FM, còn logic MBC thì chỉ dùng các chip logic đơn thuộc dòng 7400.
Một ngày nào đó tôi rất muốn hoàn thiện và phát hành nó; việc thử triển khai những trò thú vị như vậy trên GB thực sự rất vui.
Thông tin về Cubeat
Đúng là mức độ chi tiết về cấu trúc cartridge Game Boy mà tôi từng muốn biết.
Ý tưởng cartridge Game Boy mang theo cả RAM lẫn không gian lưu trữ cùng với ứng dụng thật mới mẻ, nghĩ kỹ thì cũng rất hợp lý.
Tôi từng tưởng tượng nếu điện thoại cũng hoạt động kiểu đó, thì cứ mỗi vài năm khi công nghệ chip tiến bộ, ta có thể mua cartridge mới để chạy ứng dụng hiệu năng cao hơn, hoặc cắm thêm anten mới để nâng cấp.
Điện thoại mô-đun đã được đề xuất từ lâu nhưng hoặc không thực tế, hoặc không đủ hữu ích. Nếu mọi linh kiện đều nối qua socket thì độ trễ giữa các chip tăng lên và độ tin cậy giảm xuống; với một thiết bị bị lắc trong túi cả ngày thì càng dễ gặp vấn đề hơn.
Thực tế không phải chỉ có một thành phần của điện thoại trở nên lỗi thời; camera, màn hình, CPU, RAM, pin và gần như mọi thứ đều là thứ người ta muốn nâng cấp cùng lúc. Nếu vậy thì mua điện thoại mới còn hơn thay từng món lẻ. Lợi ích thực tế của việc thay riêng lẻ có lẽ chỉ là tiết kiệm được cái vỏ máy.
Tôi đang bàn về hệ thống hot patch ROM cho vi điều khiển, và chính vì thế mà ưu điểm của kiến trúc nhúng sẵn toàn bộ ứng dụng ngay trong chip để chạy trực tiếp là rất rõ. Tuy vậy, nhu cầu người dùng cứ thay đổi dần nên mọi thứ có vẻ ngày càng phức tạp hơn.
Chắc chắn đây là một ý tưởng hay, nhưng tôi băn khoăn liệu phần cứng của thiết bị cắm cartridge vào có trở thành giới hạn hay không.
Có thể gắn RAM nhanh hơn trên cartridge, nhưng chưa chắc bo mạch hiện có tận dụng được nó đến đâu.
Ngay cả khi có thể gắn bộ nhớ lưu trữ nhanh hơn, nếu phần cứng nền tảng vẫn giữ nguyên thì hiệu quả thực tế đến mức nào cũng chưa rõ.
Tôi thậm chí còn tưởng tượng tới việc cắm cả camera vào.
Về nhận định rằng khi làm phần mềm tùy biến cho Game Boy thì không cần vượt qua phần cứng chống sao chép hay khóa vùng, có người hỏi liệu trên thực tế vẫn không phải vượt qua bước kiểm tra logo hay sao.
RGBFIX) thì có thể chèn tự động.Và sau phán quyết Sega v. Accolade, kiểu kiểm tra tiêu đề như vậy trên thực tế cũng không còn là rào cản bị cưỡng chế về mặt pháp lý nữa.
Tôi tiếc vì trang tài liệu phát triển GB mà tôi từng hay vào là devrs.com giờ không còn hoạt động nữa. Dù phần lớn liên kết đã chết, đó vẫn là nơi có rất nhiều dự án truyền cảm hứng.
Video Ultimate Game Boy Talk (bài nói tại 33c3) cũng rất đáng tham khảo.
Ultimate Game Boy Talk - 33c3
Bản Pokemon Blue của tôi từng bị cho vào máy giặt rồi cả máy sấy cách đây 20 năm mà đến giờ vẫn chạy bình thường; đúng là phần cứng cực kỳ bền. Không biết thẻ SD có chịu nổi kiểu hành hạ đó không.
Tháng này tôi mới nhập môn KiCad và thiết kế PCB cho vui, nên tò mò không biết đã có ai tự làm lại toàn bộ PCB của Game Boy đời gốc rồi công bố mã nguồn mở chưa.
Có một công ty tên FunnyPlaying tự làm và bán PCB cho GBC, GBA, nhưng khó tìm được bản open source.
Trên GitHub của nataliethenerd có dự án reverse engineering CGB, nhưng giấy phép là phi thương mại.
Họ mô tả là đã dùng bo CGB-CPU-04 để quét, mài và vẽ lại nhằm dựng sơ đồ mạch CGB, còn các giá trị thì tham chiếu từ sơ đồ gốc.
Tôi cũng muốn biết có tài liệu nào đáng tham khảo cho việc thiết kế PCB không.