2019/05/20(月) [n年前の日記]
#1 [mz] Hu-BASICの記録フォーマットについてメモ
MZ-700用 Hu-BASICの記録フォーマットについて、 mzt をバイナリエディタで開いて眺めたり、bas2txt.c を眺めさせてもらったりして、ある程度分かってきた感じがするので、そのあたりをメモ。
- 1行分は、「行の長さ (2byte)」「行番号 (2byte)」「行の内容」「行の終端コード (1byte, 0x00)」、の順で並んでる。
- ソース全体の終端コードは 0x0000。行の長さを見ていって、0 が出てきたら、そこでプログラムは終了、と判断できそう。
- 行の内容には、BASICコマンドを数値で表した中間コード、ASCIIコード、数値情報、等が入ってる。
◎ 数値について。 :
プログラム中に含まれている数値に関しては、色々な種類がある模様。
最初の1バイトを見ると、数値の種類が分かる。
ちなみに、文字列は、ASCIIコードがそのまま並んでいるっぽい。
最初の1バイトを見ると、数値の種類が分かる。
- 0x01 - 0x0A : 0 - 9 の数値を表す。
- 0x0B, 0xXX, 0xXX : 行番号。2byte で示す。(GOTO xxxx, GOSUB xxxx)
- 0x0D, 0xXX, 0xXX : 8進数。2byte で示す。(&Oxxxx)
- 0x0E, 0xXX, 0xXX : 2進数。2byte で示す。(&Bxxxxxxxx)
- 0x0F, 0xXX, 0xXX : 16進数。2byte で示す。(&Hxxxx)
- 0x12, 0xXX, 0xXX : 整数。2byte で示す。 (xxxx)
- 0x15, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX : 単精度小数点数。5byte で示す。(xxxx.xxx)
- 0x18, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX : 倍精度小数点数。8byte で示す。
ちなみに、文字列は、ASCIIコードがそのまま並んでいるっぽい。
◎ 中間コードについて。 :
中間コードは、0x80 - 0xFD で示される群と、0xFE81 - 0xFEFF, 0xFF80 - 0xFFFF で示される群がある。一応、書籍「ADVANCED MZ-700」に書かれていた情報を、若干
_メモ
してみたので、書かれている一覧表を眺めれば、ある程度は分かる…はず…。
*1
◎ REM文について。 :
REM文は、ちょっと扱いが面倒な感じ。通常の「REM」は、「PRINT」等の中間コードと同様の扱いで読んでいけばいいけれど、REM の省略形として「'」という文字があって。この「'」が使われると、プログラム内では、自動で、マルチステートメントの区切り文字である「:」が直前に挿入される模様。
ただ、この場合の「:」は、LIST を打った際には表示されないので…。読み取っていく際に「:」が出てきたら、その直後が「'」であるかどうかを調べてみて、「'」があったら、その場合の「:」は表示しない、といった処理が必要になる模様。
ちなみに「ELSE」も「'」と同様で、直前に「:」が入るらしい。これも、読み取り中に「:」が出現、かつ、直後に「ELSE」の中間コードがあるなら、その場合の「:」も表示しない、といった処理が必要になる。
ただ、この場合の「:」は、LIST を打った際には表示されないので…。読み取っていく際に「:」が出てきたら、その直後が「'」であるかどうかを調べてみて、「'」があったら、その場合の「:」は表示しない、といった処理が必要になる模様。
ちなみに「ELSE」も「'」と同様で、直前に「:」が入るらしい。これも、読み取り中に「:」が出現、かつ、直後に「ELSE」の中間コードがあるなら、その場合の「:」も表示しない、といった処理が必要になる。
◎ バイナリエディタで確認してみた結果。 :
各 .mzt を、バイナリエディタで開いて確認してみたソレも、一応アップロード。
以下のプログラムは…。
このように記録されている。
以下のプログラムは…。
このように記録されている。
以下のプログラムは…。
このように記録されている。
- .mzt は、最初の 0x80 byte がヘッダー情報。データ本体は、0x0080 以降に入っている。
以下のプログラムは…。
このように記録されている。
- 水色 : 行の長さ
- 緑色 : 行番号
- 黄色 : 数値が入っている部分。上記の例では、整数(2byte)、及び、単精度小数点数(5byte)が記録されていることが分かる。
- 紫 : 行の終端コード
- 橙 : プログラム全体の終端コード
以下のプログラムは…。
このように記録されている。
- 赤 : 行の終端コード
- 行番号を示す数値は 0x0B
- 16進数を示す数値は 0x0F
- 2進数を示す数値は 0x0E
- 8進数を示す数値は 0x0D
以下のプログラムは…。
このように記録されている。
- 整数の 0 が 0x01、9 が 0x0A で記録されている。
- 整数の 10 は、0x12, 0x000A になっている。
- 最後のあたり、REMの省略形「'」(0x27)の前に、「:」(0x3A)が挿入されていることが分かる。LIST上では「:」なんて表示されてないけど、内部では「:」が挿入されているということ。
[ ツッコむ ]
以上です。