![見出し画像](https://assets.st-note.com/production/uploads/images/161482017/rectangle_large_type_2_6246c230ffb771224cdf801809ce9576.jpeg?width=1200)
ド素人がSTM32マイコンNUCLEO-H755を使ってレトロPC用FDDエミュレータを自作した話その1 作成に至る経緯とかエミュレータの仕様とか
ここ何年かかけて作ってた自作FDDエミュレータについて、他のFDDエミュレータ自作勢とか、自作してみたい人向けに自分の経験を連載(予定)記事にしていこうかと思っています。
プログラムの公開もそのうち行いたいのですが、ひと様に見せるようなまともなコードも回路図も書いたことがないのでちょっと迷ってます。
FDDエミュ自作までの経緯
もともと私がマイコンプログラムをやってみるか、と思い立ったのは、最終的にPC98エミュレータ(FDDやCバスカードなど実際の周辺機器をつなげられるようなもの)を自作したい、という野望を抱いたからでした。
で、色々な周辺機器に対応させるならある程度の機能ごとにマイコンを割り当てて、CPU相当のマイコンで全体を統制させるのが開発も楽でよさそうだ、と考えました。
そこでまず実機のFDDをつなげれるように信号読み取りをやってみよう
→データ抽出がうまくいってるかFDDエミュを作って試すか
→PC98でうまく動いたけど、どうせなら他機種でも使いたい
→以下沼に直行・・・
結果、当初予定だったPC98エミュレータには全く手がついていませんが、3機種対応FDDエミュレータの方は最低限形になったのでこうして記事にしています。
自作エミュの動作上の特徴
私が調べたところ、一般的なFDDエミュレータは一定間隔で信号の有無を読み取るサンプリングを行う形式のものがほとんどのようです。
わかる人向けにいうと、アインシュタイン98と同じです。
これらの多くは1トラックの信号を複号してできたデータか、サンプリングした生データの01の羅列を保存しています。
この形式の弱点はアインシュタイン98と同じで、書き込み周波数を微妙に変えるプロテクトなどには原理上対応できないこと、読み込み時にサンプリング周波数を合わせないとうまく読み込めないことなどです。
一方私が使っているSTM32-H7系にはHRTIMという高分解なタイマがあり、FDDからの信号間隔を高い精度で保存し、出力できます。
具体的には信号の間隔が2us~8usなのに対し1/400usの精度まで可能です。
(私の場合は1/100us単位で保存していますが。)
わかる人は玲於奈みたいな感じ、といえばわかっていただけるかと。
単純に信号間隔を保存しているだけなので、2Dだろうが2DDだろうが1.2MBだろうが1.44MBだろうが同じ様に読み込めますし、読み込んだ回転速度と出力する回転速度が違ってもそれに応じて計算をすれば動きます。
![](https://assets.st-note.com/img/1731332356-okPcm2yHODlspA5ZF37jBMQG.png)
2バイトで1信号間隔となる。(リトルエイディアンで保存)
(1つ目の0x0174=3.72usを5/6倍して3.10uの様に、5/6倍するとPC98での信号に)
もちろん先の例では対応が難しかった回転数が微妙に変わるタイプのプロテクトにも原理上対応できます。
ただ、いわゆる不安定フォーマットに対応するには数週分保存したりするなど、何かしらの対策が必要です。
(私の場合は信号解析をあきらめ、3週以上、25万信号分のデータをそのまま保存しています。)
最大の弱点は自作ファイル形式の弱みで、世に出回っているディスクイメージなどが直接使えないことです。
別途変換プログラムを自作するか実機に書き出す必要があり、かなり手間がかかりました。
自作エミュの仕様
Nucleo-H755を利用
プロテクトの再現性は割と良好(不安定フォーマットは読み込み時の運に依存)
タッチパネル動作(同一フォルダ内なら多数のディスクを簡単に入れ替え可能)
exFat対応(256GBなど大容量SDカードが利用可能)
PC88での2ドライブ動作可
X68000で4ドライブ動作可
PC98はVFO信号なしのみ対応
読み込み時と出力時のFDD回転数の変換が可能(読みこむドライブの回転数を問わない)
機種別フォルダ-最大255個のサブフォルダ-最大255個のFDイメージフォルダ-160個(PC88は80個)のトラックイメージファイル というフォルダ階層で管理しやすい。
そこそこ安い(7000円くらいで作れる)
5V電源が必要
エミュレータ用34ピン端子とディスク読み込み用34ピン端子が別で、本体のFDDから直接イメージ化には未対応
周辺ソフトも自作が必要
その他特徴
読み込んだデータから不良セクタを取り除いて正常な部分を張り付けたり、前半が読めるフロッピーと後半が読めるフロッピーのトラックファイルを合成したり、読めない部分の信号をバイナリエディタで直接修正したりなどの作業が結構簡単に可能です。
この辺はまだ本腰をいれてやっていませんが、カビや破損などで実機で動かないゲームが動いた例が数件あります。
起動セクタだけ他のと入れ替えるだけで動くようになったりとか……。
(ただし、信号を復号して普通のデータ化して、もとの信号でのセクタの開始・終了位置を出力するようなプログラムの自作が必要でした)
いろいろ書いて長くなったので一旦この辺で切り上げます。
何が動いたとかで100個以上のゲームを羅列するのもスペースの無駄だと思いますし、何を書くかって難しいですね。
次回はSTM32-H755の具体的な設定方法等について書いていく予定です。
2025/2動作動画上げてみました。