JavaScriptを有効にすると、ここにメニューを表示します。
FM-7/77シリーズRS232C経由テープ版ソフト実行ユーティリティ  T77Server.exe

ysflight.com

概要

FM-7/77シリーズ実機とWindows PCをRS232Cクロスケーブルで接続して、FM-7/77実機にT77形式化したテープ版ソフトを送り込んで実行することができます。FM-7/77実機側では、電源投入またはリセット後毎回5行のF-BASICプログラムをタイプしなくてはならないですが、いったんそれを実行してしまえば、あとは普通に RUN "" とか LOADM"",,R でWindows PC上のサーバーからプログラムが流れ込んで実行できます。昔よくあった最初のLOADMでローダーを読み込んで、ローダーがバイナリブロックの本体プログラムを読み込むといったパターンでも、Windows PC上で動くサーバーがローダープログラムのBIOSコール部分を書き換えてBIOSリダイレクタを呼ぶようにしてから送り出すのである程度対応できます。BIOSリダイレクタは、デフォルトでは裏RAMの末尾から$FC00~にロードされ、フットプリントが小さく、最小98バイトに収まります。さすがにどんなタイトルでも98バイトの余裕が無いものは無いと思うので、大半のFM-7テープ版タイトルに対応できると思います。

はじめに

ヤフオクでFM77AV40を落としてみたらフロッピーディスクドライブがが死んでいたとか、懐かしのテープ版ソフトを実機で実行したいのだが、うっかりヤフオクでFM77AV40SXを落としてしまってテープインターフェースがついてなかったとか、動作するFM-7が手元にあるけどテープインターフェースケーブルが無いとか、またはデータレコーダが無くてテープ版ゲームが実行できないとか、そんな場合もまったくノー問題。

RS232C経由でXM7用T77テープイメージになっているソフトを実行するユーティリティを作りました。Windows上で動作するT77サーバーと、FM-7側でBIOSをオーバーライドしてカセットテープからの1バイト読み書きをRS232Cにリダイレクトするクライアントプログラムのペアで使います。

しかし!FM-7側にクライアントを転送できればプログラムをなんぼでも送り込めるけど、クライアントを送り込むにはクライアントが必要という、まさに、ニシンが先かカズノコが先かという無限再帰問題になってしまうと思ったら、それに対する解決もあります。

さすがに、LOADM "",,R ほど簡単にはできないですが、5行のF-BASICプログラムでインストーラをサーバーからFM-7に転送できます。(いや、最終行は CLOSE だけだから無くても多分動くから面倒だったら4行。) だから、テープ版ソフトを実行するには、まず5行のF-BASICプログラムを入力して実行サーバーからBIOSリダイレクターインストーラを転送。実行してBIOSリダイレクタをインストール。続いてRUN ""またはLOADM"",,R という流れになります。

いやいやいや、LOADとLOADMだけ使ってるゲームだったら起動できても、当時よくあったパターンで、最初のLOADMでローダーを読み込んで、ローダーはF-BASICと関係ないフォーマットでテープからプログラム本体を読み込むパターンだったら対応できなさいでしょう、と、思ったら大間違い。サーバー側で、マシン語プログラムを認識して、BIOSコールしている箇所 (JSR [$FBFA], JSR $F17D, JMP [$FBFA], JMP $F17D)を探して、リダイレクタにジャンプするように書き換えることで、PLAZMA LINEとCourageous Perseusの実行にも成功しています。(ついでに、Courageous Perseusとテラ4001ではRS232C経由のセーブも成功)

これまでに実機FM77AV40, FM-7で起動確認できたタイトルには、Emergency (COMPAC), Delphis (COMPAC), Dragon Slayer (Falcom), Dig Dug (namco, 電波新聞社), PLAZMA LINE (Technosoft), Courageous Perseus (コスモスコンピュータ), FM-7デモ (富士通), FM-new7デモ (富士通)、テラ4001 (T&E)、EES成績処理教育評定専用プログラム (アーバン電子) があります。

なお、セーブもできます。サーバー起動時に -save filename.T77 としておくと本体から書き込まれた内容をT77ファイルに保存して、当然XM7上から見えるようになるし、再度実機から読むこともできます。オプション付け忘れて起動してあとからセーブしたくなったらサーバー上でSVコマンドでセーブもできます。

