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

[新連載]復活!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

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