2018年09月24日

GBのカートリッジ制作メモ

GBのカートリッジ制作メモ

ゲームボーイのカートリッジを制作したのでメモ。いつものようにカセットからフラットケーブル(IDEケーブル)を生やす方式。
材料は遊戯王 デュエルモンスターズII。MBC5が搭載で32MbitのROMが乗っている。多量に出回っており投げ売りされているので採用。
目標はLSDjを動作させること。

制作手順:

1. 部品の取り外し
 SRAMはマチ針などで足に負荷をかけながら半田ごてで熱を加えるときれいに外れる。
 ROMも同様だが、再利用は不能なので破壊して外すのが楽。ミニルータにディスクカッターを取り付けてICの足に当てると面白いぐらい簡単に外せる。

2. SRAMの取り付け
 ROM(フラットケーブル)より先にこちらを接続した方が楽。LSDJは1Mbit(128KB)のSRAMを必要とするので用意しておく。
 1MbitのSRAMは取り外したSRAMより幅が広く、そのままではパターンからはみ出てしまうが、足を内側に曲げれば何とか収まる。これで余計な配線をしなくても済む。
 もともとついていたSRAMが6264で交換するのが621024の場合、621024のピン番号で3(A14), 30(CE2), 28(A13)が6264と配置が違う。なので足を上げておく。
 MBC5のA13-A16はパターンすらないこともあるので自力で配線をする必要がある。UEWを使って何とか配線ができた。

3. ROMの取り付け
 フラットケーブルを取り付ける。ROMのパターンにフラットケーブルを直付けするとパターンがはがれてしまった。
 スルーホールに配線するといい感じになった。
 GBのROMのピンアサインは↓のようになっている。

GB44PIN.png

以上です。
posted by RGBA_CRT at 20:19| Comment(0) | レトロゲーカセット自作 | 更新情報をチェックする

2018年09月17日

FT232Hを使ったGB吸出し機

FT232Hを使ったGB吸出し機

手持ちの部品でGBの吸出し機を作ってみました。
回路は自作ROMライターの回路(データバス8ビット, アドレスバス24ビット)をそのまま使用し、GBのスロットをアダプターとして使用しました。

特徴:

  • 部品が少ない&回路がシンプル
  • USB接続で高速(256kb/s)
  • MBC2のセーブ読み書きに非対応
  • GBAにも対応予定


リポジトリ:


部品:


制作方法:

具体的な制作方法はGitHub



GBD.jpg
GBD_SS.png


以上です。
posted by RGBA_CRT at 17:56| Comment(0) | 吸出し機 | 更新情報をチェックする

SFC用SA1カートリッジを作る

SFC用SA1カートリッジを作る

LoROM, HiROMのカートリッジは簡単に制作できたが、SA1は難しかったのでメモ。
目標はカービィ3のデバッグバージョンを動作させることと、マリオワールドのSA1ハックを動作させること。

材料:

・SA1のカセット
 安くてよく出回っているシャイニングスコーピオンを選択
・ROM
 スーファミ的にもちょうどいい32Mbit(4MB)のEPROMである27C322を選択
 フラッシュメモリはDIPじゃないので配線をしたくなかった
・バッテリーバックアップ対応のSRAM(1Mbit)
・↑の二つを接続する基板とケーブル
 ケーブルはIDEケーブルを選択。通常ROMはカセットに内蔵するが、
 カセットからIDEケーブルを生やして接続する方が手軽でおすすめ。
 IDEケーブルは40芯タイプ(40ピン全てが結線されているもの)が必要。


制作手順:

1.まずカートリッジを制作
 ROMを取り外し、IDEケーブルをROMに配線する。
 ピンアサインは↓の16bit版のようにした。SA1はCE OE WEが固定されているのでケーブルにつなげる必要はない。

2. ROM基板を作る
 27C322を二つ使って8MBに対応したので結構な配線量になった。4MBでもかなりきついと思われる。


3.動作確認
 動作確認をしてみると、 SA1 Speed Test Toolカービィ3のデバッグバージョンが動作した。

 しかし Touhou MarioVLDC8は動作しなかった。

4.BW-RAMの拡張
 いろいろ調べているうちに、BW-RAMが256kbitしかないことが原因であることがわかった。
 SMWのSA1ハックは1MbitのBW-RAMが必要なので交換する。


 こうすることでいろいろと動作するようになった。


 Touhou Marioなど古いSA-1 Patchを使ったハックでは初期化処理が甘いようで、
 Super Mario Legacyを起動した後、電源を切らずにROMを切り替えてリセットするという操作をしないと起動しなかった。


以上です。
posted by RGBA_CRT at 15:49| Comment(0) | レトロゲーカセット自作 | 更新情報をチェックする

2018年08月24日

身近な部品でGBA SPとDSiの充電をする

身近な部品でGBA SPとDSiの充電をする

GBA SPとDSiがかなり安く売っていたので買ってみた。
買ったは良いものの充電器を持っていないので適当な部品で充電をすることにしたのでメモ。
※火災・機器の破損をする可能性が非常に高いので、この記事に書いてあることを実行する場合は自己責任でかつ慎重にやってください。

GBA SPは充電電圧は5.2V、DSiは4.6VなのでUSBからの給電で対処できる。DSiの場合は降圧回路を入れた方が安全。

SPの充電端子は、USB TypeAのVCC,GNDの幅とほぼ同じで使用可能だった。
ジャンクのUSB3.0コネクタから金属を取り払い、それにUSB Micro B端子をくっつけた。

SPCCH2.jpg  SPCH1.jpg

これでスマホ用の充電器が使える。

DSiの充電端子は、本来の接触面の裏側に四角い穴からアクセスすることができる。
適当な抵抗を挿してみるとぴったりはまったためそのまま充電してみた。

SPCH3.png


降圧回路を組むのが面倒なので、電源装置から約4.6Vを出力。
SPCH4.jpg

成功。以上です。

posted by RGBA_CRT at 16:20| Comment(0) | 電子工作 | 更新情報をチェックする

2018年03月24日

UxROMにPRG-RAMを追加

UxROMにPRG-RAMを追加

UxROMとはファミコンカセットの基板の1つであり、エミュではマッパー2と呼ばれるものです。ドラクエ2や星をみるひと、ガリウスに採用されています。
この基板はセーブ用のSRAM(バッテリーバックアップされたPRG-RAM)がありません。このため、UxROMのゲームはパスワード方式が採用されていました。

ドラクエ2や星をみるひとはSRAMセーブパッチが出ているようなので、前回作成したUxROMフラッシュカートリッジにSRAMとコイン電池を追加し、実機でセーブ出来るようにしたいと思います。

2018/3/27追記:
記念にガリウスのセーブパッチ作りました。>RHDN - ガリウスセーブパッチ

技術的な話

ファミコンでは、メモリ空間の6000h-7FFFhがセーブ用領域になっています。エミュレータでもこのエリアがファイルに保存されます。 アドレスが6000h-7FFFhなので、上位4ビットが6h~7h つまり 011xbの時、SRAMの/CEをアクティブにすればセーブができるようになります。

カセットから見て、PRGはA15がなく、/ROMCSになっています。つまりA15の論理否定です。なので、/ROMCSとA14とA13が全て'1'になった時に/SRAMCSを'0'にすれば良いです。入力全てが1の時だけ0を出力するのはNANDゲートなので、3入力NANDがあればこの回路を実装できます。

ただし、後述のnesdev wikiではM2(phi, CPUクロック)も入力の対象としています。これでNANDゲートへの入力は4つになります。理由についてはよくわからないです。(リセットボタン関係?)

制作

nesdev wikiのPRG RAM circuitを見ると、3種類の回路が紹介されていました。今回は、手持ちにあった74HC139を使った回路で制作しました。

適当なジャンクカセットから引っこ抜いたSHARP LH5264T(6264互換)のアドレスバス・データバスを、UEWを使ってSST39SF040の裏側に配線しました。この時点でかなりのスパゲッティになり、不正な接続やUEWの被膜の傷が原因でカセット自体動作しなくなることがあるので注意です(1敗)

次に、/WEと/OEはフラッシュメモリがら拝借。/CEは上記の74HC139回路の出力を使用。CE2はVCC固定で、/CEはVCCでプルアップします。GNDはそのままで、VCCはnesdev wikiを参考に、ダイオード経由で供給します。そうしないと電源OFF時にコイン電池がPRG-ROMやCHR-RAMにまで給電してしまいます。


