[今更誰得] MSX(CX5F/YIS503)のジョイスティックポート経由でPC上のディスクイメージファイルを操作する #MSX #CX5F #YIS503

急にMSX関連のエントリをアップし始めてしまったのですが、今回のテーマが一つのヤマになるかもしれません。

さて、昨年12月に入手したMSXマシンのヤマハCX5Fですが、FDDはもちろん非搭載です。
まあテープでもPCで音声ファイルやりとりすれば面倒でもないし別にいいか~と思っていたのですが、例のTINY野郎さんのJJFSに関連したサイトをいろいろ徘徊していたら、なんと実機のFDDの代わりに、ジョイスティックポート(正しくは汎用入出力ポートというらしいですが)経由でPCとシリアル通信して、PC上にあるディスクイメージファイルを操作できるようにしてしまう(というかMSXからは普通にFDDとして認識される!)「MSXDISK」というアプリを作っている人がおりました。

TINY野郎さんのJJFSや一連のアプリ群もしかりですが、まあ世の中にはすごい人が多いものです・・・

MSXDISK 0.99.2

これは試してみたい!!
ということで、中の人も早速すでに入手済みだった拡張RAM64KBをCX5Fに挿して試してみました。

ちなみにジョイスティックポートとPCとの接続については、別記事で紹介していますが、

mobileFF's blog: [今更誰得] MSX本体のみでシリアル通信してみる(2) #MSX

今回のMSXDISKはPC⇒MSXへの通信があるため、つなぐケーブルが1本多くなりますのでご注意ください。MSXDISKでの接続は、MSX側ジョイスティックポートの9番ピンをAE-UM232RのGNDに、同じく6番ピンをAE-UM232RのRxDに、1番ピンをAE-UM232RのTxDに接続します。


が、CX5Fでは全然動かないのです・・・

ちなみに、MSXDISKはどういう仕組みで動くのかというと、

  1. PCのオーディオ出力をMSXのカセットインターフェースにつなぎ、カスタムROMをメインメモリ(ページ1)にロードするための実行ファイル(ROMLDR)をBLOADで読み込んで実行する
  2. ROMLDRが実行されるとPCからシリアル通信でカスタムROMを受信し、MSXのページ1にその内容が書き込まれる(この際、ページ1がRAMになるようにスロットを切り替える※)
  3. ページ1の内容をカスタムROMに書き換え終わったら、0000H番地にジャンプしてMSX本体を再起動する
  4. ページ1のカスタムROM(DiskBasicをカスタムしたもの)が起動する
    1. PC上に起動可能なディスクイメージ(.dsk)がセットされていれば、ディスクイメージから起動
    2. 起動可能なディスクイメージがセットされていない場合は、カスタムされたDisk Basicが起動
といったかんじのようです。(中の人の勝手な解釈)

これが、CX5Fでは、暴走とかはしないのですが、上記3.の再起動後に、何事もなかったかのように通常のMSX BASICが起動してしまうのです・・・

で、問題は、おそらく上記の(※)のところ「ページ1がRAMになるようにスロットを切り替える」なんですね。

MSXDISKのROMLDRという実行ファイルでは、すごくざっくりいうと「ページ3に割当たっているスロット番号(メインRAMが置いてあるスロット)をページ1(カスタムROMの書き込み先)のスロット番号にする」というようなロジックでスロットの切り替えをしているんですね。

要は、RAM64KB搭載のMSXなら、同じスロットに64KB積んでいるはずなので、ページ3が見ているスロットが64KB RAMのあるスロットになるわけで、ページ1のスロットもページ3のスロットと同じにすればよいのである、という理屈です。

これは、
  • 標準RAM容量が64KB以上と仕様で決められているMSX2以降の全機種
  • もとからRAM64KB搭載のMSX1
  • スロット3に標準RAMが搭載されていて、RAM32KBのマシンに64KBの拡張RAMカートリッジを挿したMSX1
  • RAM16KB以下で64KBの拡張RAMカートリッジを挿したMSX1
であれば、問題なく働きます。
まあ、おそらく大多数のMSXでは問題なく動くのだろうと思われます。

ただ、CX5Fはスロット0にメインRAMを搭載してしまっているので、上記のどの条件にも当てはまりません。そのため、ROMLDRのロジックだとページ3に割当たっているスロット番号がスロット0なので、ページ1を同じスロット番号にしてしまうと、選ばれるのはMAIN ROMになってしまってカスタムROMが書き込まれないんですね。その状態で再起動かけても、当然ながら書き替わっていないMAIN ROMのMSX BASICが起動してしまうというわけです。

