表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
2/37

エピ2 カセットテープにはデータが記録されている


 ***


 エピ2 カセットテープにはデータが記録されている


 ***


 ダンボール箱から出てきたカセットテープにはMZ80関係のデータが記録されていることが分かりました。


 波形の続きを見てみましょう。


 ***


 このテープには何本かのデータが入っているようです。ずっと聴いていたら「ピィーッ、ギャラギュラ」を何度か繰り返していたので。


挿絵(By みてみん)

 グラフにして見るとデータは5本ですね。横軸は時間で単位は秒、縦軸は振幅(Peak-Peak)です。あ、細部を見たい方はグラフをクリックしてね。


 その1本目は、0〜45.4 秒です。

挿絵(By みてみん)


 最初の「ピィーーー」という音は3〜9秒の区間です。振幅は 15000 ほどで、周波数は 2kHz くらい。


 続く「ピッギューン、ピュギューン」という音は、10秒前後の2つの区間で振幅が 15000 と 30000 とで変化している。

 

 それから一瞬だけ途切れて、ピー音の後に「ギャラギュラギャラギュラ・・・」と続く。


 音声で聴いたのと同じですがグラフの方が分かり易いです。


 *


 ピッギューン音を拡大してみましょう(9.0〜11.2 秒)。

挿絵(By みてみん)

 2つありますが、内容は同じ 130 バイトのデータが入っているようです。でも先頭の 22 バイト程しか使用していないかもです。残りは 00h と FFh で埋まっています。波形を見れば分かるね。


 先頭の 22 バイトはファイル名とその属性などなのでしょう。サイズやチェックサムなどが入っていそう。最初に1と0が40個連続するのは識別用のマークかな。


 *


 次はギュラギャラ音です(16.9〜17.2 秒)。

挿絵(By みてみん)

 最初に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 エピタイ修正と微推敲



評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