unrom-prgram.jpg
非常に雑な配線の様子


動作確認

配線が完了したら、動作確認をします。DQ2だいぶ拡張パッチを適用したドラクエ2を書き込んで動作確認してみました。

ゲームを開始して、復活の呪文を聞いてリセット。そして復活の呪文を入力せずに「おわる」を選んでゲーム開始ができれば成功です。また、電源を切ってしばらく待ってから同じことができればOKです。
あとは、カセットに収めれば完成です。私はCHR-RAMが表面実装の物だったのでその裏にDIPタイプのSRAMが入りましたが、そうでない場合は入りきらないかもしれません。私の場合でもカセットがパンパンになって基板が反ってしまいました。


unrom-prgram2.jpg
詰め込んだ様子(PRG-RAMはCHR-RAMの下)


だいぶ雑なメモですが以上です。
posted by RGBA_CRT at 02:11| Comment(0) | レトロゲーカセット自作 | 更新情報をチェックする

2018年03月19日

UxROMのFlashカートリッジ制作

UxROMのFlashカートリッジ制作

UNROM基板+SST39SF040でFlashカートリッジを作ったのでメモです。

UxROMについて

(雑に調べたのでまちがってるかも)
UxROMはCHR-RAM搭載でPRG-ROMがバンク切り替え可能、UNROMが128KB(1Mbit)まで、UOROMが256KB(2Mbit)までという仕様の物です。UNROM 512というものがあるようですが互換性はないみたいです。

PRGはROM空間8000h-FFFFhの32KBのうち、16KBの可変領域+16KBの固定領域という構成になっています。8000hに向かってバンク番号を書き込めば、下位3-4ビットが記憶され、切り替えられます。
ブロック図は以下(NESDEVより)


UNROM.png

A14が'0'であればregisterの値がそのままROMのA14-A17へ伝わります。A14が'1'になるとORゲートによってregisterの値は全て'1'となるため、ROMのA17-A14は全て'1111'に固定されます。
つまり、2A03が8000h-BFFFhにアクセスしているときは可変バンク(=registerにより指定されるアドレス)にアクセスされ、C000h-FFFFhにアクセスしているときはROMの最後の16KBにアクセスされることになります。


UxROM Flash カートリッジの制作

基本的にunagi flashmemory hikiにしたがって作ります。UOROMを使うと良いとありますが、入手性のよいUNROMのカートリッジを使いました。カセットの殻を削れば基板がおさまります。
MASK ROMを剥がし、SST39SF040を載せ、OEやA16-A17 /WEを配線します。UNROMの場合はA17用の回路が無いため、74hc161のD(pin6)を浮かしてCPU-D3へ、74hc32の空きポートの足を浮かせてCPU-A14と74hc161のQD(pin11)へ接続して出力をFlashメモリのA17へ接続します。あとは、hikiの通り74hc00で追加回路を組んで完了です。


LOGIC.png

ここで問題があります。hikiにも書いてありますが、SST39SF040はコマンドアドレスがA14:0なので書き込みができません。
Flashメモリはコマンドを使って消去、書き込み、識別などを行います。
Addr Data
5555h AAh
2AAAh 55h
5555h cmd
というような感じでコマンドを発行します。上は一例で、Flashメモリによってコマンドの形式は変わります。
hikiにはA10:0のコマンドアドレスのFlashメモリしか使えないと書いてあります。これはUxROMのブロック図を見てもらえばわかるとおり、A10-A0はROMに直結されているので問題なく使えるという意味です。
しかし、SST39SF040はA14:0です。A14はORゲートに接続しているのでFlashROMにコマンドが届きません。kazzoの仕様上コマンド発行中はバンク切り替えができません。
この問題はSST39SF040をはんだ付けしたあとに気づきました。絶望。


SST39SF040対応化

SST39SF040を剥がすのも面倒なので、無理やり書き込めるようにスイッチを追加しました。


SSTADD.png

このスイッチをGAMEにすると従来の16K+16K構成になり、PROGRAMにすると32KBの全面可変バンクになります。これでA14がFlashメモリに届くため、書き込みができるようになります。
スクリプトは以下のようになります。


Mapper2_unrom_flash_sst39sf040.ag
/* UxROM special mapping for A14:0 Flash Memory * [UxROM]variable bank 16k + fixed bank 16k * ==>[this]variable bank 32k * * 7 bit 0 * ---- ---- * xxxx PPPx * |||└ A14 from register (diabled) * +++-- Select 32 KB PRG ROM bank for CPU $8000-$FFFF */ board <- { mappernum = 2, vram_mirrorfind = true, ppu_ramfind = false, cpu_rom = { size_base = 1 * mega, size_max = 2 * mega, banksize = 0x4000 } , cpu_ram = { size_base = 0x2000, size_max = 0x2000 banksize = 0x2000 }, ppu_rom = { size_base = 0, size_max = 0, banksize = 0x2000 } }; function cpu_dump(d, pagesize, banksize) { for(local i = 0; i < pagesize - 1; i += 2){ cpu_write(d, 0x8000, i); cpu_read(d, 0x8000, banksize); cpu_read(d, 0xc000, banksize); } } function cpu_ram_access(d, pagesize, banksize) { cpu_ramrw(d, 0x6000, banksize); } function program_initalize(d, cpu_banksize, ppu_banksize) { cpu_write(d, 0x8000, 0); cpu_command(d, 0x0000, 0x8000, cpu_banksize); cpu_command(d, 0x2aaa, 0x8000, cpu_banksize); cpu_command(d, 0x5555, 0xc000, cpu_banksize); } function cpu_transfer(d, start, end, cpu_banksize) { for(local i = start; i < end - 1; i += 2){ cpu_write(d, 0x8000, i); cpu_program(d, 0x8000, cpu_banksize); cpu_program(d, 0xc000, cpu_banksize); } } function ppu_transfer(d, start, end, ppu_banksize) { }

pict_unrom.jpg
汚いけど製作例

以上です。

posted by RGBA_CRT at 02:20| Comment(0) | レトロゲーカセット自作 | 更新情報をチェックする

2018年01月21日

スーパーディスク メモ

リムーバブルディスクはロマン。ということで、今時になってスーパーディスクを購入したのでメモ。

FD32MB.png

スーパーディスクドライブ SDD-240USBSLを某サイトから2k円ほどで購入。スーパーディスクは持っていないので、速いFDD&FD32MBが目当てで購入。

Win7 64ビットにて、自動でドライバが入り、FDドライブAとリムーバブルドライブ(おそらくスーパーディスク用)がエクスプローラに出現。

2HDのFDの読み書きに成功。

FD32MBを試すべく、ドライバを探した。PanasonicやImationが配布していたSuperWrite32をダウンロードした。

再起動なしで、FD32MBのフォーマット、ディスクへの書き込みに成功。

その後再起動するとAドライブとリムーバブルドライブが消失していた。

どうやら、通常のMSドライバに被せて動作させるタイプのドライバらしく、追加ドライバが動作していない様子。これはSuperWriter32と、ドラッグ&ドロップ書き込みドライバーVer.1.00のどちらでも同じである。

再度ダウンロードしたインストーラを実行し、アンインストールすることでAドライブが復活。リムーバブルドライブが消えたが、Aドライブのフォーマットで120MB,200MB,240MBが選択できるようになっていた。FD32MBのディスクは普通に読めたので普通のFDDドライバでもFD32MBが読めるようだ(書き込めはしない)。

しかし、標準FDDドライバではSuperWriter32が動作しない。

FD32MB2.png

結局、アンインストール前にSuperWriter32だけ別の場所に退避しておき、ドライバだけ削除した。

そして、デバイスマネージャでドライバを、USBフロッピーディスクドライブから高密度フロッピーディスクドライブに変更することで、SuperWriter32を動作させることに成功。(SuperWriter32とMS標準ドライバに互換性があってびっくり)

Aドライブを右クリックしてソフトウェアからイジェクトできることも確認した。(ただし、起動時はメニューにイジェクトの項目が出なかったりする。SCSIコマンドのEjectは普通に使えるので、フリーソフトや自作でどうにかなる。)

これでソフトウェア環境は整った。

