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

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



[第39回]


●NEW,STOP,RUN,GOTO(2)

今回は[第37回]からの続きです。
NEW、STOP、RUNまで説明しました。
今回はGOTOについて説明します。
GOTOは行番号を指定することでその行番号の行にジャンプしてその行から後ろに向かって実行します。
RUNは先頭行から実行を開始しますがGOTOは途中の行から実行を開始します。
RUNはコマンドモードでしか実行できませんがGOTOはコマンドモードでも通常のプログラム実行モードでも実行できます。
その2点を除けばRUNとGOTOはやっていることは同じです。
ですのでGOTOは最初に指定しているジャンプ先の行番号を解読したあとはRUNの処理プログラムの途中のところにジャンプします。


下は[第37回]でお見せしたNEW、STOP、RUN、GOTOのプログラムリストです。



GOTO:は最初にRST 3を実行します。
RST 3は[第11回]で入口の部分だけ説明をしました。
RST 3は数式を計算してその結果(16進数2バイトの整数値)をHLに入れてリターンするサブルーチンです。
そのあとのPUSH Dはそこまで実行解読が進んだ行内の位置アドレス(DEに入れられている)を一時保存するためです。

そのあとENDCHKをCALLします。
GOTO 行番号 の後ろには ; か 0Dコードしかないことをチェックします。
ENDCHKはエラーのときの処理がちょっと複雑ですので今は説明しません(いずれ適当なところで説明をするつもりです)。
エラーがなければそのままリターンしてきます。

そのあとFNDLNをCALLします。
ここがRUNと違うところです。
RST 3によってHLにはGOTOのジャンプ先行番号データが入っています。
FNDLNは[第28回]で説明をしました。
TEXTエリアを先頭からサーチしてHLで示される行番号と同じ行番号の行がみつかったらZフラグが立ちます。
そしてその行の先頭のアドレスをDEに入れてリターンします。
Zフラグが立っていなければジャンプ先の行番号がみつからなかったことになりますからHOW?メッセージ表示ルーチンにジャンプします(0168 JNZ  AHOW)。

行番号が一致する行がみつかったときはPOP PSWを実行します。
これは0161のPUSH Dで進んだスタックをもとに戻すためのダミー命令です。
行番号が一致する行がみつかったときはその行の先頭位置のアドレスがDEレジスタに入りますから、ここでPOP Dは使えません。
そこでスタックを合わせるためにPOP PSWを使っているのです。

その後ろからはRUNの処理と同じなのでJMP RUNTSLでRUNTSLにジャンプします。
RUNTSLは[第37回]で説明をしましたのでそちらを参照してください。

復活!TINY BASIC[第39回]
2020.7.16upload

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