[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第13回]
●最も基本的なサブルーチン(4)
前回の続きです。
今回はRST 7に割り当てられているサブルーチンについて説明します。
TSTV(RST 7)
RST 7は0038に割り当てられています。
0000〜0038に割り当てられているRST命令の最後に位置しています。
今まで説明したRST 0〜RST 6はそれぞれ8バイトのサイズしかありませんでしたが、今回のRST 7はもう後ろには特別の制約はありませんから上のリストのように最後まで連続したアドレスに割り当てています。
TSTVは変数名A〜Zおよび配列@(n)をチェックして、RAMに割り当てられたメモリアドレスをHLレジスタに与えます。
最初のRST 5は前回説明しましたIGNBLKです。
ブランク(スペース、コード20)を読み飛ばしてスペースではない文字コードをAレジスタに入れてリターンしてきます。
@の文字コードは40です。
Aレジスタから40を引いてCフラグが立ったら(A<40)、配列名でも変数名でもありませんからリターンします(このときCフラグが立っていて配列でも変数でもないことをメインルーチンに示します)。
SUI 40Hの結果が0でないならば配列名@ではないので変数名チェックの続きへジャンプします(JNZ TV1)。
その下(003F)からは配列@の処理になります。
文字列のチェックなどの処理は対象になる文字列のアドレスをDEに入れて行ないます。
配列を示す@が検出されたのでその続きの処理のためDEを+1してからPARNをCALLします。
PARNも後で説明するつもりですが、( )の中の式を計算してその結果をHLに入れるサブルーチンです。
@(n)のnの値は0〜32767(0000〜7FFFH)の範囲の数です。
変数A〜Z、配列@()は16ビット(2バイト)でRAMの特定のアドレスに割り付けられています。
そのアドレスを算出するためにHLの値を2倍(DAD H)にします。
結果がオーバーフロー(Cフラグが立つ)するのはHLの値が8000Hよりも大きい場合なのでその場合にはHOW?表示ルーチンへジャンプします。
そのあとPUSH DからRST 4までは2倍したHLがRAMの空きエリアの範囲内かどうかをチェックしています。
SIZEをCALLするためにPUSH DでDEレジスタの値をスタックに退避したあとXCHGでHLの値をDEに入れます。
SIZEをCALLするとRAMの空きエリアのサイズ(バイト数)がHLに入ります。
そのHLとDEを比較します。
RST 4は前回説明しました。
HLとDEを比較するサブルーチンです。
その結果HL<DE(Cフラグが立つ)ならば空きエリア不足ですからSORRY表示ルーチンへジャンプします。
空きエリアの範囲内ならば@(n)のアドレスを算出します。
VARBGN(=1366)はRAMの空きエリアの終端+1です。
ここから前に@()が割り当てられていきます。
@(0)のアドレスは1366、1367です。
そのアドレスを算出するためにSUBDEをCALLしています。
SUBDEはHL−DEを計算するサブルーチンです。
HLには@(n)のアドレスが入ります。
そのあとスタックに退避していたDEをもとに戻してリターンします。
TV1(0058)は変数A〜Zのアドレスを算出するプログラムです。
Aレジスタには0039のSUI 40Hの結果が入っています。
文字Aの文字コードは41Hですから01Hが入ります。
文字Zの文字コードは5AHなので1AHが入ります。
Aレジスタの値が1BHと同じかそれよりも大きければA〜Z以外の文字ですからCフラグを立ててリターンします。
その後の計算によってA〜Zに対応したアドレスがHLに入ります。
変数Aのアドレスは1368、1369です。
変数Zのアドレスは139A、139Bです。
次回に続きます。
復活!TINY BASIC[第13回]
2020.6.1upload
前へ
次へ
ホームページトップへ戻る