JavaScriptを有効にすると、ここにメニューを表示します。
FM TOWNS実機救済用ブートローダープロジェクト

ysflight.com

FM TOWNSの実機があっても、CDドライブも故障し、フロッピーディスクドライブも読めない、CMOSも飛んでしまった、というと手も足も出ない状況になります。

既に、YSSCSICD.SYSを組み込むことで外付けCDドライブを内蔵CDドライブとして認識させることには成功していますが、いくつか問題がありました。ひとつは、Towns OS V1.1用、V2.1用で別の起動ディスクを用意する必要があった点です。あるいは、仮にゲームタイトルがCD-ROM I/Oを直接攻撃していないとしても、VINGBIOSのように特別なドライバまたはBIOSを必要とするゲームタイトルは、それ専用の起動ディスクを用意する必要がありました。

もうひとつは、内蔵CDドライブも内蔵フロッピーディスクドライブも死んでしまってCMOSも飛んでしまったTownsを救済することができない点です。 こうなってしまうと、起動可能なデバイスはSCSIハードディスクかICメモリカードのふたつだけになりますが、SCSIハードディスクからTownsOSを起動するためにはドライブレターを割り当てる必要があり、ドライブレターを割り当てるにはTownsOSを起動しなくてはならないという鶏と卵状態になります。ICメモリカードに至っては使えるものがほとんど手に入らない模様です。

さらに、フロッピーディスクに依存しているので、Windows上で生産ができなくなってしまった点です。少し前までWindows 10でも1232KBフロッピーディスクをフォーマットすることはできたらしいのですが、いつからかできなくなったらしいです。Townsがあれば1232KBフロッピーディスクをフォーマットできますが、1232KBフロッピーディスクがないとTownsが起動できないという、これまた鮭とイクラ状態になります。

我がFM TOWNSエミュレータ「津軽」は外付けSCSI CDドライブをサポートしたので、実機に持っていく前にフルにエミュレータ上でブートローダーの開発とテストができるようになりました。そこで、一念発起してブートローダーを書くことにしました。

そこで、実機救済用ブートローダープロジェクトを開始することにしました。SCSIハードディスクのIPLセクタはドライブレターと関係なく読み込まれて実行されるので、理論的にはハードディスクの特定セクタにプログラムを書き込んでおけばCMOSが飛んだ環境でもそのプログラムを実行可能です。そして、外付けSCSI CDドライブのIO.SYSを読み込み、BIOSリダイレクタを組み込んだ状態で続きを起動すれば外付けSCSI CDドライブからの起動が可能になるはずです。

なお、CMOSが飛んだTOWNSでこのHDイメージでCMOSを設定する場合は、次の手順に従ってください。

(1) まず電池を交換する。それほど難しい工作ではないですが、自信が無い場合は誰か自身のある人に頼みましょう。

(2) とりあえずCMOSが消えていることは無視して、TownsOSかMS-DOSに起動可能なHDイメージで起動。このとき「起動ドライブがドライブ構成に登録されていません」というエラーが出ますが、このときCMOSがリセットされます。

(3) いったん電源を切って、Townsの電源を切って、このHDイメージで起動してドライブを登録。

(4) 再度電源を切って、このHDイメージで起動してドライブ構成を登録。

(5) また電源を切って、今度はTownsOSかMS-DOS起動可能なHDイメージで起動。

この手順で、CMOSが飛んだTOWNSも復活するはず。

更新情報

2020/10/12

2020/10/03

2020/10/02

2020/09/30

2020/09/29

2020/09/28

2020/09/26

必要なもの

最近はもはや新品のSCSI CDドライブは存在しないと思いますが、中古なら手に入るので頑張ってゲットしてください。 

CDブートローダー

なんと!FM TOWNS II HR, FM TOWNS II MXでは少なくともシステムROMはSCSI CD-ROMからIPLセクタを読み込んで、IPLにジャンプすることが判明しました!おそらくII CX以降は同様なのではないかと思います。2Fではダメでした。エミュレータ上ではMXのROMで確認、実機ではHRでその動作を確認しました。

そうであればIPLを自作すればCDから直接起動するプログラムを書くことができて、CDの入れ替えが必要になりますが、その後普通にTownsシステムソフトウェアを起動することができるようになります。やり方はめちゃくちゃ簡単で、

