Game Boy cartridge कैसे काम करता है: जितना जानना चाहें उससे भी ज़्यादा विस्तार से
(abc.decontextualize.com)- Game Boy cartridge को सीधे खुद बनाने के लिए कई वर्षों के शोध और डिज़ाइन प्रक्रिया से गुजरना पड़ा
- यह लेख custom Game Boy cartridge बनाने के लिए ज़रूरी मुख्य तकनीकी जानकारी को शुरुआती नज़रिए से व्यवस्थित रूप से समझाता है
- Game Boy अपनी सरल लेकिन विस्तारयोग्य hardware संरचना की वजह से retro game development और hardware hacking community के लिए एक आकर्षक platform है
- cartridge में game data और अतिरिक्त hardware (जैसे RTC, sensor आदि) को built-in किया जा सकता है, जिससे Game Boy को नई क्षमताएँ मिलती हैं
- memory bank controller (MBC) circuit के ज़रिए capacity expansion और selective memory access संभव होता है, और इसी से अलग-अलग तरीकों से game चलाया जाता है
परिचय और लक्ष्य
- लेखक ने व्यक्तिगत रूप से पूरी तरह नया Game Boy cartridge बनाने का लक्ष्य रखा
- Game Boy cartridge की आंतरिक संरचना और उसके काम करने के सिद्धांत पर आधारित ज्ञान को open source रूप में संकलित करके साझा किया गया है
- लेख का उद्देश्य कठिन तकनीकी जानकारी को शुरुआती के दृष्टिकोण से इस तरह फिर से व्यवस्थित करना है कि कोई भी उसे समझ सके
- इसमें hardware के आंतरिक कार्यसिद्धांत के बजाय बाहर से दिखाई देने वाले behavior पर ध्यान देकर समझाया गया है
- व्याख्या DMG (शुरुआती मॉडल Game Boy) के SoC को आधार बनाकर की गई है, और Game Boy परिवार के उपकरणों का मूल cartridge interface लगभग समान है
Game Boy platform की खासियत
- Game Boy अपनी सरलता और intuitive design की वजह से hardware और software संरचना को दिमाग में समझना आसान बनाता है
- इसकी portability और low power विशेषताएँ, साथ ही जटिल protection या region lock का न होना, किसी को भी development शुरू करने देता है
- तकनीकी दस्तावेज़, hardware schematics, और community आधारित सामग्री प्रचुर मात्रा में उपलब्ध हैं
- आधिकारिक/अनौपचारिक game library बहुत बड़ी है, और open source development toolchain तथा visual scripting tools का सक्रिय रखरखाव हो रहा है
- केवल hardware चलाने वाले साधन ही नहीं, बल्कि accurate emulator और FPGA implementation जैसे उच्च-विस्तार वाले ecosystem भी बने हुए हैं
Game Boy cartridge की बुनियादी संरचना
- पुराने console उपकरणों में software और hardware की सीमा स्पष्ट नहीं होती थी
- Game Boy में operating system या built-in non-volatile storage नहीं है। सारा executable code और अतिरिक्त hardware cartridge में ही होता है
- इसी वजह से cartridge का पूरी तरह काम करना ज़रूरी है, तभी Game Boy boot और operate कर सकता है
- cartridge के निचले हिस्से का 32-pin 'edge connector' मुख्य interface है जिसके ज़रिए console और cartridge के बीच signal आते-जाते हैं
- cartridge और main unit के बीच signal को power, control (read/write/chip select), address bus (16-bit), data bus (8-bit) में बाँटा जा सकता है
Bus और कार्यप्रणाली
- bus वह संरचना है जिसमें कई हिस्से एक ही signal line साझा करके data का आदान-प्रदान कर सकते हैं
- Game Boy का CPU जिस address तक पहुँचना चाहता है उसे address bus पर, और data को data bus पर रखता है
- bus संरचना parallel होने के कारण, हर bit के लिए वास्तव में अलग pin मौजूद होता है
- यह speed के लिहाज़ से फ़ायदेमंद है, लेकिन bus साझा होने की वजह से collision/contention (एक साथ write होना) का जोखिम भी रहता है
- अगर कई IC एक ही समय में data output करें, तो short (overheating और failure का खतरा) हो सकता है, इसलिए हर समय केवल एक IC ही active होना चाहिए
Game Boy में memory के मुख्य प्रकार
- Game Boy में अधिकतम 4 तरह की memory IC लग सकती हैं: built-in RAM, video RAM, cartridge ROM, cartridge RAM
- व्यवहार में video RAM अलग bus का उपयोग करती है, इसलिए सामान्य व्याख्या में उसे अलग रखा जाता है
- built-in RAM, cartridge RAM और ROM एक ही address bus और data bus साझा करते हैं
- किसी भी समय सिर्फ एक chip data bus पर read/write ऑपरेशन करती है
- व्यावहारिक शब्दावली में इन्हें built-in RAM (WRAM), cartridge RAM (SRAM), video RAM (VRAM), high RAM (HRAM) भी कहा जाता है
Chip Select और circuit संरचना
- हर memory chip में chip select signal (CS/CE, Chip Select/Chip Enable) pin होता है
- chip select signal की स्थिति के आधार पर केवल चुनी हुई chip ही data bus तक पहुँच पाती है
- Game Boy chip select के लिए address bus के ऊपरी 3 bit (A15, A14, A13) और CPU के _CS pin का पुनः उपयोग करता है
- यह wiring एक ही समय में दो या अधिक chips के active न होने की गारंटी देती है
- उदाहरण के लिए, जब A15 = 0 हो तभी ROM chip active होती है, जबकि RAM अलग logic से active होती है
Memory Map और programmer का दृष्टिकोण
- hardware स्तर के address/pin state को abstract कर दिया जाता है, इसलिए programmer को केवल logical memory map दिखाई देता है
- 16-bit address space में 0x0000–0x7FFF क्षेत्र cartridge ROM, 0xA000–0xBFFF cartridge RAM, और 0xC000–0xDFFF built-in RAM के रूप में map होता है
- किसी विशेष address पर पहुँचते ही अपने-आप सही memory range active हो जाती है और बाकी inactive हो जाती हैं
- memory map संबंधी सामग्री Game Boy documentation में एक महत्वपूर्ण reference के रूप में उपयोग होती है
Memory Bank Controller (MBC)
- MBC Game Boy cartridge में 32KB से बड़े ROM capacity और अतिरिक्त RAM/peripherals को जोड़ने वाला मुख्य circuit है
- बाज़ार में MBC के कई प्रकार आए, लेकिन यहाँ अपेक्षाकृत सरल और सामान्य MBC5 के आधार पर समझाया गया है
- MBC5 switching (banking) तकनीक से अधिकतम 8MB ROM और 128KB cartridge RAM को support करता है
- यह RAM access control, external sensor/RTC जैसे अलग hardware का control भी कर सकता है
- cartridge के ROM address pin में ऊपरी bit (A22~A14) को MBC5 dynamically control करता है, जबकि निचले bit सीधे console के address bus से जुड़े रहते हैं
ROM Banking का सिद्धांत
- Game Boy CPU अधिकतम 64KB address space रखता है, लेकिन वास्तविक ROM access के लिए सिर्फ 32KB (16KB + 16KB) का उपयोग करता है
- MBC5 ROM chip के upper address (bank selection) को सीधे नियंत्रित करता है, जिससे 16KB इकाइयों में वांछित हिस्सा CPU address space में map किया जा सकता है
- hardware स्तर पर CPU address bus के निचले 14 bit (A0~A13) सीधे ROM chip से जुड़े होते हैं, और बाकी MBC5 से आते हैं
- वास्तविक game execution के दौरान software जब किसी विशेष memory address पर value लिखता है, तो MBC उसे पहचानकर अंदरूनी selected bank value अपडेट कर देता है
MBC protocol और mechanism
- MBC5 विशिष्ट address/control signal संयोजन को पहचानकर ROM bank selection, RAM bank selection, और अन्य functions को enable/disable करता है
- उदाहरण के लिए, A15=0, A13=1, A14=0 (0x2000~0x3FFF) क्षेत्र में write ऑपरेशन होने पर, data bus पर मौजूद value को ROM bank number के रूप में दर्ज किया जाता है
- programmer वास्तव में bank switching को low-level circuit control की तरह नहीं, बल्कि किसी खास address पर data लिखने की तरह code करता है
- cartridge RAM का उपयोग, sensor, RTC आदि भी इसी तरह के pattern से नियंत्रित होते हैं
- यह bus reuse तकनीक components की संख्या घटाती है और लागत कम करती है
निष्कर्ष और community उपयोग
- Game Boy cartridge संरचना की विशेषता कम लागत, उच्च विश्वसनीयता और विस्तारयोग्यता में है
- cartridge को खुद बनाना हो तो ऊपर बताई गई संरचना और protocol की सटीक समझ ज़रूरी है
- community और उपलब्ध समृद्ध दस्तावेज़ों का सक्रिय उपयोग करके hardware-software integrated development process में प्रवेश की बाधा काफ़ी कम की जा सकती है
संदर्भ सामग्री और आगे सीखने के रास्ते
- Rodrigo Copetti का Game Boy/Game Boy Color Architecture लेख
- gbdev.io, Pan Docs के तकनीकी दस्तावेज़
- विभिन्न open source cartridge designs और toolchains (जैसे GBDK, RGBDS आदि)
- self-made project उदाहरण: abc.decontextualize.com
(लेख के बाद के हिस्से में MBC design variation, EEPROM/flash memory, input/output IC, peripherals integration जैसे और भी जटिल विषय शामिल हैं, लेकिन ऊपर दिए गए बिंदु Game Boy cartridge के काम करने के सिद्धांत का मुख्य सार हैं.)
1 टिप्पणियां
Hacker News राय
मैं TI के TXB0108 के इस्तेमाल का अनुभव साझा करना चाहता हूँ। इसकी auto direction sensing सुविधा की वजह से ऐसा लगता है कि direction logic अलग से जोड़ने की ज़रूरत नहीं होगी, लेकिन वास्तव में इसके उपयोग की सिफारिश नहीं की जाती। अगर electrical noise हो तो direction बदल सकती है और input, output बन सकता है। ऐसे में कभी डिवाइस इसे झेल लेता है, और कभी हालात बिगड़ने पर तथाकथित 'magic smoke' जैसी स्थिति हो जाती है। किस्मत बहुत खराब हो तो यह industrial accident तक ले जा सकता है। मुझे लगता है कि ऐसे parts में experts के लिए छिपे हुए जोखिम बहुत हैं, इसलिए इन्हें ज़्यादा प्रचारित नहीं किया जाना चाहिए। इन्हें तभी इस्तेमाल करना चाहिए जब आपको failure mode ठीक-ठीक पता हो या कोई और विकल्प न हो।
ये parts सच में बहुत अनपेक्षित होते हैं। Output side पर सिर्फ एक-दो inch trace या connector भर हो, तब भी output ringing की वजह से auto direction reversal बार-बार हो सकता है। यह लगभग ऐसा स्तर है कि expert न हो तो इस्तेमाल ही न कर सके। जिन हालात में आप इन्हें इस्तेमाल करना चाहेंगे, उन्हीं में इनका इस्तेमाल और मुश्किल हो जाता है।
मैंने खुद ऐसा अनुभव किया है जहाँ direction बहुत तेज़ी से लगातार बदलती रही और गंभीर noise व oscillation पैदा हुआ। Pulldown से जुड़ी काफ़ी सीमाएँ भी हैं, लेकिन जब दोनों sides को एक ही direction में pull किया जाए तो स्थिति कुछ हद तक ठीक रहती है।
टालमटोल करते-करते मैंने abc-pcb.pdf डिज़ाइन को पहली नज़र में देखा और कुछ बातें नोट कीं
मुझे लगा, काश यह लेख उस समय होता जब मैं custom cartridge बना रहा था।
अपने गेम Cubeat में मैंने GB के audio in pin पर OPL3-L chip लगाकर FM music लागू किया था, और MBC logic के लिए सिर्फ 7400 series single logic chips इस्तेमाल किए थे।
कभी न कभी इसे पूरा करके रिलीज़ करना चाहता हूँ। GB पर ऐसे दिलचस्प tricks लागू करना सच में मज़ेदार अनुभव है।
Cubeat जानकारी
मुझे Game Boy cartridge architecture के बारे में ठीक इसी स्तर की जानकारी चाहिए थी।
Game Boy cartridges का apps के साथ RAM और disk space देना एक ताज़गीभरा विचार है, और सोचें तो यह तार्किक भी लगता है।
कभी-कभी सोचता हूँ, अगर phone भी इसी तरह काम करते, तो हर कुछ साल में chip technology बेहतर होने पर नया cartridge लेकर high-performance apps चलाए जा सकते, या नई antenna जोड़कर upgrade किया जा सकता।
Modular phones का विचार पहले भी आया है, लेकिन वह व्यावहारिक या उपयोगी साबित नहीं हुआ। सभी components को sockets से जोड़ने पर chips के बीच latency बढ़ती है और reliability घटती है, और जेब में दिनभर हिलते रहने वाले उत्पाद में यह और भी नाज़ुक हो जाता है।
असल में phones में सिर्फ एक चीज़ पुरानी नहीं पड़ती; camera, screen, CPU, RAM, battery—लगभग सब कुछ साथ में upgrade करने का मन होता है। ऐसे में parts अलग-अलग बदलने से बेहतर नया phone खरीदना होता है। अलग-अलग बदलने से बस case की लागत बचती है।
मैं microcontroller ROM hotpatch systems पर चर्चा कर रहा हूँ, और इसी वजह से chip में ही app को पूरी तरह रखकर तुरंत चलने वाली संरचना के फ़ायदे साफ़ दिखते हैं। लेकिन user demands लगातार बदलती रहती हैं, इसलिए चीज़ें और जटिल होती जाती हैं।
यह निश्चित रूप से एक अच्छा विचार है, लेकिन चिंता यह है कि कहीं plug-in device की hardware performance ही सीमा न बन जाए।
Cartridge में तेज़ RAM तो जोड़ी जा सकती है, लेकिन क्या पुराना board उसका ठीक से लाभ उठा पाएगा, इस पर संदेह है।
तेज़ storage जोड़ना संभव भी हो, तो supporting hardware वही रहे तो वास्तविक लाभ कितना होगा, यह स्पष्ट नहीं है।
मैंने तो यहाँ तक सोचा कि शायद camera भी plug in किया जा सकता है।
Game Boy के लिए custom software बनाते समय copy protection या region-lock hardware को bypass करने की ज़रूरत नहीं होती—इस बात पर किसी ने पूछा कि क्या वास्तव में logo check पास नहीं करना पड़ता?
और Sega v. Accolade फ़ैसले के बाद title check जैसी व्यवस्था अब क़ानूनी रूप से व्यावहारिक बाध्यता नहीं रही, इसलिए bypass का वास्तविक अवरोध भी नहीं बचता।
पहले मैं GB development materials के लिए devrs.com अक्सर देखता था। अब वह साइट बंद हो चुकी है, इसका अफ़सोस है। ज़्यादातर links पहले ही मर चुके हैं, फिर भी वहाँ कई प्रेरणादायक projects थे।
Ultimate Game Boy Talk (33c3 presentation) वीडियो भी देखने लायक है।
Ultimate Game Boy Talk - 33c3
मेरा Pokemon Blue version 20 साल पहले washing machine और फिर dryer तक झेल चुका है, और आज भी ठीक से काम करता है। सच में बहुत मज़बूत hardware है। सोचता हूँ, क्या SD card ऐसी मार झेल पाएगा?
इस महीने मैंने मज़े-मज़े में KiCad और PCB design सीखना शुरू किया है। क्या किसी ने पूरा original Game Boy PCB खुद बनाकर open source के रूप में जारी किया है?
FunnyPlaying नाम की एक कंपनी GBC और GBA PCB खुद बनाकर बेचती है, लेकिन open source संस्करण मिलना मुश्किल है।
nataliethenerd के GitHub पर CGB reverse engineering project है, लेकिन उसका license non-commercial है।
वहाँ बताया गया है: "CGB-CPU-04 board का इस्तेमाल करके scan, sand, और redraw के ज़रिए CGB schematic तैयार किया गया; values आदि के लिए original schematic का संदर्भ लिया गया।"
PCB design के लिए काम आने वाले reference materials की सिफारिश भी जानना चाहता हूँ।