[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第80回]
●INPERR
たまたま準備に時間がかかるご注文が一時に集中してしまったために、ホームページの更新にまで手が回らない状態になってしまいましたが、なんとかめどがたってきました。
この週末がんばれば来週前半には、いまご注文いただいている分の発送ができそうです。
ご注文いただいております皆様には大変お待たせしてしまい申し訳ありません。
発送まで今しばらくお待ちいただきますようお願い申し上げます。
そういうことで少し手が空いてきましたので、久し振りに本題復帰です。
[第77回]INPUT文のプログラムの説明の続きになります。
今回はINPUT文で入力した式や値にエラーがあるときに実行されるINPERRプログラムについての説明です。
INPERR:はINPUT文で入力した値や式にエラーがある場合に、もう一度文字列や変数名の表示を行なって再入力を行なうためのプログラムです。
INPUT文のプログラムはIP1:からスタートし、文字列表示や変数への入力が複数ある場合(各項目はセパレータ’,’で区切られています)には、IP1:に戻って各項目単位で文字列表示や変数への入力処理を行ないます。
変数への入力時にエラーが発生した場合にはそこで処理を打ち切るのではなくて、エラーメッセージを表示したあと再度同じ変数への入力処理を繰り返し行ないます。
その仕組みのために、入力エラーがあった場合にはエラーメッセージが表示されたあと、IP1:の前方のINPERR:が実行されます。
INPERR:のプログラムの説明です。
先頭の
LHLD STKINP
SPHL
POP H
SHLD CURRNT
POP D
POP D
は、
02CD IP1:PUSH D
から
02F0 PUSH H
での処理で保存した値をそれぞれもとに戻す処理です。
最初にSP(スタックポインタ)をエラー発生前のINPUT文の入力時のスタックポインタに戻します。
そしてそのときのCURRNTの値をもとに戻します。
その次にPOP Dを2回実行します。
これは
02CD IP1:PUSH D
で保存したテキスト行の位置アドレスを元にもどすための処理です。
IP1:以下の処理でエラーが発生したため、もう一度IP1:に戻って処理を再実行するためにそのようにします。
スタックを使った変数の扱いはなかなかに難しいです。
特にこの部分ではエラーによって一度表示、入力した部分をもう一度最初から再実行するために、余計にややこしい処理になっています。
わかりにくいようでしたらスタックを中心とした動きについてメモを取りながら考えてみてください。
ところで実はこれだけではエラー処理については足りないところがあります。
確かに上で説明しましたようにINPUT文の入力でエラーが発生したときにINPERR:が実行される、ということは一応はわかるのですが、それなら「エラーが発生したときに」どこのプログラムがこのINPERRへのジャンプ命令を実行するのでしょうか?
上のプログラムリストのどこにもINPERR:へのジャンプ命令はありません。
02DD JC QWHAT
がありますが、ここは変数入力時のエラーではありません。
INPUT文に文法エラーがあったときにこの命令が実行されます。
そのときにはエラーメッセージのあとエラーが発生した行を表示してブレークします。
実は変数に式、値を入力したときのエラー処理は
アドレス0307のRST 3
の中で行なわれます。
RST 3は[第11回]で説明しました。
数式の処理プログラムです。
RST 3の実体は[第68回]で説明しましたEXPR1です。
EXPR1のプログラムリストの中にはエラー処理へのジャンプはありません。
その下の階層にありそうです。
EXPR1の下の階層はEXPR2です。
EXPR2は[第67回]で説明しました。
EXPR2のプログラムではアドレス0395のJMP QHOWがエラー処理へのジャンプ命令です。
その下の階層はEXPR3です。
EXPR3は[第65回]、[第66回]で説明しました。
EXPR3のプログラムでは
03C2 JNZ AHOW
03CE JC AHOW
03ED JZ AHOW
03FA JM QHOW
がエラー処理へのジャンプ命令です。
AHOWとQHOWはエラー表示の前にPUSH Dを実行するかしないかの違いです。
AHOWとQHOWは[第15回]のプログラムリストにあります。
AHOWとQHOWのジャンプ先は
アドレス04CAのERROR:です。
一番下の階層はEXPR4です。
EXPR4は[第64回]で説明をしました。
0422 XP43:JMP QWHAT
がエラー処理へのジャンプ命令です。
QWHATはアドレス04C6です。
そういうことになりますとアドレス04C6以下のプログラムを見なければその先には進めません。
どうやらそこにINPERR:へのジャンプ命令がありそうです。
次回に続きます。
復活!TINY BASIC[第80回]
2020.9.3upload
前へ
次へ
ホームページトップへ戻る