https://github.com/captainys/FM/tree/master/TOWNS/IPL/DISKIMG

ここから、CDIMAGE.ISOをダウンロードして、CD-Rに焼くだけ。

あとは、TOWNSに接続したSCSI CDドライブに焼いたCD-Rを入れて起動すると、ディスクを入れ替えてパッドのボタンを押すようにプロンプトが出るので、そのようにすればTOWNSのソフトが起動します。

注意点としては、

CDブートセクター

さらに、なんと直接SCSI CDから起動するTowns OSが作れてしまいます。まず、Towns OSのディスクのISOイメージを作って、最初の6KBを↓のデータで書き換えるだけです。

https://github.com/captainys/FM/tree/master/TOWNS/IPL/BOOTSECT

ISOイメージをバイナリエディタなどで編集すればOKです。CUE/BIN形式の場合、データトラックのセクタ長が2048となっている場合はBIN形式の最初の部分をISOイメージと同じように書き換えればOKですが、2048以外の場合、セクタとセクタの間に隙間があるので、その隙間を避けるように上書きする必要があり、そういうことができるツールがあるのかどうかはちょっと知りません。需要があるようであればCUE/BIN編集ツールも書こうかと思いますが。

初版の事情により実機HRではTownsシステムソフトウェアV2.1L31しか確認してませんが、津軽上ではCD-ROM I/Oを直接攻撃していないソフトなら大概このブートセクタで対応できるようです。RAYXANBERがうまく起動しないんだけど原因は調査中。

FDブートローダー

FDブートローダーはフロッピーディスクに依存するという問題は解決できませんが、Towns OS V1.1, V2.1で別々の起動ディスクが必要になるという問題は解決します。非常時の起動用に何枚か作っておいても良いと思います。

↑の必要なものに加えてフロッピーディスクが最低一枚必要になります。

FM TOWNS II MX, II HRで起動を確認しています。↓のフロッピーディスクイメージ(FDIMAGE.BIN または FDMINI.BIN)をなんとかして1232KBフォーマットしたフロッピーディスクに書き込んでください。

https://github.com/captainys/FM/tree/master/TOWNS/IPL/DISKIMG

なお、ディスク先頭の128KBぐらいしか使わないので(一応160KBリザーブ)、先頭部分だけ抜き出したFDMINI.BINを書き込んでもいいですし、ディスク全体のFDIMAGE.BINを書き込んでもいいです。

2020/10/12 update: FDMINI.BIN / FDIMAGE.BIN を使うとディスクから起動するといきなりSCSI CDドライブを探しに行きますが、新しいイメージFDMINIM.BIN / FDIMAGEM.BINを使うとブートメニューに入ります。

最近ではフルに使えるディスクすら手に入りにくくなっていますが、先頭部分さえフォーマットできれば起動できるので、そのようなディスクを有効利用できます。環境にやさしいブートローダーとなってます。

そして、起動不能になっているTOWNS本体のディスクドライブに作成したフロッピーディスクをセット、SCSI接続のCD-ROMドライブにTownsシステムソフトウェアのCD(ゲームでもいいけど)をセットして起動すると、しばらく待ってると外付けCD-ROMドライブを内蔵ドライブだと思い込んだTOWNSが起動します。

最近ではフロッピーディスクを1232KBにフォーマットするのが難しくなっていて、さらにディスクイメージを書き込むのが難しくなっていますが、起動不能になっているTOWNSの他に起動可能なTOWNSが一台あるのであれば、生きている方のTOWNSを使ってディスクイメージを書き込むコマンドラインツールツールも↓に置いてあります。

https://github.com/captainys/FM/tree/master/TOWNS/FDWRITE/EXE

フォーマットまではTownsOSなりDOSなりを使う必要がありますが、1232KBフォーマットさえできてしまえば、コンソールモードに入って、

RUN386 -nocrt FDWRITE.EXP A: FDMINI.BIN

みたいな感じで実行するとイメージを書き込むことができます。なお、確認などしてこないので、うっかり大事なディスクを上書きしないようにしてください。

なお、FM TOWNSエミュレータ「津軽」上で動作を見ることができます。津軽GUIは対応していませんが、コマンドから、

.\Tsugaru_CUI.exe ROM_MX -SCSICD5 TownsOSV2.1L20.cue -FD0 FDIMAGE.BIN

