2020.6.10
前へ
次へ
ホームページトップへ戻る

[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第17回]


●入力バッファとTEXTエリア(2)

前回からの続きです。
前回はTEXTエリアについて下のように説明しました。

TINY BASICではキーボードから入力した文字列はまず入力バッファに入れられます。
最後に[Enter]キーを押すと入力の終わりを示す0Dコードが入力文字列の終わりに書き加えられます。
[Enter](0Dコード)の入力が合図となって、入力文字列の確認が行なわれます。
入力文字列の先頭に数字がある場合には、それを行番号とみなしてその数値から始まって最後の0DコードまでがTEXTエリアに入れられます。
先頭が数字ではない場合にはダイレクトコマンドと解釈されてコマンドの解読ルーチンに進みます。

今回はその入力バッファについて説明します。
下は前回お見せしたTINY BASICのプログラムリストの最後の部分です。



入力バッファは139D〜13DCの64バイトです。
13DDがBUFENDになっていますがこれはおそらくアセンブラソースプログラムの中で13DDを”BUFEND”のラベル名で表記したいところがあって、そのためにそのようにしているのだと考えられます。
実際には13DDは「入力バッファ」としては使われていないようです。
「ND80Z3.5版」TINY BASICでは入力バッファは9F9D〜9FDCに移動しています(当面の間の仮アドレスです)。
前回はTEXTエリアの中身を確認しました。
今回は入力バッファの中身もあわせて確認してみることにします。

前回はプログラムを入力しLIST出力したあとプログラムを実行してから[Ctrl][Z]でTINY BASICを終了しZB3BASICに戻ってそこでシステムワークエリアとTEXTエリアの内容を確認しました。
今回も同じようにできるといいのですが。
たとえばTINY BASICにエントリしてキーボードから
10 FOR A=0 TO 10[Enter]
と入力した直後の入力バッファの状態を確認してみたいと思います。
ところが[Enter]を入力するとすぐにそこでBASICプログラムなのかダイレクトコマンドなのかの判定が行なわれて、行番号つきの場合には行番号部分が16進数に置き換えられた後TEXTエリアに格納されるところまで進んでしまうことを確認済みです。

その途中の過程を確認するためには前回使ったDMコマンドだけではできません。
より高度なデバッグ機能が求められます。
そのような場合にもZB3BASICの機能が役立ちます。
ZB3BASICはただのBASICだけではなくて、マシン語プログラムをデバッグするためのツールとして欠かせない機能を備えています。
こういう場合にはブレークポイント機能の出番です。
下はその作業の様子です。



TINY BASICをロードしたあと、あらかじめブレークしたいアドレスをBPコマンドで設定してからTINY BASICを起動します。
ここでは
BP 8084
を入力しています。
8084は入力バッファの内容を確認するところで最初にCALLされるアドレスです。
いずれ「ND80Z3.5版」のプログラムリストも公開するつもりですが、今のところはかえって説明が煩雑になりますからここではそれ以上の説明には入りません。
そのあとJP 8000で普通にTINY BASICを起動します。
しかしブレークポイントの設定はちゃんと生きています。
キーボードから
10 FOR A=0 TO 10[Enter]
と入力するとアドレス8084でブレークしてZB3BASICに戻ってレジスタの中身が表示されます(画面には[Enter]は表示されません)。
ブレークしたアドレスはレジスタダンプのPC(プログラムカウンタ)に表示されています。

ここで入力バッファの中身を見てみるために
DM 9F90,9FDF
を実行しました。
「ND80Z3.5版」の入力バッファは9F9Dからです。
9F9D以下に入力した通りの文字列がそのまま入っています。
最後に0Dコードがあります。
この段階ではまだTEXTエリアには何も入っていません。
それを確かめてみるために、その下のところで
DM 9010,902F
を実行してみました。
TEXTエリアは9017から始まります。
TEXTエリアの未使用領域の先頭アドレスは9015に入っています。
そこには9017が書かれています。

以上を確認したあと、次のステップに進みます。



次のブレークポイントとして8137を指定しています。
BP 8137
です。
8137は1行の入力処理を終った後、次の入力を待つ部分の先頭のアドレスです。
BP 8137
を入力したあと
RT
を入力しました。
RTコマンドは現在ブレークしているアドレスに戻ってその続きを実行するコマンドです。
続きの処理が行なわれたあと8137で再びブレークしました。
そのあともう一度先ほどと同じように入力バッファとTEXTエリアを確認してみました。
先ほどは入力エリアの先頭部分には行番号がASCIIコードで書かれていました。
31 30 20
でした。
そこのところが
31 0A 00
に置き換わっています。
31はもとのままですが、0A 00は行番号10を16進数に置き換えたものだということがわかります。
16進数で普通に表記すると000Aですがメモリには下位バイト、上位バイトの順に入れられます。
そしてその0A 00から最後の0DまでがTEXTエリアにコピーされています。
ここで31がなぜそのまま残ってしまうのかが疑問だったのですが、じきにその理由がわかりました。
TEXTエリアにコピーする段階で先頭の2バイトは行番号(16進数)になり、その後ろは余分なスペースを外してすぐにプログラム命令が続くように入力バッファで整えたあとTEXTエリアにコピーするため、結果として31が残されたのだと思います。
そこのところはいずれプログラムを解析していく過程ではっきりすると思います。

さて。
そこまで考えてきて、「いや、それではまずいんじゃないの?」という点があることに気が付きました。

次回に続きます。

復活!TINY BASIC[第17回]
2020.6.10upload

前へ
次へ
ホームページトップへ戻る