ポケモンシリーズなどに存在する時計機能。この仕組みはどうなっているのだろうかとふと疑問に思ったことはないでしょうか。基板にはRTCと呼ばれるチップが別途乗っていて、さらにボタン電池も内蔵しています。GBA本体の電源を落としたり、カードリッジを素の状態でおいたままでもボタン電池に残量がある限り動き続けるという仕組みです。ここではもう少し踏む混んで時計を読み込んで表示したり、書き込んだりする方法を解説します。
まずはGBATEK、チップのデータシートそれぞれ覗いてみることです。
GBA Cart I/O Port (GPIO) 4bit General Purpose I/O Port (GPIO) - contained in the ROM-chip The I/O registers are mapped to a 6-byte region in the ROM-area at 80000C4h, the 6-byte region should be zero-filled in the ROM-image. In Boktai, the size of the zero-filled region is 0E0h bytes - that probably due to an incorrect definition (the additional bytes do not contain any extra ports, nor mirrors of the ports in the 6-byte region). Observe that ROM-bus writes are limited to 16bit/32bit access (STRB opcodes are ignored; that, only in DS mode?). 80000C4h - I/O Port Data (selectable W or R/W) bit0-3 Data Bits 0..3 (0=Low, 1=High) bit4-15 not used (0) 80000C6h - I/O Port Direction (for above Data Port) (selectable W or R/W) bit0-3 Direction for Data Port Bits 0..3 (0=In, 1=Out) bit4-15 not used (0) 80000C8h - I/O Port Control (selectable W or R/W) bit0 Register 80000C4h..80000C8h Control (0=Write-Only, 1=Read/Write) bit1-15 not used (0) In write-only mode, reads return 00h (or possible other data, if the rom contains non-zero data at that location). Connection Examples GPIO | Boktai | Wario Bit Pin | RTC SOL | GYR RBL -----------+---------+--------- 0 ROM.1 | SCK CLK | RES - 1 ROM.2 | SIO RST | CLK - 2 ROM.21 | CS - | DTA - 3 ROM.22 | - FLG | - MOT -----------+---------+--------- IRQ ROM.43 | IRQ - | - -
GPIOは80000C4hからの6バイト、本来は0x00で埋まっているということがわかります。また、ボクらの太陽の場合は0E0hで埋まっているとのこと。GPIOピンはカードリッジ上の1,2,21,22を使われている。配線はConnection ExamplesのRTC部分。SCK, SIO, CSが重要であるということがわかります。ちょっと飛躍しているかもしれませんがraspberry piやArduinoでLEDチカチカしていることと全く同じものだと思ってかまいません。3本の線を使用しているため、Lチカが3つあると考えてください。SCK, SIO, CSがHIGH(ON), LOW(OFF)することで時計の内容を読んだり書いたりしています。