[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第66回]
●EXPR3(2)
前回はEXPR3の前半部分、乗算の計算プログラムの説明をしました。
今回は後半の除算プログラムについて説明をします。
EXPR3の先頭でEXPR4をCALLします。
そのあとRST 1で’*’(文字コード2A)を確認します。
’*’が検出されなかったときはアドレス03D8のXP34:にジャンプします。
XP34:ではRST 1によって’/’の検出が行なわれます。
’/’の文字コードは2Fです。
アドレス03D9に置かれた2FとDEレジスタが示すテキストエリアのメモリアドレスのデータが一致したときは、その次の1バイトを飛ばして、アドレス03DBにジャンプします。
不一致のときはアドレス03DAに置かれた数値46Hバイト分のプログラムが飛ばされて(03DB+46=0421)、アドレス0421にジャンプします。
0421は上のプログラムリストにはありません。
[第64回]で説明したEXPR4のプログラムにあります。
0421 XP42:RET
です。
最初にEXPR4をCALLしたあとに’*’も’/’もなかった場合にはEXPR3としては何もすることがありませんからそこでリターンします。
一致した場合には次に実行されるアドレス03DBで先にCALLしたEXPR4の結果の値をPUSH Hでスタックに保存したあと、もう一度CALL EXPR4を実行します。
ここから後ろは除算の計算です。
この部分は前回の乗算とよく似ています。
03DFのMVI B,0Hは2数の負号をチェックするための準備です。
03E1でCALL CHKSGNを実行します。
CALL前にはHLには2番目のEXPR4の値が入っています。
その正負を確認します。
CHKSGNは[第48回]で説明をしました。
HLの値を調べて正数ならそのままリターンします。
負数ならそれを正数に変換します。
負数のときはBレジスタの符号を反転します。
そのあと
03E4 XTHL
でCHKSGNを実行したあとの2番目の値をスタックトップに置き、それと入れ替える形でHLに1番目の値を戻します。
そのあと
03E5 CALL CHKSGN
が実行されます。
ここで1番目の値の正負が確認されます。
乗算と同様に除算も符号なしの絶対値で行なわれますが、符号の情報はBレジスタの正負で保持されます。
2回のCHKSGNで、両方とも正数または両方とも負数のときにはBレジスタは正数になります。
どちらか一方が負数のときはBレジスタも負数になります。
03E8 XCHG
03E9 XTHL
で1番目の値をDEレジスタに移したあと、スタックに保存しておいた2番目の値をHLに戻します。
このときBASICテキストプログラムの位置アドレス(通常DEに入れられている)が2番目の値の代わりにスタックトップに移動します。
この次のところは乗算とは異なっています。
03EAでもう一度XCHGを実行します。
その結果HLは1番目の値(被除数)になりDEは2番目の値(除数)になります。
そのあと
03EB MOV A,D
から
03ED JZ AHOW
では除数を確認して0のときはHOW?表示ルーチンにジャンプします。
0でなければ
03F0 PUSH B
で符号をスタックに退避したあと
03F1 CALL DIVIDE
を実行します。
DIVIDEは[第48回]で説明をしました。
HL/DEを計算して商をBCに入れます(余りはHLに入ります)。
03F4 MOV H,B
03E5 MOV L,C
03F6 POP B
で除算の結果をHLに入れたあと、符号の情報をBレジスタに戻します。
そのあとの
03F7 XP35:POP D
以降は前回説明しましたので前回を参照してください。
オーバーフローについては乗算の場合と同じです。
復活!TINY BASIC[第66回]
2020.8.15upload
前へ
次へ
ホームページトップへ戻る