あとは、ガワを外してドライブを取り外し、古い3.5インチベイに内蔵するタイプのFDDの抜け殻に入れることで強引に内蔵化した。PCケースの3.5インチベイのフタに穴をあけて見た目もマシにした。(ただしイジェクトボタンが押せない。)FDDを現代のPCでも内蔵することが夢だったので、叶った。

オウルテックのUSB<->FDDインターフェース変換基板は入手困難だし、FD-05PCR(内蔵型USB2倍速FDD)の黒はオークションでも出品されていなかったので、この方法が一番だった。

メモ以上。SDD-240USBSLはWin7 x64で動作しました。

posted by RGBA_CRT at 03:00| Comment(0) | PC | 更新情報をチェックする

2017年06月14日

電球型蛍光灯インバータでUV-ROMイレーサを作る

電球型蛍光灯からインバータを取り出して殺菌灯を付けただけの話です。
↓どうでもいい前置きいらない人は"成功ケース"までジャンプ

前置き1:

ファミコンやスーファミなどの書き換えカートリッジ(リプロダクションカートリッジ)を作るとき、今ならフラッシュメモリで作ると思いますが、DIPパッケージではない上に3V系ばかり、値段が高いなどの理由でで制作の敷居が高いと感じていました。
そこで、秋月で買った紫外線消去型EPROMのM27C160のライターを制作していました。また、Aliexpressなどの通販サイトで中国かM27C322を安く買えることがわかったので注文してみました。 ここまで来ると、EPROMイレーサが必要になるので自作することにしました。

BLOG_EPROMS.jpg ↑27C322 10picsで\850だった



前置き2:

調べると、いくつかのブログが紫外線LEDによる消去を実験していました。回路が単純でよさそうに思ったのですが、時間がかかるのと最適な波長の紫外線LEDの入手が難しい&高いのであきらめました。
仕方がないのでスタンダードに殺菌灯と適当な点灯回路で制作することにしました。


失敗ケース:

Amazonで殺菌灯(NEC GL-4)とハンディブラックライト(蛍光灯タイプ。¥350)を注文し、ブラックライトを殺菌灯に交換してDCジャックを付け、箱に閉じ込めて消去してみました。
結果としては成功したのですが、3回目の使用でハンディライト側の回路が壊れたようで点灯しなくなってしまいました。殺菌灯も黒ずんでフィラメントの周りが黒く変色してしまいました。
ハンディライトの回路を見ると、恐ろしくシンプルな回路でしたが、どこが壊れているかわかりませんでした。外装のプラスチックもすぐひび割れるし安物買いの銭失いになってしまいました。

何とか蛍光灯を点灯させるインバータ回路を自作できないかと調べると、使い捨てカメラを使う方法があったので確かめてみましたが、電圧・電流不足なのか微妙な光量でした。


成功ケース:

さらに調べると、最近売られているグルグルしてる電球は実は蛍光管で、インバータ回路が内蔵されていることがわかったので、これを利用して作ることにしました。

電球を分解して
BLOG_EE_INV.jpg

ACソケットを付け、端子を付けて完成
BLOG_EE_INV.jpg

蛍光灯用のインバータなので殺菌灯以外にも点灯できる。
BLOG_EE_TEST1.jpg   BLOG_EE_TEST2.jpg

殺菌灯照射
BLOG_EE_TEST3.jpg
全て0xFFになってれば消去完了
BLOG_EE_BLANK.png
というわけで、今からEPROMイレーサを自作するなら、殺菌灯+電球型蛍光灯のインバータの組み合わせが安定してていいと思います。


以上です。続きを読む
posted by RGBA_CRT at 01:29| Comment(0) | EPROM | 更新情報をチェックする

2017年04月23日

2017年現在制作可能な吸出し機一覧

メインPCをWin7 32bitから64bitへに移行した際に、レトロゲーの吸出し機のうち動くものと動かないものが出てきました。
そこで、2017年現在、「回路図が公開されている」「個人でも制作できる」任天堂系レトロハードの吸出し機をまとめてみました。
最終更新や動作OSは目安です。大分アバウトな値になってます。私が所持していないものの情報は[?]になっています。
追記:2018年の情報も追加


※32bit:Windows2000~で動作 64bit:Vista64bit~で動作 SFC(ALL):SA-1,NintendoPowerに対応
ダンパー 対象 書きこみ 接続 主要技術 NT 32bit 64bit 自作難易度 最終更新 備考
Cartridge Reader for Arduino Mega2560 SFC(ALL) N64 GB GBA FlashROM SFC/N64 ROM&SRAM SD Arduino Mega - - 2018 オープンソース スタンドアローン 開発が進んでいる
Kazzo FC ROM SAVE USB AVR libUSB OK OK 2010 日本語 現時点で一番現代的
FDSLOADR FDS 殆ど不能 LPT MS-DOS NG NG 2002 02年製DOSV機ぐらいが限界 基本的に書き込みはできない
QDC FDS DISK USB FT232H OK OK 2014 日本語 安定している RAMモードあり
こーどねーむ「ホンコン」 with Arduino SFC(SA1) SRAM USB Arduino Uno OK OK 2014 日本語 拙作改造版でSA-1対応
FT232H-N64-Dumper N64 - USB FT232H OK OK 2016 N64特化の自作向けはこれくらい セーブはSRAM以外未実装
USB Linker Advance GBA ROM SRAM USB EZUSB OK NG 2002 64bitのドライバなし 32ならWin10でも動作
GB Cart Flasher GB ROM SRAM USB AVR FT232BM OK ? 2008 GB特化&USBで自作可能はこれくらいだった
writeboy GB Flash SRAM GBM USB Arduino Mega OK OK 2018 GBメモリを書き込むことができる
FT-GB Dumper GB SRAM USB FT232H OK OK 2018 私製 256kb/sの高速吸出し

以上が2017年現在の状況です。 パラレルポート版のホンコンは、ソフトウェアが入手不能なため除外しました。
FDSLOADRはQDCに置き換えることでFDSの吸出し環境は整いました。古いPCを持ってくる手間がなくなります。 ULAはドライバが32bitOSでしか動作しないので、64bitOSでは動作しません。 64bit版のCYUSBドライバ向けにPC側を作り直せば動作しますが、EZUSB自体入手難なのでArduino辺りで再設計した方がよさそうです。

Cartridge Reader for Arduino Mega2560については、万能・安定で今後もバージョンアップで発展していく可能性がありますが、入手するには基板の発注をしないとならないのが難点です。基板データを基に配線を追うことはできますが、大規模な分面倒そうです。

--- 追記:
Cartridge Reader for Arduino MegaがバージョンアップしてGBAにも対応したようです。これでファミコン以外の任天堂レトロハードの吸出しできるようになりました。確実にかつ手軽に制作したいならこれ一択でしょう。ファミコンならKazzo, FDSはQDCあたりを作っておけばカバーできるでしょう。
----



ついでに、非自作系もまとめてみました。↓

ダンパー 対象 書きこみ 接続 主要技術 NT 32bit 64bit 自作 最終更新 備考
VirtuaQD - FDS/QD emulator - FDS DISK SD ? - - NO 2015 同人ハード 回路図未公開(?)
FDSStick FDS DISK USB ? OK OK(?) NO 2016 海外製 FDS系では一番手軽かも
FDSemu FDS DISK SD ? - - NO 2015 FDSStickと類似?
Magic Wild Card FDS DISK SD ? - - NO 2015 FDSStickと類似?
Super UFO 8 SFC(ALL) NP SAVE SD ? - - NO 2012 有志のソフトでSA1やNPに対応
Retron5 FC SFC MD GB GBA SAVE USB ? ? ? NO 2015 本格的な製品
FCダンパー FC ? USB ? ? ? NO 2017 Amazonとかでも売ってる
SFCダンパー SFC ? USB ? ? ? NO 2017 Amazonとかでも売ってる
N64ダンパー N64 ? USB ? ? ? NO 2017 Amazonとかでも売ってる
Retro Base Dumper GBA SFC N64 ? USB ? ? ? NO 2017 Amazonとかでも売ってる
GB-Transfer2 GB GBA ROM SRAM LPT CPLD NG NG NO 2001 不安定 よくセーブが消える
64drive 64DD - CF/SD FPGA - - NO 2016 N64フラッシュ 有志のソフトで64DD IPLが吸える
パソファミ FC FDS SFC(ALL) GB ROM DISK SRAM USB PIC OK OK NO 2016 日本語 老舗


所持している吸出し機の写真
dumpers.jpg



