TTC++(Tiny Tiny Compiler lncrement)はS-OS“SWORD"上で動作する1バイト型(変数は1バイト整数)のコンパイラです。名前からもわかるように,これはOh!X1989年6月号で発表されたTTCのバージョンアップ版で,Oh!X1989年10月号で発表されたインタプリタ言諮TTIにフルコンパチとなっています。間違ってもオブジェクト指向言語というものではありません。TTC同様,とにかくコンバクトでTTIと組み合わせた開発環境が作れます。そのほか,式の展開ルーチンやランタイムルーチンにも手を加えたので。出力コードが多少改善されています。
TTC++はランタイムルーチンを含めても2Kバイト強しかない小さなコンパイラてす。変数は8ビット無符号で変数名にはアルフアベット1文字のみ有効です(使用できる変数は26個)。1パスでオブジェクトを出力するので,高速にコンパイルします。
演算の優先順位はなく,式の最適化はほとんどしません。マシン誌のプログラムを混在させることができます。このコンパイラで大きなプログラムを書くのには無理がありますが,命令を見てもわかるようにアセンブラの知識がある方ならかなりきめ細かいプログラムを書くことができます。アセンブラで書くほどもないちょっとしたプログラムの作成にご利用ください。
また,PUT,GET命令を使えばマシン語サブルーチン化もできます。
TTC++は専用コンパイラなので,ソースプログラムはE-MATEなどのテキストエディタで作成する,またはTTIと紺み合わせて使用してください。コンパイラ本体とランタイムルーチンのあいだが広く空いていますが,ここにはTTIが入ります。TTIと併用する場合はTTIの3DC9H以下のテキスト関係のデフォルトアドレスを4A00Hなどに変更し,まとめてセーブしておくとよいでしょう。
ソースプログラムを入力あるいはロード後,本プログラムを起動してください(スタートアドレスは3000H番地)。
コンパイラは次のような質問をしてくるので,16進4桁て答えてください(TTCより増えています)。
PUSH,TOP命令て使用するスタック領域の番地。
@GOTO,@GOSUBの分岐先テーブル(512バイト)を置くアドレス。これらの命令を使用しない場合0000を指定するとテーブルは生成されません。
しばらくすると,オブジェクトの終了アドレスを表示してS-OSに戻ります。なお,このアドレスはオフセットを含めた値なので注意してください。エラーが出た場合は,エラーコード表を参照してエディタを修正して,再度コンパイルしてください。
無事コンパイルが終了したら,ランタイムルーチン,オブジェクトが含まれる範囲でセーブしてください。なお,ソースとオブジェクトは重ならないようにしてください。また,ランタイムルーチンは302バイト,変数領域は26バイトですので,オブジェクトと重ならないようアドレスを決めてください。
・ラベルは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コードを値とする
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
スタックが空なのにデータを取り出そうとした |
(C)1990 Shinji Hirai(original)
(C)1997 Junji Okazaki(edited)
(C)2024 Oh!Ishi,Nibbles Lab.(formatted)