[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第83回]
●NOPx3の意味
[第77回]でINPUT文のプログラムの中でNOP命令が3回連続して使われていることについて、「ひとつ思いついたことがありますので、後で書くことにします」と書いて、そのままになっていました。
わからないままそのままにしていたわけではありません。
もうすでに検証済みなのですが、あれこれ順番に書いていますので、今回まで持ち越しになっていました。
下はもう何回もお見せしたINPUT文のプログラムリストです。
問題のNOP命令はアドレス0308から030Aの3バイトです。
NOP命令ですからこの3バイトはあってもなくてもプログラムの実行結果は変わりません。
でもここにNOP命令があるということには何かの意味があるはずです。
右のコメントにはCAN BE ’CALL ENDCHK’とあります。
「ここに”CALL ENDCHK”を置くことができる」
と解釈しました。
おお、ひょっとしたら、そういうことか?
で。
試してみました。
いつもは画面コピーで見ていただくことが多いのですが、ND80Z3.5は実行中のログを自動で取得しています。
とっても便利です。
もう2週間も前に検証しています。
下はそのときのログです。
logfile nd80zlog\08251932.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/ld tinybst9.bin,8000 loading TINYBST9.BIN ...1fdf(8159)bytes loaded,from 8000 to 9FDE >jp 8000 TINYBASIC OK )10INP.A )20P.A ). 10 INP.A 20 P.A OK )R. A:ABC 0 OK )R. A:12+34 46 OK )R. A:12XYZ 12 OK )END of TINYBASIC |
何を検証しているかといいますと。
TINY BASICのINPUT文で変数に入力する値のエンドチェックを行なっているかどうかということの確認です。
最初の入力では
ABC[Enter]
と入れてみました。
今気が付きました。
これは例が悪いですね。
結果は0が表示されていますが、これは何も入力されなかったのか、それとも何かが入力されたのかがわかりません。
TINY BASICでは変数はA〜Zと@(n)しか使えません。
変数の入力には式も使えますから上の入力例では、Aの値が入力されてそのうしろの’BC’は無視されたと考えられるのですが、確証はありません。
で。
あらためて確認をしてみました。
これで確認できました。
ABCと入力すると最初のAが変数Aと判断されてその値が入力されますが、その後ろのBCは無視されるようです。
そういうことで間違いはなさそうです。
上のログにもどります。
続けてA:の入力に12+34[Enter]と入力しました。
入力した式が計算されA=46になりました。
もう一回試してみます。
A:の入力に12XYZ[Enter]と入力しました。
結果はA=12になりました。
これではっきりしました。
TINY BASICのINPUT文では入力した文字列の数式部分はそのまま読み込みますが、それに続いてなにか余分なもの(つまりはゴミ)があってもそこまでのチェックは行なっていません。
これがGOTO文などでは処理が異なってきます。
GOTO文で試してみました。
logfile nd80zlog\09071513.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/ld tinybst9.bin,8000 loading TINYBST9.BIN ...1fdf(8159)bytes loaded,from 8000 to 9FDE >jp 8000 TINYBASIC OK )10P."START" )20G.300 )30P."ABC" )300P."XYZ" )310G.400+XYZ )320P."AAA" )400P."BBB" ). 10 P."START" 20 G.300 30 P."ABC" 300 P."XYZ" 310 G.400+XYZ 320 P."AAA" 400 P."BBB" OK )R. START XYZ WHAT? 310 G.400+X?YZ OK )X=0 OK )R. START XYZ WHAT? 310 G.400+X?YZ OK )310G.400+X )R. START XYZ BBB OK )END of TINYBASIC >/exit 0000 00C3 - リモート接続を終了しました logfile closed at Mon Sep 07 15:18:31 2020 |
GOTO文は命令行の終わりに余計なものがあるとエラーになります。
GOTO文のうしろには0Dコード以外を書くことはできません。
そのためにENDCHKをCALLしています([第81回]参照)。
上のプログラムでは
20 G.300
は正しく実行されますが
310 G.400+XYZ
はエラーになっています。
また甘いテストプログラムになってしまいました。
Xの値がはっきりしていませんでした。
それでダイレクトモードでX=0[Enter]を実行してからもう一度プログラムを実行しました。
結果は同じです。
やはりXのうしろに?が表示されました。
そこで310行を書き換えました。
310 G.400+X
としました。
そして再実行したところ今度は正しく実行されました。
以上のテストからTINY BASICではGOTO文などではENDCHKをCALLしていて、行の終わりに0Dコード以外があるとエラー表示を行ないますが、INPUT命令の変数に対する入力についてはENDCHKはCALLしていないので、入力データのうしろにおかしな文字があってもエラーにはならずにそこはスルーされます。
そういうことがわかってきました。
おお。
ということは。
INPUT文のプログラムのあのNOPの代わりにCALL ENDCHKを置いてみたら!
こういうときにND80Z3.5は実に便利なのです。
あ。
でもその作業にかかる前に、説明しておくことがありました。
今までTINY BASICのプログラムの説明ではオリジナルのプログラムリストを使って行なってきました。
しかしND80Z3.5にロードしてテストをおこなっているのは「中日電工版」のTINY BASICなので、プログラムのアドレスが異なっています。
「中日電工版」TINY BASICでは、INPUT文のNOPのところのアドレスは下のリストになります。
837A D5 IP3:PUSH D 837B EB XCHG 837C 2A0190 LHLD CURRNT 837F E5 PUSH H 8380 215883 LXI H,IP1 8383 220190 SHLD CURRNT 8386 210000 LXI H,$0000 8389 39 DAD SP 838A 220790 SHLD STKINP 838D D5 PUSH D 838E 3E3A MVI A,3A 8390 CDD185 CALL GETLN 8393 119D9F LXI D,BUFFER 8396 CD7780 CALL EXPR 8399 00 NOP 839A 00 NOP 839B 00 NOP 839C D1 POP D 839D EB XCHG |
アドレス8399〜839BがNOPです。
ここをCALL ENDCHKに書き換えてみることにします。
ENDCHKのアドレスもオリジナルのTINY BASICのアドレスとは異なっています。
「中日電工版」TINY BASICではENDCHKのアドレスは8595です。
それではその部分を書き換えてみます。
最初にお見せしたログの終わりのところ、一旦TINY BASICを終了してZB3BASICに戻ったところからの続きの作業です。
TINY BASICを終了するには
[Ctrl][Z]を入力します([Ctrl][Z]はログには記録されません)。
OK )END of TINYBASIC >cm 8399 8399 00-cd 839A 00-95 839B 00-85 839C D1- >jp 8000 TINYBASIC OK )10INP.A )20P.A ). 10 INP.A 20 P.A OK )R. A:123XYZ WHAT? A:12,34 WHAT? A:12 12 OK )END of TINYBASIC >/exit 0000 00C3 - リモート接続を終了しました logfile closed at Tue Aug 25 19:39:54 2020 |
CMコマンドでアドレス8399〜839Bを
CD 95 85
に書き換えました。
こういうことが簡単にできてしまいます。
そしてもう一度
JP 8000[Enter]
でTINY BASICにエントリします。
そして前半のテストと同じことをしてみました。
NOPだったときには
A:の入力に
12XYZ[Enter]
と入力してもうしろのXYZは無視されてエラーになりませんでしたが、そこをCALL ENDCHKに書き換えたところ、WHAT?が表示されて、再入力を要求されるようになりました。
12,34[Enter]
もエラーになりました。
普通に
12[Enter]
と入力したところ正しく入力されて正常にプログラムが終了しました。
あのNOPの意味はそういうことだったのでした。
デフォルトではINPUTの入力ではENDCHKはCALLしないけれど、もしエンドチェックをしたいならばそうすることもできるよ、ということだったのでした。
そのようにするかどうかは、お好みでどうぞ、ということなのでしょう。
これにて。
一件落着です。
復活!TINY BASIC[第83回]
2020.9.7upload
前へ
次へ
ホームページトップへ戻る