ロード トップ 参照元 逆検索 検索 ヘルプ

[logo] ゲームボーイアドバンス


SuzTiki:不定期にっき

ゲームボーイアドバンスは、GCC で ソフト開発できるらしい。

GBA のスペックは、

参考:


  • いくつかカードリッジをあけてみた。

    なるほど、あたらしいものは、SRAM が足りないから 増やしているわけか。 MM1134A は? なんか SRAM を バックアップするための デバイスのように 見える。

    GB は歴史が長いから、いろんなタイプのカセットがありそうだが... GBA はみな一緒だと思っていた

    3 つ 空けてみたら 全部ちがった。

    いまはシリアル接続の EE-PROM がある。汎用品をつかっているようだ。 それはともかく、そんなものをバスに直結できるはずがない。 MASK ROM とは書いてあるが、汎用品ではなくて ASIC なのだろう。

    64K では全然たりない場合は こっちを使うのかなぁ?

            MASK ROM 44 pin
            256K SRAM 28 pin
            電池 CR 1616
            9803F ? LV2416 ?? 8pin 
    

    謎。いちばん 型番が あたらしそうなのにもかかわらず、SRAM が使われている。 わずか 32KB だから。本体の RAM が足りないからというわけでもないはず。

    512K の FLASH のバージョンがあるんだから、バックアップならこれ使えば いいように思える。

    ... ひょっとして、不揮発性 RAM に最新のデータをおくことで、いつ電源を 切られてもよいようにしている?

    FLUSH は、書き込み回数に制限があるから使いたくないということか。

    なんとなく、カセットがどういうものかはわかってきた。

    Data と Adresss がマルチプレックスされている部分のためだけでも、 なんか回路が必要で、古くは、MBC-01 から MBC-05 まで 専用の IC が 使われていたように思える。で、今は MASK ROM の方にその回路が入って しまっているのだろう。

    個人レベルでカセットを造ろうと思うと、結局それに相当する回路が どうしても必要で、今なら CPLD を使うのがいちばん 簡単で安あがり ということか。

    それはともかく、GB/GBA のカセットを作るのには、カセットの形状からみて、 表面実装のデバイス以外つかえない。

    いまは、安く 基板をつくってくれる ところがあるから、 基板を設計して、カセットを作ってみるというのは、けっこうたのしいかも しれない。

    ただ、問題は、なににつかうか... ダウンロードするデバイスをつくれば、カセットはかならずしも必要ない ことになる。


    シリアル<=>GBA 通信ケーブルに関する情報

    なんか、簡単らしい。

    マルチブートでは、start 1bit/data 16 bit/stop 1bit の型式 115200 bps で データを転送する。これをおこなうには、なんか特殊な ハードが必要。

    PIC とかつかえば、通信自体は できそうだが.... プロトコルは、プロテクトがかかったものらしい。...というわけで しろうとでは これを扱うのは無理っぽい。


    02/06/04 妄想編

    この2つのことを考えあわせて、

    なんてことができると、いいなぁ。それができれば、プログラムの書き変えも 楽だし 。MMC にデータ入れて なんかするって応用もできそうだし、かなり楽しい かも。

    ちょっと現実性があるかどうかみてみることにしよう。

    このモデルで、128 バイト(64 word x 16bit) の ランダム ROM パターン を 適当に作ってみる。

    となった。このあたりが上限らしい。

    あとは、MMC 用のコードがどうか。

    このページのコードを をみてなにしているか見てみる。

    簡単に説明しすぎ & たぶんまちがっている のだが .. まあこんなかんじ。 128 バイトもあれば作れないかなぁ。

    ブートシーケンスは ...

    そんな感じでどうだろう。32K もあれば、FAT から ある決まったファイルを 読みこんできて制御を渡すなんてことも可能なはず。 メニューを 出すなんてこともできるだろう。

    このシステム、十分なROM エリアを持っていないわけだから、たぶんゲームのコピー を動かすなんて使い方はできない。... たぶん健全だろう。

    さて、ほんとうにこれを作るとする。しかも 自分で... という前堤。

    どうやったら、それができるか?

    お、ハードの試作はできるような気がする。

    02/06/05 妄想編2

    GBA がストレージ持てたらなにをするか... というと MP3 が鳴らせるか とか MPEG4 が表示できるか ということをまずやりそうだ。

    この2つができたら次は、通信ポートに bluetooth。 もし、ここまで来たら 携帯ゲームの最終形って感じがする。

    電子工作を楽しみたいから というのが 大きな理由としてあるのは確か。

    ただ、安いというのは大きな要素で 電子工作したいと思う前堤にもなっている。 ( bluetooth モジュールは今は高いけども、将来安くなるのは見えているので安い 要素にいれる)

    あとは... iPAQ であたりまえのようにできることでも、GBA でできたらやぱり すごいと思えるから。MP3 プレイヤーとして実用的に使えるだけでも それができたら、満足しそう。


    MMC の 資料:

    メモ:

    MMC Pin Connection(SPI mode):

      1: CS
      2: DATAIN
      3: GND
      4: VCC
      5: CLK
      6: GND
      7: DATAOUT
    

    CLK は、20MHz ぐらいでも OK らしい。10MHZ なら十分? これぐらいなら、/ROMCS をベースにして 1 clock 出せそう。

  • ROM の上(A23) を読む ->
  • RAM の上(A15) の bit 0 を書く ->
  • RAM の下(!A15) を書く ->
  • RAM を読む

    なんかこんな感じで MMC 用のハード作ったら どうかな。

    ROM のアクセス

  • (1) /CSROM が ↓ となったときの AD1-15 にはアドレスが出ているので、 15 bit のカウンタにロード。
  • (2) /RD が ↓ のとき このカウンタ + A16-A23 がアドレス。
  • (3) /RD が ↑ のとき AD0-15 に出た ROM のデータを CPU が読みこむ。 このときに、このカウンタ をインクリメントしないといけない。
      /CSROM   ~~~~~~~~~~↓___________________↑~~~~~~~~~~~~~~~~~~
                        (1)                   (4)
    
      /RD      ~~~~~~~~~~~~~~↓_↑~~~~↓_↑~~~~~~~~~~~~~~
                            (2) (3)
    

    RAM のアクセス

    なんかこんな感じらしい。

    メモリマップは、

    だそうだ。ROM の 3 つのエリアはどこも同じイメージ?

    だいたい規模だけ合わせた回路図(バグバグってこと)を書いてみた。

    64 bytes でブートシーケンスが作れるならば、OK。128 bytes RANDOM は 入らなかった。96バイト(最後の32バイトは 0) としたら

    となった。とりあえず、これベースを考えよう。

    うーん。64 バイトでは、ちょっとしたプログラムも動くような気がしない。 どうしたものか... と思って他の chip をためしてみたら

    XC9572XL 44 pin でなんとかならないかなぁ。XC9572LX-10PC44C という PLCC タイプもあるから、専用ボードなくても 試作は なんとかなるっぽい。 値段も 若松で 500円らしい。

    128 バイトのコードで なんとかブートローダ作れないかなぁ。

    とりあえず、256 バイトを保険と考えて 128 バイトにおさまるかマジメに 考えてみよう。

    やるべきことは、

    やっぱり正確じゃないけども。だいたいこんなところ。


    さて、ターゲットが XC9572XL or XC95144XL に変わったってことで 実験するなら やはり カメレオンUSB か。

    それとも、H8/3664 ベースで 書き込み器を作るか...

    というのがあるらしい。PC のパラレルポートで簡単にできそう。 なるほど、XC98xxXL が 5V の I/O が OK だからこれでできるのかぁ。


    さて MMC の タイミング

    ではコマンドレベルのシーケンスがわかるけども ...

    がわかりやすい。

    これみると。

     MMC_CLK       --------------               ---------------
                                |              ↑
                                ----------------
    
     MMC_OUT                    |XXXXXXXXXXXXXXXXXXXXXXXXXXXXX|
    
    
    
     MMC_IN                                     |
                                               取りこみ
    
    

    という風にするのが第一歩 。

    Xilinx のライブラリは基本的にCLK ↑ で動作するようだから ラッチを つけないといけなさそう。

    MMC_CLK          ~~|_|~|_|~|_|~|_|~|_|~|_|~|_|~|_|~|_
    
    
    MMC_OUT          | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
    
    MMC_IN             |   |   |   |   |   |   |   |
    
                       7   6   5   4   3   2   1   0
    
    こういう風に動かすには、
    
      MMC_IN --  SLI   シフトレジスタ Q7 ----- D   ラッチ  --- Q ---> MMC_OUT
                          SR8RLE                    FD
    
                            CLK                     CLK
                            |                        |
      /SHIFT ---------------+------------------- |>o-+  
       
    
     こんな感じにすればよさそうだ。
     
     ただ、データのロードも CLK ↑ でのみ。SHIFT と LOAD は同時には発生しない
     ので、単純に AND を取れば CLK の方は OK。
    
       /LOAD  ~~~~~~~~~~~~~|_|~~~~~~~~~~
       /SHIFT ~~~~~~~~~~~~~~~~~~~|_|~~~~
        ↓
              ~~~~~~~~~~~~~|_|~~~|_|~~~~
    
      それは良いのだが、上の /LOAD を inv して シフトレジスタの L に
      入れてもちゃんと動くのだろうか?
    
      なんか不安なので、こんな風にしてみる。
    
      /RAMCS     -----|>o ------------------------> シフトレジスタの L
    
      ( RAMCS & WR & セレクタ(A15==0) ) -----|>o----> /LOAD 
    
    
    


    02/06/07

    アキハバラに買い出し。第一目的は LROUTER 復活のための パーツ。 足りないパーツは、40pin ICソケットたくさん と ROM基板用のピン

    GBA 関係も 購入

    計画

    まずは、ここまでなんとかすることを考えることにしよう。

    工作(番外)

    工作

    そうそう電源のことを忘れていた。一応東芝の TA48M033F というのを 3.3V 用に購入。(100円@千石)

    3.3 V 出力で 500mA 流せるから この用途には十分。 ... ただ、ちょっと迷いがある。RS232C 用のチップ以外は、全部 3.3V で 動くはずなのだ。RS232C のチップも 3.3V 用を用意してある。

    うーん。RS232C のチップ SP232 と SP3232 の違いをしらべ、H8/3664 の データシート 見て 全体を 3.3V 化できないか 検討してみよう。

    というわけで、RS232C を SP3232 に変えた。やっぱり 5V で使用する場合も あるかも知れないので、評価用の基板に 3.3V レギュレータを装着することに した。


    02/06/08 ... そろそろ H8 の開発環境の整備 / 基板 自体の動作確認 をしたい。gcc のバージョンは問わないようだから、GBA 用の gcc と 兼用しよう。

    さて、開発環境の入手。ここでは、

    を使うことにする。(H8 用には、gcc-2.95.3 を使用)

    binutils を展開し、適当な build 用ディレクトリ GBA をその下に作る。 で

        ../configure --prefix=/usr/cross --target=arm-thumb-elf
    

    で つくってみる。

    うーん。できちゃったので、make install する。

    つぎは、gcc 。gcc-3.0.4 と newlib-1.9.0 を展開。

       cd gcc-3.0.4
       ln -sf ../newlib-1.9.0/newlib .
    

    とやる。

    で、gcc-3.0.4 の下に GBA というディレクトリをつくりそこで

        ../configure --prefix=/usr/cross --target=arm-thumb-elf  \
            --with-cpu=arm7tdmi --with-newlib --disable-threads \
             --enable-targets=arm-elf --enable-languages="c" 
    
    

    とやってみる。さてどうなるんだろう? なんかパッチが必要っぽいし、 configure も完全に同じではない。

    ついでに H8 の make 。

    binutils は、

        ../configure --prefix=/usr/cross --target=h8300-hms
    

    で make 。gcc は、

        ../configure --prefix=/usr/cross --target=h8300-hms  \
            --with-newlib --disable-threads  --enable-languages="c" 
    

    でやる。/usr/cross/bin に path を通して make。

    あぁ失敗。gcc-3.0.4 ではダメなのか。とりあえず、gcc-2.95.3 を使って 同じことをやってみる。( newlib のリンクは忘れないように )

    ちょっと、arm-thumb-elf-gcc で hello world を make してみる。 a.out までできてしまった。.o を objdump してみる。

    a.o:     ファイル形式 elf32-littlearm
    
    セクション .text の逆アセンブル:
    
    00000000 <main>:
       0:   e1a0c00d        mov     ip, sp
       4:   e92dd800        stmdb   sp!, {fp, ip, lr, pc}
       8:   e24cb004        sub     fp, ip, #4      ; 0x4
       c:   ebfffffe        bl      0 <main>
      10:   e59f0004        ldr     r0, [pc, #4]    ; 1c <main+0x1c>
      14:   e91b6800        ldmdb   fp, {fp, sp, lr}
      18:   eafffffe        b       0 <main>
      1c:   00000000        andeq   r0, r0, r0
    

    H8 もできたので、同じことをしてみる。

    a.o:     ファイル形式 coff-h8300
    
    セクション .text の逆アセンブル:
    
    00000000 <_main>:
       0:   6d f6           6d f6             mov.w r6,@-e7
       2:   0d 76           0d 76             mov.w r7,r6
       4:   79 00 00 00     79 00 00 00       mov.w #0x0,r0
       8:   5e 00 00 00     5e 00 00 00       jsr   @0x0:0
       c:   6d 76           6d 76             mov.w @r7+,r6
       e:   54 70           54 70             rts
    
    

    おお、CISC 的だね。ここで、h8 の flush 書き込みプログラムを make して みる。... おおできた。

    最初にダウンロードするプログラム h8prog のサイズをみてみる。

       text    data     bss     dec     hex filename
        306       0       0     306     132 h8prog.o
    

    うーん。シリアルからダウンロードして、Flush に書き込みプログラムが 306 バイトかぁ。GBA のブートローダは、プログラム的にはこれより 簡単なはずだが ...やっぱり 256 バイトにおさめるのが精いっぱいかも。 厳しそうだなぁ。

    そういえば... L-Router 用の開発環境も作らないといけない。

    とりあえず newlib つかった gcc を作りたいんだが、 target はどうやって指定するんだろう。

    でエラーになる。... うーん。--with-gnu-as --with-gnu-ld を入れる?

    gcc-3.0.4 で 以下の設定で、やってみることにしよう。

        ../configure --prefix=/usr/cross --target=mipsel-elf  \
            --with-newlib --disable-threads  --enable-languages="c" \
    	--with-gnu-as --with-gnu-ld
    

    とりあえず、objdump

    a.o:     ファイル形式 elf32-littlemips
    
    セクション .text の逆アセンブル:
    
    00000000 <main>:
       0:   27bdffe8        addiu   sp,sp,-24
       4:   afbf0010        sw      ra,16(sp)
       8:   0c000000        jal     0 <main>
       c:   00000000        nop
      10:   3c040000        lui     a0,0x0
      14:   0c000000        jal     0 <main>
      18:   24840000        addiu   a0,a0,0
      1c:   8fbf0010        lw      ra,16(sp)
      20:   00000000        nop
      24:   03e00008        jr      ra
      28:   27bd0018        addiu   sp,sp,24
    

    mips でコードでかいなぁ。それはともかく、コードを書くための 準備はできたらしい。


    回路

    mmc 部分を分けて書き直し。ついでにロジックもみなおし。

    回路図

    なかなか 思うようなものにならない。

    (希望する)仕様

    回路全体は、XC9572XL 44 pin に入る。MMC 部分のみなら XC9536XL 44 pin に入る。

    ただ、GBA のカセットと SD/MMC スロットを比べてみると

    もし自分で基板をおこしたとしても 、標準のカセットには入らない。 ( ネジが邪魔 だし、若干 高さがある。 ) ... GB のカセットに 加工して入れるのかなぁ。

    FLS007-30(手差し型) だそうだ。 手許にあるのは、FPS009-24(SD 背低プッシュ型 ) らしい。


    02/06/13

    とりあえず ブートプログラム らしきものを 作ってコンパイルしてみた。

    ううむ。C で書いて、210 バイト程なら 最適化 がんばれば良いのだろうか? それとも、他に初期化必要っぽいし、厳しいのか? なんか微妙なかんじだ。

    最適化したら、かなり小さくなった。138バイト

    プログラムを冷静に見てみると

    次は、プログラムを小さくできるような 回路を考えてみることにしよう。

    どうしてもダメか 回路をみなおして、再度コードをチューニング

    後始末を 放棄して、とにかく 1セクタだけ ロードして 跳ぶというコード。 これだと 122 バイトにおさまった。

    上記のコードで rom データを作りなおすと、余裕っぽい結果になった。

    じゃあってことで、後始末をいれて、頭にオマジナイを入れてみる。

    なんかギリギリだ。ちょっと ROM パターンを変えると入らなくなる。 オマジナイが足りないか、MMC の制御を考え違いしていたら終りだなぁ。 後始末をサボれば 6 バイト稼げるが ... ほとんど余裕がない。


    02/06/22

    実験用カセット作成。

    エックスターミネータアドバンス接続アダプター という ものがある。 エックスターミネータアドバンス と テレビDEアドバンス を同時に使うための もので、一方が本体に刺さり、他方にカセットが刺さるという単なる エクスパンダ。

    これを使って、線を ピンソケットに 引き出すものを作成した。

    基本的には、ただこれだけのもの

    工夫したのはこれぐらい。

    これで、実際に回路を使って 遊べる準備はできてしまった。


    メモ XC9572 の pinout

    Device : XC9572XL-5-PC44
    I/O : 34
                                        V     
                                        C     
                                        C     
             --------------------------------  
            /6  5  4  3  2  1  44 43 42 41 40 \
           | 7                             39 |       
           | 8                             38 |       
           | 9                             37 |       
       GND | 10                            36 |       
           | 11        XC9572XL-5-PC44     35 |       
           | 12                            34 |       
           | 13                            33 |       
           | 14                            32 | VCC
       TDI | 15                            31 | GND
       TMS | 16                            30 | TDO
       TCK | 17                            29 |    
           \ 18 19 20 21 22 23 24 25 26 27 28 /
             --------------------------------  
                      V     G                
                      C     N                
                      C     D                
                                             
    Device : XC9572XL-5-VQ44
    I/O : 34
                                   V  G  T         
                                   C  N  D      
                                   C  D  O      
              --------------------------------  
             /33 32 31 30 29 28 27 26 25 24 23 \
            | 34                            22 |         
        VCC | 35                            21 |         
            | 36                            20 |         
            | 37                            19 |        
            | 38        XC9572XL-5-VQ44     18 |         
            | 39                            17 | GND
            | 40                            16 |      
            | 41                            15 | VCC
            | 42                            14 |    
            | 43                            13 |    
            | 44                            12 |    
            \ 1  2  3  4  5  6  7  8  9  10 11 /
              --------------------------------  
                       G              T  T  T  
                       N              D  M  C  
                       D              I  S  K  
                                               
    
    Device : XC9572XL-5-VQ64
    I/O : 52
                                                     
                                   G           V     
                                   N           C     
                                   D           C     
              -----------------------------------------------  
             /48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 \
            | 49                                           32 |
            | 50                                           31 |
            | 51                                           30 | TCK
            | 52                                           29 | TMS
        TDO | 53                                           28 | TDI
        GND | 54                                           27 |    
        VCC | 55                                           26 | VCC
            | 56               XC9572XL-5-VQ64             25 |    
            | 57                                           24 |    
            | 58                                           23 |    
            | 59                                           22 |    
            | 60                                           21 | GND
            | 61                                           20 |    
            | 62                                           19 |    
            | 63                                           18 |    
            | 64                                           17 |    
            \ 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 /
              -----------------------------------------------  
                    V                                G        
                    C                                N        
                    C                                D        
                                                              
    
    Legend :  
                  = Tie pin to GND or board trace driven to valid logic level
             VCC  = Dedicated Power Pin
             GND  = Dedicated Ground Pin
    
             TDI  = Test Data In, JTAG pin
             TDO  = Test Data Out, JTAG pin
             TCK  = Test Clock, JTAG pin
             TMS  = Test Mode Select, JTAG pin
    
    


    (最終更新 Thu Mar 30 19:20:58 2006)