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

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



[第55回]


●POPA

POPAはFOR文のプログラムではなくてNEXT文のプログラムでCALLされます。
前回説明しましたPUSHAのちょうど反対の動作をします。



先頭のPOP Bと最後のPP1:PUSH Bはペアになっています。
POPAをCALLしたもとのプログラムに戻るためのリターン先アドレスを一時的に保存しておくのが目的です。
そのあとスタックからLOPVAR変数に値を戻します。
このときその値が0ならスタックに保存されているFOR変数領域はないことになりますから、そこで処理を打ち切ってPP1:にジャンプしたあとメインルーチンにリターンします。
0ではなかったときはPUSHAでの処理とは逆の順序で、スタックからLOPINC、LOPLMT、LOPLN、LOPPTに値を戻したあとメインルーチンにリターンします。

●SETVAL

SETVALはFOR文の先頭のところでPUSHAをCALLしたあとにCALLされます。
FOR文の先頭の
変数名=計算式
の部分を解読して、計算式の値を変数に入れる動作をします。
SETVALはFOR文のほかLET文でもCALLされます。
LET文は変数名=計算式というそのままの構文です。



RST 7は[第13回]で説明をしました。
変数A〜Zまたは配列@(n)のアドレスを算出してHLレジスタに入れます。
そこに変数名、配列名が書かれていなかったときはキャリーフラグが立ちます。
SETVALは最初に変数または配列があることが前提ですから、それがないときはWHAT?表示ルーチンにジャンプします。
PUSH Hで変数アドレスをスタックに一時保存します。
RST 1は[第11回]および[第14回]で説明しました。
RST 1の次に置かれた文字コード(ここでは’=’の文字コード3D)をDEで示すメモリの値と比較して、一致していたらRST 1の2バイト先のアドレスにジャンプします。
不一致だったときは、文字コードが置かれているアドレスの次のアドレスにある値の分だけ先にジャンプします。
上のプログラムリストでは、’=’が検出された場合にはアドレス04A8が実行されます。
検出されなかったときはアドレス04B0にジャンプします(WHAT?表示ルーチンにジャンプします)。
検出されたときに実行される04A8のRST 3は[第11回]で少しだけ説明をしました。
式を計算してその結果の値をHLに入れてリターンします。
そのHLの値を最初にスタックに保存した変数のアドレスに入れるために、まずBCレジスタにコピーします。
そのあとスタックから変数アドレスをHLに戻して、そこにBCレジスタにコピーした式の値を書き入れてリターンします。

復活!TINY BASIC[第55回]
2020.8.3upload

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