JavaScriptを有効にすると、ここにメニューを表示します。
CDドライブが死んだFM-TOWNS用にSCSI CD-ROMドライバCDSD.SYSをビルド

ysflight.com

つい最近、間違ってヤフオクでFM-TOWNS 2MXを落としてしまった。絶対30,000円で落ちないよな!と、思って35,000円で入札したら落札額25,000円だった。その後アメリカまでの送料の方が高くついた。この機種は僕が大学2年〜大学院1年目ぐらいまで主力として使った機種だった。あのクソつまらないPC98なんていう機種がのさばっているようでは日本のパソコン文化は続かない、なんとしてもFM−TOWNSを応援しなきゃ、という一念で、フリーソフトを量産した。僕は、正しくない未来予測をするのが得意なのだが、日本のパソコン文化が続かなくなるという予想だけは当たってしまった。

当時使っていた一台は渡米に際して友達にもらってもらったのだが、今回届いたこの一台はどういう人に使われてどういう命を生きてきたんだろう?

せめて自分ができる範囲で当時の日本のパソコンを保存していこうと思って、今手元にFM-7、FM77AV、FM77AV40、FM TOWNS 2F (20Fだと思ったら2Fだった)、FM TOWNS 2MXがある。このうちFM-7、FM TOWNS 2Fは当時実際に自分が使っていた機種が奇跡的に生き残っていたもので、FM-7はコンディションが悪かったもののカーネギー・メロンのコンピュータクラブの修理の名人によってVRAMチップを交換して完全に動作する状態になった。

新たに落とした2MXは、割と信頼できるソースからの出品で、CDドライブも動作するということだったのだが、届いてみたら動かない。どうもレーザーの出力が弱いのかCD-Rに焼いたものが読めない。貴重な原本は厳重に保管しているので、なるべく引っ張り出したくない。また、プレスした通常のCDは読めるもののディスクの外側の方の読み込みが不安定というかほとんど失敗する。CD-DAの再生もできない。

当時「FM TOWNSシステムセットアップガイド」なんていう本の執筆にも入れてもらったのに、ハードウェアはほとんど素人なもんだから、CDドライブが壊れたらSCSIのCDと交換すればなんとかなるのかな、と、思っていたら甘くなかった。FM TOWNSのCD ドライブは富士通特製でまったく標準的な規格のものではなかった。だから、出回ってるSCSIのCDドライブと交換なんてできない。

しかし、どうやらCDSD.SYS (宇野澤成夫さん作)とCDISC2.SYS (加藤武男さん作)というデバイスドライバを使うと外付けSCSI CDドライブを内蔵ドライブの代わりとして使えるようになり、しかもCD-DAの再生もできるとのこと。ちなみに、結論だけ言うと大成功。我が2MXはPanasonic CW-7502-B を認識した。こんなドライバが存在するとは奇跡的としか思えない。作者の方には非常に感謝している。

ところが、CDSD.SYSはソースコードだけ公開で、バイナリがダウンロードできない。とりあえず僕は使えるようになったけど、普通の人はアセンブルできない。ドキュメントには、バイナリは製品版扱いとあるものの、どこにも売ってない。10,000円ぐらい払っても良かったのに。いや、でも、仮に買えたとしても使えなかったと思う。バグっててTOWNS OSではそのままでは使えない。

多分、FM TOWNSを動態保存している人は他にもいるはず。また、驚いたことにアメリカ国内でFM TOWNSを動態保存している人が案外いるらしい。高いクオリティのDOSゲームやアーケードの移植(しかもBGMがCDから再生だからありえないクオリティだったりする)のおかげだと思う。そういう人向けにCDSD.SYSのビルド方法を書いておく意義はあるかもしれないと思ったので、まとめてみた。

なお、CDSD.SYSはそのままだとTOWNS OSでは使えない (FM-R/TOWNS対応って書いてあるのに! )。TOWNS OSで使うとCONFIG.SYSのパラメータのパーシングでバッファオーバーフローする。このバグを直してもSCSI CDドライブを接続してないとFORRBIOSのインストールで無限ループになる。だがしかし、俺はプログラマーだ。ソースがあるなら直す!ということで、ほぼ30年ぶりに8086アセンブラと格闘してバグ取ったんで。ライセンス条項を見たら修正したソースは公開しても構わないっていうんで、ここで公開することにした。

FM TOWNSは割とCDドライブが死ぬことが多いと聞いたんで、なんとか許可をもらってCDSD.SYSのバイナリを例えばSCSI IDとドライブ名決め打ちとかにしてFM TOWNS専用(FM-R不可)とかにして公開させてもらえないかと思ったけど作者の人に連絡取れない。Vector.co.jpからリンクないし。READMEに連絡先書いてないし。