みたいな感じで実行するとSCSI CDドライブから起動する様子を再現できます。

SCSI HDDブートローダー

そんなこと言ったって目の前にあるTOWNSはCDドライブが死んでてTownsシステムソフトウェア起動できないし、別の一台なんて持ってないし、Windows 10を最新バージョンにアップグレードしたら1232KBのフロッピーディスクフォーマットできなくなっちゃったし、あるいはポータブルCD-ROMドライブを買ってみたらSCSI IDが5番か6番しか選べなかったからどうにもならんよ、という人のために、SCSIブートローダーを開発しました。

今では、UNZまたは津軽などエミュレータを使って起動可能なハードディスクイメージを作成することは可能になりました。しかし、実機で実行するにはドライブレターにハードディスクを割り当てなくてはなりません。しかし、ドライブレターを割り当てるには、TownsOSまたはMS-DOSを起動する必要がありました。しかし、TownsOSまたはMS-DOSをハードディスクから起動するためにはドライブレターを割り当てる必要があり、まさに鮭とイクラ問題。

しかし、それも昨日まで。

SCSI2SDまたは変換番長のような仮想SCSIハードディスクを使って、このハードディスクイメージから起動して、ドライブレターを割り当てることができます。起動すると、デフォルトではSCSI CDから起動するメニューを選んだ状態になっているので、パッドの上下を使って、メインメニューに移行して、次にドライブレター割り当てメニューに進んで、パッドの上下でドライブ選択、左右でドライブにSCSI IDを割り当てることができます。そして、"BACK TO MAIN MENU"として"SAVE CHANGES"を選ぶと割り当て完了。

その後、エミュレータで作ったハードディスクイメージを仮想SCSIハードディスクにマウントして起動することができます。

↓のHDIMAGE.BINがそのイメージになります。

https://github.com/captainys/FM/tree/master/TOWNS/IPL/DISKIMG

一応、バイナリエディタなどを使ってHDDブートローダー自体の後ろを512バイト単位で0で埋めてサイズを引き延ばすと、TOWNSは単に容量の大きなHDとして認識するので多分パーティションを追加してTownsOSその他をインストールすることが可能なはずです。まだ試してないんですが。

さらに、既にあるハードディスクイメージの後ろにこのブートローダーを追加することも可能なはずなのですが、一部書き換えが必要で、まだ試してません。

これにより、仮想SCSIドライブだけあればSCSI CDドライブからの起動ができない旧モデルのTOWNSで起動フロッピーディスクの生成ができない場合でも救済できるはずです。

起動成功確認機種

現在のところ以下の機種で起動成功の報告がありました。試していただいた方、ありがとうございました!

起動できなかった報告

起動確認ソフト

起動できない確認ソフト

基本的にYSSCSICD.SYSで起動するためにパッチが必要なソフトは起動できません。

技術情報

電源投入後の起動プロセスで、FM TOWNSのシステムROMは、起動メディアの最初のセクタをB000:0000からに読み込み、最初の4バイトが"IPL4"だった場合、B000:0004にジャンプします。このプロセスはドライブレターの割り当てその他CMOS設定と無関係に発生するので、自力で書いたコードをディスクの最初のセクタに書き込むことで、CMOSが飛んでいようがなんだろうが自分のコードにジャンプさせることができます。救難ブートローダーはこの仕組みを使っています。

起動の最初のステージ(IPL)は、どうやら2KBに限らている、というかフロッピーディスクだと先頭のセクタ2個、ハードディスクの場合だと先頭のセクタ4個としているようです。しかし、2KBでは大したことができないので、IPLは大きめの第二段階のブートローダーを8000:0000からに読み込んでジャンプします。(もともとのIPLの場合IO.SYSを読み込んでジャンプ)

第二段階のブートローダーは、YSSCSICD.SYSをB400:0000~に読み込み、次にSCSIチェインの中でCD-ROMまたはCD-Rドライブを探します。見つけたら次に最初の方で"FBIOS"で始まるセクタを探します。それがIO.SYSの最初のセクタです。IO.SYSの長さはTowns OSのバージョンによって異なりますが、128KBを超えることは無いらしいので、64セクタ読み込んでおけば大丈夫のようです。(CD-ROMのセクタ長は2KB)