ただしDelphisはバグフィックスが必要でロードがやや面倒になります(後述)。1984年のタイトルだから、35年ぶりにぜんぜん関係ない僕に回収されるバグ、まさにテクノロジーの無駄遣い感がいいですね。というか、当時お年玉を投入して買って冬休み中死ぬほど遊んだ記憶があるので、当時はFM-7で安定して起動できていたんだと思いますが、RS232C経由の実行が5回に1回ぐらいしか成功しないもんだから、逆アセンブルしてこのバグを見つけたときは、なんで当時動いてたんだ?と、思いました。

なお、8バイト先読みバッファを使うモードだとテープ比5倍速ぐらいの爆速ロードができます。エミュレータ上でロード中全力駆動することで爆速起動というのはありますが、テープ版ソフトが実機上で爆速起動するのを見るのは笑えます。当時データレコーダが回るのを見ながらひたすら起動を待ち続けたソフトの実機上での爆速起動を見るためだけにこのサーバーを使ってみる価値ありです。まさにテクノロジーの無駄遣い。

さすがに既に老朽機。実機をメインで使うということは無く、昔のソフトを見たくなったらエミュレータXM7等で起動するのがほとんどかもしれません。でも、動作する実機があるなら、まだ実機が稼働したいと言ってるなら、ときどき電源を投入して使ってあげてはどうでしょう?

更新情報

2019/02/06 8バイト先読みバッファ使用モード (-buffered オプション) を追加。

ダウンロード

他のFM-7用RS232Cユーティリティと一緒に入っているので、ここからダウンロード。使うファイルは t77server.exe。

ソースファイル

https://github.com/captainys/FM/tree/master/7/util

(* ソースコードのURLが変わりました)

使い方

FM-7/77実機で富士通純正RS232Cカードを使う場合は、ディップスイッチの5番と6番のみオンであとはオフになっていることを確認してください。純正互換RS232Cカードの場合は、ジャンパピンの5番のみショートさせて、あとはすべてオープンにしてください。

なお、ひょっとするとT77Serverを実行しようとしたときデジタル署名されていないプログラムであるという警告が出るかもしれませんが、信用していただけるのであれば無視して実行してください。デジタル署名は本来セキュリティを向上させることを目的としてできたものですが、今は僕のような個人プログラマーを駆逐する目的に使われています。現在、コード署名は値段が高いだけではなくいくらお金を払っても個人プログラマーには発行されません。明らかに自由にプログラムを公開する権利の侵害ですが、僕には何もできません。

あとは、次の手順に従って操作してください。

1.  シリアルクロスケーブルでFM-7/77シリーズとWindows PCを接続。

2.  Windows上でT77サーバーを起動。T77ファイル名がfilename.t77、COMポート番号が5番の場合、コマンドプロンプトまたはPower Shellに入って、次のコマンドを入力。なお、t77Server.exeにパスを張ってない場合はフルパスまたは相対パスで指定するって、多分このプログラムを使おうってぐらいの人なら知ってるか。コマンドの詳細は後の方で。なお、オプションに -buffered を追加すると、8バイトの先読みバッファを使ってほぼテープ比5倍速でロードができるようになる。デフォルトだとその6割ぐらいのスピード。

t77Server filename.t77 5

3.  使ってる機種がFM77AV2以前の場合はこのステップは飛ばして手順3へ。使ってる機種がFM77AV20/40以降の場合は、F-BASICを起動後次の3行を入力してF-BASICでRS232Cが見えるようにする。EXEC -512の後は30秒ぐらい待つと再起動してRS232CがF-BASICから使えるようになっている。

POKE &HFD0C,5
POKE &HFD0B,16
EXEC -512

4.  続いて、約256バイトのプログラムを毎回手でタイプして入力したくないので、サーバーからプログラムを転送する。F-BASIC上で次のプログラムをタイプしてRUN。

10 OPEN "I",#1,"COM0:(F8N1)"
20 FOR I=0 TO 255
30 INPUT #1,A%:POKE &H6000+I,A%
40 NEXT
50 CLOSE

