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

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



[第65回]


●EXPR3

前回は式計算プログラムの最下層のサブルーチンEXPR4について説明をしました。
今回はそのひとつ上の階層のサブルーチン、EXPR3について説明をします。
EXPR3はEXPR4を*または/で複数つないだ構造をしています([第63回]参照)。
下がEXPR3のプログラムリストです。



最初にEXPR4をCALLします。
そのあとRST 1で’*’(文字コード2A)を確認します。
RST 1は[第11回][第14回]で説明しました。
DEで示されるメモリアドレスから1バイトのデータを読み込んでそれがスペース(20H)ならスペース以外のコードが出現するまで読み飛ばし、そのようにして読み込んだコードとRST 1の次に置かれたコードとを比較します。
アドレス03A9には’2A’があります。
’2A’は’*’の文字コードです。
コードが一致した場合にはその次の1バイトも飛ばして2バイト先のアドレス03ABに行きます。
検出されなかったときはその文字コードの次に置かれた数値の分だけアドレスが進みます。
’2A’の次には’2D’が置かれています。
不一致だった場合にはその次の2Dバイトが飛ばされます。
03AB+2D=03D8ですからアドレス03D8のXP34:にジャンプします。

一致した場合に次に実行されるアドレス03ABでは先にCALLしたEXPR4の結果の値をPUSH Hでスタックに保存したあと、もう一度CALL EXPR4を実行します。
ここから後ろは乗算の計算です。
03AFのMVI B,0Hは2数の負号をチェックするための準備です。
03B1でCALL CHKSGNを実行します。
CALL前にはHLには2番目のEXPR4の値が入っています。
その正負を確認します。
CHKSGNは[第48回]で説明をしました。
HLの値を調べて正数ならそのままリターンします。
負数ならそれを正数に変換します。
負数のときはBレジスタの符号を反転します。

そのあと
03B4 XTHL
でCHKSGNを実行したあとの2番目の値をスタックトップに置き、それと入れ替える形でHLに1番目の値を戻します。
そのあと
03B5 CALL CHKSGN
が実行されます。
ここで1番目の値の正負が確認されます。
乗算は符号なしの絶対値で行なわれますが、符号の情報はBレジスタの正負で保持されます。
2回のCHKSGNで、両方とも正数または両方とも負数のときにはBレジスタは正数になります。
どちらか一方が負数のときはBレジスタも負数になります。

03B8 XCHG
03B9 XTHL
で1番目の値をDEレジスタに移したあと、スタックに保存しておいた2番目の値をHLに戻します。
このときBASICテキストプログラムの位置アドレス(通常DEに入れられている)が2番目の値の代わりにスタックトップに移動します。
この辺りのプログラムも凄いなあと思わず感心してしまいます。
実に無駄がないです。

そのあと
03BA MOV A,H
から
03C2 JNZ AHOW
のところでは1番目の値(DE)と2番目の値(HL)が8ビットよりも大きいか大きくないかをチェックしています。
両方とも8ビットを越えている場合には、それを乗算すると確実にオーバーフローします。
その場合にはHOW?表示ルーチンにジャンプします。
とりあえずどちらか一方または両方が8ビット以下の場合には
03C5 XP32:MOV A,L
以下が実行されます。
03CA JZ XP35
までのところでは片方の値がゼロかどうかを確認しています。
ゼロならこの部分の乗算は終了なのでXP35にジャンプします。

XP32:以下の部分では、その次のXP33:から下の乗算のための準備もしています。
8ビット以下の方の値の下位8ビットをAレジスタに入れるとともにHLレジスタを0クリアします。
乗算はシンプルな(原始的な)計算方法で行います。
Aレジスタ(Lの値)×DEレジスタの乗算をAレジスタの値の回数分DEレジスタの値をHLレジスタに加算するという計算で行います。
XP33:DAD D
JC AHOW
DCR A
JNZ XP33
JMP XP35
がその部分です。

XP35:POP D
でテキストプログラムのアドレスポインタをDEに戻します。
03F8 MOV A,H
03F9 ORA A
03FA JM QHOW
は乗算結果のオーバーフローのチェックです。
TINY BASICの乗算は符号をはずした正数で行います。
計算結果も正数でなければなりません。
計算結果が負数(ビット15が1)ならオーバーフローです。
03FD MOV A,B
03FE ORA A
03FF CM CHGSGN
のところで結果の値に符号をつけます。
Bレジスタが負数のときは結果の値も負数にします。

これで最初の2項の乗算が終りました。
結果はHLレジスタに入っています。
JMP XP31で最初に戻って次の計算に進みます。

このあと除算(’/’)についての計算が続くのですが、説明が長くなってしまいましたので、除算については次回に説明することにします。

復活!TINY BASIC[第65回]
2020.8.14upload

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