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

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



[第19回]


●コマンドテーブル

前回までのところで入力バッファとTEXTエリアについて説明しました。
キーボードからコマンド(命令)や行番号付きのプログラム行を入力して[Enter]を入力すると、まず最初に入力した文字列の先頭に数値があるかどうかがチェックされます。
数値があればそれが行番号と解釈されその行全体がプログラム行としてTEXTエリアに格納されます。
数値がなければその行はダイレクト命令と解釈されただちに実行されます。

ここでただちに実行されると書きましたが、それではTINY BASICはどうやって命令を解読してそれを実行するのでしょうか?
ここが一番肝心のところです。
TINY BASICのダイレクトコマンドは3つあります。
LISTとRUNとNEWです。
この3命令はダイレクトにしか実行できません(行番号をつけてプログラム行とすることはできません)。
そのほかの命令(たとえばPRINTとかGOTOとか)は行番号をつけないでダイレクトコマンドとして実行することもできますし、行番号をつけてプログラム行としてTEXTエリアに格納しておいて、RUNコマンドで実行することもできます。

それではどこでLIST、RUN、NEWとそのほかの命令を区別しているのでしょうか?
それ以前にどのようにしてLISTとかPRINTとかという命令を解読してそれぞれの命令に合ったプログラム命令を実行しているのでしょうか?
ちょっと考えるとなんだか難しそうですが、意外に簡単な方法で行なわれています。

下は命令解読部分の先頭部分です。
コマンド(命令)は「テーブル」の名前で各命令の文字列とその命令の処理を行なうプログラムの先頭アドレスとがペアになった形で列挙されています。
最初に書いてあるのはそのテーブルとそのテーブルを使って命令を解読するプログラムの説明です。
その説明が終ったところから始まっているのが「ダイレクトコマンド」のテーブルです。



’LIST’ ’RUN’ ’NEW’ の文字列があって、各文字列に続いてその命令の処理を行なうプログラムの先頭アドレスが書かれています。
アドレスは通常のメモリ内の配置とは逆に上位バイト、下位バイトの順に置かれています。
さらにその上位バイトは最上位ビットが’1’に置き換えられています。
たとえば’LIST’の処理プログラムの先頭アドレスは016Fなのですがその上位バイト01を81に置き換えています。
これは実に巧妙な仕組みです。

命令を示す文字列の文字コードは00〜7Fの範囲にあります。
つまり文字列を構成する文字コードの最上位ビットは常に’0’なのです。
そこでテーブル文字列の終わりの位置にジャンプ先アドレスを置いて同時にその上位バイトの最上位ビットを’1’にすることで、そこが文字列の終わりであることを示すマークとして利用しているのです。
さらにTINY BASICのシステムプログラムは0000〜07FFの範囲にありますから、命令コードのジャンプ先アドレスをそのように上位バイトの最上位ビットを’1’に置き換えてあっても、その上位バイトを7Fでマスクすれば正しいジャンプ先アドレスが得られますから何の問題も生じません。

上のテーブルには続きがあります。
「ダイレクトコマンド」は上の3つだけですがそのほかの命令も「ダイレクト」に実行することができますから、それらの命令のテーブルも上のダイレクトコマンドの続きとして記述されています。
ただし「ダイレクトコマンド」はプログラムの中で使うことはできませんから「ダイレクトコマンド」とそれ以外の命令を区別することができるように、下のテーブルの先頭にはTAB2:のラベルがつけられています。
「ダイレクトコマンド」をサーチするときには上のTAB1:から検索を開始し、プログラム内の命令をサーチするときにはTAB2:から検索を開始することができるようにするためです。



「プログラム命令」の最後は’STOP’です。
その文字列の下には’STOP’の処理へのジャンプアドレスが置かれていますがさらにその下にも同じように最上位ビットを’1’にしたアドレスが置かれています。
このようにアドレスが2つ続いているのはここだけです。
ここがコマンドテーブルの最後なのです。
アドレス031Dはコマンドテーブルの最後まで検索して該当する命令が検出されなかったときに実行される処理ルーチンの先頭アドレスです。

本当はコマンドテーブルの説明に続いてそのコマンドテーブルを使って命令を検出して各処理ルーチンにジャンプするプログラムについても説明をするつもりだったのですが、本日は時間がなくなってしまいました。
その説明は次回にすることにいたします。

復活!TINY BASIC[第19回]
2020.6.12upload

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