IO.SYSを読み込んだら、元のIPLであればそのままIO.SYSにジャンプするところですが、このブートローダーは、IO.SYSに細工をします。IO.SYSはBIOSを初期化した後、JMPFする箇所があるのですが、そこを探してブートローダーにジャンプするように飛び先を加工してからIO.SYSにジャンプします。このとき、AXの値をF7FFHとします。するとIO.SYSはB0000~BFFFFのメモリが実装されていないと思って使用禁止にします。このためあらかじめ読み込んでおいたYSSCSICD.SYSが破壊されることはありません。また、BX=0008HとすることでIO.SYSに内蔵CDから起動していると思い込ませることができます。

すると、IO.SYSはBIOSを一通り初期化してからこのブートローダーに飛んできます。そのタイミングでYSSCSICD.SYSにINT 93Hをリダイレクトします。あとは、IO.SYSの続きにジャンプしてやれば、SCSI CDを内蔵CDだと思い込んでTowns OSが起動してくるという仕組みです。

直接起動用ブートセクタは、IPLと第二段階ブートローダーとYSSCSICD.SYSを8KBに詰め込んだものです。システムROMはハードディスクからセクタを4個読み込んでいると思っているのですが、実はCD-ROMから4セクタを読んでいるので、2KB x 4=8KBを読んでいます。また、IPLにジャンプする段階でBHにSCSI IDを通知してくれるので、SCSIチェインのスキャンが必要ありません。それに加えて、既にセクタが読み込めているのでUnit Readyを待つループも省略できました。YSSCSICD.SYSは32KBありますが、実はそのうち28KBぐらいは  DB 2354 dup (0) とただ0が並んでいるだけなの実質4KB程度です。もともとB000HセグメントにIPLを読み込んでくれるので、YSSCSICD.SYSを転送する手間もかかりません。そういうわけで、結局青森県地図とDemosplash 2020へのお誘いメッセージを含めて5KBに収まってしまいました。まだ2KB強の余裕が残っているので、デモプログラマーとしては何かデモを入れ込みたい気分になってます。

ちなみに、SCSI CDからのTOWNS起動は本来不可能なはずでした。津軽を使って起動時のSCSIコマンドの動きを見たのですが、コマンド12H (INQUIRY)を出しているのでシステムROMがデバイスの種類を判別しているのは間違いなく、そうであればハードディスク以外のデバイスのブートセクタを読むことはないだろう、と思っていました。ちなみに、TOWNS 2FのシステムROMはそのような動作をします。ところが、念のため確認してみようかと思って津軽上でMXのROMを使って仮想SCSI CDドライブをマウントした状態で起動してみたところ、コマンド12Hが出た後で、まるでデバイスの種類は無視したかのようにコマンド28H (READ10)が出ました。

ありえんだろう、と思ったのですがそのまま起動を続行させると、内蔵CDから起動していると思い込んでいるのでその先は失敗して、不正な割り込みが発生しました、と言って止まります。ブートセクタが読み込まれていなければ、システムROMに処理が戻って次の起動デバイスを探しに行くはずなので、間違いなくセクタを読んでIPLにジャンプしていました。

だったら実機で同じ動作をするか確認してやれ、と、思って隣に置いてあるTOWNSのSCSI CDドライブに適当なCDを入れて起動してみたところ、なんと!不正な割り込みが発生しました!なるほどなあ、MXのシステムROMはデバイスの種類に限らず先頭セクタを読み込んでIPLにジャンプするのか。でも、他のTOWNSでも動作が同じなのかな? と、思った次の瞬間、考えてみたら当日TOWNS II HRの電源をAT化してテストのためにMXを下ろしてHRを置いてあったんだった。うっかりHRのシステムROMでもSCSI CDドライブから起動できることを確認してしまいました。しかも、SCSIコマンドをエミュレータで見たところ、先頭LBAから4セクタ読み込んでいます。ハードディスクであれば先頭の4セクタ、2KBを読み込みますが、SCSI CDだと1セクタが2KBなのでなんと8KBも読んでくれます。それならSCSI CD起動用のIPLが書けるはず、と、思って書いてできたのが↑のCDブートローダー、ブートセクタでした。

Comments are welcome.  Send E-Mail to: 

Back to http://www.ysflight.com