MSXとWindowsで通信してみよう 「ジョイジョイファイルシステム」
「ジョイジョイファイルシステム」とは?
- MSXのジョイスティック端子とPCのUSB端子を自作ケーブルで接続して、お互いにファイルを送受信するシステムです。
- Windows用ツールの「ジョイジョイファイルサーバー」と、そのツールからMSXにインストールされる「ジョイジョイファイルシステム」によって成り立っています。
- MSX-BASICの拡張コマンドで、「PC上のファイルのロード」や「PC上のファイルへセーブ」ができます。
- MSXどうしを接続することで、テキストやバイナリーデータの送信ができます。
- RAM64KB以上のMSXで動作します。(ROMに焼いた場合はRAM8KB以上のすべてのMSXで動作する…と思います)
動画
ダウンロード
「ジョイジョイファイルサーバー(Windows)」+「ジョイジョイファイルシステム(MSX)」
- MSX2でロード系のコマンドを実行するとファイルサイズが正しく読めずにフリーズしていたのを修正しました(1.03)
- PC版ツールでCOMポートの変更が反映されなかったのを修正しました(1.02)
接続ケーブルの作成
必要なもの
作り方
- AMP9ピンケーブルの 9番ピンを USBコンバーターの GND に接続する
- AMP9ピンケーブルの 6番ピンを USBコンバーターの RXD に接続する
- AMP9ピンケーブルの 1番ピンを USBコンバーターの TXD に接続する
※写真のように、ケーブルにQIコネクタを装着するにはこちらのサイトなどを参考にしてください。
使用準備
PC側(Windows)
- MSX本体のジョイスティックポート2 と、PCのUSB端子を、作成したケーブルで接続してください
- 「ジョイジョイファイルサーバー(JoyJoyFileServer.exe)」を起動して、[接続]をクリックしてください
MSX側
- ダウンロードしたファイルに含まれている JJFS.BAS を、MSX-BASIC で実行してください(付属の wavファイル をデータレコーダー端子経由で CLOAD しても良いですし、実機で手作業で入力してもそれほど時間はかからないと思います)。
- RUNしてください。
- 画面に PUSH [INSTALL] ON JJF-SERVER と表示されたら、PCで起動している 「ジョイジョイファイルサーバー」 の [INSTALL] → [ジョイジョイファイルシステムのインストール] をクリックしてください。
- JJF-SYSTEM INSTALLED と表示されれば終了です。
MSX-BASIC拡張コマンド
「ジョイジョイファイルシステム」がインストールされると、BASICから以下の拡張コマンドが使用可能になります。
バージョン表示コマンド
インストールされているバージョンを表示します。正しくインストールされているかどうかの確認に使ってください。
- _JJVER … MSXにインストールされているJJFSのバージョンを表示します。最新版は 1.03 です。
PC → MSX転送コマンド
PC上のファイルを、MSXのメモリやVRAMにロードします。
(「ジョイジョイファイルサーバー」で指定した「ファイルサービングフォルダ」直下にあるものをロードします)
- _JJLOAD("ファイル名" , 開始アドレス) … 指定したファイルを、メモリの指定したアドレスにロードします。
- _JJLOAD("ファイル名" , 開始アドレス , S) … 指定したファイルを、VRAMの指定したアドレスにロードします。
- _JJBLOAD("ファイル名") … 指定したBLOADフォーマットのファイルをメモリにロードします。(開始アドレスはファイルの2 , 3バイト目を参照します。終了アドレスは無視され、全データがロードされます)
- _JJBLOAD("ファイル名" , S) … 指定したBLOADフォーマットのファイルをVRAMにロードします。(開始アドレスはファイルの2 , 3バイト目を参照します。終了アドレスは無視され、全データがロードされます)
- _JJBLOAD("ファイル名" , R) … 指定したBLOADフォーマットのファイルをメモリにロードし、実行します。(開始アドレスはファイルの2 , 3バイト目、実行アドレスはファイルの6 , 7バイト目を参照します。終了アドレスは無視され、全データがロードされます)
MSX → PC転送コマンド
MSXのメモリやVRAMを、PC上にファイルとして保存します。
(「ジョイジョイファイルサーバー」で指定した「ファイルサービングフォルダ」直下に保存されます)
- _JJSAVE("ファイル名" , 開始アドレス , 終了アドレス) … MSXの指定した範囲のメモリを、指定したファイル名で、PCに保存します。
- _JJSAVE("ファイル名" , 開始アドレス , 終了アドレス , S) … MSXの指定した範囲のVRAMを、指定したファイル名で、PCに保存します。
- _JJBSAVE("ファイル名" , 開始アドレス , 終了アドレス) … MSXの指定した範囲のメモリを、指定したファイル名で、BLOADフォーマットのヘッダを付加した状態でPCに保存します。
- _JJBSAVE("ファイル名" , 開始アドレス , 終了アドレス , S) … MSXの指定した範囲のVRAMを、指定したファイル名で、BLOADフォーマットのヘッダを付加した状態でPCに保存します。
- _JJBSAVE("ファイル名" , 開始アドレス , 終了アドレス , 実行アドレス) … MSXの指定した範囲のメモリを、指定したファイル名で、実行アドレスを指定して、BLOADフォーマットのヘッダを付加した状態でPCに保存します。
フロッピーディスク用コマンド
フロッピーディスクのファイルにアクセスするコマンドです。BLOAD用のヘッダを付加せず、純粋なバイナリーファイルとしてセーブ・ロードするものが欲しかったので作りました。
簡易的なエラー処理しかしていないので、大切なディスクには使わないほうが良いかもしれません(^_^;)
- _JJDLOAD("ファイル名" , 開始アドレス) … フロッピーディスクから、指定したファイルを、メモリの指定したアドレスにロードします。
- _JJDLOAD("ファイル名" , 開始アドレス , S) … フロッピーディスクから、指定したファイルを、VRAMの指定したアドレスにロードします。
- _JJDSAVE("ファイル名" , 開始アドレス , 終了アドレス) … MSXの指定した範囲のメモリを、指定したファイル名で、フロッピーディスクに保存します。
- _JJDSAVE("ファイル名" , 開始アドレス , 終了アドレス , S) … MSXの指定した範囲のVRAMを、指定したファイル名で、フロッピーディスクに保存します。
VRAM制御コマンド
VRAMアドレスのオフセットを設定するコマンドです。
セーブ・ロード系コマンドの Sオプションで VRAMのセーブ・ロードを行う際、引数で指定できるVRAMのアドレスは0000H-FFFFHの64KBですが、MSX2以降でこのオプションを 1 にすることで、後半のVRAM(10000H-1FFFFH)にアクセスすることができます。
- _JJVRAMPAGE(0または1) … 1を設定すると、以降すべてのVRAMセーブ・ロードコマンドについて「指定したアドレス+10000H」にアクセスするようになります。一度指定すると電源を切るまで保存されるので、元に戻したい場合は 0 を指定してください)。
テキスト送信同期モード用コマンド
「ジョイジョイファイルサーバー」(Windows)のテキスト送信ウィンドウに入力された文字列を、MSXにリアルタイム転送するためのコマンドです。
- _JJINPUT(0または1) … テキスト送信同期モードをOFF/ONします。テキスト送信同期モードがONの状態では、WindowsとMSXは1/60秒ごとに通信を行い、テキスト送信ウィンドウに入力されたテキストを即座にMSX側に転送します。
※同期モードがONの状態で他のシリアル通信コマンドを実行しないでください。他のコマンドを実行する際には、必ず _JJINPUT(0) を行って、同期モードをOFFにしてください。
※同期モードがONの状態で通信が遮断された場合、MSX側は通信待ち状態でフリーズしてしまいます。通信を切断する前に、必ず _JJINPUT(0) を行って同期モードを終了させてください。
※同期モード用のプログラムは、BASICワークエリアの「ファイルコントロールブロック(FCB)」の最後に常駐するので、MSX-BASIC の最大ファイル数が0(MAXFILES=0)だとエラーになります。また、同期モードがONの状態で、 OPEN や PRINT#1 などのファイル操作命令を行わないでください(SAVE,LOAD等は大丈夫です)。どうしても利用したい場合、同期モードをONにする前にMAXFILES=2以上にしてください。
汎用送受信コマンド
38400bpsの汎用シリアル通信を行うためのコマンドです。
ターミナルソフトと通信したり、2台のMSXで通信を行う場合などに使ってください。
- _JJSEND(開始アドレス , 終了アドレス) … 指定した範囲のメモリをジョイスティックポートに出力します。
- _JJSEND(開始アドレス , 終了アドレス , S) … 指定した範囲のVRAMをジョイスティックポートに出力します。
- _JJSENDBYTE(データ) … 1バイトデータ(0~255)をジョイスティックポートに出力します。
- _JJSENDMSG("文字列") … 文字列をジョイスティックポートに出力します。
- _JJRECV(開始アドレス , 終了アドレス) … ジョイスティックポートから入力されたデータを指定した範囲のメモリに書き込みます。すべてのデータを受信するまで停止しないので注意してください。
- _JJRECV(開始アドレス , 終了アドレス , S) … ジョイスティックポートから入力されたデータを指定した範囲のVRAMに書き込みます。すべてのデータを受信するまで停止しないので注意してください。
- _JJRECVBYTE(整数型変数) … ジョイスティックポートから入力された1バイトのデータを整数型変数に格納します。変数は必ず "A%" のように整数型で指定してください。
- _JJRECVDMSG(文字型変数) … ジョイスティックポートから入力されたデータを文字型変数に格納します。変数は必ず "A$" のように文字型で指定してください。最大255文字までで、改行コード(LF = 0AH)を受信するとそこで停止します。
2台のMSXを繋ぐには、AMP9ピンケーブルを2本用意して、GND(9番ピン)どうしを繋ぎ、あとはお互いに自分の1番ピンを相手の6番ピンに繋いでください。
また、双方が_JJRECV待ち状態になると、デッドロックを起こしてフリーズしてしまいます。双方向通信のプログラムを書く場合は注意してください。
デバッグ用コマンド
- _JJDUMP(アドレス) … 簡易メモリダンプです。指定したアドレスから128バイト(WIDTH80の場合は256バイト)のメモリの内容をダンプします。RETURNを押すと次の128バイトを続けてダンプします。
- _JJDUMP(アドレス , S) … 簡易VRAMダンプです。指定したアドレスから128バイト(WIDTH80の場合は256バイト)のVRAMの内容をダンプします。RETURNを押すと次の128バイトを続けてダンプします。
ジョイジョイファイルサーバーを使う際の注意点
- 通信中にエラーが起こったり、正しくデータを受信できない場合に、MSXが受信待ちのままフリーズ状態になることがあります。そのような際には、「ジョイジョイファイルサーバー」の[×]ボタンを一度クリックしてみてください。ダミーデータを送信することで、受信待ちが解消される場合があります。
- [INSTALL] → [ジョイジョイファイルシステムのインストール] は、JoyJoyFileServer.exe と同一フォルダにある JJFS.ROM をインストールするので、これらのファイルは必ず同じフォルダに置くようにしてください。
- [INSTALL] で [その他] を選ぶと、JJFS以外のROMイメージを裏RAMに配置することができます。ただし、サイズは16KBまでになります。
- _JJINPUT で同期モードをONにすると、「入力ウィンドウ」の色がピンクになります。この状態でテキストを入力して ENTER を押すと、入力ウィンドウ内のテキストがMSX側に転送されます。
- 同期モードは必ず手動でOFFにしてください。[SYNC OFF]ボタンを押すと簡単です。
最後に
38400bpsという(MSXとしては)高速な通信を実現するのは苦労しました。
アセンブラレベルでかなりギリギリのチューニングをやっているため、エラー処理などもほとんど入っていません。
そのため、通信が遮断されたり、予想外のデータが送られてくると、よくフリーズしてしまいます。ごめんなさい(T_T)
とにかく、困ったときはダメ元で「ジョイジョイファイルサーバー」の [×]ボタン を押してみてください。運が良ければ復活するかもしれません(^_^;)
また、開発にあたっては、以下のサイトを大いに参考にさせていただきました。
Joy232
https://hackaday.io/project/18552-joy232
ご意見・ご質問は twitter で @tiny_yarou まで、よろしくお願いします。