エピ2 カセットテープにはデータが記録されている
***
エピ2 カセットテープにはデータが記録されている
***
ダンボール箱から出てきたカセットテープにはMZ80関係のデータが記録されていることが分かりました。
波形の続きを見てみましょう。
***
このテープには何本かのデータが入っているようです。ずっと聴いていたら「ピィーッ、ギャラギュラ」を何度か繰り返していたので。
グラフにして見るとデータは5本ですね。横軸は時間で単位は秒、縦軸は振幅(Peak-Peak)です。あ、細部を見たい方はグラフをクリックしてね。
その1本目は、0〜45.4 秒です。
最初の「ピィーーー」という音は3〜9秒の区間です。振幅は 15000 ほどで、周波数は 2kHz くらい。
続く「ピッギューン、ピュギューン」という音は、10秒前後の2つの区間で振幅が 15000 と 30000 とで変化している。
それから一瞬だけ途切れて、ピー音の後に「ギャラギュラギャラギュラ・・・」と続く。
音声で聴いたのと同じですがグラフの方が分かり易いです。
*
ピッギューン音を拡大してみましょう(9.0〜11.2 秒)。
2つありますが、内容は同じ 130 バイトのデータが入っているようです。でも先頭の 22 バイト程しか使用していないかもです。残りは 00h と FFh で埋まっています。波形を見れば分かるね。
先頭の 22 バイトはファイル名とその属性などなのでしょう。サイズやチェックサムなどが入っていそう。最初に1と0が40個連続するのは識別用のマークかな。
*
次はギュラギャラ音です(16.9〜17.2 秒)。
最初に1と0が 20 個連続していて、その後に9ビットで1バイトのデータが続く。
*
ギュラギャラ音のデータを翻訳してみましょう。
1波を1ビットと見做して、振幅が大きい波を1、他方を0とします。9ビット毎に区切り、最初の1ビットは「1」であることを確認して、残り8ビットを16進数にします。
すると、...
01: 1 00001100 => 0Ch length 12 (= 00h*256+0Ch)
02: 1 00000000 => 00h
03: 1 01100100 => 64h number 100 (= 00h*256+64h)
04: 1 00000000 => 00h
05: 1 10010101 => 95h DIM
06: 1 00100000 => 20h SP
07: 1 01000001 => 41h "A"
08: 1 00100100 => 24h "$"
09: 1 00101000 => 28h "("
10: 1 00110110 => 36h "6"
11: 1 00101001 => 29h ")"
12: 1 00001101 => 0Dh CR
これはBASIC言語の
100 DIM A$(6)
という文番号 100 の命令文のようです。
最初の2バイトはバイト数、次の2バイトは文番号だと推測しました。文番号が 1〜65535 の範囲なのは2バイトだからか。1文の文字数の最大はどうなんだろう?
続く5バイト目の 95h はMZ80のアスキーコードでは「オ」なのですが、A$() は添字付きストリング変数で、使用する前に DIM 命令で宣言するので DIM だと推測できます。
*
続きをもう少し翻訳してみますと、
01: 1 00110100 => 34h length 52
02: 1 00000000 => 00h
03: 1 01101110 => 6Eh number 110
04: 1 00000000 => 00h
05: 1 01000001 => 41h "A"
06: 1 00100100 => 24h "$"
07: 1 00101000 => 28h "("
08: 1 00110001 => 31h "1"
09: 1 00101001 => 29h ")"
10: 1 10110110 => B6h =
11: 1 00100010 => 22h """
12: 1 00101010 => 2Ah "*"
:(略)
50: 1 00101010 => 2Ah "*"
51: 1 00100010 => 22h """
52: 1 00001101 => 0Dh CR
110 A$(1)="*(略)*"
文番号 110 でストリング変数 A$(1) に文字列をセットしているようです。B6h はBASICの代入演算子です。
***
**
*
命令文を内部ではコードで格納するのは、中間言語形式と言うそうです(...、と自称しているけど言語とは何か)。
命令と中間コードの対応が推測できたものは、
85h PRINT
87h FOR
88h IF
89h GOTO
8Bh GOSUB
8Ch RETURN
8Dh NEXT
8Fh END
95h DIM
ADh THEN
AEh TO
AFh STEP
B6h =
などです。例えば、...
IF A$="Y" THEN 200
という 18 文字からなる文は、内部では A$ と "Y", 200 はアスキーコードで、IF と THEN は中間コードに変換されて、
88h (IF) 20h (SP) 41h (A) 24h ($) B6h (=)
22h (") 59h (Y) 22h (") 20h (SP) ADh (THEN)
20h (SP) 32h (2) 30h (0) 30h (0) 0Dh (CR)
と、15 バイトになります。なお、SP はスペースで、CR は改行です。
命令を1バイトで表せば文字列で表すよりメモリ節約になるし、命令の解釈実行が効率的になるかな。
*
「中間言語形式」って調べてみると、Dr.Dobb's Journal, 1976-1〜1976-2 に掲載された Tiny BASIC などが出てきて、これが本当の中間言語形式ですね。
少なくともあれは言語ではないよ(個人の主張です)。
***
**
*
このテープにはMZ80のBASIC言語のプログラムが記録されていると、これで確定です。イイですね?
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2025.12.18 推敲と図の差替
2026.2.11 微推敲
2026.2.18 推敲
2026.4.17 微推敲
2026.4.24 エピタイ修正と微推敲




