先日紹介した,ゲーム ROM 吸出し機「BASIL」ですが,もう少し改良してみました。まだ配布できる状況じゃないけれど(その前にこんなもん作らんか),なかなかうまく動いています。今回は,ひとまず経過報告ということで……。
上の図は,「遊戯王デュエルモンスターズ2」なるものを吸い出してみたところです。うまく動きました。でも……,あたし,この漫画ぜんぜん知らないんですよね……。どうやって遊ぶんですか?これ……。
ちょっと起動してみたところ,
デッキキャパシティーがたりないみたいだ
などと,わけの分からない文句を言われどおしなので,「ムキッ」ときて止めちゃいました(←逆ギレ)。なんなんですか,デッキキャパシティーって……。
今回の改良点でもっとも大きかったのは,BASIL のプログラムに bulk_read ルーチンを加えたところです。これは,1回の命令で,データを 256byte 読んで返すというものです。ゲームボーイは,ROM 1bank あたり 16KByte の容量があるから,64回命令を送れば 1bank 分のデータを読み出せるという寸法です。
16KByte あると分かっているなら,一遍に 16KByte 分読めば良さそうなものですけれど,将来的にファミコンの ROM も読みたいので,適当なところで切っておいたというわけです。
さて,この bulk_read,威力はてき面でした。前回は,いくらクリスタルを速くしても,8bank(128KByte)を読むのに20分近くかかるという体たらくでした。けれど,bulk_read で読んだところ,8bank を15秒強で読めるようになりました。「分」じゃないです,「秒」です。びっくりですね……。UART の性能を十分発揮しているようです。
なんで前回のインクリメントしながら読む方法が駄目だったのかを想像してみるに,「小さなデータを細切れに送受信」していたところがいけなかったみたいです。このせいで,ドライバ側のオーバヘッドがふくらんでしまったんじゃないでしょうか。いや……sio のソース読んでないし,詳しいところはよく分からないんですけどね……。もしそうなら,1回に読み出す量を増やせば,もう少し高速に通信できるかもしれませんね。
冒頭で吸い出した,「遊戯王2」も,MBC5 256bank(4MByte)という難物でしたけれど,8分11秒と好成績でした。
他にやったことは,
bgb が ROM ONLY,MBC1,MBC2,MBC3,MBC5 の ROM リードに対応
BASIL のクリスタルを 7.3728MHz に変更
上の変更に伴って UART を 115200bps (Error rate 0.0%)に変更
bgb の create_file_name() 関数のバグを修正
といったところです。ROM を読むところまでは,大分環境として整ってきた感じがします。
そのうち,暇を見つけて紹介します。