2018/01/21 : 表を見やすく改変

posted by RGBA_CRT at 15:46| Comment(0) | 吸出し機 | 更新情報をチェックする

2016年09月07日

FT232Hを用いたUSB式N64吸出し機

FT232Hを用いたN64吸出し機

 ファミコンはKazzo、スーファミはHongKongArduinoとUSB接続の吸出し機が公開されていました。しかし、N64は自作向けの回路とソフトが存在せず、吸出しには入手が難しいPAR3を使ったパラレルポート経由の方法しかありませんでした。
 最近になってsanni氏の Nintendo cart readerが登場し、SDカードでの吸出しが可能になりました。しかし、ArduinoMegaを所有してないことと基盤の発注が面倒ということで、Nintendo cart readerを参考に、もっとシンプルなものを作ってみました。

リポジトリ: https://github.com/RGBA-CRT/FT232H-N64-Dumper
FT232HとMCP23S17を用いることで部品点数も少なく作れ、約400KB/sという高速な吸出しができます。

部品



回路図



 回路図からも分かる通り、FT232HのACバスにアドレスバスの下位、MCP23S17のGPIOAに上位を担当させ、ADバスでコントロールピンを制御させるという至極単純な回路です。
保護系やパスコンをどう入れればいいのかわからなかったのでつけていませんが、動作に問題がなかったのでそのままにしています。問題があればご指摘ください。

注意事項

  • 回路図のセーブデータ保護回路はなくても動きまが、セーブデータが消えやすくなります。
  • セーブデータ保護回路を省く場合は、N64のVCCに直接VCCをつなげます。
  • セーブデータ保護回路はついていますが、セーブデータが消えることを覚悟のうえで使用してください。
  • Windows側でソフトを立ち上げ、[INSERT CART AND PRESS ENTER]の表示が出るまでカートリッジは挿入しないでください。
  • 吸出し中や、アクセスLEDが点灯中はカートリッジを抜かないでください。
  • ESCキーで吸出し作業の中断ができます。
  • AE-FT232HLのジャンパはすべてショートしてください。
  • FT232Hは使用前にEEPROMの設定が必要かもしれません。制作に用いたFT232Hには、QDC(ハードウェアディスクシステムエミュレータ)と同じ設定がしてあります。


画像

なぜかICソケット2段重ねの基板写真
基板イメージ

基板の例 UEWによるスパゲッティ (クリックで拡大)
IMG_20180316_003543.jpg IMG_20180316_003559.jpg

ActiveBasic製の吸出しソフト
実行イメージ


以上です。詳しくは Githubリポジトリで。
posted by RGBA_CRT at 01:18| Comment(4) | TrackBack(0) | 吸出し機 | 更新情報をチェックする

2016年07月09日

ActiveBasicの仮想関数を使ってクラスを切り替え

正式名称が分かりませんが、
 Dim a AS *ClassProto
a = new Class1
a.func1() '---> Class1のfunc1が実行される
a = new Class2
a.func1() '---> Class2のfunc1が実行される
というようなことをActiveBasic v4でもしたい場合があります。
例えば画像を取り扱うクラスで、JPEGクラス, PNGクラスを内部的に切り替え、外からはどちらも同じように使える というような感じ。正式名称が知りたい。AB5ならできるっぽいけど、実行ファイルサイズがひどいので却下。

いろいろ試した結果、強引にも仮想関数を使ってクラスの切り替えができたのでサンプルコードです。
 Class ClassPrototype
Public
	Virtual Function A_proto() AS Byte
	Virtual Function B_proto(opt1 As Long,opt2 AS Byte) AS Byte
End Class

Class ClassMain : Inherits ClassPrototype
Public
	Function A() AS Byte
		Print "This is ClassMain->A()"
	End Function

	Function B(dummy AS Long,opt1 As Long,opt2 AS Byte) AS Byte
		Print "This is ClassMain->B()"
		Print ex"\tdumy =";dummy
		Print ex"\topt1 =";opt1
		Print ex"\topt2 =";opt2
	End Function

	Sub ~ClassMain()
		Print "Deconst ClassMain"
	End Sub
End Class

Class ClassSub : Inherits ClassPrototype
Public
	Function A() AS Byte : Print "This is ClassSub->A()" : End Function

	Function B(dummy AS Long,opt1 As Long,opt2 AS Byte) AS Byte
		Print "This is ClassSub->B()"
		Print ex"\tdumy =";dummy
		Print ex"\topt1 =";opt1
		Print ex"\topt2 =";opt2
	End Function

	Sub ~ClassSub()
		Print "Deconst ClassSub"
	End Sub
End Class

'ClassMainを作成し、VTableを構築する関数
Function New_ClassMain() AS *ClassPrototype
	Dim cm AS *ClassMain

	'ClassMainを作成
	cm=new ClassMain
	New_ClassMain=cm

	'VTableの構築
	Dim VTable AS *DWord
	VTable=calloc(sizeof(*Function)*3)	'Function * n個
	VTable[0]=AddressOf(cm->A)
	VTable[1]=AddressOf(cm->B)

	'VTableのセット(ClassPrototypeの仮想関数にClassMainの関数ポインタをセットする)
	SetDWord(cm,VTable)

End Function

'ClassSubを作成し、VTableを構築する関数
Function New_ClassSub() AS *ClassPrototype
	Dim cs AS *ClassSub

	cs=new ClassSub
	New_ClassSub=cs

	Dim VTable AS *DWord
	VTable=calloc(sizeof(*Function)*3)
	VTable[0]=AddressOf(cs->A)
	VTable[1]=AddressOf(cs->B)

	SetDWord(cs,VTable)
End Function

'VTableとクラスを開放する関数。
Sub Delete_ClassProto(ByRef cProto AS *ClassPrototype)
	if VarPtr(cProto)<>0 Then
		'VTableの開放
		if GetDWord(cProto)<>0 Then free(GetDWord(cProto))
		Delete cProto
		cProto=NULL
	End If
End Sub

'---------------------------------------------

#console
Dim cUse AS *ClassPrototype

Print "-------- ClassMain --------"
'ClassMainを使ってみる
cUse= New_ClassMain()
cUse->A_proto()
cUse->B_proto(7,-1 AS Byte)
Delete_ClassProto(cUse)

Print
Print "-------- ClassSub ---------"

'ClassSubを使ってみる
cUse= New_ClassSub()
cUse->A_proto()
cUse->B_proto(1,2)
Delete_ClassProto(cUse)

'一つのポインタ変数で違うクラスの実行ができる! はず

End	'ないと落ちる


実行結果:
-------- ClassMain --------
This is ClassMain->A()
This is ClassMain->B()
        dumy = 4597428
        opt1 = 7
        opt2 = 255
Deconst ClassMain

-------- ClassSub ---------
This is ClassSub->A()
This is ClassSub->B()
        dumy = 4597428
        opt1 = 1
        opt2 = 2
Deconst ClassSub

わかりにくい説明:
 ActiveBasic ver4において、クラスでは仮想関数を宣言できます。これは、COMオブジェクトのためについた機能ですが、言語側に仮想関数にポインタをセットする機能はないっぽいです。 仮想関数を持つクラスは、クラスの一番先頭に関数ポインタ配列のVTableの領域が作成されます。(詳しくはABのヘルプ->Class参照)
 このプログラムでは、VTableを手動で作成し、手動で関数ポインタをセットするということをしています。 というわけで、ベースとなるクラスClassPrototypeを作成し、各クラスに継承させます。これで各クラスはVTableの領域を持ちます。あとは、New_ClassMain()のように、NewしてVTableを構築し、仮想関数を呼び出すだけです。
 ただし、ABのバグか何かのせいで、呼び出された側からみると引数を読みだすための領域がずれてしまいます(仮想関数呼び出しの時にスタックがずれると予想)。対策として、メンバ関数BにはDummyという引数を作ってズレても読めるようにしておきます。Dummyの型は、次の引数と同じサイズの型にしなければなりません。

コードをみるとわかる通り、かなりアブナイコードです。できることなら使わないほうがいいでしょう。

以上です。
posted by RGBA_CRT at 13:16| Comment(0) | プログラミング | 更新情報をチェックする

2016年05月11日

