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

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



[第73回]


●REMプログラムの’3E’について(2)

前回はオリジナルのTINY BASICのREM文のプログラムでIF文のエントリ部に置かれたRST 3をジャンプするために、その直前にDB 3Eを置いているところをうっかりしてそのまま中日電工版TINY BASICでも同じことをしていることに気が付きました、と書きました。
DB 3Eはその次に置かれた1バイトの命令をジャンプするための「裏技」です。
ところが中日電工版TINY BASICでは、RSTの代わりに3バイトのCALL命令を使います。
オリジナルと同じようにしてDB 3Eを使っても3バイトの命令はパスできません。
たまたまRST 3の代わりに使ったCALL命令のCALL先アドレスが問題が発生しない1バイト命令になるために見かけ上は正常に動作することが確認できました。
しかしRST 3をCALL命令に置き換えてしまったからには、ここにDB 3Eを使うわけにはいきません。
そこでプログラムを変更することにしました。

そこでオリジナルのプログラムリストをながめていましたら、なんだもっと簡単にできるじゃないか。
うまい手を思いつきました。
これならオリジナルよりもすっきりしたプログラムになります。
後から考えてみれば、こんなことができるならTINY BASICの作者も当然そうしていたはずです。
そこに気が付かなかったのは浅はかでありました。
左側に見えているTINYBST8.LSTが変更後のプログラムです。
右側はそのプログラムで前回と同じことをやってみたところです。



あれ?
行番号30が実行されない?
なぜだ?

こういうときのために、ND80Z3.5でZB3BASICを起動して、中日電工版TINY BASICをそこで走らせるように考えてあるのです。
ZB3BASICは名前こそBASICですが、強力なマシン語デバッグ機能をもっていて、ZB3BASIC起動後はそのままでマシン語プログラムのデバッグをすることができます。
使い方は簡単です。



JP 8000[Enter]でTINY BASICにエントリする前に
BP 833F[Enter]
でブレークポイントを設定しておくだけです。
REMプログラムの実行直前のアドレス833Fでブレークするようにブレークポイントをセットしました。
それで準備完了です。
普通に
JP 8000[Enter]
でTINY BASICにエントリしてテストプログラムを入力し、念のためリストの表示を行ないました。
ここから先は下の画面をご覧ください。



RUN[Enter](R.[Enter])と入力すると最初に行番号10のPRINT文が実行され、そのあと行番号20のREM文のところでブレークしました。
TINY BASICは8080の命令語で記述していますが、Z80でも問題なく実行できます。
ND80Z3.5はZ80CPUなのでブレーク時に表示されるレジスタはZ80のレジスタとして表記されますが、8080で使用していないレジスタについては無視して構いません。
レジスタを見るとPC(プログラムカウンタ)は833Fになっています。
アドレス833Fの実行直前にブレークしたことがわかります。
REM文のプログラムで肝心なのはDEレジスタです。
DEレジスタには現在解読実行中のテキスト行の位置アドレスが入っています。
DEレジスタの値は9026になっています。
9000番地台にはテキストプログラムが書かれています。
その内容を確認するためにそのままの状態でDMコマンドを使ってみました。
DM 9000,9030[Enter]
です。
DMコマンドは指定した範囲のメモリの内容を16進数とASCII文字で表示します。
アドレス9026は「REM」の直後のスペースのアドレスです。
ここまでは問題はなさそうです。
そこでデバッグを次に進めます。
BP 8342[Enter]
で次のブレークポイントを
8342 JNC RUNTSL
の実行直前のアドレスにセットしたあと、
RT[Enter]
で(マシン語の)ユーザープログラムに復帰します。

ブレークポイントを設定したアドレス8342でブレークしました。
PC=8342になっています。
それではDEは?
あれ?
9038になっています。
ここは本来は行番号20の終わり(その次の行の先頭アドレス)の902Eのはずです。
本来なら902Dの0Dコードを検出してそこでリターンしてくるはずなのに、そこが無視されてしまっているようです。
9038はテキストプログラムの最後のアドレスなので右端のフラグを見るとキャリーフラグが立っています。
なのでこのあとは結局8345のJMP RSTARTが実行されてテキストプログラムが終了してしまうことになります。
問題はどうやら833FのCALL FNDSKPにあるようです。

次回に続きます。

復活!TINY BASIC[第73回]
2020.8.23upload

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