このプログラムだけは電源を入れるたびにタイプしなきゃならない。30バイト程度のマシン語コードを使う手も考えたけど、30バイト間違えずにMONで入力する方が大変という理由で没。なんかもう少し短くできんもんかな。FM77AV1/2, FM77AV20/40だったらキーボードエミュレータから赤外線経由でタイプさせられるんだけど。

5.  サーバー側でコマンド

IA

とタイプ。256バイトがFM-7/77側に転送される。

6.  FM-7側でプログラムが終了するはずなので、次のコマンドをタイプ。

EXEC &H6000

これで、カセットテープへの入出力がRS232Cにリダイレクトされるようになる。なお、このプログラム中でF-BASICからCOM0は見えなくなる、というか以後はBIOSフックがCOM0を使うので、意図的に見えなくしてる。

あとは、テープからプログラムを実行する要領で、

RUN ""

とか、あるいはマシン語コードを直接読み込む場合だったら、

LOADM "",,R

みたいな感じで実行できるようになる。

FM-7/77側BIOSオーバーライドインストーラダンプリスト

一応、俺は256バイトぐらいタイプするぜ!という人は、下のダンプリストを打ち込んでEXEC &H6000でも可。

普通モード というかSmallモード(仮名)

FILENAME=CAS0COM0.srec
Add +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F Sum
6000 20 04 FB AF FC 00 34 77 1A 50 10 8E FD 00 BE FB :33 | .....4w.P......
6010 FA AF 8C 64 AF 8C 72 CC 05 10 A7 2C E7 2B C6 0A :DC |...d..r....,.+..
6020 CE 06 F4 6F C0 5A 26 FB 6F 22 A7 2F 30 8C 4D C6 :A8 |...o.Z&.o"./0.M.
6030 62 EE 8C CE EF 8C 38 11 A3 8C C9 27 0F 30 8C 4D :A5 |b.....8....'.0.M
6040 C6 51 8D 19 30 8C 1E EE 8C BA C6 17 8D 0F 86 7E :48 |.Q..0..........~
6050 B7 00 DE AE 8C AE BF 00 DF A6 2F 35 F7 A6 80 A7 :E9 |........../5....
6060 C0 5A 26 F9 39 6F 01 34 77 1A 50 B7 FD 0F BD FB :72 |.Z&.9o.4w.P.....
6070 AF 6D 4F 24 05 35 77 7E F1 7D 35 F7 6F 01 34 77 :73 |.mO$.5w~.}5.o.4w
6080 1A 50 8D 09 24 05 35 77 7E F1 7D 35 F7 CE FD 00 :B8 |.P..$.5w~.}5....
6090 86 B7 E6 84 5A 27 08 5A 27 24 5A 27 30 43 39 A6 :A8 |....Z'.Z'$Z'0C9.
60A0 02 4C 26 11 30 8C 08 4F A6 80 A7 47 2A F9 39 00 :08 |.L&.0..O...G*.9.
60B0 00 00 40 4E B7 86 40 A7 C4 6F 42 6F 47 39 A7 47 :04 |..@N..@..oBoG9.G
60C0 8D 02 A6 02 E6 47 54 24 FB A7 46 4F 39 A7 47 4A :84 |.....GT$..FO9.GJ
60D0 8D F2 86 02 A4 47 27 FA A6 46 A7 02 4F 39       :30 |.....G'..F..O9..
---------------------------------------------------------
     F2 06 EC 24 43 1C 59 D4 B4 F6 4E 6D 33 CF B1 E6

8バイト先読みバッファモード (Buffered mode)

