エピ6.1 メインループを解読しましょう
***
エピ6.1 メインループを解読しましょう
***
メインループのコードは 124Dh から 12DFh です。なお、1200h〜124Ch は初期化処理で、12E0h〜13BBh はエラーメッセージの処理でした。
メインループを解読しましょう。
***
メインループの処理は次の(1)〜(5)に別れます。
(1)124D〜1258: 「READY」 の表示
(2)1259〜1277: ワークエリアの一部を退避、スタックポインタを復旧
(3)1278〜1290: ワークエリアの一部を初期化、改行、入力待ち、中間コードへの変換、文番号の有無を判定して4または5に進む
(4)1291〜129E: 文番号無しなら直接実行命令文として実行、3に戻る
(5)129F〜12DF: 文番号付きならプログラムとして記憶、2に戻る
メインループへの入口は 124Dh と 1259h の二つあります。124Dh なら(1)からで、1259h なら(2)からです。「READY」を表示するか否かの違いだけです。
「READY」を表示するなどした後は(3)で入力待ちとなります。
ここで直接実行命令文を入力するなり、文番号を付けてプログラムを入力するなりしてCRすると、入力した文が取り込まれて解釈実行されます。
直接実行命令文なら(4)で実行、文番号付きなら(5)でメモリに記憶します。
以上がメインループの全体像です。
*
メインループでは文番号付きの命令文ならプログラムとしてメモリに記憶し、文番号無しなら直接実行命令文として実行します。
直接実行命令文とは、"SAVE" とか "LOAD", "LIST", "RUN" などです。
これしか知らない人がいることを西部労働レストランと呼んだとか、どこかの雑誌の読者投稿でありましたね。
本来はプログラムで使われる命令文も文番号を付けなければ直接実行できます。
例えば、
PRINT 1+2
FOR I=0 TO 9 : PRINT I; : NEXT
などと入力すれば画面に
> 3
> 0 1 2 3 4 5 6 7 8 9
と表示されます。文番号を付けて〜、とは、
10 PRINT "ABC";
20 GOTO 10
...、等と入力することです。RUNすれば画面一杯にABCが表示され続けます。
*
個々の処理について順に解説を。
(1)「READY」の画面表示は 1355h 番地のルーチンを使います(ROMの 0009h と 0015h をコール)。
その他にROMルーチン 0030h(ROM MELDY)をコールします。でも DE=12FCh で 0Dh を指定していてメロディは鳴らないです。適当なメロディ文字列を用意して 12FCh の部分を書き換えることを想定しているのでしょうか。
(2)では、4565h と 47FFh〜4800h を参照して処理を決めます。
4565h には 13BCh〜13C8h のルーチンにより、00h, 01h, 02h のどれかがセットされます。各々の値の意味は、
00h : プログラムを修正した場合
01h : STOP, END で終了した場合
02h : BREAK で終了した場合
47FFh〜4800h はエピ5のエラーメッセージの表示で出て来ました。0000h 以外なら、その値はプログラム実行中だった文番号でした。
この2つ参照して次の処理をします。変数 m[] はメモリで、r[] はレジスタです。
if m[0x4565] == 0x00:
r[SP] = m[0x4563]
elif m[0x47FF]+m[0x4800]*256 != 0x0000:
m[0x4566:0x4566+6] = m[0x47FD:0x47FD+6]
プログラムの実行が STOP,END,BREAK で停止した場合には CONT 命令で再開できるのですが、プログラムを修正すると CONT 命令で再開できなくなります。当然ですね。
そんな場合(4565h==00h)には、4563h 番地の値(初期化処理で格納したメモリ末尾の番地)でスタックポインタを復旧します。
プログラムが停止した直後(4565h!=00h)で文番号が残っている状態なら、1790h のルーチンをコールして 47FDh からの6バイトを 4566h 以降に退避します。そして CONT 命令で再開する際には 4566h に退避した6バイトを参照します。47FDh からの6バイトはプログラムの実行に関係する重要データな雰囲気ですね。
(3)1278h からのコードです。
ワークエリアの初期化は 1842h をコールします。47FDh〜4800h の4バイトをゼロクリアします。
改行はROMルーチン 0009h のコールです。
文の入力は、DE=4400 で 3D26h のルーチンをコールします。3D26h のルーチンではROMの 0003h をコールします。DE で指定した番地に入力された文字列が格納されます。この文字列は画面上の1行分とは限らず、2行分(最大80文字)になることもあります。エピ5の最後で登場した謎な2行です。
それと、ですね。エピ5の初期化処理の最初で 3D25h 番地を 01h にしていましたが、実はこれが 3D26h のルーチンに関係します。
3D25: 0x00 # set 01h by init
3D26: r[A] = m[0x3D25] # LD A,(3D25h)
3D29: r[Zf] = 1 if A==00h else 0 # "OR A"
3D2A: if r[Zf]==0: _0003h # JUMP ROM & RET
3D2D: ....
3D25h 番地が 01h ならROMルーチンをコールするのですが、00h なら 3D2Dh 以降のコードで文字入力の処理するのです。そして 3D25h 番地の初期値は 00h です。これは何かありますね。...、あとで復習しましょう。
なお。3D2A 番地ではROMルーチンをコールする代りにジャンプしています。ROMルーチンからリターンすると直にメインループに戻ります。CALL 命令より JP 命令の方が7クロック速いし、RET 命令のコード(1バイト)とその処理時間(10クロック)を節約しています。素敵ね。
入力された文字列は 13C9h と 143Dh の2つのルーチンで処理します。キーワードを中間コードに変換する処理なのですが。ちょっと重いので次回で説明します。
文番号付きの文か否かは、4457h〜4458h を参照します(13C9h のルーチンでここに文番号をセットします)。0000h なら文番号無しで(4)に進み、0000h 以外なら(5)にジャンプします。
(4)は、次回の次ね!
(5)プログラムの記憶ですが、これも次回で。
***
**
*
今日のマメ知識です。
CRあるいはリターン・キーとは現在のパソコンのEnter・キーのことです。
CRやLFはタイプライタ時代の用語で、それがテレタイプ端末(TTY)にも引き継がれて通信コードとなり、電子計算機が誕生するとTTYは入出力装置となって、マイコンにも影響を遺したのでしょう。アスキーコードにはCRやLFのコードがありますからね。
そう言えば(?)、古えのパソコン通信ではターミナルエミュレータで日本語(漢字)を表示するのが1つの目標であった時期もあったようです。信じられない? JUNETでは漢字が化けるーとか8ビットが通らないよーとかの叫び声や、NKFのような便利ツールが流れていたのですよ。
ともかく。昔のマイコンやパソコンでは今のEnterキーのことをCRやリターン・キーと言っていたのです。キーボードにも「CR」キーがありました。
マイコン老人会に所属されている方は(今でも)EnterのことをCRと言うので(個人の偏見です)、これで判定できます。
***
次回は、入力文の処理(13C9h と 143Dh)を見るよ! あと文番号付きの入力文がプログラムとして記録される様子もね!
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2026.1.26 推敲
2026.1.31 微推敲
2026.2.7 微推敲
2026.2.11 推敲
2026.2.12 推敲と改題
2026.2.14 推敲
2026.2.24 微推敲
2026.3.8 微推敲
2026.3.19 2つに分割
2026.3.22 エピタイ修正




