HxC Floppy Emulator 導入

遅ればせながらではありますが、PC-98用にHxC Floppy Emulatorを導入しました。
購入したのはSDカード版のRev.Fです。

PC-9821であればVFO回路を別途用意しなくても直に搭載できる
そうですので、本体内蔵という手もあります。
とはいうものの、単価が高くて複数台購入するのは厳しいので
外付けで使用することとしました。

使用した外付けドライブはELECOMのFDD-3.5Sとなります。
VFO回路が基板上に搭載されているため、
HxC Floppy Emulatorがそのまま搭載できます。
搭載して動作させた画像は以下になります。

HxC_PC-98_0.jpg

本体はPC-9801VX21を使用しました。
ソフトウェアディップスイッチ搭載前の機体ですので、
外付けドライブを#1、#2とするためにはSW1-4をONにする必要があります。

HxC Floppy Emulator Rev.Fのねじ穴ですが、確かに穴は開いてはいるのですが
ねじ切りされていないため、そのままではねじでの固定ができません。
このため、amazonで新潟精機のタップドリルセットST-4Sを購入して
対応しました。
M3×0.5を使えばミリネジで固定できるようになります。

接続については34ピンコネクタの向きさえ間違えなければ問題ありませんが、
(逆指し防止の突起が上側になるように接続する)
FDD1台用なのでそのままだとDriveSelect信号が1台分しか
結線されておりません。
2台接続とするには以下の画像のように結線する必要がありました。
(製品ロットによって基板が異なるかもしれないので、
改造する場合はテスター等で問題無いことをご確認ください)

HxC_PC-98_1.jpg

なお、HxC Floppy Emulator側のディップスイッチはID0AとID1BをONにします。

これで2HD 1.25MBのディスクは問題無く使えるようになりました。
2DDについては使う予定がないので未確認です。

freedos(98)にフロッピーディスクを認識させる

freedos(98)はブートしたHDDをAドライブと認識するだけで、
フロッピーディスクにアクセスできないという問題がありますが、
前回MOを認識させたのと同様にデバイスドライバを組み込んでやれば
フロッピーディスクも認識させることができるはずです。

MS-DOSでは標準対応のフロッピーディスクを読み書きするデバイスドライバが
あるのかと思いきや、vectorを検索してみると1.44MBのフロッピーディスクに
アクセスするためのドライバがいくつかありました。
以下を組み合わせて使うこととします。

FD144 http://www.vector.co.jp/soft/dos/hardware/se000695.html
EXTDISK http://www.vector.co.jp/soft/dos/hardware/se015717.html

実験はエミュレータでも可能なので、T98-Nextを使用します。
それぞれ単独では次のようになります。

FD144 : ドライブレターが出現し1.44MBのディスクのみアクセス可能となる
EXTDISK : ドライブが見つからずに組み込みに失敗する

EXTDISKはEXTDISKL.BPBを使用すれば2HD 1.25MBや2DDのフロッピーも
扱えますので、FD144でドライブレターを出現させた上でEXTDISKを組み込む
ことで組み込みを成功させます。

具体的にはCONFIG.SYSに以下のように記述します。
EXTDISKL.BPBはEXTDISK.BPBにリネームしてEXTDISK.SYSと
同じディレクトリに配置しておいてください。
(ここではa:\extdiskディレクトリに配置しています)

device=a:\fdd144\fd144.exe /gioctl
device=a:\extdisk\extdisk.sys

結果、以下の画像のようにDドライブ、Eドライブとして認識します。

freedos98_fdd.png

試しに闘神都市IIを
D:\>alsmenu d: a:
としてインストールしたところ、特に問題無くインストールできましたので
問題はなさそうです。

freedos(98)でMOを使う

前回freedos(98)を実機のPC-9801USで使えるようにしましたが、
そのままでは外部とのデータのやりとりをするたびにCFを外して
PCで編集しないと行けないので不便です。
そこでMOを使えるようにすることとします。

MOを使用するデバイスドライバとして、vectorからダウンロードできる
「NEDRV」を使用します。
http://www.vector.co.jp/soft/dos/hardware/se005370.html

NEDRVの使用にはPC-9801-55互換のSCSIカードと
特定ベンダーのMOドライブが必要となりますが、
SCSIカードはICMのIF-2771ETが搭載されているので問題ありません。
MOドライブは中身を確認していませんが、とりあえずそのまま
認識させてみます。

結果ですが、以下の画像の通り、Bドライブとしてすんなり認識しました。

freedos98_mo.jpg