FILENAME=CAS0COMF.srec
Add +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F Sum
6000 20 04 FB B1 FC 20 34 77 1A 50 10 8E FD 00 BE FB :55 | .... 4w.P......
6010 FA AF 8C 64 AF 8C 72 CC 05 10 A7 2C E7 2B C6 0A :DC |...d..r....,.+..
6020 CE 06 F4 6F C0 5A 26 FB 6F 22 A7 2F 30 8C 4D C6 :A8 |...o.Z&.o"./0.M.
6030 80 EE 8C CE EF 8C 38 11 A3 8C C9 27 0F 30 8C 4D :C3 |......8....'.0.M
6040 C6 6F 8D 19 30 8C 1E EE 8C BA C6 17 8D 0F 86 7E :66 |.o..0..........~
6050 B7 00 DE AE 8C AE BF 00 DF A6 2F 35 F7 A6 80 A7 :E9 |........../5....
6060 C0 5A 26 F9 39 6F 01 34 77 1A 50 B7 FD 0F BD FB :72 |.Z&.9o.4w.P.....
6070 B1 6D 4F 24 05 35 77 7E F1 7D 35 F7 6F 01 34 77 :75 |.mO$.5w~.}5.o.4w
6080 1A 50 8D 09 24 05 35 77 7E F1 7D 35 F7 CE FD 00 :B8 |.P..$.5w~.}5....
6090 86 B7 E6 84 5A 27 08 5A 27 24 5A 27 30 43 39 A6 :A8 |....Z'.Z'$Z'0C9.
60A0 02 4C 26 11 30 8C 08 4F A6 80 A7 47 2A F9 39 00 :08 |.L&.0..O...G*.9.
60B0 00 00 40 4E B7 86 40 A7 C4 6F 42 6F 47 39 A7 47 :04 |..@N..@..oBoG9.G
60C0 8D 02 A6 02 E6 47 54 24 FB A7 46 5F 39 31 8C 24 :3D |.....GT$..F_91.$
60D0 E6 3F C1 08 25 14 A7 47 4C 8D E9 86 02 A4 47 27 :71 |.?..%..GL.....G'
60E0 FA A6 46 A7 A5 5C C4 07 26 F1 A6 A5 A7 02 5C E7 :A7 |..F..\..&.....\.
60F0 3F 4F 39 08 00 00 00 00 00 00 00 00             :CF |?O9.............
---------------------------------------------------------
     A4 66 A6 DB 69 65 9D 28 80 2E 36 A6 8D C6 99 CE

サーバーオプション

サーバーコマンド T77Server.exe はコマンドプロンプトまたはPower Shellから実行します。起動は、

T77Server.exe t77-filename.t77 com-port-number

として起動します。com-port-numberは、ポート番号です。

以下のオプションを指定できます。

-install ADDR

BIOSリダイレクタ本体のインストールアドレスを指定します。ADDRは16進数で、0xとか&Hとか$とか一切つけずに4桁で指定してください。

-38400bps

通信速度38400bpsを使用。このオプションを使うにはRS232Cカードが38400bpsに対応していてそのように設定されている必要があります。

-bridge ADDR

BIOSリダイレクタ本体を呼び出すためのブリッジのインストールアドレスを指定します。ADDRは16進数で、0xとか&Hとか$とか一切つけずに4桁で指定してください。ブリッジアドレスと本体アドレスに同じ値を指定することもできますが、その場合、表RAM上の105バイト以上の連続した場所を指定してください。

-rdnonfbasic

非F-BASICブロック内もBIOSコールを探してリダイレクタに飛ぶように修正してFM-7/77に送り出します。Courageous Perseusみたいに、専用ローダーから読み込むマシン語コードからテープにデータをセーブすてるような場合はこのオプションによってデータセーブもRS232Cに出すことができるようになるものもあります。手元にあるテープ版ソフトで専用ローダーでマシン語でテープにセーブ機能つきってCourageous Perseusしか無いな。他にも同様のソフトがあるのかどうか不明。あ、アドベンチャーゲームのテープ版とかありそうな気がする。けど持ってない。今度なんかヤフオクで落としてやってみよう。

-save T77-file-name.t77

FM-7/77実機から送ってきたデータをセーブする.T77ファイル名。例えば、実機でF-BASICプログラムをタイプして、SAVEしたやつを、そのままXM7に持って行って開けたりする。

-buffered

FM-7にインストールプログラムを送るとき、8バイト先読みバッファを使うプログラムを送信します。先読みバッファを使うとほぼテープ比5倍速でロードができるようになり、実機なのに爆速でテーププログラムを読み込めます。なお、先読みバッファ使用モードだとBIOSリダイレクタが使うメモリが少し増えます。(すべて表RAMに展開すると128バイト)

サーバーコマンド

サーバーコマンド起動後は、以下のコマンドを受け付けます。

IA

BIOSリダイレクタをASCII形式で送信します。