なお、CDSD.SYSのソースコード改変版を含めて、CDISC2.SYSのバイナリとソースコードは再配布可能とのことなので、ご厚意に甘えて、ZIP形式にしてここからもダウンロードできるようにした。このCDSD.SYSのソースは、TOWNSで使用できないバグを修正済み。

[CDSD.SYSソース] [CDISC2.SYS] 

CDSD.SYSのビルド

まず用意するもの。

  1. CDSD.SYSのソース
  2. ビルドスクリプトFMBUILD.BAT <-ここからダウンロード
  3. FM TOWNSエミュレータ「うんず」とコマンドモードに入れるシステムディスク (多分DOSエミュレータならなんでもいい)。あるいは実機でも可。
  4. MASM.EXE (一応5.0で確認したけど4.0でも行けるらしい)またはTASM.EXE (4.1で確認)。なお、実行ファイル一本だけでいい。
  5. EXE2BIN.EXEとLINK.EXE (僕はMS DOS 3.1のシステムディスクから発掘した)
  6. ディスクイメージ読み書きするツール。EditdiskとかImDiskとか。実機でビルドするなら不要。

まず最初のハードルはMASMのゲット。昔はMicrosoftのサイトからダウンロードできたらしいが今は無い。気づいたら、研究室にあったMSDNのCDは処分されていた。処分するぐらいならなんでもらっておかなかったのか。。。これは、がんばって探す。としか言いようがない。大学の研究室の倉庫に残ってるかもしれないし、中古ソフト屋とかを探すとかeBayを探してもいいけど、とにかくMASMを見つける。

多分EXE2BIN.EXEとLINK.EXEはMS-DOSのシステムディスクに入っているようなのでこっちの方が確保しやすいと思う。

もしもFMBUILD.BATが怪しいバッチファイルと思われてダウンロードできない場合は、以下のテキスト内容なので作る。

REM Build for FM-R / FM-TOWNS BIOS



SET ASM=""
IF EXIST UTIL\TASM.EXE SET ASM=UTIL\TASM.EXE
IF EXIST UTIL\MASM.EXE SET ASM=UTIL\MASM.EXE
IF NOT "%ASM%"=="" GOTO ASMFOUND

ECHO Assembler not found.
ECHO Copy MASM.EXE or TASM.EXE in UTIL
GOTO EXIT

:ASMFOUND



IF EXIST UTIL\LINK.EXE GOTO LINKFOUND

ECHO LINK.EXE not found.
ECHO LINK.EXE must be in UTIL directory
GOTO EXIT

:LINKFOUND



IF EXIST UTIL\EXE2BIN.EXE GOTO EXE2BINFOUND

ECHO EXE2BIN.EXE not found.
ECHO EXE2BIN.EXE must be in UTIL directory
GOTO EXIT

:EXE2BINFOUND




cd source


..\%ASM% /DDRIVE=SCSI2 /DIF_TYPE=FM /DDRV_TYPE=XA cdsd.asm
..\util\link cdsd;
..\util\exe2bin cdsd.exe cdsd_xa.sys
del cdsd.exe
del cdsd.obj
copy cdsd_xa.sys ..
del cdsd_xa.sys

..\%ASM% /DDRIVE=SCSI2 /DIF_TYPE=FM /DDRV_TYPE=OLD cdsd.asm
..\util\link cdsd;
..\util\exe2bin cdsd.exe cdsd_old.sys
del cdsd.exe
del cdsd.obj
copy cdsd_old.sys ..
del cdsd_old.sys

..\%ASM% /DDRIVE=SCSI2 /DIF_TYPE=FM /DDRV_TYPE=PHOTO cdsd.asm
..\util\link cdsd;
..\util\exe2bin cdsd.exe cdsd_photo.sys
del cdsd.exe
del cdsd.obj
copy cdsd_photo.sys ..
del cdsd_photo.sys


cd ..


:EXIT

とりあえず全部準備したとする。しかし、EXEファイルは古すぎるDOSプログラムだからWindowsから直接実行できないっぽい。そこで、FM-TOWNSエミュレータ「うんづ」上でビルドする。多分、PC98のエミュレータでもDOSエミュレータでも大丈夫だと思う。もちろん実機でやってもOK。

EDITDISK等を使って以下のようなディレクトリ構成のディスクイメージを作る。実機でビルドする場合はディスクを作る。

FMBUILD.BAT
+SOURCE
    CDSD.ASMその他、CDSD_SRC.ZIPを展開したファイルをすべて。
