エピ9.2 SP5030の "LOAD" 命令をもう一度
***
エピ9.2 SP5030の "LOAD" 命令をもう一度
***
エピ9.1ではROMの LOAD コマンドの動作を解読しました。
簡単に復習すると、LOAD コマンドを処理するルーチンらは次の構成になっていました。
<LOAD コマンド> 00CFh〜
◎04D8h(ファイル名をロード:BC=0080h, HL=10F0h)
◎04F8h(データ本体をロード:BC=[1102h], HL=[1104h])
◎06B2h(Playボタン待ち)
◎065Eh(1連続と0連続待ち:40個または20個)
◎0510h(データ取得:BCバイト分をHL番地に格納)
◎0624h(1バイト取得)
◎0601h(0→1検出)
◎0760h(時間待ち)
◎0700h(モータ停止など終了処理)
基礎となるROMのルーチンが分ったところで、SP5030の "LOAD" 命令をもう一度見てみましょう。
***
改めてSP5030の "LOAD" 命令を見てみると、次の構成になっていることが分かりました。
<"LOAD" 命令> 2A15h〜
◉4049h(ファイル名をロード)
◉4069h(データ本体をロード)
◉4128h
◎06B2h(Playボタン待ち)
・時間待ち(20000h 回ループ)
◉4122h
◉40FCh(0の100連続待ち)
◎065Eh(1連続と0連続待ち:40個 or 20個)
◉4081h
◎0624h
◎0601h(0→1検出)
◎0760h(時間待ち)
◉40FCh(0の100連続待ち)←←←ココ、気が付いて無かった
◎0700h(モータ停止など終了処理)
*
「◉」はSP5030のルーチン、「◎」はROMのルーチンです。
*
このように見てみれば、えーっ、っと思う位に簡単なことだったのですけど、最初は何がなんだか分からなくて、...似たようなコードが何度も現れて、さっきとの違いが分からなくて、リターンしても何処に戻るのか不確かになって。
...、個々のルーチンの役割が確かになって、ようやく構成の全体が見えてきたんです(泣)
*
SP5030の 4049h, 4069h はROMの 04D8h, 04F8h と同じコードです。コールしている3つのルーチンの番地が違う以外はね。
3つのルーチンも対応関係があるようです。
4128h と 4122h は、各々ROMルーチンの 06B2h と 065Eh に処理を追加したものです。4128h なら、06B2h をコールした後に時間待ちのコードが続きますし、4122h は 065Eh をコールする前に 40FCh をコールします。
カセットテープレコーダの Play ボタンが押下されてモーターが回転を始めたら、信号が安定するまで時間待ちが必要だよね。メカの動作開始時は不安定だから。
40FCh のルーチン(0の 100 連続待ち)を追加したのも信号が安定したことを確認するためでしょう。
4081h は 0510h と同じ、...同じだよな。同じかな...、あ、違いがあった。4081h はチェックサム・エラーが発生して2つ目のデータのロードを始める前に 40FCh をコールして0の 100 連続を待ちます。
でも1つ目と2つ目の間の信号は連続しているのだけど。ここにこれは必要なのかな。40FCh のコールがなければ 4081h は 0510h と同じになって、4081h のコード、...4081h〜40FBh の 123 バイトは要らなくなるのだけど、...。
*
4128h のルーチンの 20000h 回のループの時間は、...細かいところは省いて見積ると、...ループ1回の命令は DEC 6, NOP 4, LD 4, OR 4, JR 12 なので、6 + 4 + 4 + 4 + 12 = 30 ステート。
これを 20000h 回ですから 30*0x20000 = 3932160 ステートです。時間にすると 1,966,080 μs、...約2秒?
最初の「ピー」音は短くても3秒あるから、この時間で信号が安定するのを待つ感じですね。
*
製品出荷後にROMコードに課題が見つかって、SP5030で改良が必要となったのでしょう。憶測ですけど。065Eh のルーチン(1連続と0連続待ち)で誤検出する不具合が発生したとか。
クリーンコンピュータでよかったね?
***
一方、SP5030の "LOAD" 命令のコード(2A15h〜)は、ROMの LOAD コマンド(00CFh〜)と大きく違います。
*
ファイル名などの 128 バイトを 10F0h〜 に格納するのはROMと同じですが。
SP5030では 128 バイトの先頭バイト(ファイルの種別?それとも属性?、形式?)を参照して、01h, 02h 以外だったらデータ本体はロードしないで、次の 128 バイトが見つかるのを待ちます。多分ね(...、03h と 04h の場合がありそうだけど?)。
先頭が 02h ならBASIC言語で書かれたプログラムとしてロードします。
その場合、1102h のデータのサイズをメモリサイズと比較して不足するならメモリエラーにします。データ本体は、1104h 番地を 4806h で上書きして、4806h〜 に格納します。1106h の実行番地は無視です。
あと、1108h の値を 2998h に格納します。何だろう?
*
データ本体のロード後は 2B35h をコールして、次文への「番地」を設定します。
カセットテープに録音されたBASIC言語のプログラムは「文字数・文番号・命令文」なので、文字数を番地にして「番地・文番号・命令文」にするわけです。
この文字数はエピ2で見たように、自身の2バイトに文番号の2バイトと命令文の長さを合計した値で、次の文までのバイト数と同じです。なので、最初の文なら 4806h に文字数を加えた値が「次文への番地」になります。そして次の文の番地でも同様に繰り返すのです。文字数 == 0000h だったらプログラム末尾なので処理終了です。
この 2B35h のルーチンでは文字数の上限をチェックしていないのですけど良いのかな? どこかでバッファを壊しそうだよ。1文の長さは最大65535でよいかな?(ニヤリ)
ロードが終わったら、1102h のサイズに 4806h を加算した値を 4634h 番地にセットして、184Ah と 186Fh をコールしてワークエリアを初期化します。
その後、1109h の値が 00h 以外なら "RUN" 命令を実行します。オートRUNだ。
*
なお、128 バイトの先頭が 01h だったら機械語なので、ロード先が("LIMIT" 命令で)確保されているかを確認してからロードするようです(...、詳しくは調べていないです)。
***
**
*
これなら、4049h のコールをフックして 128 バイトを 10F0h 番地に転送して、4069h のコールをフックしてデータ本体を 4806h 番地に転送したらロードできるのではないかな。ロードができると言うかロードしたのと同じになると言うか。...、同じなら良いでしょ?
*
ファイル名などの 128 バイトとデータ本体、...BASIC言語のプログラム、...は中間コードのリストを発見した時に一通り保存してある。
中間コードを元のキーワードに戻して、プログラムリストとして表示したりしたよ。
そしたら雑誌に掲載されたプログラムを入力したものがあって、...「地底最大の作戦」とかね。
同じファイル名のデータが複数あるなと思ったら、...へびの数を調整する改変をしている。スコアが低くて悔しかったのか。今で言うチート? 主な変数の表にべびの数は変数 K とあるが変数 L も修正が必要って、...メモが残っている。何してんの。
*
これらをRUNできたらよいのだけど「画面」がないからな。
***
**
*
ふと、気になって "LIST" 命令を調べてみた。"LIST" 命令の中間コードは 82h で分岐先は 1A66h です。
最初に 2998h 番地を調べて、00h 以外なら何もしないでメインループに戻っている。2998h はロード時に 1108h 番地の値を転送した番地だ。
プログラムを保存する前に 1108h 番地を FFh とかにすればプログラムリストを隠せるのかな。あ、"SAVE" 命令で 2999h の値を 1108h に設定するルートがある。これって隠しコマンド?
でもさ。2998h 番地が 00h 以外なら "LIST" 命令を禁止するのですから、つまり、ここを 00h に書き換えればプログラムリストを...、ゲフンゲフン
*
それから、色々しているけれど、つまり 143Dh をコールして、ROMの 0018h を DE=4400h でコールして画面表示することが分かりました。
143Dh とは、メインループで入力を処理するルーチンの2つ目で、中間コードに変換された文を元の文に戻すという何をしたいのか意味不明だったルーチンでしたけれど。
なるほど。LIST するときに使うルーチンなのかと納得です(...、入力時の処理はデバック用途?)。
なお、143Dh のルーチンは変換後の文字数をカウントしていて、80 文字以上ならエラーにします。
プログラムの最初の文を 80 文字以上にすれば、LIST しようとしたらエラーとなって実質 LIST 禁止にできるのでは?
これなら容易に回避できないでしょう。
...、あ。最初の文だけが 80 文字以上で、行番号 10 の REM 文だったりしたら、単にその文を削除すれば良いのか。10 <CR> で一瞬で解除。あう!
***
**
*
ちょっとズルい気もするけど...、BASIC言語のプログラムをSP5030でロードできたよ。
それから LIST してみたら、プログラムリストが画面表示される様子をROMコール時のパラメータから伺うことができましたよ。
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2026.2.3 推敲
2026.2.7 推敲
2026.2.8 微推敲
2026.2.9 推敲...連日?
2026.2.12 微推敲
2026.2.15 推敲
2026.2.18 改題
2026.3.17 微推敲
2026.4.1 微推敲
2026.4.5 エピタイ修正と微推敲
2026.7.19 エピタイ修正と微推敲