Q

サーバー終了。

V

Verbose Mode on/off。オンだと1バイト読み込み、書き込みリクエストが来るたびに表示します。

R

最初まで巻き戻し。

SVfilename.t77

FM-7実機から送られてきたデータを.T77形式ファイルとしてセーブ。例えば、実機でF-BASICプログラムをタイプして、SAVEしたやつを、そのままXM7に持って行って開けたりする。

解説

FM-7実機でBIOSをオーバーライドするには、メモリ上のどこかにオーバーライドするコードを展開して、$00DE,$00DF,$00E0の3バイトがもともと、

JMP    $F17D

となっているところ、$F17Dを自分のコードのアドレスに書き換えます。これだけでF-BASICからのすべてのBIOSコールをインターセプトして、機能をオーバーライドすることができます。(中村英都, F-BASIC解析マニュアルフェーズI 基礎編, pp. 3, 秀和システムトレーディング)

このBIOSリダイレクタの目的は、カセットインターフェースをRS232Cにリダイレクトすることなので、MOTOR ONのリクエストではRS232Cを初期化、MOTOR OFFではRS232Cを停止、1バイトリードではRS232Cに読み込みリクエストを送りサーバーから1バイトを読み込み、1バイトライトでは書き込みリクエストに続けて1バイトを送信します。

なお、F-BASICのSAVEコマンドではBIOSと関係なくモーターをオンにしている(BIOSも呼んでいる)ので、ここでは#$20を$FD00に書き込んでモーターも明示的に停止します。

I/Oに載っていたような、というかCOMPACのタイトルなどは、これだけで動くようになります。驚いたのは実はFalcomのDragon Slayerも素直にLOADとLOADMだけで読み込むようになっていたので動いてしまいました。

しかし、おそらく単純にロードされて他のテープにセーブされるのを防止する目的で、まず最初のLOADMでローダーを読み込み、ローダーが続く非F-BASICデータブロックの本体プログラムを読み込むパターンにはこれだけでは対応できません。

そこで、Windowsで走らせるサーバー上でBIOS呼び出しのパターン、

JSR    [$FBFA]

または

JSR    $F17D

を探して、FM-7実機に送り出す前に呼び出し先をBIOSリダイレクトコードの入り口に書き換えます。これによって、少なくともPLAZMA LINEの起動に成功しています。なお、場合によっては、

JSR    [$FBFA]
RTS

と書く代わりに、

JMP    [$FBFA]

としている可能性を考慮して、JSR以外にもJMPも探すようにしています。

リダイレクタはデフォルトでは裏RAMの末尾にインストールされます。が、裏RAMのコードはF-BASICが有効の状態からは直接呼び出すことはできないので、$FC00~$FC17にブリッジコードを置きます。この$FC00がBIOSリダイレクトの

しかし、仮にBIOSのリダイレクトができたとしても、リダイレクタ本体が大きすぎてテープ版ソフトと共存できないのでは意味がありません。そのため、リダイレクタはフットプリントが小さくできています。デフォルトでは裏RAMの末尾の$FBAF~$FC16を使いますが、すべて表RAM上に配置する場合は、98バイトまで小さくできます。(8バイト先読みバッファを使う場合は、デフォルト$FBB1~$FC36、すべて表RAMだと128バイトの連続スペース)。

また、リダイレクタのインストーラはサーバーから転送するので、サーバーのオプションでインストールアドレスを変更できるようになっています。テラ4001などは、デフォルトインストール先と衝突するらしく、リダイレクタを7F80からにインストールすることで実行できました。

プロトコルは非常に単純で、1バイト読みたいときは、FM-7実機から$B6をサーバーに送信します。サーバーでは$B6を受け取ったらサーブ中のテープの1バイトをFM-7実機に送ります。1バイト書き込みたいときはFM-7実機から$B7に続けて書き込みたい1バイトを送信します。

なお、1バイト送って1バイト返すのではあまりにも効率が悪いので、$B8をサーバーに送ると8バイト分送り返す(テープの最後まで行ったら後は$FFを返す) モードも追加したところ、さすがにXM7の全力駆動には及ばないものの、ほぼテープ比5倍速の爆速ロードができるようになりました。サーバーの起動オプションに -buffered をつける以外、その他の手順は同じです。

