ละเอียดเกินกว่าที่คุณอยากรู้เกี่ยวกับวิธีทำงานของตลับเกมบอย
(abc.decontextualize.com)- เพื่อสร้าง ตลับเกมบอยแบบทำเอง ผู้เขียนได้ผ่าน กระบวนการวิจัยและออกแบบหลายปี
- บทความนี้รวบรวมข้อมูลทางเทคนิคสำคัญที่จำเป็นต่อการสร้าง ตลับเกมบอยแบบคัสตอม อย่างเป็นระบบในมุมมองของ ผู้เริ่มต้น
- เกมบอยเป็นแพลตฟอร์มที่น่าดึงดูดสำหรับ ชุมชนพัฒนาเกมย้อนยุคและฮาร์ดแวร์แฮ็กกิง เพราะมีโครงสร้างฮาร์ดแวร์ที่ เรียบง่ายแต่ขยายต่อได้ดี
- ตลับสามารถ บรรจุทั้งข้อมูลเกมและฮาร์ดแวร์เพิ่มเติม (เช่น RTC, เซ็นเซอร์ ฯลฯ) เพื่อเพิ่มความสามารถใหม่ให้เกมบอย
- วงจร Memory Bank Controller (MBC) ทำให้ ขยายความจุและเข้าถึงหน่วยความจำแบบเลือกได้ จึงรองรับการทำงานของเกมได้หลากหลายรูปแบบ
บทนำและเป้าหมาย
- ผู้เขียนตั้งเป้าหมายส่วนตัวในการ สร้างตลับเกมบอยขึ้นใหม่ทั้งหมด
- ได้สรุปและเผยแพร่ความรู้เกี่ยวกับโครงสร้างภายในและหลักการทำงานของตลับเกมบอยในรูปแบบโอเพนซอร์ส
- จุดประสงค์ของบทความคือการเรียบเรียงข้อมูลเทคนิคที่เข้าใจยากใหม่ให้ ทุกคนตามทันได้จากมุมมองของผู้เริ่มต้น
- อธิบายโดยเน้น พฤติกรรม (behavior) ที่สังเกตได้จากภายนอก มากกว่าหลักการทำงานภายในของฮาร์ดแวร์
- ใช้ SoC ของ DMG (เกมบอยรุ่นแรก) เป็นฐานในการอธิบาย และอุปกรณ์ตระกูลเกมบอยก็มีอินเทอร์เฟซตลับพื้นฐานคล้ายกัน
ความพิเศษของแพลตฟอร์มเกมบอย
- เกมบอยเข้าใจโครงสร้างฮาร์ดแวร์และซอฟต์แวร์ได้ง่ายในภาพรวม เพราะมี ความเรียบง่ายและการออกแบบที่ตรงไปตรงมา
- ด้วยคุณสมบัติ พกพาได้และใช้พลังงานต่ำ รวมถึง ไม่มีระบบป้องกันซับซ้อนหรือการล็อกโซน จึงเปิดให้ใครก็พัฒนาได้
- มีการสะสม เอกสารทางเทคนิค แบบร่างฮาร์ดแวร์ และข้อมูลจากชุมชน ไว้อย่างมากมาย
- มีทั้ง คลังเกมทางการ/ไม่เป็นทางการ ขนาดใหญ่ และเครื่องมือพัฒนาโอเพนซอร์สกับเครื่องมือสคริปต์เชิงภาพที่ยังได้รับการดูแลอย่างต่อเนื่อง
- ระบบนิเวศยังขยายไปถึงทั้งไดรเวอร์ฮาร์ดแวร์ อีมูเลเตอร์ที่แม่นยำ และการอิมพลีเมนต์บน FPGA
โครงสร้างพื้นฐานของตลับเกมบอย
- เครื่องคอนโซลยุคก่อนมี เส้นแบ่งระหว่างซอฟต์แวร์กับฮาร์ดแวร์ที่ไม่ชัดเจน
- เกมบอย ไม่มีระบบปฏิบัติการหรืออุปกรณ์เก็บข้อมูลถาวรในตัว โค้ดที่ใช้รันทั้งหมดและฮาร์ดแวร์เสริมจะอยู่ใน ตลับ
- เพราะเหตุนี้ ตลับต้องทำงานได้สมบูรณ์ก่อนที่ เกมบอยจะบูตและทำงานได้
- edge connector 32 พิน ที่ด้านล่างของตลับเป็นอินเทอร์เฟซหลักสำหรับรับส่งสัญญาณกับตัวเครื่อง
- สัญญาณระหว่างตลับกับตัวเครื่องแบ่งได้เป็น ไฟเลี้ยง, สัญญาณควบคุม (อ่าน/เขียน/เลือกชิป), address bus (16 บิต), data bus (8 บิต)
Bus และหลักการทำงาน
- bus คือโครงสร้างที่ชิ้นส่วนหลายตัวแชร์สายสัญญาณชุดเดียวกันเพื่อส่งข้อมูลได้พร้อมกัน
- CPU ของเกมบอยจะส่งแอดเดรสที่ต้องการไปยัง address bus และส่งข้อมูลไปยัง data bus
- เพราะโครงสร้าง bus เป็นแบบ ขนาน (parallel) พินที่แทนแต่ละบิตจึงมีอยู่จริงบนฮาร์ดแวร์
- แม้จะได้เปรียบด้านความเร็ว แต่เมื่อ bus เป็นทรัพยากรร่วมก็มีความเสี่ยงเรื่อง การชนกัน/คอนเทนชัน (เขียนพร้อมกัน)
- หากมี IC หลายตัวส่งข้อมูลออกมาพร้อมกัน จะเกิด ชอร์ต (เสี่ยงร้อนเกินและเสียหาย) ดังนั้นจึงต้องให้มี IC ที่เปิดใช้งานอยู่เพียงตัวเดียวเสมอ
การแบ่งประเภทหน่วยความจำหลักของเกมบอย
- เกมบอยสามารถติดตั้ง IC หน่วยความจำได้สูงสุด 4 ประเภท (RAM ในตัว, video RAM, cartridge ROM, cartridge RAM)
- ในทางปฏิบัติ video RAM ใช้ bus แยกต่างหาก จึงมักไม่นับรวมในการอธิบายทั่วไป
- ชุด RAM/ROM ในตัวและบนตลับ ใช้ address bus และ data bus ชุดเดียวกันร่วมกัน
- ต้องมี เพียงชิปเดียวในแต่ละครั้ง ที่ทำการอ่านหรือเขียนบน data bus
- ในทางปฏิบัติยังเรียกกันว่า RAM ในตัว (WRAM), RAM บนตลับ (SRAM), video RAM (VRAM), high RAM (HRAM)
Chip Select และโครงสร้างวงจร
- ชิปหน่วยความจำแต่ละตัวจะมีพิน สัญญาณเลือกชิป (CS/CE, Chip Select/Chip Enable)
- สถานะของสัญญาณเลือกชิปจะกำหนดว่าชิปใดเข้าถึง data bus ได้
- เกมบอยนำ 3 บิตบนของ address bus (A15, A14, A13) และพิน _CS ของ CPU มาใช้ซ้ำสำหรับการเลือกชิป
- การต่อวงจรลักษณะนี้ รับประกันว่าจะไม่เปิดใช้งานเกินสองชิปขึ้นไปพร้อมกัน
- ตัวอย่างเช่น ROM จะถูกเปิดใช้งานก็ต่อเมื่อ A15 เป็น 0 ส่วน RAM จะถูกเปิดผ่านลอจิกอีกชุดหนึ่ง
Memory Map และมุมมองของโปรแกรมเมอร์
- สถานะของแอดเดรสและพินในระดับฮาร์ดแวร์ถูกทำให้เป็นนามธรรม จนโปรแกรมเมอร์รับรู้เพียง memory map เชิงตรรกะ
- ในพื้นที่แอดเดรส 16 บิต ช่วง 0x0000–0x7FFF ถูกแมปเป็น cartridge ROM, 0xA000–0xBFFF เป็น cartridge RAM, และ 0xC000–0xDFFF เป็น RAM ในตัว
- เมื่อเข้าถึงแอดเดรสที่กำหนด หน่วยความจำช่วงที่ต้องการจะถูกเปิดใช้งานอัตโนมัติ ส่วนที่เหลือจะถูกปิดใช้งาน
- เอกสาร memory map จึงเป็นแหล่งอ้างอิงสำคัญในเอกสารของเกมบอย
Memory Bank Controller (MBC)
- MBC คือวงจรสำคัญในตลับเกมบอยที่ทำให้ รองรับ ROM ขนาดเกิน 32KB รวมถึง RAM และอุปกรณ์ต่อพ่วงเพิ่มเติม ได้
- แม้จะมี MBC หลายชนิดวางจำหน่าย แต่ที่นี่อธิบายโดยอิง MBC5 ซึ่งค่อนข้างเรียบง่ายและใช้งานได้กว้าง
- MBC5 รองรับ ROM ได้สูงสุด 8MB และ cartridge RAM 128KB ผ่านเทคนิค การสลับแบงก์ (banking)
- ยังสามารถควบคุมการเข้าถึง RAM และฮาร์ดแวร์แยกอย่างเซ็นเซอร์ภายนอกหรือ RTC ได้ด้วย
- ในพินแอดเดรสของ ROM บนตลับ บิตบน (A22~A14) จะถูกควบคุมแบบไดนามิกโดย MBC5 ส่วนบิตล่างจะต่อเข้ากับ address bus ของตัวเครื่องโดยตรง
หลักการของ ROM Banking
- CPU ของเกมบอยมีพื้นที่แอดเดรสได้สูงสุด 64KB แต่ในทางปฏิบัติใช้กับ ROM เพียง 32KB (16KB+16KB)
- MBC5 ควบคุมแอดเดรสบนของ ROM (การเลือกแบงก์) โดยตรง เพื่อแมปช่วงที่ต้องการขนาด 16KB เข้าสู่พื้นที่แอดเดรสของ CPU
- ในเชิงฮาร์ดแวร์ 14 บิตล่างของ address bus จาก CPU (A0~A13) จะต่อเข้ากับชิป ROM โดยตรง ส่วนที่เหลือรับจาก MBC5
- ระหว่างที่เกมกำลังทำงาน เมื่อซอฟต์แวร์เขียนค่าไปยัง แอดเดรสหน่วยความจำบางตำแหน่ง MBC จะตรวจจับ และอัปเดตค่าแบงก์ที่เลือกไว้ภายใน
โปรโตคอลและกลไกของ MBC
- MBC5 จะตรวจจับ ชุดค่าผสมของแอดเดรส/สัญญาณควบคุมบางแบบ เพื่อทำงานอย่างการเลือก ROM bank, เลือก RAM bank, และเปิด/ปิดฟังก์ชันอื่น ๆ
- ตัวอย่างเช่น หากมีการเขียนในช่วง A15=0, A13=1, A14=0 (0x2000~0x3FFF) ค่าที่อยู่บน data bus จะถูกบันทึกเป็นหมายเลข ROM bank
- ในมุมของโปรแกรมเมอร์ การสลับแบงก์จึงไม่ได้ดูเหมือนการควบคุมวงจรระดับล่าง แต่เป็นเพียงการ เขียนข้อมูลไปยังแอดเดรสที่กำหนด
- การใช้งาน cartridge RAM, เซ็นเซอร์, RTC และอื่น ๆ ก็ถูกควบคุมด้วยรูปแบบคล้ายกัน
- เทคนิค การนำ bus กลับมาใช้ซ้ำ (reuse) แบบนี้ช่วยลดจำนวนชิ้นส่วนและลดต้นทุนได้
บทสรุปและการใช้ประโยชน์จากชุมชน
- จุดเด่นของโครงสร้างตลับเกมบอยคือ ต้นทุนต่ำ ความน่าเชื่อถือสูง และขยายต่อได้ดี
- หากจะสร้างตลับขึ้นเอง ความเข้าใจ โครงสร้างและโปรโตคอลข้างต้นอย่างแม่นยำ เป็นสิ่งจำเป็น
- หากอ้างอิงชุมชนและเอกสารจำนวนมากที่มีอยู่อย่างจริงจัง ก็จะ ลดกำแพงในการพัฒนาแบบบูรณาการระหว่างฮาร์ดแวร์และซอฟต์แวร์ได้มาก
แหล่งอ้างอิงและเส้นทางการเรียนรู้เพิ่มเติม
- บทความ Game Boy/Game Boy Color Architecture ของ Rodrigo Copetti
- เอกสารเทคนิคจาก gbdev.io, Pan Docs
- แบบออกแบบตลับและ toolchain โอเพนซอร์สหลากหลายแบบ (เช่น GBDK, RGBDS เป็นต้น)
- ตัวอย่างโปรเจกต์ทำเอง: abc.decontextualize.com
(ในช่วงหลังของบทความต้นฉบับยังกล่าวถึงองค์ประกอบที่ซับซ้อนยิ่งขึ้น เช่น ความแปรผันของดีไซน์ MBC, EEPROM/flash memory, I/O IC และการรวมอุปกรณ์ต่อพ่วงต่าง ๆ แต่หัวข้อด้านบนคือแก่นสำคัญของหลักการทำงานของตลับเกมบอย)
1 ความคิดเห็น
ความเห็นจาก Hacker News
อยากแชร์ประสบการณ์การใช้ TI TXB0108 แม้ฟังก์ชันตรวจจับทิศทางอัตโนมัติจะดูเหมือนไม่ต้องเพิ่มลอจิกทิศทางแยก แต่ในความเป็นจริงไม่แนะนำให้ใช้ เพราะเมื่อมี electrical noise ทิศทางอาจสลับจนอินพุตกลายเป็นเอาต์พุตได้ ทุกครั้งที่เกิดขึ้นอุปกรณ์อาจทนไหว หรือถ้าหนักก็อาจเกิดสิ่งที่เรียกกันว่า "ควันวิเศษ" และถ้าโชคร้ายมากก็อาจลุกลามเป็นอุบัติเหตุในภาคอุตสาหกรรมได้ คิดว่าชิ้นส่วนแบบนี้มีความเสี่ยงแฝงสำหรับมืออาชีพมากเกินไป ไม่ควรถูกโฆษณาเกินจริง ควรใช้เฉพาะเมื่อรู้ failure mode อย่างแม่นยำ หรือไม่มีทางเลือกอื่นจริง ๆ
ชิ้นส่วนพวกนี้คาดเดาไม่ได้จริง ๆ แค่มี trace ฝั่งเอาต์พุตยาวสักหนึ่งสองนิ้วหรือมีคอนเน็กเตอร์ ก็อาจเกิดการกลับทิศทางอัตโนมัติบ่อยจาก output ringing ได้ เป็นระดับที่ถ้าไม่ใช่มืออาชีพแทบใช้งานไม่ได้ และยิ่งมักอยากใช้ในสถานการณ์ที่กลับใช้งานได้ยากกว่าเดิม
เคยเจอจริงว่าทิศทางสลับไปมาอย่างรวดเร็วมากจนเกิด noise และการสั่นรุนแรง ข้อจำกัดเรื่อง pull-down ก็มีอยู่พอสมควร แต่ถ้าทั้งสองฝั่งถูกดึงไปในทิศทางเดียวกันก็ยังพอไหว
ระหว่างผัดวันประกันพรุ่งเรื่องอื่นอยู่ เลยลองดูแบบ abc-pcb.pdf แล้วมีข้อสังเกตเบื้องต้นบางอย่าง
อ่านแล้วรู้สึกเลยว่า ถ้าบทความนี้มีตั้งแต่ตอนฉันทำคาร์ทริดจ์แบบคัสตอมก็คงดีมาก
ในเกม Cubeat ของฉัน ฉันใส่ชิป OPL3-L ที่ขา audio in ของ GB เพื่อทำเพลง FM ส่วนลอจิก MBC ใช้เพียง single logic chip ตระกูล 7400
สักวันหนึ่งอยากทำให้เสร็จและวางขายจริง การได้ลองทำทริกแปลก ๆ แบบนี้บน GB เป็นประสบการณ์ที่สนุกมาก
ข้อมูล Cubeat
นี่แหละคือระดับรายละเอียดเกี่ยวกับโครงสร้างคาร์ทริดจ์ Game Boy ที่ฉันอยากรู้มาตลอด
แนวคิดที่คาร์ทริดจ์ Game Boy มาพร้อมทั้ง RAM และพื้นที่ดิสก์ให้ตัวแอปด้วยนั้นสดใหม่ดี และพอคิดดูแล้วก็สมเหตุสมผล
ถ้าโทรศัพท์ทำงานแบบนี้บ้าง ก็นึกภาพได้ว่าอาจอัปเกรดด้วยการซื้อคาร์ทริดจ์ใหม่ทุก ๆ สองสามปีเมื่อเทคโนโลยีชิปดีขึ้น เพื่อรันแอปที่แรงขึ้น หรือแม้แต่เสียบเสาอากาศแบบใหม่เข้าไป
โทรศัพท์แบบโมดูลาร์ถูกเสนอมาแต่ก่อนแล้ว แต่ไม่ค่อยใช้งานได้จริงหรือไม่ค่อยมีประโยชน์ เพราะถ้าเอาทุกชิ้นส่วนไปต่อผ่านซ็อกเก็ต latency ระหว่างชิปจะเพิ่มขึ้นและความน่าเชื่อถือก็ลดลง ยิ่งเป็นอุปกรณ์ที่สั่นอยู่ในกระเป๋าทั้งวันก็ยิ่งเปราะบาง
ในความเป็นจริง ไม่ได้มีแค่ส่วนเดียวในโทรศัพท์ที่ล้าสมัย แต่เรามักอยากอัปเกรดแทบทุกอย่างพร้อมกัน ทั้งกล้อง หน้าจอ CPU RAM แบตเตอรี่ ฯลฯ ถ้าเป็นแบบนั้น การซื้อโทรศัพท์ใหม่ทั้งเครื่องก็ดีกว่าเปลี่ยนทีละชิ้น สิ่งที่ได้จากการเปลี่ยนแยกจริง ๆ อาจมีแค่ประหยัดค่าตัวเครื่องภายนอกเท่านั้น
ตอนนี้กำลังคุยกันเรื่องระบบ hot patch ของ ROM บนไมโครคอนโทรลเลอร์ และด้วยเหตุนี้ข้อดีของโครงสร้างที่ใส่แอปทั้งหมดลงบนชิปแล้วรันได้ทันทีจึงชัดเจนมาก เพียงแต่ความต้องการของผู้ใช้ก็เปลี่ยนไปเรื่อย ๆ เลยยิ่งซับซ้อนขึ้น
เป็นไอเดียที่ดีแน่นอน แต่ก็อดคิดไม่ได้ว่าฮาร์ดแวร์ของเครื่องที่ใช้เสียบจะกลายเป็นข้อจำกัดหรือเปล่า
ต่อให้ใส่ RAM ที่เร็วกว่าไว้ในคาร์ทริดจ์ได้ ก็ยังไม่แน่ใจว่าบอร์ดเดิมจะใช้ประโยชน์จากมันได้ดีแค่ไหน
แม้จะต่อสตอเรจที่เร็วขึ้นได้ แต่ถ้าฮาร์ดแวร์รองรับยังเหมือนเดิม ก็ไม่แน่ว่าผลที่ได้จริงจะมากแค่ไหน
ถึงขั้นจินตนาการว่าอาจเสียบกล้องเข้าไปได้ด้วย
มีคนถามว่าในเมื่อบอกว่าการทำซอฟต์แวร์คัสตอมบน Game Boy ไม่จำเป็นต้องข้ามฮาร์ดแวร์ป้องกันการคัดลอกหรือ region lock จริงหรือ ในเมื่อยังต้องผ่านการตรวจสอบโลโก้อยู่ไม่ใช่หรือ
RGBFIX) ก็ให้แทรกอัตโนมัติได้อีกทั้งหลังคำพิพากษา Sega v. Accolade แล้ว วิธีตรวจสอบไตเติลแบบนี้ก็แทบไม่มีผลบังคับทางกฎหมายอีกต่อไป จึงแทบไม่มีอุปสรรคเชิงปฏิบัติในการหลบเลี่ยง
เสียดายที่เว็บไซต์เอกสารพัฒนา GB ที่เคยเข้าเป็นประจำอย่าง devrs.com ไม่ได้เปิดให้บริการแล้ว แม้ลิงก์ส่วนใหญ่จะเสียไปแล้ว แต่ที่นั่นเคยมีโปรเจ็กต์ที่สร้างแรงบันดาลใจไว้มากมาย
วิดีโอ Ultimate Game Boy Talk (บรรยายในงาน 33c3) ก็น่าดูเหมือนกัน
Ultimate Game Boy Talk - 33c3
Pokemon Blue ของฉันเคยเข้าเครื่องซักผ้าและเครื่องอบผ้าเมื่อ 20 ปีก่อน แต่ตอนนี้ก็ยังทำงานได้ตามปกติ เป็นฮาร์ดแวร์ที่ทนมากจริง ๆ เลยสงสัยว่า SD card จะทนอะไรแบบนั้นได้ไหม
เดือนนี้เพิ่งเริ่มลอง KiCad กับการออกแบบ PCB แบบสนุก ๆ เลยสงสัยว่ามีใครเคยทำ PCB ของ Game Boy รุ่นออริจินัลขึ้นมาใหม่ทั้งแผงแล้วปล่อยเป็นโอเพนซอร์สหรือไม่
มีบริษัทชื่อ FunnyPlaying ที่ทำและขาย PCB สำหรับ GBC และ GBA เอง แต่เวอร์ชันโอเพนซอร์สดูจะหาได้ยาก
ใน GitHub ของ nataliethenerd มีโปรเจ็กต์ CGB reverse engineering แต่ไลเซนส์เป็นแบบ non-commercial
เขาอธิบายไว้ว่า "ใช้บอร์ด CGB-CPU-04 เป็นฐานในการสแกน ขัดผิว และเขียนใหม่ เพื่อจัดทำ schematic ของ CGB โดยอ้างอิงค่าต่าง ๆ จากวงจรต้นฉบับ"
อยากได้คำแนะนำแหล่งข้อมูลที่เหมาะใช้เป็น参考ในการออกแบบ PCB ด้วย