The Last Story PKアーカイブファイルフォーマット

 Wii用ゲームのThe Last Storyは、テクスチャ、モデル、セリフ、パラメータデータ等がアーカイブファイルの中に格納されています。
 アーカイブファイルは、pk、pkh、pfsの拡張子を持っていて、pkがデータ実体、pkhにオフセット、pfsにファイル名・ディレクトリ構造の情報が記録されています。この3つのファイルフォーマットについて調べたので記しておきます。
 なお、このアーカイブ形式は開発元のAQインタラクティブの後継会社のマーベラスAQLが開発したSoul Sacrifice Deltaというゲームにも採用されているそうですが、所持していないので同じ形式かどうかわかりません。


参考ページ[source]: http://forum.xentax.com/viewtopic.php?f=10&t=5938


展開プログラム書いたので、ほしい方はこちらから



初めに

Wiiはパワーアーキテクチャ系のCPUで、ビッグエンディアンが採用されています。ファイルに記録されている値はすべてビッグエンディアンなので注意してください。
1つのアーカイブにつき、3つのファイルがあります。(例:boot.pk , boot.pkh , boot.pfs)
以下に記すデータ型は、DWordを4バイト符号なし整数、Longを4バイト符号あり整数とします。ぶっちゃけ型は適当なのでバイト数だけ注目してください。

