2019/05/13(月) [n年前の日記]
#1 [mz][python] MZシリーズのBASICをテキスト変換するPythonスクリプトを書いてたり
MZ-80K/1200の標準BASIC、SP-5030用のBASICプログラムを、テキスト出力する Pythonスクリプトを書いているところ。mztファイルを読み込んでテキストに変換、みたいな。
ちなみに、SP-5030用BASICプログラムの記録フォーマットは、 _2019/05/09の日記 にメモしてある。
ちなみに、SP-5030用BASICプログラムの記録フォーマットは、 _2019/05/09の日記 にメモしてある。
◎ S-BASICにも対応させたい。 :
SP-5030用の処理はそれらしい結果が出てくるところまで書けたけど。ついでに、MZ-700版 S-BASIC (1Z-007B) にも対応させようとしたところで悩んだり。
MZ-700版 S-BASIC の記録フォーマットは、以下のページが参考になりそう。英語版の S-BASIC が対象ではあるけれど、中間コードの一覧も、記録内容も、細かく解説してある。英語だからよくわからんところもあるけど…。
_S-BASIC 1Z-013B internals
_Overview of S-BASIC commands
_MZ-700 / MZ-800 Basic Instructions Overview
例えば、以下のソースは…。
以下のような形で記録されてる。
フォーマットは、SP-5030 とかなり似ているけれど、若干違う部分もあるようで。
同じ点は以下。
異なる点は以下。
SP-5030 は…。
S-BASIC は…。
ちなみに、mztファイルを読み込んで、S-BASIC、Hu-BASIC のソースをテキスト出力してくれる、bas2txt というツールが既にあって…。
_We Love MZ-700
C言語で書かれたソースも同梱されているので、とても参考になる。ありがたや。
というか、変換結果だけ欲しければ、bas2txt を使わせてもらったほうが早いのだけど。今回は、記録フォーマットについて把握しておきたいので、自分も処理を書きつつ仕様を確認、みたいな。
MZ-700版 S-BASIC の記録フォーマットは、以下のページが参考になりそう。英語版の S-BASIC が対象ではあるけれど、中間コードの一覧も、記録内容も、細かく解説してある。英語だからよくわからんところもあるけど…。
_S-BASIC 1Z-013B internals
_Overview of S-BASIC commands
_MZ-700 / MZ-800 Basic Instructions Overview
例えば、以下のソースは…。
以下のような形で記録されてる。
フォーマットは、SP-5030 とかなり似ているけれど、若干違う部分もあるようで。
同じ点は以下。
- 1行分は、「行の長さ(2byte), 行番号(2byte), 内容、終了コード(1byte)」の順で並ぶ。
- ソースコードの最終2byteが、終了コード = 0x0000 になっている。要は、行の長さが 0x0000 なら、そこでプログラムは終了、という扱いにできる。
異なる点は以下。
SP-5030 は…。
- 行の終了コードが 0x0d。
- コマンドの中間コードは、1byteのみ。0x80 - 0xff の範囲を取る。
- ソース中の数値は、ASCIIコードでそのまま記述される。
S-BASIC は…。
- 行の終了コードが 0x00。
- コマンドの中間コードは、1byte、または 2byte。1byte分は 0x80 - 0xfd、2byte分は 0xfexx - 0xffxx の範囲を取る。
- ソース中の数値は、数値種類コード 1byte + 数 byte のバイナリで記述される。最初からバイナリになった状態で記録されるから、実行時に ASCII から数値に変換しないで済む ―― 実行速度が稼げるらしい。
ちなみに、mztファイルを読み込んで、S-BASIC、Hu-BASIC のソースをテキスト出力してくれる、bas2txt というツールが既にあって…。
_We Love MZ-700
C言語で書かれたソースも同梱されているので、とても参考になる。ありがたや。
というか、変換結果だけ欲しければ、bas2txt を使わせてもらったほうが早いのだけど。今回は、記録フォーマットについて把握しておきたいので、自分も処理を書きつつ仕様を確認、みたいな。
◎ S-BASICの数値に記録フォーマット。 :
MZ-700 S-BASIC は、ソース内の数値をバイナリとして記録してあるらしいのだけど。それぞれ、以下のような状態で記録されてるらしい。
16進数と行番号は、種類を示す数値の後ろから 2byte 読み込むだけで済むけれど。浮動小数点数が…よく分からない…。以下で説明はされているけれど…。
_S-BASIC 1Z-013B internals
- 0x15 + 5byte : 浮動小数点数 (単精度実数)。5byte のうち、最初の 1byte が 指数部、残り4byteが仮数部。らしい。
- 0x11 + 2byte : 16進数。ソース内で $xxxx と記述した際に使われる。0x0000 - 0xffff まで記述できる。
- 0x0b + 2byte : 行番号。0 - 65535 まで記述できる。
16進数と行番号は、種類を示す数値の後ろから 2byte 読み込むだけで済むけれど。浮動小数点数が…よく分からない…。以下で説明はされているけれど…。
_S-BASIC 1Z-013B internals
[ ツッコむ ]
以上、1 日分です。