ArduinoベースのAmigaフロッピーディスクリーダー - 低コスト・オープンソースなデータ復旧
必要な部品と材料
| 部品名 | 数量 | 備考 |
|---|---|---|
| 抵抗 1kΩ | 1 | |
| ブレッドボード | 1 | |
| ジャンパーワイヤー | 1セット | |
| ブレッドボード用電源モジュール 5V/3.3V (SparkFun) | 1 | |
| Arduino UNO (または Pro Mini) | 1 | Pro Miniも使用可 |
使用するソフトウェア
- Arduino IDE
プロジェクト概要
目的: Windows 10などのモダンな環境で、Amigaダブルデンシティ(DD)フロッピーディスクからデータを復旧する、シンプル・低コスト・オープンソースな手段を提供すること。
解決策: Arduino + Windowsアプリケーションの組み合わせ。
背景: 一般的なPCのフロッピードライブではAmiga形式のディスクを読めません(記録方式が異なるため)。KryoFluxやCatweaselといった専用コントローラーは高価で、かつクローズドソースです。筆者は電子工作の経験を活かし、Arduinoで独自のリーダーを開発することを決意しました。
Amigaとの思い出
筆者は10歳のクリスマスに両親からAmiga 500+をプレゼントされ、それがキャリアの原点となりました。ゲームで遊ぶうちにDeluxe Paint IIIやWorkbench、AMOS Basicに触れ、プログラミングコンテストで入賞するなど、Amigaは人生を変えたマシンでした。しかし時が経ち、手元には動かないA500+と大量のフロッピーディスクが残されていました。これらのデータを保存・活用したいという思いから、このプロジェクトが始まりました。
技術的背景と課題
Amiga DDフロッピーは300rpmで回転し、80トラック、トラックあたり11セクタ、セクタあたり512バイト、MFM変調で記録されています。正確に読み取るには500kHzでのサンプリングが必要ですが、Arduino (ATmega328P, 16MHz) でこれを実現するのは困難です。
試行錯誤の記録
Attempt 1: シフトレジスタによる並列化
2個の8ビットシフトレジスタ (SN74HC594N) を使い、サンプリング周波数を1/8 (62.5kHz) に落とすアプローチ。USARTを2M baudで駆動しデータ転送を試みましたが、意味のあるデータが得られませんでした。オシロスコープ (Gould OS300 20MHz) を購入し、信号を観測することに。
Attempt 2: 割り込み(ISR)によるパルス検出
500kHzタイマー割り込み内でパルスを検出しビットシフトする方式。しかしISRのオーバーヘッドと digitalRead の遅さにより、実行時間が割り込み間隔 (2µs) を超えてしまい断念。レジスタ直接アクセスでも間に合わず。
Attempt 3: ハードウェアカウンター (Timer/Counter) の活用
大学時代に学んだ「ハードウェアカウンター」機能を思い出し、ATmega328のTimer0を外部クロックカウントモードで設定。500kHzタイマー (Timer2) のオーバーフローごとにカウント値をチェックし、パルス有無を判定する方式に変更。データらしきものが取れるようになりましたが、チェックサムエラーが多発。
Attempt 4: ソフトウェアPLL (位相同期ループ) での再同期
ドライブの回転ムラやセクタ間ギャップによる位相ズレを補正するため、パルス検出時にTimer2のカウンタ値を所定の位相 (phase) にリセットし、擬似的なPLLを実装。これにより劇的にデータ品質が向上し、ほぼ完璧な生データが取得できるようになりました。オシロスコープ上でも両信号が綺麗に同期しているのが確認できました。
Attempt 5: 外部割り込み (INT0) による高速リセット
メインループでの位相リセットにはジッターが生じるため、データパルスをINT0ピンにも接続し、ISR_NAKED 属性を持つ最小限のアセンブリISRで TCNT2 = targetPhase; のみを実行する方式に変更。コンパイラ生成命令を5命令 (約0.3µs) まで削減し、再同期のタイミング精度を最大化。MFMデコードルール (「1が連続しない」「0が4つ以上続かない」) を用いたエラー検出も追加。
Attempt 6: シュミットトリガーによる波形整形
SN74HCT14N ヘックスシュミットトリガーを追加し、立ち上がりエッジでトリガーするよう変更。目立った改善は見られず、Attempt 5の方式を採用。
Attempt 7: MFMデコードルールによるエラー補正
MFM符号化ルールに基づき、「連続する1の2つ目を無視する」などの簡易補正を実装。エラー検出数は少なかったものの、一部のディスクが読めない原因は磁気劣化やドライブ側の問題の可能性も。
デコードとADFファイル生成
フロッピードライブから出力されるパルスは「生のMFMデータ」であり、クロック信号なしで位相遷移を表します。同期ワード 0x4489 (実際には 0xAAAAAAAA44894489 または初期バグ対応で 0x2AAAAAAA44894489) を検索し、セクタヘッダーとデータをデコード。ヘッダー/データのチェックサム検証を行い、全11セクタが有効になるまで再読み取りを繰り返します。最終的に標準的なADF (Amiga Disk File) 形式で保存し、ADFOpus等で開けることを確認しました。
今後の展望 (V2以降)
- プロジェクト全体をGNU GPL v3で公開済み。GitHubリポジトリ
- V2では読み取り精度向上とライティング機能を実装済み。
- AmigaDOS以外のフォーマット (コピープロテクト付きゲーム等) に対応するため、FDI (Universal Floppy Disk Image) 形式への対応を計画中。
- Software Preservation Society (CAPS/IPF) はクローズドなため、オープンなFDI形式に注力。
- 将来的にはADF/FDI双方への書き込み機能も追加予定。
回路図


製造プロセス
- アニメーションの進化と技法:洞窟壁画からCGIまで
- フロッピーディスクの進化:磁気メディアから光ストレージへ
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- ArduinoベースのAmigaフロッピーディスクリーダー - 低コスト・オープンソースなデータ復旧