2022/10/13(木) [n年前の日記]
#1 [pc][windows][mz][z80] S-OSアプリをX1エミュレータで動かすための下準備
かつて、Z80 CPU を搭載していた日本製レトロPC上で、共通のバイナリを動かせる、S-OS という仕組みがあったわけだけど。X1エミュレータを利用して、その操作感覚を体験してみたいなと。
環境は Windows10 x64 21H2。
念のために書いておくけど、X1 というのは SHARP が販売していた 8bit PC。
_X1 (コンピュータ) - Wikipedia
_SHARP X1シリーズ | ひみつの屋根裏部屋
環境は Windows10 x64 21H2。
念のために書いておくけど、X1 というのは SHARP が販売していた 8bit PC。
_X1 (コンピュータ) - Wikipedia
_SHARP X1シリーズ | ひみつの屋根裏部屋
◎ S-OSアプリの入手先。 :
◎ .objファイルとはなんぞや。 :
まず、.mzt ファイルについて。これは、カセットテープに入っている1ファイル分を模したファイル形式。例えば MZ-700エミュレータで、カセットテープから何かのファイルを読み込んで…といった流れで操作する場合は .mzt が利用できる。
対して、.obj ファイルは…。これはどうやら UNIX or Windows用のS-OS SWORD で利用するためのファイル形式、らしい。たぶん。
一応念のために書いておくけれど。ここでいう .obj は、前述のページで入手できるファイルに限定した話で…。.obj という拡張子は、色々な場面で、色々なアプリが、全く異なるフォーマットで生成したり利用したりしているので、「.obj = S-OS関連ファイル」と思い込まないでほしいなと…。
さておき。ここでいう.obj ファイルは、アプリの本体バイナリの前 ―― ファイルの先頭に、18 byte (16進数なら 0x12 byte) のヘッダ部分がついているらしい。ヘッダ部分 + 本体バイナリ = .objファイル、ということかなと。
_古籏氏のサイトのファイルと、Oh!石氏のサイトのS-OS用のファイルのMZT化
_S-OS "SWORD"
_S-OS SWORD最強伝説
このヘッダ部分には、おそらく以下のフォーマットで、ロードアドレス(そのファイルを配置してほしいメモリ領域の先頭アドレス)や実行アドレス等々の情報が入っている、ように見えた。
バイナリエディタで開いた状態も載せてみる。なんとなく分かるだろうか…。
ちなみに、前述のページから入手できる FuzzyBASIC (FUZZYBASIC.LZH) の中には、FUZZYBASIC、FZ_DRG.BAS の2つのファイルが入っていたけれど、どちらも拡張子として .obj がついてないものの、先頭部分に前述のヘッダ部分があった。全部確認したわけではないけれど、件のページで配布されてるファイルは、どれもヘッダ部分がついているのかもしれない。
対して、.obj ファイルは…。これはどうやら UNIX or Windows用のS-OS SWORD で利用するためのファイル形式、らしい。たぶん。
一応念のために書いておくけれど。ここでいう .obj は、前述のページで入手できるファイルに限定した話で…。.obj という拡張子は、色々な場面で、色々なアプリが、全く異なるフォーマットで生成したり利用したりしているので、「.obj = S-OS関連ファイル」と思い込まないでほしいなと…。
さておき。ここでいう.obj ファイルは、アプリの本体バイナリの前 ―― ファイルの先頭に、18 byte (16進数なら 0x12 byte) のヘッダ部分がついているらしい。ヘッダ部分 + 本体バイナリ = .objファイル、ということかなと。
_古籏氏のサイトのファイルと、Oh!石氏のサイトのS-OS用のファイルのMZT化
_S-OS "SWORD"
_S-OS SWORD最強伝説
このヘッダ部分には、おそらく以下のフォーマットで、ロードアドレス(そのファイルを配置してほしいメモリ領域の先頭アドレス)や実行アドレス等々の情報が入っている、ように見えた。
Address | Size | Description |
---|---|---|
0x00-0x03 | 4byte | いわゆるシグネチャ相当。"_SOS" のASCIIコード。おそらく、S-OS関係のファイルであることを示している。 |
0x04 | 1byte | 区切り文字。0x20 (スペースのASCIIコード)が入っている。 |
0x05-0x06 | 2byte | おそらくファイル種類。ASCIIコードで記述。"01"が S-OS用バイナリファイル。"02"がFuzzyBasicの.BASファイル等。他にも種類がありそう。 |
0x07 | 1byte | 区切り文字 (0x20)。 |
0x08-0x0b | 4byte | ロードアドレス。ASCIIコードで記述されてる。指定可能な範囲は 0x0000 - 0xffff。 |
0x0c | 1byte | 区切り文字 (0x20)。 |
0x0d-0x10 | 4byte | 実行アドレス。ASCIIコードで記述されている。指定可能な範囲は 0x0000 - 0xffff。 |
0x11 | 1byte | 終端文字。0x0a (ASCIIコードで LF)が入ってる。 |
バイナリエディタで開いた状態も載せてみる。なんとなく分かるだろうか…。
ちなみに、前述のページから入手できる FuzzyBASIC (FUZZYBASIC.LZH) の中には、FUZZYBASIC、FZ_DRG.BAS の2つのファイルが入っていたけれど、どちらも拡張子として .obj がついてないものの、先頭部分に前述のヘッダ部分があった。全部確認したわけではないけれど、件のページで配布されてるファイルは、どれもヘッダ部分がついているのかもしれない。
◎ .objのヘッダ部分を分離。 :
とりあえず、ヘッダ部分も一緒になっていると、X1エミュレータ + S-OS SWORD で読み込めないのではないかと思えてきたので…。試しに、バイナリエディタ FavBinEdit 1.2.5 を使って、前述のページから入手した INVADER.obj のヘッダ部分と本体バイナリを分離してみた。
_バイナリエディタ | FavBinEdit
INVADER.obj を開いて、先頭から18 byte (0x12 Byte) を選択。
右クリックして「切り取り」。
ツールバー上の「新規作成」をクリック。空のウインドウが開く。
右クリックして「貼付け」。
これで、ヘッダ部分と本体バイナリを分離できた。
ちなみに、INVADER.obj のロードアドレス、実行アドレスは、共に 0x3000 だった。この情報は後で必要になるので覚えておかないといけない。
と言っても、.HED を開いて確認すれば済む話だけど。ヘッダ部分(.HED) は全てASCIIコードで記述されているので、普通のテキストエディタで開いても内容が確認できる。
_バイナリエディタ | FavBinEdit
INVADER.obj を開いて、先頭から18 byte (0x12 Byte) を選択。
右クリックして「切り取り」。
ツールバー上の「新規作成」をクリック。空のウインドウが開く。
右クリックして「貼付け」。
これで、ヘッダ部分と本体バイナリを分離できた。
- ヘッダ部分は、INVADER.obj.HED として保存した。
- 本体バイナリは、INVADER.obj.BIN として保存した。
ちなみに、INVADER.obj のロードアドレス、実行アドレスは、共に 0x3000 だった。この情報は後で必要になるので覚えておかないといけない。
と言っても、.HED を開いて確認すれば済む話だけど。ヘッダ部分(.HED) は全てASCIIコードで記述されているので、普通のテキストエディタで開いても内容が確認できる。
◎ .d88ファイルとはなんぞや。 :
X1エミュレータにファイルを読み込ませるためには、拡張子が .d88 になってるファイルを経由する必要があるらしい。
.d88 って何だろうとググってみたら、どうやらフロッピーディスクのイメージファイルの模様。NEC PC-8801等のエミュレータで使われているイメージファイルフォーマット、なのだとか。
フロッピーディスクの容量としては、2D (両面倍密度、320KByte)を想定していることが多いように見えた。
_フロッピーディスク - Wikipedia
_D88形式フォーマット | HuDisk
_.D88形式のフロッピーディスクイメージフォーマット - (仮)
_wii88/FORMAT.TXT at master - jpzm/wii88
.d88 って何だろうとググってみたら、どうやらフロッピーディスクのイメージファイルの模様。NEC PC-8801等のエミュレータで使われているイメージファイルフォーマット、なのだとか。
フロッピーディスクの容量としては、2D (両面倍密度、320KByte)を想定していることが多いように見えた。
_フロッピーディスク - Wikipedia
_D88形式フォーマット | HuDisk
_.D88形式のフロッピーディスクイメージフォーマット - (仮)
_wii88/FORMAT.TXT at master - jpzm/wii88
◎ .d88にS-OSアプリのバイナリを含めてみる。 :
X1エミュレータで S-OSのアプリを動かすためには、S-OSのアプリバイナリを、この .d88 なる形式のファイルに収めてやらないといけない。さて、何をどうしたらいいのやら。
何か良いツールは無いものかとググっていたら、以下のページが参考になった。
_SONY SMC-777でS-OS SWORDを動かしました。 - tunozemichanの日記 / tunozemichan's diary
l3diskex というツールがあるらしい。ググってみたら、以下に遭遇。
_トップページ - 日立 ベーシックマスター レベル3 マーク5 / S1
L3 Disk Explorer (l3diskex) が正式名称で、日立ベーシックマスターのエミュレータ用に作られたツールらしい。コレを利用すればどうにかなりそう。ありがたや。
l3diskex_win32_060.zip を入手して解凍。l3diskex.exe を実行するとウインドウが開いた。
少し触ってたら、なんとなくやり方が見えてきたので、一応手順をメモ。
まず、新規ディスクを作成。ツールバー上の「新規」アイコンをクリック。
「ディスクの新規作成」ダイアログが開く。
ここでちょっと疑問が湧くかもしれない。「S-OSから扱うディスクなのに、Hu-BASICなんか選んじゃっていいの…?」
むしろ、Hu-BASIC を選んだほうがいいらしい。と言うのも、S-OS のディスクフォーマットは Hu-BASICと同じにしてあるそうなので…。
_S-OS Sword Ver2.0 (J)(1986-02)(Oh!mz) [mz80K][type-in].txt
さておき。GAME01 というディスクが新規作成された。
この「GAME01」をクリックすると、「FATがおかしいよ」と言ってくる。フォーマットが必要なのだろう…。
右クリックして「BASIC用にフォーマット」を選ぶ。
BASICの種類を選択する。「X1 Hu-BASIC (3インチ/5インチ2D)」を選択。あらかじめこうして用意してあるなんて、本当にありがたい…。
「中身が全部消えるけどいいのか?」と尋ねてくるので「いいですよ」と。
これでフォーマットはできたはず。S-OSのアプリバイナリを含めてみる。ツールバー上の「インポート」をクリック。
先ほどヘッダ部分と本体バイナリを分離した、INVADER.obj.BIN を選択。今回はコレを入れてみる。
ファイルをインポートするウインドウが表示される。
ちょっと注意点。もしかすると、上記のウインドウとは違うウインドウが出てくる時があるかもしれない…。ディスクの新規作成から続けて作業した時は、大体このウインドウになるのだけど…。違うウインドウが出てくる時の条件は、まだ分かってない。
さておき。これで、S-OSのアプリバイナリを、ディスクイメージに含めることができた。
保存アイコンをクリックして、ディスクイメージを保存する。
「GAME01.d88」というファイル名で保存してみることにした。
今日はここで時間切れ。X1エミュレータ + S-OS SWORD で、この .d88 から読み込む手順は明日メモする。
何か良いツールは無いものかとググっていたら、以下のページが参考になった。
_SONY SMC-777でS-OS SWORDを動かしました。 - tunozemichanの日記 / tunozemichan's diary
l3diskex というツールがあるらしい。ググってみたら、以下に遭遇。
_トップページ - 日立 ベーシックマスター レベル3 マーク5 / S1
L3 Disk Explorer (l3diskex) が正式名称で、日立ベーシックマスターのエミュレータ用に作られたツールらしい。コレを利用すればどうにかなりそう。ありがたや。
l3diskex_win32_060.zip を入手して解凍。l3diskex.exe を実行するとウインドウが開いた。
少し触ってたら、なんとなくやり方が見えてきたので、一応手順をメモ。
まず、新規ディスクを作成。ツールバー上の「新規」アイコンをクリック。
「ディスクの新規作成」ダイアログが開く。
- 「カテゴリー」は「シャープ X1 Hu-BASIC」を選択。
- 「ディスク名」は…今回は「GAME01」にしてみた。おそらく、大文字の英数字だけにしておいたほうが問題が起きにくい予感。
ここでちょっと疑問が湧くかもしれない。「S-OSから扱うディスクなのに、Hu-BASICなんか選んじゃっていいの…?」
むしろ、Hu-BASIC を選んだほうがいいらしい。と言うのも、S-OS のディスクフォーマットは Hu-BASICと同じにしてあるそうなので…。
_S-OS Sword Ver2.0 (J)(1986-02)(Oh!mz) [mz80K][type-in].txt
ディスクフォーマット
ディスクのフォーマットはHuBASICと同じにしました。
つまり、S-BASICと比べるとディスクの表裏が逆、記録されるデータはビットが反転しています。
これは、現在S-OSを移植中のマシンとの関係も合わでて、こちらのほうが一般的かつ合理的であると判断したからです。
さておき。GAME01 というディスクが新規作成された。
この「GAME01」をクリックすると、「FATがおかしいよ」と言ってくる。フォーマットが必要なのだろう…。
右クリックして「BASIC用にフォーマット」を選ぶ。
BASICの種類を選択する。「X1 Hu-BASIC (3インチ/5インチ2D)」を選択。あらかじめこうして用意してあるなんて、本当にありがたい…。
「中身が全部消えるけどいいのか?」と尋ねてくるので「いいですよ」と。
これでフォーマットはできたはず。S-OSのアプリバイナリを含めてみる。ツールバー上の「インポート」をクリック。
先ほどヘッダ部分と本体バイナリを分離した、INVADER.obj.BIN を選択。今回はコレを入れてみる。
ファイルをインポートするウインドウが表示される。
- 「ディスクイメージ内のファイル名」を指定。ここもおそらく、大文字の英数字にしておいたほうが問題が起きにくい予感。
- 「ファイル種類」は「Bin」にしておく。
- 「ロードアドレス」「実行アドレス」を指定。INVADER.obj.HED には「3000」と書かれてたので、それに従って入力。
- 一応、「全ての日付を無視する」にチェックを入れておいた。
ちょっと注意点。もしかすると、上記のウインドウとは違うウインドウが出てくる時があるかもしれない…。ディスクの新規作成から続けて作業した時は、大体このウインドウになるのだけど…。違うウインドウが出てくる時の条件は、まだ分かってない。
さておき。これで、S-OSのアプリバイナリを、ディスクイメージに含めることができた。
保存アイコンをクリックして、ディスクイメージを保存する。
「GAME01.d88」というファイル名で保存してみることにした。
今日はここで時間切れ。X1エミュレータ + S-OS SWORD で、この .d88 から読み込む手順は明日メモする。
[ ツッコむ ]
以上です。