CX5Fに64KB拡張RAMカートリッジを挿した時のメモリ構成

まあ、原因が分かったとしても、さて、じゃあ、どうするか、なのですが・・・

中の人はMSX BASICとポケコンBASICなら多少はわかるのですが、マシン語なんてまったくわかりません。

なので、ここからが長かったです・・・
(過程を書いてもあまり意味がないので省きますが、最終的には必要なかったマシン語プログラムも試行錯誤の過程で2~3個作る羽目になりました)

幸い、MSXDISKにはアセンブラのソースコードも添付されていたので、様々なサイトを参考にしつつ、どうにかこうにか、ROMLDRのコードを、ページ1のスロットを1に固定で設定するコードに書き換えて、元から入っていたROMLDRとファイルを入れ替えて、実行してみると・・・


結果が上のツイートですが、行けました!

ディスクイメージファイルもDISK BASICから操作できています。

これ、いったい世界中で何人に有用な情報なのかわかりませんが、一応中の人が修正したROMLDRも、置き場を準備したら置いておきますので、もう少々お待ちください。

【ダウンロード】

※変更箇所のソースは以下の通りです。

「====== COMMENT START ======」から「====== COMMENT END ======」までは元のROMLDRのソースですが、コメントアウトします。「====== PATCH START ======」から「====== PATCH END ======」までが中の人が追加したコードです。単純にスロットを固定値(スロット1)で決め打ちにしている力業のコードです。拡張RAMをスロット2などに挿す場合はこの指定も変わりますのでご注意ください。


START:

    DI

;====== COMMENT START ======
;    IN A,(0A8h)     ;PRIMARY SLOT REGISTER       
;    AND 0C0h        ;SELECT PAGE 3

;    RLCA            ;ROTATE PAGE 3 TO PAGE 1
;    RLCA
;    RLCA
;    RLCA
;    LD B,A          ;STORE IN B

;    RLCA            ;ROTATE PAGE 1 TO PAGE 2
;    RLCA
;    OR B            ;PAGE 1+2
;    LD B,A          ;STORE IN B
    
;    IN A,(0A8h)
;    AND 0C3h        ;SELECT PAGE 0+3
;    OR B            ;OR PAGE 1+2
;    OUT (0A8h),A    ;UPDATE REGISTER

;    LD A,(0FFFFh)   ;SECONDARY SLOT REGISTER
;    AND 0C0h        ;SELECT PAGE 3
    
;    RLCA            ;ROTATE PAGE 3 TO PAGE 1
;    RLCA
;    RLCA
;    RLCA
;    LD B,A          ;STORE IN B

;    RLCA            ;ROTATE PAGE 1 TO PAGE 2
;    RLCA
;    OR B            ;PAGE 1+2
;    LD B,A          ;STORE IN B

;    LD A,(0FFFFh)
;    AND 0C3h        ;SELECT PAGE 0+3
;    OR B            ;OR PAGE 1+2
;    CPL             ;COMPLEMENT
;    LD (0FFFFh),A   ;UPDATE REGISTER
;====== COMMENT END ======

;====== PATCH START ======
SET_SLOT:
     LD A,004H          ; PAGE 3-2-1-0 is SLOT 00-00-01-00
     OUT (0A8h),A    ; UPDATE REGISTER
;====== PATCH END   ======


とはいえ、実はまだカスタムDISK BASICが起動してPC上のディスクイメージをいじれたところまでしか確認できていないのですが、MSX-DOSやほかのROMイメージ、起動可能なディスクイメージからのブートなど、徐々に試していきたいと思っております。

とりあえずは以上です~

参考にしたサイト


アセンブラの環境づくりは、TINY野郎さんの以下ページをそのまま試しました。

アセンブラでソフトを開発しよう

Z80のマシン語命令は、以下リファレンスが大変有用でした。

8ビットCPU Z80 (命令セット) | Yamamoto's Laboratory

今回の対応では、最終的には逆アセンブルは不要でしたが、オンラインで逆アセンブルできるサイトがありましたので、参考までにご紹介します。

disassembler.io

BSAVE形式のファイルを作るためのヘッダ情報はこちらのサイトがわかりやすかったです。

ファイル形式 - MSX JAPAN▉

[MSX] MSX-BASICでHello World(笑) と言ってもマシン語でする。 - プログラミング・メモ

BIOS関係は以下サイトがシンプルながらわかりやすかったです。

MSX Assembly Page

MSXの標準仕様については何といってもMSX Datapackということで、MSX Datapack Wiki化計画さんのサイトもずっと拝見してました。

MSX Datapack wiki化計画


コメント