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

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



[第45回]


●LIST,PRINT(2)

前回からの続きです。
前回はLISTについて説明をしました。
今回はPRINTについて説明します。
下は前回もお見せしたLISTとPRINTの解説文とプログラムリストです。
PRINTの文法については[第5回]で説明しました。
下の解説文の内容と同じですので PRINTの動作については[第5回]を参照してください。



PRINTのプログラムの説明です。
最初にCレジスタに6を入れます。
Cレジスタには数値を表示するときのスペースを含めた表示桁数を入れます。
その初期値が6です。
RST 1は[第11回][第14回]で説明しました。
DEで示されるメモリアドレスから1バイトのデータを読み込んでそれがスペース(20H)ならスペース以外のコードが出現するまで読み飛ばし、そのようにして読み込んだコードとRST 1の次に置かれたコードとを比較します。
アドレス018Aには’3B’があります。
’3B’は’;’の文字コードです。
1行に複数の命令を記述する場合に命令と命令の間を仕切る「セパレータ」として使われます。
コードが一致した場合にはその次の1バイトを飛ばしてさらにその次のアドレスにジャンプします。
ここで’3B’だった場合にはアドレス018CのCALL CRLF(改行)が実行されます。
そこがPRINT命令の終わりになるからです。
そのあとRUNSMLにジャンプします。
RUNSMLは[第37回]で説明をしました。
行内の現在位置から命令を解読するサブルーチンです。

RST 1の実行の結果コードが不一致だった場合にはその文字コードの次に置かれた数値の分だけアドレスが進みます。
’3B’の次には’06’が置かれています。
不一致だった場合にはその次の6バイトが飛ばされます。
ここではアドレス0192のPR2:にジャンプすることになります。
PR2:にはまたRST 1があります。
そこではCR(’0D’)との比較が行なわれます。
一致した場合は’;’の場合と同じで改行が行なわれそのあとRUNSMLにジャンプします。

’0D’ではなかった場合には019BのPR0:にジャンプします。
PR0:では’#’との比較が行なわれます。
#に続く数値が、数値を表示する場合のスペースを含めた桁数を指定する値になります。
’#’に続く数値を解読するためにRST 3がCALLされます(アドレス 019E)。
RST 3は[第11回]で説明しました。
RST 3の結果得られた値をCに入れます。
Cに入れた桁指定の値はその同じPRINT文の中では次に’#’による指定が行なわれるまで持続します。
桁指定の処理が済んだあとはPRINT文の続きを実行するため01A9(PR3:)にジャンプします。

’#’ではなかった場合には01A3(PR1:)にジャンプします。
PR1:ではQTSTG(アドレス056C)をCALLします。
QTSTGは文字列表示サブルーチンです。
QTSTGについてはいずれ説明をします。
文字列ではなかったときは01B6(PR8:)へジャンプします。
PR8:では数値を解読するためRST 3をCALLします。
その後PRTNUM(アドレス0592)をCALLします。
PRTNUMは数値を表示するサブルーチンです。
PRTNUMについてもいずれ説明をします。

その後はPRINT文の続きを実行するため01A9(PR3:)にジャンプします。
PR3:では’,’との比較が行なわれます。
一致した場合にはFIN(04B3)をCALLします。
FINは[第23回]で説明をしました。
FINは命令の終わり(’;’か’0D’)をチェックする処理ルーチンです。
命令の終わりではなかったときは019B(PR0:)にジャンプしてPRINT文の続きを実行します。

’,’ではなかった場合には01B2(PR6:)にジャンプします。
PR6:に来たときにはPRINT文としての全ての解読を終えているはずなのであとはPRINT文の最後の処理としてCRLF(改行ルーチン)をCALLしたあとRST 6を実行します。
RST 6は[第12回]で説明をしました。
RST 6もFINをCALLしています。
ここでも文末の’;’か行末の’0D’をチェックしているのですが、直接FINをCALLする場合とRST 6をCALLする場合の違いは、前者は不一致の場合にはそのままリターンしますが、後者ではWHAT?表示ルーチンにジャンプすることです。
PR6:でFINではなくてRST 6をCALLしているのは、上にも書きましたように、ここまで来たときにはPRINT文としての解読は全て完了しているはずなのでその次にあるコードは’;’か’0D’以外にはないはずだからです。

復活!TINY BASIC[第45回]
2020.7.23upload

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