最近ではPCの性能も上がり、ゲーム機のエミュレータを実行するのに実行速度の面では全く、問題はなくなってきました。エミュレータで遊ぶには正に好機です。ネックになるのはエミュレータで遊ぶためのコンテンツです。カートリッジの内容をPCに転送する必要があります。カートリッジの内容をPCに転送することを一般には吸出しと言います。タコの吸出し(タコ吸い)が祖先です。ここではUSB2.0を用いた
業界最速のGBA カートリッジ吸出しシステム
をご紹介します。
-
開発の動機
- USB2.0 に向くアプリケーション
ULAの開発を行った後で、USB を用いた各種のシステムを開発した後に次はどんなテーマを行うかを考えていました。ULAは USB1.1 を用いたシステムです。USB1.1 と来れば、次は 2.0 になるのは自然な流れです。問題は USB2.0 でどの様なシステムを組むか?と言うことです。あまりに汎用的なシステムではやりたいことがはっきりしないし、あるいはあまりにも特定の分野に偏っては大多数の人に受け入れてもらうことは出来ません。TeamKNOx の芸風はモバイル端末のプログラミングとそれに付随した電子工作や各種治具の開発ですからその路線を行うことにします。ULA でネックとなっていたのはカートリッジの吸出し速度です。実験的なシステムとしてもその遅さは明白です。
- 吸出し速度の比較
ブートケーブルの転送時間 (256Mbitフラッシュカートの読出し)
| ブートケーブル名 | 所要時間 | 転送速度 |
| PLA | 22分02秒 | 0.024 [MB/Sec] |
| ULA | 20分17秒 | 0.026 [MB/Sec] |
| BTU | 2分29秒 | 0.214 [MB/Sec] |
| ULA-FX | 5分20秒 | 0.086 [MB/Sec] |
*)http://mootan.hg.to/etc/ezusbfx.html より引用
- 決意
ULA は今から見るとけっこう痛いプログラミングですが、それでも遅すぎます。後発のブートケーブルに比べると一桁遅い環境になっています。もう少しナントカしたかったわけです。
- 開発の経緯(1)
USB2.0 でGBAカートリッジ読み出しシステムを構築するわけですが、ハードウェアは後述のアクセス方法を参考にして読み出し方法を決めました。USB2.0 は参考文献により読み出し方法はおおよそ掴めていましたので、FX2チップのGPIFを利用して、コントロールラインを使って /RD 信号を駆動することにしました。ただ、実際のファームウェアを制作するまでには技量的に足らず、あきらめかけていたのでした。基本的に FX2 などの EZ-USB のファームウェアの推奨開発環境は Keil の 8051 の開発システムです。サンプルアプリケーションなどは全てこのシステムで記述されています。商用のコンパイラのシステムですから、それなりの価格がします。Keil が購入できない場合は SDCC などのフリーコンパイラを利用するわけですが、KeilとSDCCでは記述方法に大きな違いがあり、そのままコンパイルできません。USB は PC と連動するシステムですから、PCとのやりとりの部分が多く、この部分を一から理解してスクラッチから記述するにはかなりの力量が要求されると思われます。(少なくとも拙には出来なかった。)
- 開発の経緯(2)
そんな失意の中、インターネット上で発見したのが、このシステムに含まれる、FX2の部分です。いくつか動作に不具合がありましたが、SDCC で動作させることが可能になりました。ただ、この時点でも最速吸出しを可能にするための GPIF の理解はほとんど進みませんでした。
- 開発の経緯(3)
ほとんど、忘れ去られた中で TeamKNOx のフォーラムを立ち上げました。現在のチームの活動は多岐に渡っています。問い合わせのメールなどを数多くいただきますが、それらの中には色々な人と共有した方が良い情報も数多く含まれています。そういった情報共有の場を作るためにフォーラムを設立したわけです。その中に電子工作のフォーラムがありますが、その中で FX2 のファームに詳しい方が現れたので今回のプロジェクトがシステムレベルで実現したわけです。
-
ハードウェアの変遷
ハードウェアの結線は基本的に全て、同一です。コネクタの実装方法などが異なっています。
- 初号機
記念すべき初号機。GB用のコネクタを用いたために GBA とうまく嵌合出来なかったため、コネクタを削るも削りが悪かったために接触不良が発生して、データの読み出しが出来ませんでした。弐号機と共にポート/GPIF切り替えのためのジャンパセレクトがあります。その後の調整により、正しく読み取れるようになりました。
- 弐号機
初号機のクローンです。共同開発者のN.I.氏に貸し出してファームの開発用に利用されました。コネクタの追加工などは行っていないのでそのままではGBAのカートリッジはうまく嵌合できません。氏は無理に嵌めて、カートリッジを割ってしまったそうです。ロジアナでの解析・測定用のプローブをハンダ付けしてあります。その他にもファームウェアのダウンロード用のEEPROMが実装できるようになっています。
- 参号機
-
動作原理
-
理論限界値
- データの流れ
ブートケーブルシステムはGBA自身でのプログラム実行によりカートリッジ内容を通信端子を経由して外部へ送出します。ボトルネックはケーブルの伝送速度です。これ以上は速くなりません。そこで、USB2.0ではカートリッジ直結のシステムを考えることにします。システムを構築すると必ず、理論限界値が発生します。一番遅い部分に引きずられてしまうのです。今回の目標はシステムで一番遅い部分に焦点を当てて、その部分の速度まで吸出し速度を高めることを目標にしました。PCのシステムには様々な速度表示があります。CPUでは 3.2GHz とかネットワークでは 100Mbpsなどです。USB2.0 では 480Mbps ですね。バイト換算では 60MB/Sec になります。GBAのカートリッジの容量を 8MB として換算すれば、0.14 秒で吸出せることになりますが、現実はそうではありません。なぜでしょうか?先ほど、「システムの一番遅い部分に引きずられる」と言いました。今回のシステムで一番、遅い部分はどこでしょうか?データの流れを順番に考えてみることにします。
カートリッジ(ROM) → FX2チップ → USB2.0chip → ハードディスク(ファイル化)
になります。
- アクセス速度
カートリッジ内にはROMチップが実装されています。このROMにも読み出し速度があるわけです。ポケモンルビーだとROMチップ上に以下のマーキングがしてあります。(ロットによって変わる可能性あり)
MX29L010TC-15
末尾の-15はアクセス速度を表します。このアクセス速度は 150ns と言うことになります。
- 分周比(Pre-Scaler)
150ns = 150 * (1 / 1000 / 1000 / 1000)
6.67MHz = 1 / 150ns
ただし、ファームウェアで実際に出せる /RD のクロックは原発振の 48MHz の分周になります。
145.83ns = 6.85MHz = 48MHz / 7
166.67ns = 6.00MHz = 48MHz / 8
この場合だと分周比(Pre-Scaler) を基本的には 8 にする必要があります。ホストソフトからこの分周比を設定することが出来ます。このメモリは2バイトアクセスですので、約12MB/sec がROMの最大読み出し速度になります。これ以上のクロックスピードではデータ読み出しが保障されません。システム的には分周比は2からセットすることになります。この速度ではもちろん、読出しは出来ませんが分周比を振ることにより、チップの実力を測ることも可能になります。(実力的には分周比 = 3 で読み出せるカートリッジもあります。)
- 転送速度
今回の実験で得られた最大スピードは 7MB/sec になります。12MB/secとはまだ開きがあります。この差を詰めるべく、改良を続けています。ただ、前述の 7MB/sec もPC環境によって大きく左右されます。筆者が計測した中では下は 5MB/sec 程度のものもあります。
-
ホストソフトウェア
ホストソフトウェアの見た目は非常にシンプルですが、機能は過不足なく詰め込んであります。本ソフトウェアはマルチスレッド対応になっており、UIの操作性を犠牲にすることなく、データの読み込みが高速に行えるようになっています。また、FX2 の制御に関しても新型クラスライブラリを用いることにより、少ないオーバーヘッドで制御可能です。このクラスライブラリは FX2 だけではなく、EZ-USB(AN21xx)でも利用可能になっています。
- 構成
- 初期設定
- ファームウェアのダウンロード
- リナミュレーション
- カートリッジヘッダー情報の取得
- カートリッジ内容セーブファイルネームの決定
- ROM 容量測定
- スレッドによるFX2読み込みループ
- 読み出し速度の測定方法
今後、USB2.0(FX2) を用いた吸出しシステムが各所よりリリースされると思います。(先日も某チームにホストソフトウェアの技術供与をしました。)その中で重要なのは吸出し時間の測定方法です。吸出し時間の定義として、
データを読み出してからファイルとしてセーブするまで。
があります。吸出し時間の比較をするために是非、この辺のコンディショニングは押さえて頂きたいと考えています。
- UI の変遷
- 最初のバージョン
シンプルなUI、カートリッジ内のROMのアクセススピードは1種類のみ対応。
- 分周設定実験バージョン
分周比を設定できるようにした。ちょっと、やっつけっぽい仕上がり…。
- 最新バージョン
-
スピード記録
-
吸出しの思ひ出
- タコ吸い
タコ吸いはファミコンの吸出しシステムとして、非常に有名です。筆者がまだオニ厨だった頃にバッ活に載っていて凄いなぁーと感心したことがあります。それから月日が経ち、タコ吸い2003 として自分自身で復活させたわけです。
- 鬼吸い
今回はタコ吸い2003から更に2年が経過したわけですが、良いものが出来て良かったと思います。コンピュータの原理を理解するのにアドレスバス、データバスを意識して製作する吸出し(機)は最適です。特に昨今のようにエミュレータが使える場合は吸い出した成果物を実際に試すことが出来ます。
-
参考文献
-
謝辞
共同開発を名乗り出てきてくれたN.I.氏、アイコンを使用させていただいているYoshiくん氏、その他アドバイスをくれた開発者の皆様、フリーの素材を提供されているサイトの方々に感謝します。
|