8バイト先読みバッファを使うとしても必要であればすべて$FC00~$FC7Fに収めたいと思ってがんばってサイズを縮めて行って、最後は ORCC #1 を COMA に置き換えてなんとかフットプリントを最大128バイトに収めることができました。

なお、CTS/RTS, DTR/DSRを使って読み込みリクエストを送らないバージョンも試作して、これなら爆速ロード/セーブができるはず!と、思ったら、1バイト送って1バイト受け取るよりお遅くなってしまいました。一応gitに試作品も残ってるかな。途中バージョンをチェックアウトしたら出てくるかも。本質的にCTS/RTS, DTR/DSRの信号のオン・オフに長い時間がかかるのか、それともWindowsのGetCommModemStateの問題なのか、8251Aの問題なのか、何が問題なのか解明できてないのですが、8バイト先読みバッファを使う方式で128バイト以内のフットプリントで爆速ロードという目的は達成してしまったので、この方式は没になりました。

XM7

今回も大半はWindows上でXM7で実験しながら開発しました。XM7はありがたいことにRS232Cのエミュレーションまでできるようになってます。XM7開発に携わった方々には非常に感謝しています。僕もできることなら何か貢献したかったけど、XM7の存在に気付いた時には大体出来上がった後でした。

ただ、このBIOSリダイレクタをXM7で動作を実験してみたい、としても、現在ダウンロードできるバイナリ(本家がバイナリ公開を停止してしまったけど)ではこのBIOSリダイレクタは残念ながら動作しません。XM7にはRS232Cのエミュレーション機能があるだけ奇跡的なのですが、惜しくもバグってます。

僕はソースを見てバグ修正したバージョンを自分でビルドしたので直っているのですが、現在出回っているバージョンでは以下の制約があります。

一応、修正方法はわかっていて、XM7は公開されているソースからVisual Studio 2017を使ってコンパイルするのは非常に簡単なので、そのうち直し方とコンパイルの仕方をYSFLIGHT.COMのどこかで公開するかもしれません。

ベンチマーク (ロード時間)

PLAZMA LINE (Tecno Soft)

通常モード 1分10秒 (70秒)  元テープ比 3.5倍速
8バイト先読みバッファモード 0分40秒 (40秒)  元テープ比 6.2倍速
元テープの.WAVファイル 4分28秒 (248秒)

Dragon Slayer (Falcom)

通常モード 2分14秒 (134秒)  元テープ比 3.4倍速
8バイト先読みバッファモード 1分26秒 (86秒)  元テープ比 5.3倍速
元テープの.WAVファイル 7分43秒 (463秒)

動作確認

実機FM77AV40とFM-7で確認。ゲーム開始、ターゲット1個破壊まで確認。

実機FM77AV40とFM-7で確認。デモ・ゲーム開始まで。3回連続成功したから多分大丈夫。

テープ読み込みにBIOSを使っていないため、BIOSを使わせるパッチが必要。パッチのダウンロードはここ。使い方は、単にパッチのT77の後ろにハイドライドのT77を結合して、FM-7上ではテープモードで起動して、RUN "" でローダーを起動するだけ。セーブとロードも多分できる。パッチを当てたT77は単にテープ読み込みにBIOSを使わせているだけなので、普通にXM7等で使える。

なお、ハイドライドは裏RAMの最後まで使ってしまうので、リダイレクターはFC00~にインストールする必要があるので、起動コマンドは、次のようにする。(COMポートが4番の場合)

t77server hydlide_patched.t77 4 -install FC00 -bridge FC00

Hydlide同様、テープ読み込みにBIOSを使っていないためBIOSを使わせるパッチが必要。パッチはここ。使い方は、単にパッチのT77の後ろにJeldaのT77を結合して、FM-7上ではRUN ""でOK。パッチを当てたT77は単にテープ読み込みにBIOSを使わせているだけなので、普通にXM7等で使える。

実機FM77AV40とFM-7で確認。ゲーム開始、キーで自機を操作するところまで確認。ただし、普通に RUN "" では起動不能。次のF-BASICプログラムで起動する必要がある。