ただし、ディスクのフォーマットには注意が必要で、付属のNEFORM.EXEで
フォーマットしたディスクはWindows7では認識できず、Ubuntu 12.04では
認識できました。
Windowsやその他のフォーマッタでフォーマットしたディスクを使いたくなるところですが、
逆にNEDRVで認識できなかったり、NEDRVで書き込んだディスクがWindowsで
見えなかったり、その逆になるなど互換性に問題があるようです。
ですので、Windows7で認識できないのはあきらめて、NEFORM.EXEで
フォーマットしたディスクを使った方がよいかと思います。

FreeDOS(98)を実機で動かしてみる

FreeDOS(98)をPC-98エミュレータで動かす情報はあるのですが、
実機で動かしてみたという話は検索してみても出てこなかったのでやってみました。
ソースイメージは
http://black.sakura.ne.jp/~sakai/metajo/mtj_zai_download.htm
で公開されているツァイメタ女のイメージの中身を
http://mwlab.net/2011/11/pc-98-emu-hdd-image.html
で公開されているHDDイメージの中にあるkernel.sysとcommand.comに
置き換えたもので試しています。

とりあえず動かすだけならイメージの実データ部分をそのまま
IDE接続のストレージに書き出せばよいので
CFをUSBカードリーダ経由で接続してLinuxからddコマンドで書き込みます。

dd if=test.hdi of=/dev/sdx bs=512 skip=8
(書き込み元のイメージがAnex86形式のtest.hdiで、
書き出し先のCFカードが/dev/sdxで認識されている場合)

実験には前面から簡単にIDEディスクを交換できるPC-9801USを使用しました。
CFカードの容量は512MBですが、元のイメージのサイズが40MBなので
パーティションサイズは40MBとなります。

試してみた結果、以下のことが分かりました。

・EMM386.EXEを組み込むとハングアップする。
・FDXMS.SYSを組み込まないで起動するとハングアップする。
・FDXMS.SYSを組み込んで起動すればOK

なぜかXMSドライバを組み込まないとうまく起動しませんでした。
以下のようなconfig.sysを書けばOKです。

files=20
buffers=10
device=fdxms.sys
dos=high

起動時の画面と、試しにアリスソフト様がフリー宣言されたゲームの
闘神都市IIを動かしてみた画面が以下となります。

freedos98_real_machine1

freedos98_real_machine2

とりあえず起動には成功しましたが、このままだとディスクサイズが
40MBに制限されるので何とかしたいところです。
MS-DOSに頼ってしまっては本末転倒になってしまうので、
フリーソフトのみで何とかならないか検討中です。

NEOGEO CDの複合同期信号 その2

NEOGEO CDの複合同期信号について書いてからずいぶんたってしまいましたが、
ようやく対策する気になったので公開します。

NEOGEO CDのメインクロックですが、24.167829 Mhzが乗っていて
HSYNCは15.734kHzになるようです。
ということは、14.31818MHzからHSYNCを作れるので、
以下のような回路とお試しソフトウェアを作成して試してみました。
ソフトウェアについてはお試し状態で検証不十分なので
参考にする場合は自己責任でお願いいたします。

NEOGEO_SYNC_FIX.png

http://poorcore.web.fc2.com/files/NEOGEO_SYNC_FIX_20140127.ZIP

動作ですが、VSYNCが出力されるタイミングでHSYNCのタイミングが狂っているので、
その部分をAVRの16bit Timerで作成したPWM信号に置き換えています。

結果としては以下の写真のように、画面上部の歪みはほぼ無くなっているので
効果はありました。

NEOGEO_SYNC_FIX_1.jpg


NEOGEO_SYNC_FIX_2.jpg

ただ、現状では以下の問題があるため、よく見ると画面上部が左右に微妙にふらついています。

(1) GPIOで元のHSYNCの立ち下がりを検出してからタイマーを起動しているため、
200nsec程度遅れている
(2) 本体クロックとのずれを考慮して毎フレームタイマーを起動し直しているため、
PWM信号のタイミングがフレームごとに微妙に違う

次のステップとしては次の2通りが考えられます。

(a) 回路を内蔵してしまい、CPUクロックに同期してSYNCを生成する。
これならばいちいち本体信号とPWM信号を切り替える必要がないので完璧なはず。

(b) タイマーを起動する1つ前のHSYNCのタイミングで割り込みをかけて、次のHSYNC
にはプログラムウェイトでタイミングを合わせてタイマーを起動する。

時間があればどちらかにトライしてみるつもりです。