TTI(Tiny Tiny Interpreter)は,S-OS“SWORD"上で動作する1バイト型(変数は1バイト整数)の,簡易エディタつきインタプリタ言語です。エディタはZEDAライクなカーソルエディタ風ラインエディタ。開始アドレスは3A00HでTTCと共存可能です。
文法などではTTCのものを少し改良して上位バージョンとなっています。部分的にはどうしてもインタプリタで実現できないものもありますので完全なコンパチではありません。追加された命令を使用しなければ,そのままTTCでコンパイルして高速実行てきます。
TTCの命令を含み,以下の命令が追加されています。
例) .A=9 @GOTO A+1
ラベル10に分岐します。
BASICのIFと同等てす。
例) @IF A=1 “ABCDE"
Aが1のとき,ABCDEを表示します。
DEC A IF A#0, ラベル
DEC B IF B#0, ラベル
(LOOPA)
(LOOPB)
をひとまとめにした命令です。動作はマシン諾のDJNZと同等で,速さを意識した命令です。TTCでコンパイルするときは上記のように展開してください。
SCRN$関数でカーソル位置の文字コードを値とします。
TTIを起動させると,タイトル表示後,プロンプト‘]'が表示され,入力待ちになります(3A03Hにジャンプすればホットスタート)。]に続いてコマンド一覧のコマンドを入力するとそのコマンドが実行されます。また,1文字以上のスペースをつけてTTIの命令を入力すると,その命令が実行されます(いわゆるBASICのダイレクトモード)。
1) テキストの入力において,I(追加),B(挿入)を使い分けなければならない
2) nはラベルでなく,Tコマンドのリスト表示でエディタがつけた行番号である
3) nは省略できない
です。なお,コマンド中断はSHIFT+BREAKキーです。
プログラムの実行はGコマンドです。また,プログラムを途中から実行するには,実行させたい場所にラベルをつけて,
実行中エラーが出ると,エラーメッセージとエラーが出た行を表示して止まります。エラーコード表を参照して修正してください。また,SHIFT+BREAKキーを押すと,プログラムの実行を中断できます(多少止まりにくいことがあります)。
TTIはインタプリタのため,以下の点がTTCとは違います。TTCで動かすプログラムを書くときは気をつけてください。
1) DB,DW,DM命令は使えない
2) REPEAT〜UNTILループの途中でGOTOで抜け出してはいけない
3) PUT,GET命令の扱いが違う
例) DEレジスタの値を渡して,2000HをCALLする場合。
●TTC
PUTDE X,Y
DB $CD,$00,$20
●TTI
PUTDE X,Y
CALL $20,$00
これは,TTCがCALL命令を出力する際,A,Dレジスタを破壊するコードを出すためです。したがってAレジスタを渡す場合も同様にしなければなりません。
参考までに,TTCでDE,Aレジスタの値を渡してマシン語ルーチンを呼び出してDE,Aレジスタの値を受ける場合は,
PUTDE X,Y
PUTA Z
DB $CD,$00,$20
GETA Z
GETDE X,Y
4) インタプリタのみの命令はTTIでしか使えない
当然のことながら,コンパイルを前提としたプログラム開発を行うときには,インタプリタ専用の命令をどのように置き換えていくかということをあらかじめよく考えてから開発したほうがよいでしょう。もちろん,コンパチの部分しか使わなくともプログラムを記述できます。
さて,気になるスピードですが,サンプルのTICBANが301行のB=0をB=4に書き換えるだけでコンパイルしなくても十分遊べるので結構速いと思います。もっとも,TTIで書いて遅ければTTCでコンパイルすればいいわけですからあまり問題ではないでしょう。
■メインメモリ |
3A00H |
~ |
3DACH |
: |
テキストエディタ |
3DADH |
~ |
4564H |
: |
TTIインタプリタ本体 |
4565H |
~ |
47B8H |
: |
ワークエリア |
■特殊ワークエリア |
0000H |
~ |
1000H |
: |
ラベルテーブル |
・SYNTAX ERROR
ステートメントの記述がおかしい
・ILLEGAL FUNCTION CALL
式の記述がおかしい
・UNDEFINED LABEL
分岐先のラベルが見あたらない
・OUT OF LABEL
ラベルが1023を超えている
・BAD GOSUB
GOSUBのネステイングが64重を超えた
・BAD REPEAT
REPEATループのネステイングが16重を超えた
・BAD UNTIL
REPEATがないのにUNTILを実行しようとした
・BAD PUSH
データスタックがオーバーフローした
・BAD POP
スタックが空なのにデータを取り出そうとした |
I……テキストエンドより追加入力を始める。SHIFT+BREAKキーでコマンド入力に戻る
Tn……第n行からテキストを表示する。スペースで一時停止,SHIFT+BREAKキーでコマンド入力に戻る。なお,表示後のテキストはスクリーンエディット可能
Dn……第n行を削除する
Bn……第n行からテキストの挿入を始める。SHIFT+BREAKキーでコマンド入力に戻る
Sファイル名……現在作成しているテキストファイル名でセーブする
Lファイル名……ファイル名のテキストをロードする
Z……ディレクトリを表示する
&……現在作成中のテキストを消去する
R……テキストを復活する
P……Tコマンドにおけるプリンタ出力のON/OFFを設定する デフォルトはOFF
F文字列……先頭から文字列を探し始める。スペースで一時停止,SHIFT+BREAKキーでコマンド入力に戻る
M……現在作成中のテキストの格納されているアドレスを表示する
Xアドレス……テキスト格納先鎮アドレスを指定する。デフォルトは4800番地。なお,アドレスは16進4桁で,また,初めて指定したときは必ず&を実行すること
!……S-OSに戻る
C……TTCがメモリにあれば,制御を移す
G……プログラムを実行する
V……変数リストを表示する |
・ラベルは0〜1023の範囲で必要なところだけつける
・ひとつの項,もしくは複数の項を2項演算子でつないだもの
・演算はすべて符号なし8ビットで行われる。また,オーバーフローのチェックはしない
・演算は優先順位がないので,左から順番に行われる。また,括弧を使うことはできない
・取りうる値は,0〜255。255以上の値は,256で割った余りが値となる
・先頭に$をつけて表す。値の範囲は00H〜FFH。必ず2桁で表すこと
・シングルクォーテーションを先頭とする1文字のASCIIコードを値とする
・[と]の2つ。WIND命令で表される番地をアクセスする
・AND,OR,XORの3種があり,それぞれ,&,;,!で表す
左辺の項に右辺の式の値を代入する。BASICのLET文と同じ
変数の値に1を加える。機械語と同じ,キャリは立たない
指定行へ分岐する。コマンドとラベルの間のスペースは1個だけ
GOSUBに対応するRETURN。または,BASICのEND文
式の値が0以外(要するに真)ならば,指定行へ分岐する
式の値が1になるまで,REPEATとUNTILのあいだのプログラムを繰り返す。なお,途中でGOTOなどで抜け出してもかまわない
ダブルクォーテーションで囲まれた文字列をそのまま出力する
シングルクォーテーションで図まれた文字列をコントロールコードとして出力する
D……カーソルを下へ1文字分移動
U……カーソルを上へ1文字分移動
R……カーソルを右へ1文字分移動
L……カーソルを左へ1文字分移動
C……画面をクリア
/……改行する
式1を上位バイト,式2を下位バイトとみなした2バイトの値を10進右詰め5桁で出力する
式1を上位バイト式2を下位バイトとみなして,16進4桁で出力する
式1をX座標,式2をY座標とする位置へカーソルを移動する
特殊変数[がアクセスする番地を決める。式1が上位バイト,式2が下位バイトを表す
特殊変数]がアクセスする番地を決める。WIND1と同様
式1を上位バイト,式2を下位バイトとするアドレスの機械語サブルーチンをコールする
式1の値をDレジスタに,式2の値をEレジスタに与える
Dレジスタの値を変数1,Eレジスタの値を変数2に与える
式の値が真ならば,式以降のステートメントを実行する。ふつうのBASICのIF文
変数Aの値を-1にし,その結果が0でなければラベルへ分岐する。機械語のDJNZと同様
変数Bの値を-1し,その結果が0でなければラベルへ分岐する。機械語のDJNZと問様
キーが押されるのを待って1文字入力し,そのASCIIコードを値とする
リアルタイムキー入力。どのキーも押されていないならば0,なにかのキーが押されていれば,そのASCIIコードを値とする
(C)1989 Shinji Hirai(original)
(C)1997 Junji Okazaki(edited)
(C)2024 Oh!Ishi,Nibbles Lab.(formatted)