PKファイル

 一番大きなファイルです。複数のファイルが圧縮されて格納されています。  圧縮形式はLZ-11で、 DSDecmp(https://github.com/Barubary/dsdecmp)で1つのファイルを展開できます。
未調査ですが、圧縮されていない場合もあるそうです。
バイナリの先頭が0x11で始まっていたらLZ-11で圧縮されてると考えていいです。

PKHファイル

このファイルにPKファイルのオフセット、圧縮サイズ、展開後サイズが記録されています。このファイルの情報を基にPKファイルを分割することができます。

PKHファイルヘッ ダ(4byte)
File Count
DWord (4byte)
ファイル総数です

ファイル情報テーブル (全16Byte×ファイル数)
Hash
DWord (4byte)
ファイルパスのCRC32です。詳しくは後述
Offset
DWord (4byte)
PKファイルの内部アドレスです。
Decompressed size
DWord (4Byte)
LZ11を展開した時のファイルサイズです。
Compressed size
DWord (4Byte)
PKファイルに記録されているサイズです。

ファイル情報テーブルは、ファイル総数の分だけ存在します。
例えば、preload/boot.pkhだと、ファイル数が217なので、PKHファイルサイズは4+16*217=3476バイトです。
Hashは、ファイルパスの文字列のCRC32をとったものです。ファイル名でアクセスするには、このハッシュで構造体を検索してPKファイルから展開、といった形になります。

PFSファイル

ディレクトリ構造・ファイル名が記録されています。

PFSファイルヘッ ダ (16 bytes)
0x00
8byte
0x00で埋められています
Directory count
DWord (4byte)
全ディレクトリ数です。
File count
DWord (4byte)
全ファイル数です。



ディレクトリ情報 テーブル (24bytes * Directory Count)
Directory ID
Long (4byte) ディレクトリIDです。
Parent directory ID
Long (4byte) 親ディレクトリIDです。ルートディレクトリの場合は-1になります。
Start child directory Long (4byte) 子ディレクトリの開始IDです。
Child directory count Long (4byte) 子ディレクトリ数です。
Start child file Long (4byte) このディレクトリにあるファイルの開始ナンバーです。
Child file count Long (4byte) このディレクトリにあるファイルの数です。



ディレクトリ名オフ セットテーブル(4bytes * Directory count)
Offset in string table
DWord (4byte)
文字列テーブル中のディレクトリ名へのオフセット。



ファイル名オフセッ トテーブル(4bytes * File count)
Offset in string table DWord (4bytes)
文字列テーブル中のファイル名へのオフセット



文字列テーブル(EOF まで)
String table
EOFまで
文字列テーブルです。上の2つのテーブルを使ってアクセスします。


ディレクトリ構造の例

Boot.pfsの中身を例として以下に表します。
[親ディレクトリID,自分のディレクトリID]ディレクトリ名
[File,FileNum]ファイル名

Dir Index.0
 Name :
 dirID : 0
 ParentID : -1
 StartChildDir : 1
 ChildDirCount : 5
 StartChildFile : 0
 ChildFileCount : 0

Dir Index.1
 Name : boot
 dirID : 1
 ParentID : 0
 StartChildDir : 6
 ChildDirCount : 0
 StartChildFile : 0
 ChildFileCount : 56

Dir Index.2
 Name : data
 dirID : 2
 ParentID : 0
 StartChildDir : 6
 ChildDirCount : 3
 StartChildFile : 56
 ChildFileCount : 0

Dir Index.3
 Name : database
 dirID : 3
 ParentID : 0
 StartChildDir : 9
 ChildDirCount : 1
 StartChildFile : 56
 ChildFileCount : 0

Dir Index.4
 Name : font
 dirID : 4
 ParentID : 0
 StartChildDir : 13
 ChildDirCount : 0
 StartChildFile : 56
 ChildFileCount : 11


Dir Index.5
 Name : hbm
 dirID : 5
 ParentID : 0
 StartChildDir : 13
 ChildDirCount : 1
 StartChildFile : 67
 ChildFileCount : 0

Dir Index.6
 Name : d2anime
 dirID : 6
 ParentID : 2
 StartChildDir : 9
 ChildDirCount : 0
 StartChildFile : 67
 ChildFileCount : 16

Dir Index.7
 Name : shader
 dirID : 7
 ParentID : 2
 StartChildDir : 9
 ChildDirCount : 0
 StartChildFile : 83
 ChildFileCount : 76

Dir Index.8
 Name : texture
 dirID : 8
 ParentID : 2
 StartChildDir : 9
 ChildDirCount : 0
 StartChildFile : 159
 ChildFileCount : 36

Dir Index.9
 Name : cosedit
 dirID : 9
 ParentID : 3
 StartChildDir : 10
 ChildDirCount : 3
 StartChildFile : 195
 ChildFileCount : 0


Dir Index.10
 Name : option
 dirID : 10
 ParentID : 9
 StartChildDir : 13
 ChildDirCount : 0
 StartChildFile : 195
 ChildFileCount : 12

Dir Index.11
 Name : palette
 dirID : 11
 ParentID : 9
 StartChildDir : 13
 ChildDirCount : 0
 StartChildFile : 207
 ChildFileCount : 4

Dir Index.12
 Name : preset
 dirID : 12
 ParentID : 9
 StartChildDir : 13
 ChildDirCount : 0
 StartChildFile : 211
 ChildFileCount : 1

Dir Index.13
 Name : HomeButton2
 dirID : 13
 ParentID : 5
 StartChildDir : 14
 ChildDirCount : 0
 StartChildFile : 212
 ChildFileCount : 5


(Root)\ 
    [0,1]boot\
      [File,0]ai_table.csv
      [File,1]arrow_set.csv
            ~省略~
      [File,55]weapon_param_text_jp.u16
    [0,2]data\
      [2,6]d2anime\
        [File,67]camp_cursor.d2b
        [File,68]camp_info4.d2b
        [File,69]camp_info7.d2b
            ~省略~
        [File,80]tips_ud.d2b
        [File,81]ui_loading.d2b
        [File,82]ui_saving.d2b
      [2,7]shader\
        [File,83]color.shader
            ~省略~
        [File,158]water_uv_RF.shader
      [2,8]texture\
        [File,159]ban_home_button.texture
        [File,160]diffuse.texture
             ~省略~
        [File,194]wd_01_02.texture
    [0,3]database\
      [3,9]cosedit\
        [9,10]option\
          [File,195]option_parts.csv
          [File,196]pc_set_a_level.csv
          [File,197]pc_set_b_level.csv
          [File,198]pc_set_d_level.csv
          [File,199]pc_set_f_level.csv
          [File,200]pc_set_g_level.csv
          [File,201]pc_set_j_level.csv
          [File,202]pc_set_l_level.csv
          [File,203]pc_set_m_level.csv
          [File,204]pc_set_w_level.csv
          [File,205]pc_set_x_level.csv
          [File,206]pc_set_y_level.csv
        [9,11]palette\
          [File,207]db_eff_palette_id_table.csv
          [File,208]db_eff_palette_name_table.u16
          [File,209]db_palette_id_table.csv
          [File,210]db_palette_name_table.u16
        [9,12]preset\
          [File,211]edit_preset.csv
    [0,4]font\
      [File,56]cp932_unicode.tbl
      [File,57]font_01_01.gly
      [File,58]font_02_01.gly
      [File,59]font_02_01_s.gly
      [File,60]font_02_02.gly
      [File,61]font_02_03.gly
      [File,62]font_03_01.gly
      [File,63]font_05_01.gly
      [File,64]font_05_01_s.gly
      [File,65]font_06_01.gly
      [File,66]font_07_01.gly
    [0,5]hbm\
      [5,13]HomeButton2\
        [File,212]config.txt
        [File,213]home.csv
        [File,214]homeBtn.arc
        [File,215]HomeButtonSe.arc
        [File,216]SpeakerSe.arc


ファイルパスの形式とハッシュ

 PKHのHashはファイルパスのCRC32をとったものです。
CRC32には複数の種類がありますが、広く用いられているCRC32bではなくノーマルなCRC32だそうです。
 CRCテーブルは
0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, ...
となります。続きはググれば出ます。ちなみに、main.dolの0x00737AD0あたりにもこのCRCテーブルが記録されています。
ファイルパスの形式は、
ディレクトリ名/ファイル名
です。
例:boot/ai_table.csv (CRC32:1D9635ED)
File No.26
 CRC32  : 1D9635ED
 Offset : 00000000
 decompressed size : 0000596E
 compressed size   : 00001299

Windowsのパスのように'\'ではないので注意しましょう。
 また、CRC32をとる時には、パスに含まれる大文字をすべて小文字に変換してからでないとPKHにあるハッシュと一致しません。
例:hbm/HomeButton2/HomeButtonSe.arc -> hbm/homebutton2/homebuttonse.arc (CRC32:6AC91931)
File No.88
 CRC32  : 6AC91931
 Offset : 0016F800
 decompressed size : 00059BB6
 compressed size   : 000560A1



以上です。
posted by RGBA_CRT at 00:08| Comment(0) | TrackBack(0) | プログラミング | 更新情報をチェックする

2016年05月03日

WOLF RPGエディターのマップファイルフォーマット簡易解析

ウディタのマップファイル(.MPS)のフォーマットを簡単に調べたのでメモっておきます。 対象バージョンはver2.10です

SAMPLE

 ADDRESS  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF
00000000  00 00 00 00 00 00 00 00 00 00 57 4F 4C 46 4D 00  ..........WOLFM.
00000010  00 00 00 00 64 00 00 00 65 05 00 00 00 82 C8 82  ....d...e....な
00000020  B5 00 00 00 00 00 30 00 00 00 21 00 00 00 21 00  オ.....0...!...!.
00000030  00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00  ................
00000040  00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00  ................
00000050  00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00  ................
00000060  00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00  ................
00000070  00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00  ................
00000080  00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00  ................
00000090  00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00  ................
~続く~

構造

オフセット
サイズ(Byte)
内容
0x00000000
10
00が10バイト並ぶ
0x0000000A 5
マップデータを表す識別子"WOLFM"
0x0000000F 19
未調査データ。0x64 0x65 0x82 などが含まれていることがある
0x00000022 4
マップチップID。4バイト整数型
0x00000026 4
マップ幅。4バイト整数型
0x0000002A 4
マップ高さ。4バイト整数型
0x0000002E 4
不明
0x00000032
マップ幅*高さ*4 マップデータ。4バイト整数型でマップチップIDが並ぶ
マップデータの後ろ
EOFまで
イベントデータ。未調査
  • ヘッダ部分は中途半端なデータサイズの型があるので、構造体にするときはアライメントに注意
  • マップデータはマップチップのベース画像の先頭が0、その後1,2,3...と続く(4バイト整数型、リトルエンディアン)
  • オートタイルの部分はB8 96 01 00など、大きな値になる。
  • マップサイズは、マップ幅*マップ高さ*4(4バイト整数型)*3(レイヤー数)で求められる
  • マップデータは垂直方向で画面左上から右下へ記録されている

スクショ

MPSFormat1.png
WOLF RPGエディター

MPSFormat2.png
Dxlibで組んだ表示プログラム

以上です
posted by RGBA_CRT at 02:09| Comment(0) | プログラミング | 更新情報をチェックする

2016年03月24日

こーどねーむホンコン with Arduino用高速化ファーム&クライアント

概要

たにやま氏が開発のスーファミ吸出し機「こーどねーむホンコン with Arduino」に手を加えて 高速化・SRAMの吸出し・特殊カートリッジ吸出しなどの機能を加えたものを作りました。

HKAC-SS1.png

- Original -
こーどねーむホンコン with Arduino
Copyright (c) 2014 たにやま
http://hongkongarduino.web.fc2.com/


ダウンロード



HongKongArduinoClone
Download



主な変更内容

Arduino側

  • ループdigitalWriteやdigitalReadなどをしていた部分をレジスタを直接いじるようにした
  • 最高で90KB/sで吸い出せるようにした(37倍の高速化)
  • 最適化オプションを-Osから-O3に変更
  • 特殊チップSA-1, SPC7110, S-DD1に対応
  • SFメモリカセット, サテラビューのメモリパックに対応

Windows側

    • ActiveBasicとWinAPIで作成
    • タイムアウト時間を設定してフリーズを防止した
    • ボーレート変更機能を付けた
    • SRAM吸出し機能を付けた
    • SRAM書き込み機能を付けた(実験段階)

Spd1.png
初期 (2.4KB/s)

spd2.png
高速化後 ver0.0 (47KB/s)

spd3.pngspd4.png
高速化後 ver0.6 (55KB/s)

spd5.png
高速化後 ver0.9 (98KB/s)

動作確認済みカートリッジ

ROMの吸出しができるか確認されたものです。SRAMが吸い出せるとは限りません。
  • LoROMカートリッジ
  • HiROMカートリッジ
  • ExHiROMカートリッジ
  • DSP1搭載カートリッジ
  • SuperFX搭載カートリッジ
  • SGB BIOS
  • BS-X
  • 特殊LoROMカートリッジ(衛星放送対応カセット)
  • サテラビューのメモリパック(Lo/Hi/BIOS/SA-1カートリッジから吸出し可能)

また、クロック回路を増設することで、
  • SA-1搭載カートリッジ(マリオRPG, カービィ3, バス釣りNo.1)
  • S-DD1搭載カートリッジ(スターオーシャン)
  • SPC7110搭載カートリッジ(天外魔境Zero)
  • SFメモリカセット
に対応します。

SA1
クロック回路


使い方

Arduinoへのファームウェアの書き込み

ダウンロードして解凍したフォルダの中に、HongKongArduinoFastと いうフォルダがあるので開き、
その中のHongKongArduinoFast.hexをArduinoへ書き込んでください。
ArduinoIDEにはGUIでのHEXファイル書き込み機能がないので、書き込み用バッチファイルを作成するプロプログラムを同梱しておきました。

ArduinoHexWriterの使い方

1.Arduinoを接続する
2.ArduinoHexWriterを起動し、Arduinoが接続されているCOMポートを選択する
3.ArduinoIDEのあるフォルダを入力もしくはドラッグ&ドロップ
AHX-SS2.png
例:C:\Program Files\Arduino


確認ボタンを押すとこの必要なファイルが存在するかチェックします。
3.HEXファイルをドラッグ&ドロップ

4.書き込みボタンを押す
コマンドプロンプトが開いて書き込みが始まります。
[avrdude.exe done. Thank you.]が表示されたら完了です。 これ以降はこの操作は必要ありません


HongKongArduinoCloneの起動と接続

HongKongArduinoClone.exeを起動してください
HKAC-SS1.png

「Serial Port」にArduinoのポートを指定して[connect]ボタンを押してください。
右のInfomation欄に「Connection successful!」が表示され、ゲームタイトルが表示されていれば接続成功です。
もし、ファームウェアを変更して通信レートを変更した場合はダイアログ右の[baudrate]を変更してください

吸出しの方法

  1. GetCartInfoボタンを押してカートリッジ情報を取得
  2. ゲームタイトルなどが正しく表示されていることを確認してください。されていない場合はカセットの端子を掃除をしてください。
  3. [DumpROM][DumpSRAM]など押します。
  4. 少し待ったら完了です。
  5. SRAMが吸い出せない場合はMAD1にチェックをつけてリトライしてください。


Q&A

  • 吸出し中に[0]Warning! と出るが、これは何か?
    • Arduinoから送信されてきたデータのサイズが不正の時に表示されます。

  • 「Over retry count.」と表示されて吸出しが停止した
    • 上記のWarningが20回ほど発生した場合に吸出しが停止します。 HongKongArduinoClone.iniの中のMaxContinueの右辺の値を増やすことでWarning時の再試行回数を増やせます。

  • Serial Portの欄にErrと表示される
    • COMポートのリストアップに必要なメモリが不足している可能性があります。 HongKongArduinoClone.iniの中のQDDSizeの右辺を書き換えると改善する可能性があります。 なお、QDDSizeの値が1023以下の場合デフォルトの値に戻されますので注意してください。

  • ゲームタイトルなどが正常に表示されない
  • 吸い出したデータのCRCが合わない
    • カセットの接触が悪い可能性があります。綿棒にサビ取り剤などをつけて端子を掃除してください。
      いったん接続を切り、USBケーブルを抜いたのち、もう一度再接続すると改善する場合があります。
      それでもダメな場合はあきらめてください。
      また、非対応のカートリッジの場合があります。たとえば、SA-1搭載カートリッジ(マリオRPGなど)などは制御が難しいため対応していません。

  • セーブデータ(SRAM)が正常に吸い出せない
    • SRAMの吸出しの動作確認済みのカートリッジは、
      • ノーマルLoROMカートリッジ
      • MAD1搭載HiROMカートリッジ
      です。 また、MAD1を搭載していないのにMAD1にチェックをつけないとSRAMが吸い出せないカートリッジもありました。


その他

  • このプログラムを使用していかなる損害・災害などが発生しても作者は一切の責任を持ちません。
  • 自己責任にてお使いください。
    特に、カートリッジ内部のSRAMは消えやすいので 本プログラムを使用した結果データが消えるかもしれないということを念頭に置いてご使用ください。
    また、吸い出したROMイメージをインターネット上にて公開することは法律で禁止されています。
  • ライセンスはオリジナルの「クリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス」を引き継ぎます
  • もっと通信速度を上げたい場合はHongKongArduinoFast.inoのSetup()に記述されているSerial.begin(500000);の値を変更してください。
  • HongKongArduinoClone.exeの開発にはActiveBasic ver4を使用しています。


以上です
posted by RGBA_CRT at 02:23| Comment(12) | 吸出し機 | 更新情報をチェックする

2016年03月23日

こーどねーむホンコン with Arduinoを作ってみた

スーファミ用吸い出し器こーどねーむホンコン with Arduino[http://hongkongarduino.web.fc2.com/]の回路を組み立ててみた

部品

・Arduino Unoはaitendoの互換品を使用
・ロジックICの74HC245と74HC377は秋月電子と共立エレショップから購入
・全アドレスにLEDは貧乏なのでつけません
・配線はUEW
・2.54mmピッチエッジコネクタは入手が難しいですが、ここのサイトで比較的簡単に買えました。

制作

・秋月のBサイズのユニバーサル基盤に作り、Arduinoを直接挿すようにしました。
・配線する本数は多いですが、回路は比較的シンプルでKazzoよりは簡単に作ることができました。
・回路図のA16~A23と、カードエッジコネクタのピン番号の図のBA0~BA7は同じものです。
・電源/アクセスランプLEDを付けました。

HongKongArduino1.jpg
HongKongArduino2.jpg


吸出し

・普通のカートリッジなら問題なく吸出しでき、CRCも正常です。
・DSP1、SuperFX、MAD1あたりのゲームは吸出しできました。
・SA-1搭載カートリッジは対応していません。


sss.jpg


こーどねーむホンコン with ArduinoはArduino側もWindows側もソースコードが公開されているので、自由に機能の追加ができます。Arduino側のコードを見る限りスピードアップが可能なようなので別ページにて改造版を公開します。

以上です。
posted by RGBA_CRT at 01:10| Comment(0) | 吸出し機 | 更新情報をチェックする

2016年03月15日

マッパー0フラッシュカートリッジ作成

Kazzoが完成したのでマッパー0のフラッシュカートリッジを作ってみました。

参考ページ

http://ponrevival.blogspot.jp/2011/03/0flash.html
http://akiba.geocities.jp/consolehomebrewprogramming/fc/index.html
http://blogs.yahoo.co.jp/aaoommhhtt/29903085.html
http://www.crl.nitech.ac.jp/~ida/education/computer/project/computer020601.html

部品

使用するフラッシュメモリは秋月電子で簡単に入手できるEN29F002Tを2つ使用
ぽんRevさんのページではNANDゲートICの74xx00を使ってCPU R/Wを論理否定し、/OEを作り出していますが、74HC00の節約のためトランジスタを使って論理否定してみることにします。

制作過程

HVC-NROM-256K-02基盤からROMを抜き取る。ハイドライドスペシャルを生贄にしました。

2016-03-06 15.18.36.jpg


はんだ付けに入る前に基盤にピンアサインを書いておきました。データシート見る手間省けるのでお勧めです。
基板のピンアサインとフラッシュメモリのピンアサインを見ながら配線していきます。

2016-03-07 02.36.34.jpg


HVC-NROM-256K-02ではPRG側の/CEがGNDに入っているので使用せず、基板の/OEに接続します。
H/Vスイッチも付けておくと楽になります。


配線完了、しかし書き込みが中々うまくいかない。
手でPLCCソケットを抑えながら書き込むと成功したりしなかったりする怪現象が発生し、半田を何度もも再加熱してみるも安定はしませんでした。74HC00を使ってみても同様の結果。
二日ほど試行錯誤したのち、論理否定用のトランジスタへの入力(CPU R/W)にダイオードをつけてやると安定するようになることが分かりました。
トランジスタは2SC1815Yを使用、以下のように接続しました。



TrNot.png
トランジスタによるNOTゲート


そして書き込みに成功



片方ずつ書き込まないと安定しなかったりいまだに書き込みエラーが出たりしますが一応書き込み成功頻度は上がりました。



2016-03-10 01.50.59.jpg


汚れたカセットの外装をやすりで磨いたりしました。
あとはそれっぽいラベル作って張れば完成ですね。


これで自作ソフト作ったりハックロムを作って遊んだりできます。ファミコンプログラミングのページを見る限り、ちょっとしたゲーム作るだけでもコンピュータの低レベルな部分の勉強になりそうです。



[小メモ]
スーパーマリオブラザーズのROMのアドレス0x107Aが残機の設定。
初期設定では02(=3人)になっているのでいじれば残機が増えます。
鬼畜なハックロムやるときに便利です。

以上です。
posted by RGBA_CRT at 17:44| Comment(0) | レトロゲーカセット自作 | 更新情報をチェックする

ディスクシステムのドライブコントローラICを交換してみる

FD3206P搭載ディスクシステムを手に入れたので、動作不能のジャンクドライブから取り出したFD7201Pと交換してみる実験をやってみました。

2016-02-25 23.41.29.jpg
←後期型(FD3206P) 前期型(FD7201P)→


写真だとよくわからないと思いますが、一部部品がついていない部分以外は部品配置がほとんど同じです。この分だとICだけ交換でも動きそうです。


というわけではんだを除去して交換してみました。


2016-03-02 16.04.20.jpg


結果は成功
2016-03-02 16.19.49.jpg

「てすと201」がFD7201Pに交換したドライブで書き込んだファイルです。
読み込みも書き込みも問題なし。ジャンク基盤に乗っていたFD7201Pは故障していないことがわかりました。

というわけで、FD3206PとFD7201Pは回路の変更なしに交換可能です。
FD3206PをFD7201P化する改造も海外サイトには乗っていますが、部品が入手困難なのでこっちの方が簡単ですね。

以上です。

posted by RGBA_CRT at 15:11| Comment(0) | ゲーム | 更新情報をチェックする

Kazzo用MADARAのSRAM対応スクリプト

セーブが怪しくなってきた魍魎戦記MADARA(VRC6b)からセーブデータ(SRAM)をバックアップするためのKazzo用スクリプトファイルを作りました。

MADARA 201603151214102.png


nesdevのVRC6のページによると、ファミコンのメモリ空間の0xB003の7ビット目が1でバックアップRAMが有効になるそうです。
そしてエミュで0xB003の動きを見てみると、ゲーム中は大体0x7F(0b01111111)でセーブデータ読み込みの時に0xEBなどになってるっぽいです。


それを元に、VRC6のスクリプトファイルにcpu_ram_access関数を追加してSRAMを吸出してセーブデータとして保存すると、

2015-10-05 22.23.47.jpg
実機

aff98f9301992b69413cabbb2ad42b78.png
エミュレータ


セーブデータのバックアップに成功しました。これでカセットのバッテリーが切れても安心です。



スクリプトファイルダウンロード



※セーブデータがぶっ壊れても知りません
※エスパードリームではどうなるかわかりません

手動で書き換え


vrc6b.afをvrc6b.agにリネームして以下のようになるようにcpu_ramの部分を書き加える。

board <- {
mappernum = 26,
cpu_rom = {
size_base = 2 * mega, size_max = 2 * mega,
banksize = 0x4000
},
ppu_rom = {
size_base = 2 * mega, size_max = 2 * mega,
banksize = 0x0400
},
cpu_ram = {
size_base = 0x2000, size_max = 0x2000,
banksize = 0x2000,
},

ppu_ramfind = false,
vram_mirrorfind = false
}
~中略~

ファイルの後ろに↓も書き加える
/* WorkRAM
PPU Banking Style ($B003)

7 bit 0
---------
W.PN MMDD
| || ||||
| || ||++- PPU banking mode; see below
| || ++--- Mirroring varies by banking mode, see below
| |+------ 1: Nametables come from CHRROM, 0: Nametables come from CIRAM
| +------- CHR A10 is 1: subject to further rules 0: according to the latched value
+--------- PRG RAM enable

*/

function cpu_ram_access(d, pagesize, banksize)
{
cpu_write(d, 0xb003, 0xEB);
cpu_ramrw(d, 0x6000, banksize);
cpu_write(d, 0xb003, 0x7F);
}


参考文献


http://wiki.nesdev.com/w/index.php/VRC6
https://twitter.com/bakuten_do/status/644794217307312128
http://forums.nesdev.com/viewtopic.php?f=11&t=10628
http://blog.naver.com/xsnake/220330634248

以上です。
posted by RGBA_CRT at 12:46| Comment(0) | 吸出し機 | 更新情報をチェックする

Kazzo制作メモ

Kazzo 0.1.2を作ってみたのでメモ。 ⇒ Kazzo公式ページ
このページに出ている回路図と部品表がver0.1.2用だったのでそっちを作っちゃいましたけど、74HC574を2つ使うVer0.1.3もダウンロードページにあるのでそっちを作ったほうが良かったかもしれません。

部品について

・Amazonにファミコン用のエッジコネクタが売っていたのでそれで制作
・68Ω、30KΩ、1.5KΩの抵抗と74HC574はaitendoで購入。その他は秋月で購入
・抵抗値があっていればワット数はどうでもいいっぽい
・秋月のユニバーサル基板 Bタイプで制作
・AVRはATMega164P-20PUを使用
・UEWで配線
・シャーペンを加工してワイヤリングペンを作り、それでUEWを使う
・あらかじめ配線しやすいようにReadme.txtの接続図と回路図を一緒に印刷しておいたほうが楽

制作ログ

・まず基板上に部品配置を決め、USBのVCC,GND,D+,D-の配線を行った
・セラロック発信子は真ん中のピンがGND
・UEWは、熱したはんだに突っ込むと被膜が溶けて導通するようになる
・回路図の通り電源とGNDの間にコンデンサをはさむ
・次にスイッチ、74HC574への配線を行い、AVR用のICSPを配線してファームを書いてみた
・書き込みにはPICerFTで問題なかった
・USB機器として認識されていないと思ったら、フューズビットを書き込んでなかった
・フューズビットは以下のようにした。Hexファイルと同じフォルダに保存したら書きこんでくれた

CKDIV8=1 ;disabled
CKOUT=1 ;PB0=I/O, Default
SUT=2 ;Default
CKSEL=E ;Low Power Crystal Oscillator 8-16MHz
OCDEN=1 ;OCD disabled, Default
JTAGEN=1 ;JTAG disabled
SPIEN=0 ;Serial Program enabled, Default
WDTON=1 ;disabled, Default
EESAVE=1 ;EEPROM not preserved with Chip Erase, Default
BOOTSZ=0 ;1024words, Default
BOOTRST=1 ;Reset Vector = Boot Loader, Default
BODLEVEL=7 ;disabled, Default

※フューズビットは間違えるとシリアル書き込みできなくなるので自己責任で使用してください。

・ようやくUSB機器として認識され、kazzo_test.exeも動作。
・次にファミコン用エッジコネクタを取り付け、配線。
・ここからは回路図よりReadme.txtの配線表を見て作業しないと訳が分からなくなる。
・D0~D7、A0~A13はCPU,PPUの両方を共通にして配線。これでAVRと74HC574の足を節約しているっぽい。
・データバスとアドレスバスの配線は、一筆書きのようにしたほうがやりやすい。
・分けて配線すると片方のUEWをはんだ付けするともう片方のUEWが外れるということが起きて面倒。
・非常に数が多いので配線ミスに注意。
・すべて配線して吸出しのテスト。
・ハイドライドスペシャルの吸い出しに成功。
・マリオ3の吸出しに失敗、UEWの被膜が十分にとけ切ってなかようで、半田を再加熱で治った。
こちらのサイトを見て電源ランプとアクセスランプを取り付け。A12がHIGHで点灯するようにした。
・トランジスタは2sc1815を使用。
・完成

Kazzo_compressed.jpg

ソフトウェア側

・Kazzoでは標準カセット(NROM)以外のカセット(MMC3など)を制御(バンク切り替えなど)するために吸出し・書き込み方法をスクリプトファイルに記述している。
・スクリプトファイルは標準以外にもググれば出てくる。自作もできる。
・スーパーマリオやハイドライドなどマッパー0カセットはPRGをAutoではなくx2にしなければならない。
・Anago GUI 0.6.2はNesCartDBのxmlを用意すればCRCから吸い出したソフト名を表示してくれる。
2015/10月現在はファイル名がNesCarts (2012-10-22).xmlだが、これをNesCarts (2010-02-08).xmlとリネームしてanagoフォルダに入れるとソフト名表示がされる。
・dumpタブが吸出し、Programタブが書き込み、Workramタブがセーブデータ等の吸出し・書き込み。
・WorkramタブのBrouseボタンは開くダイアログと保存ダイアログの指定が間違っているが、RAM Read側がセーブデータ吸出し、Write側が書き込みである。テキストボックスに直接ファイル名を書けば動く。

kazzo-dump.png

スクリプトファイルについて

・拡張子によってスクリプトの持つ機能が分かれている。
(.adは吸出しのみ、.afは吸出しと書き込み など)
・function cpu_dump(d, pagesize, banksize){の内側にPRG-ROMの吸出し処理
・function ppu_dump(d, pagesize, banksize){の内側にCHR-ROMの吸出し処理
・function cpu_ram_access(d, pagesize, banksize){の内側にSRAMの吸出し処理
・カセットのコントロールICを制御するためにcpu_dump関数内などにもcpu_writeが記述されることがある。

以上がメモです。

一応手持ちのソフトはほとんど吸い出せましたが、
Amazonで買ったエッジコネクタはディスクシステムのRAMアダプタと相性が悪いらしく、BIOSが吸い出せませんでした。
また、スーパーマリオブラザーズも接触が悪いのか黒つぶしROMだからなのか吸出し不良になりました。
悪魔城すぺしゃる ぼくドラキュラくんはunagiでないと吸出しできませんでした(vrc4e)。

-----
2018/6/30追記:
最近の環境でのドライバインストール方法がわからない人向けのメモ

タスクマネージャを開き、「他のデバイス」の中にKazzoがあるか確認する。
プロパティに「ドライバがインストールされていません。」という表示があれば正常に認識されています。「要求に失敗」「応答が不正」「認識されていません」などの表示が出ている場合はKazzo側を見直してください。

KazzoDrv1.png

次にドライバのインストール
Zadigをダウンロードし、実行する。
Kazzoを選び、libusbKをインストールする。

KazzoDrv2.png

インストールが終わればタスクマネージャからも正常に認識されるようになる。

KazzoDrv3.png

これでインストールが完了です。kazzo_test.exeが動作するはずです。

-----

以上です。
posted by RGBA_CRT at 02:20| Comment(19) | TrackBack(0) | 吸出し機 | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。