ゲームボーイアドバンスは、GCC で ソフト開発できるらしい。
GBA のスペックは、
参考:
1 VCC(3.3V) 2 PHI ??? 3 /WR 4 /RD 5 /CSROM 6-21 A0 - A15/D0 - D15(for ROM) 22-29 A16 - A23/D0 - D7(for RAM) 30 /CSRAM 31 IREG/DREG ??? 32 GNDだそうだ。ROM では、Data bus と Adress bus が マルチプレクスされている。
マスク ROM 32 pin MBC1 24 pin が主要な部品。基板には、DMG-BEAN-02 と書いてある。
マスクROM 2M/4M/8M 32 pin MBC-5 32 pin SRAM 64K bit 28 pin MM1134A 8pin ?? 電池 CR 1616 が主要な部品。基板には、DMG-A6-01 とか DMG-A2-01 とか 書いてある。
なるほど、あたらしいものは、SRAM が足りないから 増やしているわけか。 MM1134A は? なんか SRAM を バックアップするための デバイスのように 見える。
マスクROM 4M/8M 32 pin MBC-7 64 pin(?) EEPROM 8 pin ADXL202 14 pin (加速度センサ) が主要な部品。基板には、DMG-A40-01 と書いてある。
GB は歴史が長いから、いろんなタイプのカセットがありそうだが... GBA はみな一緒だと思っていた
3 つ 空けてみたら 全部ちがった。
MASK ROM 44pin 4K/64K EE-PROM 8pin
いまはシリアル接続の EE-PROM がある。汎用品をつかっているようだ。 それはともかく、そんなものをバスに直結できるはずがない。 MASK ROM とは書いてあるが、汎用品ではなくて ASIC なのだろう。
MASK ROM 44 pin 512K FLASH (39VF512) 32 pin ?
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 出せそう。
なんかこんな感じで MMC 用のハード作ったら どうかな。
ROM のアクセス
/CSROM ~~~~~~~~~~↓___________________↑~~~~~~~~~~~~~~~~~~ (1) (4) /RD ~~~~~~~~~~~~~~↓_↑~~~~↓_↑~~~~~~~~~~~~~~ (2) (3)
RAM のアクセス
なんかこんな感じらしい。
メモリマップは、
だそうだ。ROM の 3 つのエリアはどこも同じイメージ?
だいたい規模だけ合わせた回路図(バグバグってこと)を書いてみた。
64 bytes でブートシーケンスが作れるならば、OK。128 bytes RANDOM は 入らなかった。96バイト(最後の32バイトは 0) としたら
となった。とりあえず、これベースを考えよう。
うーん。64 バイトでは、ちょっとしたプログラムも動くような気がしない。 どうしたものか... と思って他の chip をためしてみたら
Macrocells 36/72 (50%) Product Terms 319/360 (88%) Registers 33/72 (45%) Function Block 77/216 (35%) よくわからんが、Product Terms ってのが ネックになるのか。 これ以上ははいらなそう。
Macrocells 41/144 (28%) Product Terms 583/720 (80%) Registers 33/144 (22%) Function Block 134/432 (31%)
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 はどうやって指定するんだろう。
../configure --prefix=/usr/cross --target=mipsel-elf \ --with-newlib --disable-threads --enable-languages="c"
でエラーになる。... うーん。--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 部分を分けて書き直し。ついでにロジックもみなおし。
回路図
なかなか 思うようなものにならない。
(希望する)仕様
MMC_CLK ----+ +------------ | | +--------+ @ @ | | bit 7 出力 シフトして bit 0 取りこみ
回路全体は、XC9572XL 44 pin に入る。MMC 部分のみなら XC9536XL 44 pin に入る。
ただ、GBA のカセットと SD/MMC スロットを比べてみると
もし自分で基板をおこしたとしても 、標準のカセットには入らない。 ( ネジが邪魔 だし、若干 高さがある。 ) ... GB のカセットに 加工して入れるのかなぁ。
FLS007-30(手差し型) だそうだ。 手許にあるのは、FPS009-24(SD 背低プッシュ型 ) らしい。
とりあえず ブートプログラム らしきものを 作ってコンパイルしてみた。
arm-thumb-elf-gcc -mthumb -O -c mb003.c
static const void *clk_addr = 0x0d000000; static const void *dev_addr = 0x0e007fff; static const void *ram_addr = 0x0a000000; static const char data[3][3] = { { 0x40, 0x95, 0x01 }, { 0x41, 0xff, 0x00 }, { 0x51, 0xff, 0x00 } }; static inline void mmc_cs(char data) { /* 0xff or 0x00 */ *((volatile char *)(dev_addr+1)) = data; } static int mmc_send(char data) { int i,x =0 ; *((volatile char *)(dev_addr)) = data; for (i=0; i<8; i++) { *((volatile short *)clk_addr = 0); } return *((volatile char *)(dev_addr)); } static int mmc_cmd(const char *data) { int i; mmc_send(0x00); mmc_send(data[0]); for (i=0; i<4; i++) { mmc_send(0x00); } while (mmc_send(data[1]) != data[2]) ; } mmcboot() { int i; char *ram = ram_addr; mmc_cs(0xff); for (i=0; i<10; i++) { mmc_send(0xff); } mmc_cmd(data[0]); mmc_cmd(data[1]); mmc_cmd(data[2]); while (mmc_send(0x00) != 0xfe) ; for (i=0; i<512; i++) { *ram++ = mmc_send(0xff); } mmc_send(0xff); mmc_send(0xff); }
00000000 <mmc_send>: 0: b500 push {lr} 2: 0600 lsl r0, r0, #24 4: 0e00 lsr r0, r0, #24 6: 4b07 ldr r3, [pc, #28] (24 <mmc_send+0x24>) 8: 681b ldr r3, [r3, #0] a: 7018 strb r0, [r3, #0] c: 2100 mov r1, #0 e: 4806 ldr r0, [pc, #24] (28 <mmc_send+0x28>) 10: 2200 mov r2, #0 12: 6002 str r2, [r0, #0] 14: 8813 ldrh r3, [r2, #0] 16: 3101 add r1, #1 18: 2907 cmp r1, #7 1a: ddfa ble 12 <mmc_send+0x12> 1c: 4b01 ldr r3, [pc, #4] (24 <mmc_send+0x24>) 1e: 681b ldr r3, [r3, #0] 20: 7818 ldrb r0, [r3, #0] 22: bd00 pop {pc} 24: 0004 lsl r4, r0, #0 26: 0000 lsl r0, r0, #0 28: 0000 lsl r0, r0, #0 ... 0000002c <mmc_cmd>: 2c: b530 push {r4, r5, lr} 2e: 1c05 mov r5, r0 (add r5, r0, #0) 30: 2000 mov r0, #0 32: fffef7ff bl 0 <mmc_send> 36: 7828 ldrb r0, [r5, #0] 38: fffef7ff bl 0 <mmc_send> 3c: 2400 mov r4, #0 3e: 2000 mov r0, #0 40: fffef7ff bl 0 <mmc_send> 44: 3401 add r4, #1 46: 2c03 cmp r4, #3 48: ddf9 ble 3e <mmc_cmd+0x12> 4a: 7868 ldrb r0, [r5, #1] 4c: fffef7ff bl 0 <mmc_send> 50: 78ab ldrb r3, [r5, #2] 52: 4298 cmp r0, r3 54: d1f9 bne 4a <mmc_cmd+0x1e> 56: bd30 pop {r4, r5, pc} 00000058 <mmcboot>: 58: b570 push {r4, r5, r6, lr} 5a: 4b17 ldr r3, [pc, #92] (b8 <mmcboot+0x60>) 5c: 681e ldr r6, [r3, #0] 5e: 4b17 ldr r3, [pc, #92] (bc <mmcboot+0x64>) 60: 681a ldr r2, [r3, #0] 62: 23ff mov r3, #255 64: 7053 strb r3, [r2, #1] 66: 2500 mov r5, #0 68: 20ff mov r0, #255 6a: fffef7ff bl 0 <mmc_send> 6e: 3501 add r5, #1 70: 2d09 cmp r5, #9 72: ddf9 ble 68 <mmcboot+0x10> 74: 4c12 ldr r4, [pc, #72] (c0 <mmcboot+0x68>) 76: 1c20 mov r0, r4 (add r0, r4, #0) 78: fffef7ff bl 0 <mmc_send> 7c: 1ce0 add r0, r4, #3 7e: fffef7ff bl 0 <mmc_send> 82: 3406 add r4, #6 84: 1c20 mov r0, r4 (add r0, r4, #0) 86: fffef7ff bl 0 <mmc_send> 8a: 2000 mov r0, #0 8c: fffef7ff bl 0 <mmc_send> 90: 28fe cmp r0, #254 92: d1fa bne 8a <mmcboot+0x32> 94: 2500 mov r5, #0 96: 1c34 mov r4, r6 (add r4, r6, #0) 98: 3601 add r6, #1 9a: 20ff mov r0, #255 9c: fffef7ff bl 0 <mmc_send> a0: 7020 strb r0, [r4, #0] a2: 3501 add r5, #1 a4: 4b07 ldr r3, [pc, #28] (c4 <mmcboot+0x6c>) a6: 429d cmp r5, r3 a8: ddf5 ble 96 <mmcboot+0x3e> aa: 20ff mov r0, #255 ac: fffef7ff bl 0 <mmc_send> b0: 20ff mov r0, #255 b2: fffef7ff bl 0 <mmc_send> b6: bd70 pop {r4, r5, r6, pc} b8: 0008 lsl r0, r1, #0 ba: 0000 lsl r0, r0, #0 bc: 0004 lsl r4, r0, #0 be: 0000 lsl r0, r0, #0 c0: 0000 lsl r0, r0, #0 c2: 0000 lsl r0, r0, #0 c4: 01ff lsl r7, r7, #7
ううむ。C で書いて、210 バイト程なら 最適化 がんばれば良いのだろうか? それとも、他に初期化必要っぽいし、厳しいのか? なんか微妙なかんじだ。
最適化したら、かなり小さくなった。138バイト
00000000 <mmcboot>: 0: 4c1f ldr r4, [pc, #124] (80 <dev_addr>) 2: 4d1e ldr r5, [pc, #120] (7c <clk_addr>) 4: 23ff mov r3, #255 6: 7063 strb r3, [r4, #1] 8: 2650 mov r6, #80 a: 8028 strh r0, [r5, #0] c: 3e01 sub r6, #1 e: ddfc ble a <mmcboot+0xa> 10: 2300 mov r3, #0 12: 7063 strb r3, [r4, #1] 14: a61d add r6, pc, #116 (adr r6,8c <data+0x2>) 00000016 <.cpc>: 16: 2703 mov r7, #3 18: 20ff mov r0, #255 1a: fffef7ff bl 0 <mmcboot> 1e: 7830 ldrb r0, [r6, #0] 20: fffef7ff bl 0 <mmcboot> 24: 2304 mov r3, #4 26: 2000 mov r0, #0 28: fffef7ff bl 0 <mmcboot> 2c: 3b01 sub r3, #1 2e: ddfa ble 26 <.cpc+0x10> 30: 7870 ldrb r0, [r6, #1] 32: fffef7ff bl 0 <mmcboot> 36: 78b3 ldrb r3, [r6, #2] 38: 4298 cmp r0, r3 3a: d1f9 bne 30 <.cpc+0x1a> 3c: 1cf0 add r0, r6, #3 3e: 3f01 sub r7, #1 40: ddea ble 18 <.cpc+0x2> 42: 2000 mov r0, #0 44: fffef7ff bl 0 <mmcboot> 48: 28fe cmp r0, #254 4a: d1fa bne 42 <.cpc+0x2c> 4c: 4e0e ldr r6, [pc, #56] (88 <d512>) 4e: 4a0d ldr r2, [pc, #52] (84 <ram_addr>) 50: fffef7ff bl 0 <mmcboot> 54: 7010 strb r0, [r2, #0] 56: 3201 add r2, #1 58: 3e01 sub r6, #1 5a: ddf9 ble 50 <.cpc+0x3a> 5c: fffef7ff bl 0 <mmcboot> 60: fffef7ff bl 0 <mmcboot> 64: 4a07 ldr r2, [pc, #28] (84 <ram_addr>) 66: 4697 mov pc, r2 00000068 <mmc_send0>: 68: 20ff mov r0, #255 6a: 46c0 nop (mov r8, r8) 0000006c <mmc_send>: 6c: b502 push {r1, lr} 6e: 7020 strb r0, [r4, #0] 70: 2108 mov r1, #8 72: 8028 strh r0, [r5, #0] 74: 3901 sub r1, #1 76: ddfc ble 72 <mmc_send+0x6> 78: 7820 ldrb r0, [r4, #0] 7a: bd02 pop {r1, pc} 0000007c <clk_addr>: 7c: 0000 7e: 0d00 00000080 <dev_addr>: 80: 7fff 82: 0e00 00000084 <ram_addr>: 84: 0000 86: 0a00 00000088 <d512>: 88: 0200 0000008a <data>: 8a: 9540 8c: 4101 8e: 00ff 90: ff51 92: 0000
プログラムを冷静に見てみると
次は、プログラムを小さくできるような 回路を考えてみることにしよう。
どうしてもダメか 回路をみなおして、再度コードをチューニング
00008000 <_start>: 8000: 200e mov r0, #14 8002: 0604 lsl r4, r0, #24 8004: 250a mov r5, #10 8006: a61a add r6, pc, #104 (adr r6,8070 <data>) 00008008 <.cpc>: 8008: 2703 mov r7, #3 800a: 20ff mov r0, #255 800c: 7060 strb r0, [r4, #1] 800e: 2650 mov r6, #80 8010: 7020 strb r0, [r4, #0] 8012: 3e01 sub r6, #1 8014: ddfc ble 8010 <.cpc+0x8> 8016: 2000 mov r0, #0 8018: 7060 strb r0, [r4, #1] 801a: 7830 ldrb r0, [r6, #0] 801c: f820f000 bl 8060 <mmc_send> 8020: 2304 mov r3, #4 8022: 2000 mov r0, #0 8024: f81cf000 bl 8060 <mmc_send> 8028: 3b01 sub r3, #1 802a: ddfa ble 8022 <.cpc+0x1a> 802c: 7870 ldrb r0, [r6, #1] 802e: f817f000 bl 8060 <mmc_send> 8032: 78b3 ldrb r3, [r6, #2] 8034: 4298 cmp r0, r3 8036: d1f9 bne 802c <.cpc+0x24> 8038: 1cf0 add r0, r6, #3 803a: 3f01 sub r7, #1 803c: dde5 ble 800a <.cpc+0x2> 803e: 2000 mov r0, #0 8040: f80ef000 bl 8060 <mmc_send> 8044: 28fe cmp r0, #254 8046: d1fa bne 803e <.cpc+0x36> 8048: 062a lsl r2, r5, #24 804a: 2604 mov r6, #4 804c: 0236 lsl r6, r6, #8 804e: 2000 mov r0, #0 8050: f806f000 bl 8060 <mmc_send> 8054: 7010 strb r0, [r2, #0] 8056: 3201 add r2, #1 8058: 3e01 sub r6, #1 805a: ddf8 ble 804e <.cpc+0x46> 805c: 062a lsl r2, r5, #24 805e: 4697 mov pc, r2 00008060 <mmc_send>: 8060: b502 push {r1, lr} 8062: 7020 strb r0, [r4, #0] 8064: 2108 mov r1, #8 8066: 7020 strb r0, [r4, #0] 8068: 3901 sub r1, #1 806a: ddfc ble 8066 <mmc_send+0x6> 806c: 78a0 ldrb r0, [r4, #2] 806e: bd02 pop {r1, pc} 00008070 <data>: 8070: 9540 8072: 4101 8074: 00ff 8076: ff51 8078: 0000
後始末を 放棄して、とにかく 1セクタだけ ロードして 跳ぶというコード。 これだと 122 バイトにおさまった。
cpldfit: version E.37 Xilinx Inc. Fitter Report Design Name: main Date: 6-18-2002, 7:37PM Device Used: XC9572XL-5-PC44 Fitting Status: Successful **************************** Resource Summary **************************** Macrocells Product Terms Registers Pins Function Block Used Used Used Used Inputs Used 35 /72 ( 48%) 293 /360 ( 81%) 34 /72 ( 47%) 32 /34 ( 94%) 66 /216 ( 30%)
上記のコードで rom データを作りなおすと、余裕っぽい結果になった。
じゃあってことで、後始末をいれて、頭にオマジナイを入れてみる。
cpldfit: version E.37 Xilinx Inc. Fitter Report Design Name: main_k Date: 6-18-2002, 8:55PM Device Used: XC9572XL-5-PC44 Fitting Status: Successful **************************** Resource Summary **************************** Macrocells Product Terms Registers Pins Function Block Used Used Used Used Inputs Used 35 /72 ( 48%) 326 /360 ( 90%) 34 /72 ( 47%) 32 /34 ( 94%) 70 /216 ( 32%)
なんかギリギリだ。ちょっと 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