エピ4 波長で0と1を判定しましょう
***
エピ4 波長で0と1を判定しましょう
***
ビットの判定方法を見直しました。
振幅で信号の有無を確認して、波長で0と1を判定しましょう。
波長なら振幅が乱れるようなノイズが入った場合でも影響を受け辛いのです。
***
ビット化けが消えてスッキリしましたので、別のテープも読んでみましょう。
ラベルに「BASIC」とか「SP5030」とあるので、MZ80用のBASICのプログラムが入っているのだと思います。
BASICのプログラム、...とはBASIC言語で書かれたプログラムではなくて、BASIC言語のプログラムを解釈実行するプログラムです。けど、分かり難いよね。BASICのプログラムではなくてSP5030と言うことにしましょう。
*
まずは振幅と波長の確認をします。0〜190 秒がデータの全体です。
横軸は時間です。上段が振幅で下段が波長です。振幅では1と0の判定が困難な部分もありましたが、波長なら楽勝でした。
テープによって振幅が違うのは気になります。前のテープの出始めの振幅は 15000 程でした。録音レベルを弄ったかな?
波長は20〜27と41〜48の範囲にほぼ収まっています。外れているのは、...3と6は各1個。11〜19は3〜10個。30と34は各1個。
11〜19や30、34が出ている部分(11.660〜11.685 秒)を確認すると(...、-2500 のラインがしきい値です)、
うーん。直流成分が揺れている?
しきい値とのクロスではなくて別の方法で波を扱うべきかもです。最大や最小を検出するとか。
でもまぁ、音の始めか終わりで発生しているので振幅で監視すれば除外することはできますね。出始めはピー音が数秒続くので、これで何とかできましょう。例外は個別に処置。
*
ビットの判定が安定したので、安心して16進数で表示できるようになりました。安定とか安心って良いですね。
ファイル名が入っている部分の 130 バイトです。
0000: 01 53 50 2D 35 30 33 30 0D 0D 0D 0D 0D 0D 0D 0D
0010: 0D 0D 40 2F 00 12 00 12 00 00 00 00 00 00 00 3A
0020: FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00
0030: FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00
0040: FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00
0050: FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00
0060: FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00
0070: FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00
0080: 01 C3
最初のバイトは 01h です。エピ1ではBASIC言語で書かれたプログラムが入っていて 02h でした。多分ですが 01h なら機械語で、02h ならBASICなのでしょう。
続く 53h, 50h, 2Dh, 35h, 30h, 33h, 30h はアスキーコードでファイル名を表していて、「SP-5030」の7文字です。0Dh (CR) でファイル名の最後を示します。ファイル名は最大16文字なので、16文字未満なら残った部分は 0Dh (CR) で埋めるのかな。
ファイル名(と 0Dh)に続く 40h, 2Fh, 00h, 12h, 00h, 12h と 3Ah、それから最後の 01h, C3h は意味がありそうだけど未解明です。
先頭の 32 バイトと最後の2バイトには情報が入っていて、他は FFh と 00h で埋まっているから未使用なのかも。
*
プログラムが入っている部分です。
機械語なので、...。16進数で表示してもアレなので、...。逆アセンブルすると、それらしきリストになりました。機械語のプログラムで間違いなさそうです。
*
お客さまの中に「目視で」逆アセンブル出来る方はいらしゃいませんかー お客さまっー
*
BASICが、...SP5030が起動すると(...アセンブルリストを見て、Z80になったつもりで、1ステップ毎に動かすのです)、まず最初にメモリのテストを行いつつ、メモリをゼロクリアして、メモリの末尾にスタックポインタを設定します。
それから、「 * SHARP BASIC SP-5030」を画面表示します。
この文字列は 00E0h に入っていて、文字列の最後は 0Dh (CR) です。他に READY や ERROR とかの文字列が見えますね。
00E0: 20 2A 20 53 48 41 52 50 |SP| *|SP| S| H| A| R| P|
00E8: 20 42 41 53 49 43 20 53 |SP| B| A| S| I| C|SP| S|
00F0: 50 2D 35 30 33 30 0D 52 | P| -| 5| 0| 3| 0|0D| R|
00F8: 45 41 44 59 0D 20 45 52 | E| A| D| Y|0D|SP| E| R|
0100: 52 4F 52 0D 20 49 4E 0D | R| O| R|0D|SP| I| N|0D|
文字列を画面に表示するには、DE レジスタに文字列の先頭番地をセットして、ROMに格納されているサブルーチン(0015h)をコールします。
0027: 11E012 LD DE, 12E0h ; 12E0 = 1200 + 00E0
002A: CD1500 CALL 0015h ; CALL ROM MSG
このように DE レジスタに 12E0h をセットしているので、SP5030は 1200h 番地以降にロードされていると推測できます。...。1200h はファイル名の後ろにあった値。
その後は、ワークエリアに各種の初期値を設定して、メモリサイズを表示して、時計を0クリアして初期化は終了です。
それから「READY」を表示して、カーソルを点滅し、操作待ちになります。プログラムを入力するなり、カセットテープからロードするなりします。
*
それから、それから。02D4h 〜 0414h には中間コードに対応する文字列が入っています。
文字列 + 0Dh という形式ではなくて、最後の文字のMSBを1にして終端を示す形式です。命令文で使われる文字は 7Fh 以下でMSBは0なので区切りに使えるのです。...、ご存知でしょうけれど、MSBは最上位ビット(b7)のことです。最下位ビット(b0)はLSBと言います。
n = 0x80; c = ""
for a in range(0x02D4,0x0414+1):
o = p+a*9
c += asc_t[int(s1[o+2:o+9],2)]
if s1[o+1] == "1":
print "%02X : %s"%(n,c); n += 1; c = ""
変数 s1 にはビット判定した結果が入っていて、データ部分の先頭を変数 p で示します。変数 asc_t[] はアスキーコード表です。
変数 a は 02D4h 〜 0414h の範囲で変化して、変数 o は変数 a に応じて9ビット毎のデータの最初を指します。それで、s1[o+1] がMSB(b7)、s1[o+2:o+9] が下位7ビット(b6〜b0)になります。
なお s1[o] は最初のビットで、値は1固定です(エラーが無ければね)。
すると、
80 : REM
81 : DATA
82 : LIST
83 : RUN
84 : NEW
85 : PRINT
86 : LET
87 : FOR
:
:
D8 : LN(
D9 : ABS(
DA : SGN(
DB : SQR(
DC : [7Fh]
DD : [7Fh]
という一覧を取得できました! このうち A9h, AAh, ABh, ACh と CCh, CDh, CEh と DCh, DDh は 7Fh で予約コードみたいです。
SP5030は DBh までしか参照しないですけど。DEh と DFh も予約コードの方が美しくないかな。
これでBASICのプログラムの翻訳が捗ります。
*
命令文の LET なんて教科書でしか見たことなかったけど実在したんだ!
***
データを表示していて気が付いたのですが、...、同じ内容のデータが2つ入っています!
2つをロードして比較するのでしょうか。誤り訂正符号を付ければ、...と思うけど。
2つ入っているのはファイル名と同じですが、ファイル名は 130 バイトですから1秒が2秒に増える程度です。データは長いと数分あるから、2倍になるのは辛いのではないかな。
それとね。ファイル名の後ろの 2F40h という値はデータ1つ分のサイズ(バイト数)ですね。
データが 2F40h バイトだとすると、データの後に2バイトの情報があるようです。チェックサムかCRCと推測されます。
ファイル名の 130 バイトもデータは 128 バイトで、最後の2バイトはチェックサムかも知れない。
***
ファイル名が入っている 128+2 バイトと、プログラムの 2F40h+2 バイトを保存します。
***
**
*
謎な部分は多々ありますが、...例えば謎に1ビットのズレが出るとか、...ありますが、大枠は分ってきた感じです。
BASICも機械語もプログラムとして翻訳、表示できたし。あとは例外の検証かな。気が向いたら取り組むと言うことでよろしくお願致します。
皆様、良いお年をお迎えくださいませ、...(まだ早いか)
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2025.12.20 加筆と微推敲
2025.12.25 推敲
2025.12.28 微推敲
2026.1.7 推敲。怒涛の年末年始よ。
2026.2.12 微推敲。2026.1.7の履歴を誤字訂正
2026.4.17 エピタイ修正