+UTIL
    MASM.EXE       MASM 5.0のディスクからMASM.EXEだけコピーしたら全部済んだ。
    EXE2BIN.EXE    僕はMS-DOS 3.1のシステムディスクから発掘した。
    LINK.EXE       これもMS-DOS 3.1のシステムディスクから発掘。

なお、Turbo Assembler V4.1でも全く同じバイナリができることを確認。FMBUILD.BATは対応しているので、MASM.EXE の代わりに TASM.EXE を置いておくとOK。

そして「うんづ」を起動してコマンドモードに入る。MS-DOSのシステムディスクイメージがあればそこから起動しても可。ところで、「うんづ」でマウスカーソルが飛びまくって操作不能になる現象だけど、画面解像度を下げると起こらないようだ。我がThinkPad X250では画面解像度を1024x768にするか、外付けの1280x1024のモニタに「うんづ」のウィンドウを表示するとカーソルが飛ばない。

Aドライブに上で作ったディスクイメージをセットして、

Q> A:
A> FMBUILD.BAT

とタイプ。あとはリターンキーを何度か押して行けば、ビルドが終わって、

CDSD_XA.SYS
CDSD_OLD.SYS
CDSD_PHO.SYS

この3本ができる。またEditdiskかImDiskを使ってファイルを取り出す。実機だったら既にディスク上にファイルができてるのを取り出せばいい。それで、このうちどれを使えばいいのかわからなかったのだが、CDSD_XA.SYSを使えばいいらしい。あとは、TOWNS OS起動ディスクのCONFIG.SYSのBUFFERS=の行の前に、

DEVICE=\CDSD_XA.SYS /I6 /D:SCSI_CD
DEVICE=\CDISC2.SYS /D:SCSI_CD /D:TOWNS_CD /N:CDISC_CD

この2行を追加。なお、/I6はSCSI IDに応じて変更。そして、AUTOEXEC.BATのMSCDEXを呼んでる行のTOWNS_CDをCDISC_CDに置き換え。

C:MSCDEX /D:CDISC_CD /M:8 /L:Q > NUL

こんな感じ。

こうすると、SCSI CDドライブを接続しているときはSCSI CDドライブがQドライブに、無い時は内蔵ドライブがQドライブになる。内蔵ドライブが完全に死んでいるTOWNSだと内蔵ドライブを使う意義は無いかもしれないけど、我が2MXのように半端に生きている場合はそれなりに使えるかもしれない。何がいいかって、これで外付けCDを使うときと使わないときで違うシステムを作っておかなくても良くなるのがいい。

元のCDSD.SYSの修正点

CDSD.SYSのドキュメントにはFM-R/TOWNS対応と書いてあるけど、そのままのCDSD.ASMをFM TOWNSで使うにはふたつ問題がある。というか、FM TOWNSには対応してない。

最初の問題は、他のMS DOSだと知らないけどTOWNS OSのDOSはCONFIG.SYSのパラメータが0dHでなく00H 0AHが終端になっているが、CDSD.ASMは0DHが終端だと思っていることによる。もはや開発環境も無く、デバッガなんて無く、ましてデバイスドライバの不具合なんて原因の究明のしようがない、かと思ったがソースの止めたいところに無限ループを仕込んで「うんづ」のデバッガでたどることで原因を究明できた。なんとかなるもんだ。

原因がわかってしまえば対応は簡単で、GetArgプロシージャ内で、0DHに加えて00H、念のため0AHのチェックを入れるだけ。GetArg2:の直下を、

GetArg2:
    ; CaptainYS >>
    cmp al,00h ; TOWNS-OS terminates with 00 0a
    je GetArg9
    cmp al,0Ah ; TOWNS-OS terminates with 00 0a (Just in case)
    je GetArg9
    ; CaptainYS <<
    cmp al,0dh ; CR ?
    je GetArg9
    cmp al,'/' ; Separator ?
    jne GetArg1

このように書き換えることでドキュメントにあるように本当にFM TOWNSに対応する。

次の問題はもっと厄介で、SCSIのCDドライブを接続した状態で起動すれば何も問題が無いのだが、ドライブを接続していない状態で起動するとなぜかFORRBIOSのインストールで無限ループに陥ってしまう。おそらく、ドライブの有無のチェックのためにFM-RのSCSI BIOSコールを発行した後、何かのリソースを持ったままになっているのだろう、と、思ってBIOSコールの個所をチェックしたところ、AH=0FDH  INT 93H を発行しているのはわかった。しかし、この夏実家から回収してきたFM-R徹底解析マニュアルにもFM TOWNSテクニカルデータブック(初版)にも残念ながら対応するBIOSコールの記述が無く、何が起きているのかわからなかった。

