mieki256's diary



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シリーズ | ひみつの屋根裏部屋

S-OSアプリの入手先。 :

S-OSのアプリのバイナリは以下で入手できる模様。ありがたや。

_THE SENTINEL
_S-OS

前者では .obj ファイルがDLできる。後者では .mzt ファイルがDLできる。

.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最強伝説

このヘッダ部分には、おそらく以下のフォーマットで、ロードアドレス(そのファイルを配置してほしいメモリ領域の先頭アドレス)や実行アドレス等々の情報が入っている、ように見えた。

AddressSizeDescription
0x00-0x034byteいわゆるシグネチャ相当。"_SOS" のASCIIコード。おそらく、S-OS関係のファイルであることを示している。
0x041byte区切り文字。0x20 (スペースのASCIIコード)が入っている。
0x05-0x062byteおそらくファイル種類。ASCIIコードで記述。"01"が S-OS用バイナリファイル。"02"がFuzzyBasicの.BASファイル等。他にも種類がありそう。
0x071byte区切り文字 (0x20)。
0x08-0x0b4byteロードアドレス。ASCIIコードで記述されてる。指定可能な範囲は 0x0000 - 0xffff。
0x0c1byte区切り文字 (0x20)。
0x0d-0x104byte実行アドレス。ASCIIコードで記述されている。指定可能な範囲は 0x0000 - 0xffff。
0x111byte終端文字。0x0a (ASCIIコードで LF)が入ってる。

バイナリエディタで開いた状態も載せてみる。なんとなく分かるだろうか…。

obj_header.png

ちなみに、前述のページから入手できる 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) を選択。

split_hed_bin_ss01.png


右クリックして「切り取り」。

split_hed_bin_ss02.png


ツールバー上の「新規作成」をクリック。空のウインドウが開く。

split_hed_bin_ss03.png


右クリックして「貼付け」。

split_hed_bin_ss04.png


これで、ヘッダ部分と本体バイナリを分離できた。

split_hed_bin_ss05.png


  • ヘッダ部分は、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に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 を実行するとウインドウが開いた。

少し触ってたら、なんとなくやり方が見えてきたので、一応手順をメモ。

まず、新規ディスクを作成。ツールバー上の「新規」アイコンをクリック。

d88_impor_ss01.png


「ディスクの新規作成」ダイアログが開く。
  • 「カテゴリー」は「シャープ X1 Hu-BASIC」を選択。
  • 「ディスク名」は…今回は「GAME01」にしてみた。おそらく、大文字の英数字だけにしておいたほうが問題が起きにくい予感。

d88_impor_ss02.png

ここでちょっと疑問が湧くかもしれない。「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 というディスクが新規作成された。

d88_impor_ss03.png


この「GAME01」をクリックすると、「FATがおかしいよ」と言ってくる。フォーマットが必要なのだろう…。

d88_impor_ss04.png


右クリックして「BASIC用にフォーマット」を選ぶ。

d88_impor_ss05.png


BASICの種類を選択する。「X1 Hu-BASIC (3インチ/5インチ2D)」を選択。あらかじめこうして用意してあるなんて、本当にありがたい…。

d88_impor_ss06.png


「中身が全部消えるけどいいのか?」と尋ねてくるので「いいですよ」と。

d88_impor_ss07.png


これでフォーマットはできたはず。S-OSのアプリバイナリを含めてみる。ツールバー上の「インポート」をクリック。

d88_impor_ss08.png


先ほどヘッダ部分と本体バイナリを分離した、INVADER.obj.BIN を選択。今回はコレを入れてみる。

d88_impor_ss09.png


ファイルをインポートするウインドウが表示される。
  • 「ディスクイメージ内のファイル名」を指定。ここもおそらく、大文字の英数字にしておいたほうが問題が起きにくい予感。
  • 「ファイル種類」は「Bin」にしておく。
  • 「ロードアドレス」「実行アドレス」を指定。INVADER.obj.HED には「3000」と書かれてたので、それに従って入力。
  • 一応、「全ての日付を無視する」にチェックを入れておいた。
d88_impor_ss10.png

ちょっと注意点。もしかすると、上記のウインドウとは違うウインドウが出てくる時があるかもしれない…。ディスクの新規作成から続けて作業した時は、大体このウインドウになるのだけど…。違うウインドウが出てくる時の条件は、まだ分かってない。

さておき。これで、S-OSのアプリバイナリを、ディスクイメージに含めることができた。

保存アイコンをクリックして、ディスクイメージを保存する。

d88_impor_ss11.png


「GAME01.d88」というファイル名で保存してみることにした。

d88_impor_ss12.png


今日はここで時間切れ。X1エミュレータ + S-OS SWORD で、この .d88 から読み込む手順は明日メモする。

以上、1 日分です。

過去ログ表示

Prev - 2022/10 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project