10 CLEAR ,&H14FF
20 LOADM"DATA"
30 POKE &H68B1,&HFD
40 POKE &H68B2,&H05
50 POKE &H68B3,&H2A
60 POKE &H68B4,&HFB
70 EXEC
80 LOADM"DELPH.M"
90 POKE &H560D,&HFD
100 POKE &H560E,&H05
110 POKE &H560F,&H2A
120 POKE &H5610,&HFB
130 EXEC

最初AV40で単純に RUN "" で実行しようとしたら3~5回に1回ぐらいしか起動に成功しないので逆アセンブルを見たらサブCPUがかなりシビアなタイミングでHALT要求に応答することを前提に書いてあった。

LDA #$80, STA$FD05して次のクロックでサブCPUがHALTしてるなどということがあり得るのだろうか?

FM77AV40特有の問題かと思って素のFM-7でも試したけど結果は同じ。上のローダーなら起動するけどデフォルトで入ってるローダーでは滅多に起動しない。当時よくこれで本当に動いていたんだろうか?I/OにDebug出てたっけ?

本当は少なくとももう一か所(サブCPUにプログラムを転送するところ)あるのだが、直せない。が、どうやらこの二か所を直しておけば、起動に失敗しなくなったから大丈夫のようだ。XM7を使ってこのプログラムをセーブしておくと楽。

だけど、Delphisって4方向移動移動だったか。しかも爆撃すると自機の移動が止まってしまうという。。。。ジョイスティック対応に改造しようかな。

実機FM77AV40とFM-7 で確認。ゲーム開始、キーで自機を操作するところまで確認。

Jelda同様、BIOSを使わずテープを読んでるのでBIOSを使わせるパッチが必要。パッチはここ。Jeldaと同じかと思ったらBIOSのワークを破壊するらしく、IPL本体を$0000ではなく$0E00に置く修正も必要だったけど、実機FM77AVで動作確認。パッチを当てたT77はXM7でも普通に使える。パッチの当て方は、単にパッチの後ろにPolar Star IIIのテープイメージをつなげるだけ。パッチを当てたら、FM-7上では RUN "" [リターン]で起動可能。ジョイスティック対応パッチも作ったと思ったんだが、行方不明になっちゃった。

実機FM77AV40とFM-7で確認。

実機FM77AV40で確認。ただし、t77Serverに追加オプションが必要 -install 7f80 -bridge 7f80。FM-7側では、CLEAR ,&H7F7FとしてからBIOSリダイレクタをインストールして RUN ""

オープニングデモ~開始まで確認。セーブもできたっぽい。

実機FM77AV40で確認。

実機FM77AV40で確認。

実機FM77AV40で確認。起動するとこまで。オールBASICだから絶対成功すると思ったんだ。実家にあったんだけど超絶レアものだと思う。

動作しなかった確認

どちらも、最初のLOADMで読み込んだバイナリが、アスキー独自フォーマット ($FF に続けて'A' 'S' 'C'で始まる) の第二弾ローダーを読み込み、その第2弾ローダーの中からBIOSを呼んでいるが、第2弾ローダーに暗号がかかっているためどうにもならない。いや、どうにもならなくも無くてそれぞれに専用プログラムを書けばなんとかなるけど、今のところそこまでする予定なし。

新事実

そういえば、素のFM-7のI/Oアドレス $FD09, $FD0A, $FD0Bは$FD0D, $FD0E, $FD0Fと同じ意味を持つことが判明。これは広く知られている事実なのだろうか?だから、RS232C初期化コードで、FM77AV20/40以降も対応しようと思って、LDA #$10    STA $FD0B  と書いておいたら素のFM-7だとF-BASICに戻れなくて暴走してしまった。という話をしたらApolloさん、裏RAMが怪しいのでは? と電光のごとく返事が返ってきたので LDA $FD0F を追加したら動くようになって、回路図を確認したらたしかに、$FD0D, $FD0E, $FD0FをチェックするところでAddress Bus 2を考慮してないことが判明。あえて素のFM-7で動作してその後のシリーズで動かないプログラムを書こうと思ったら、この3本のアドレスを使うとできることがわかった。意味ないけど。超絶意味ないけど。

Comments are welcome.  Send E-Mail to: 

Back to http://www.ysflight.com