CDSD.ASMのInit procはBAS-SCSI.ASMのInquiry procを呼び、そこからIF.ASMのPhase procを呼び、Phase.procはExPhase procを呼ぶ。ExPhase内でこのBIOSコールを発行してるけど、そのときCDSD.INCで定義されているWork_0をBIOSに渡している。多分、このポインタが以後のBIOSコールでも使われるワークエリアになってて、これをBIOSから解放しないままドライバをAbortしてしまうと以後FM-R BIOSがまともに使えなくなるというパターンだと思うが、もはやどうやって解放すればいいのかわからない。

CDSD.SYSはSCSI CDドライブを発見できなかったときは、デバイスドライバのAbortの手順に従って、Breakアドレス(ドライバの最後尾アドレス)とドライブ数を0にして終了する。そうすると、DOSはそのドライバは無かったことにしてその場所は別のドライバが使ったりする。だとすれば、別のドライバがFM-R BIOSのリソースを破壊してしまってネイティブからFM-R BIOSを呼ぶためのFORRBIOSのセットアップで無限ループになるのではないか?と、思って、試しにCDドライブが見つからなかったときもインストールは成功したふりをして、その代わり、以後あらゆるリクエストに対してエラーを返すようにしたところ、SCSI CDドライブが無くてもFORRBIOSがインストールできてTOWNS OSが起動するようになった。

書き換えは、まずInit8:の xor bx,bx を、

mov bx,offset Break
call NukeJumpTable

と置き換える。そして、Initプロシージャの末尾にNukeJumpTableを追加。

; CaptainYS >>
NukeJumpTable:
    push di
    push ax
    mov di,offset ComTbl0
    mov word ptr [di] ,offset None
    mov word ptr [di+2] ,offset None
    mov word ptr [di+4] ,offset None
    mov word ptr [di+6] ,offset None
    mov word ptr [di+8] ,offset None
    mov word ptr [di+10],offset None
    mov word ptr [di+12],offset None
    mov word ptr [di+14],offset None
    mov di,offset ComTbl8
    mov word ptr [di] ,offset None
    mov word ptr [di+2] ,offset None
    mov word ptr [di+4] ,offset None
    mov word ptr [di+6] ,offset None
    mov word ptr [di+8] ,offset None
    mov word ptr [di+10],offset None
    mov word ptr [di+12],offset None
    mov word ptr [di+14],offset None
    mov word ptr [di+16],offset None
    mov di,offset IIOCTbl
    mov word ptr [di] ,offset None
    mov word ptr [di+2] ,offset None
    mov word ptr [di+4] ,offset None
    mov word ptr [di+6] ,offset None
    mov word ptr [di+8] ,offset None
    mov word ptr [di+10],offset None
    mov word ptr [di+12],offset None
    mov word ptr [di+14],offset None
    mov word ptr [di+16],offset None
    mov word ptr [di+18],offset None
    mov word ptr [di+20],offset None
    mov word ptr [di+22],offset None
    mov word ptr [di+24],offset None
    mov word ptr [di+26],offset None
    mov word ptr [di+28],offset None
    mov word ptr [di+30],offset None
    mov di,offset OIOCTbl
    mov word ptr [di] ,offset None
    mov word ptr [di+2] ,offset None
    mov word ptr [di+4] ,offset None
    mov word ptr [di+6] ,offset None
    mov word ptr [di+8] ,offset None
    mov word ptr [di+10],offset None
   
    mov byte ptr [DevNam] ,'D'
    mov byte ptr [DevNam+1],'I'
    mov byte ptr [DevNam+2],'S'
    mov byte ptr [DevNam+3],'C'
    mov byte ptr [DevNam+4],'O'
    mov byte ptr [DevNam+5],'N'
    mov byte ptr [DevNam+6],'N'
    mov byte ptr [DevNam+7],' '

    pop ax
    pop di
    ret
; CaptainYS <<

Init endp

この書き換えでは、ジャンプテーブルをすべて None に変更してあらゆるリクエストに対してエラーを返すようにする。それから、後からこの本来存在しないドライブが発見されてしまわないようにデバイス名を"DISCONN"に変更する。

こうすることで、SCSIのCDドライブが接続されているときは指定のデバイス名のCDドライブが追加され、無いときは"DISCONN"として追加されるので、以下のデバイスドライバやMSCDEXではドライブが存在しないものとして扱われる。 

Comments are welcome.  Send E-Mail to: 

Back to http://www.ysflight.com