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

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



[第88回]


●ABS

今回はABS()について説明します。
とても簡単なプログラムです。



ABS:の先頭で
CALL PARNを実行します。
PARNはRND()でも使っています。
PARNは[第64回]のEXPR4プログラムの中にあります。
( )で囲んだ式の値を計算してHLに入れます。
そのあと
CALL CHKSGN
を実行してリターンします。
CHKSGNは[第48回]で説明しました。
CHKSGNはHLの正負を判定して負数のときはそれを正数に変換します。
正数のときはそのままリターンします。

ところでCALL CHKSGNの前にDCX Dがあります。
そしてCALL CHKSGNの後ろにはINX Dがあります。
どういう目的なのか、いささか気になるところです。

ここでスタックに保存されるDEにはその時点でのテキスト行のアドレスが入っています。
ということからすると、おそらくはCHKSGNでエラーが発生したときに表示される”?”の位置に関係しているのでは?と目星をつけました。
そういうときは試してみるのが一番です。
CHKSGNでのエラーは[第48回]で書きましたように対象になる負数が8000Hつまり−32768であるときに発生します。
そのときの”?”の表示位置を確認してみました。



Xに−32767を入力するとABS(X−1)の()の中の値が−32768になるので、そこでHOW?が表示されます。
注目すべきはそのとき”?”が表示される位置です。
X−1?
と表示されていて、X−1の計算結果がABS()関数では計算できない値であることを示しています。
このときのDEの値に注目です。

こういうときにもZB3BASICはとても便利です。
下の画像の左側のプログラムリストは「中日電工版」TINY BASICのABSプログラムの部分です。
右側ではABS()関数のテストプログラムを実行中ですが、途中にブレークポイントを設定してブレークさせています。


右側のコマンドプロンプトの画面で
BP 851A[Enter]
を実行してアドレス851AにブレークポイントをセットしたあとでTINY BASICを起動しています。
アドレス851AはCALL PARNを実行した直後、DCX Dのところです(DCX Dの実行直前でブレークします)。
さきほどと同じようにXに−32767を入力しました。
ブレークして表示されたレジスタダンプを見るとPCは851Aになっています。
HLは8000(−32768)ですからX−1が計算されたことがわかります。
この段階ではまだエラーは表示されていません。
DEは902Bです。
それがテキスト行のどこなのかを確認するために、DMコマンドを実行しました。
アドレス902Bには2B(”+”の文字コード)があります。
その前には29があります。
29は”)”の文字コードです。
このあと
RT[Enter]
の入力で残りが実行されてエラーが表示されました。
以上でわかったことは、もし8515 DCX Dがなかったとすると、エラー表示は下のようになると考えられます。
20 Y=ABS(X−1)?+1

推測しているだけではだめですね。
これも実際に試してみましょう。



CMコマンドでアドレス851Aとアドレス851Eを00(NOP)に書き換えました。
プログラムがRAM上にありますからこういうデバッグが簡単にできてしまいます。
そのようにして先ほどと同じテストをしてみました。
上で推測した通りの結果になりました。

”?”がどちらの位置になってもよいようなものですが。
これは考え方の問題のような気がします。
HOW? Y=ABS(X−1?)+1
の場合は上で書きましたように、X−1の値がABS()関数では計算できないという意味になります。
HOW? Y=ABS(X−1)?+1
の場合にはABS(X−1)の値がHOW?です、いう意味になると思います。

そのように考えてみると。
やっぱり前者が正解、でしょうねえ。

復活!TINY BASIC[第88回]
2020.9.12upload

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