超小型コンパイラ TTC++

平井真二
 
 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より増えています)。
●TEXT ADDRESS:
 ソースプログラムの格納番地。
●RUNTIME ADDRESS:
 ランタイムルーチンの発生開始番地。
●VARIABLE TOP:
 変数領域の先頭番地。変数Aがこの番地になります。
●STACK TOP:
 PUSH,TOP命令て使用するスタック領域の番地。
●TABLE TOP:
 @GOTO,@GOSUBの分岐先テーブル(512バイト)を置くアドレス。これらの命令を使用しない場合0000を指定するとテーブルは生成されません。
●OBJECT ADDRESS:
 オブジェクトプログラムの発生開始番地。
●OFFSET ADDRESS:
 オフセット。通常は0000とします。
以上でコンパイルが開始されます。
 しばらくすると,オブジェクトの終了アドレスを表示してS-OSに戻ります。なお,このアドレスはオフセットを含めた値なので注意してください。エラーが出た場合は,エラーコード表を参照してエディタを修正して,再度コンパイルしてください。
 無事コンパイルが終了したら,ランタイムルーチン,オブジェクトが含まれる範囲でセーブしてください。なお,ソースとオブジェクトは重ならないようにしてください。また,ランタイムルーチンは302バイト,変数領域は26バイトですので,オブジェクトと重ならないようアドレスを決めてください。
 
図 メモリマップ
3000H


39C9H



4880H


49AEH

TTC++コンパイラ部
 

空き
 

ランタイムルーチン
 
 

TTC++リファレンス

■構文規則

●プログラム
・文法はほぼtinyBASICと同様
・ラベルは0〜1023の範囲で必要なところだけつける
・ステートメント間のセパレータはスペース
・セミコロン以下の1行は注釈とみなされる
・ステートメントと式の間はスペースで区切る
●式
・ひとつの項,もしくは複数の項を2項演算子でつないだもの
・演算はすべて符号なし8ビットで行われる。また,オーバーフローのチェックはしない
・負数は2の補数または,0-のかたちで表現する
・演算は優先順位がないので,左から順番に行われる。また,括弧を使うことはできない
●項
・定数,変数,関数
 

■定数

●10進数
 取りうる値は,0〜255。255以上の値は,256で割った余りが値となる
●16進数
 先頭に$をつけて表す。値の範囲は00H〜FFH。必ず2桁で表すこと
●文字定数
 シングルクォーテーションを先頭とする1文字のASCIIコードを値とする
 

■変数

●1文字変数
 A,B,~Zの1文字で表される変数
●特殊変数
 [と]の2つ。WIND命令で表される番地をアクセスする
 

■演算子

●2項演算子
 加減乗除剰余記号,比較演算子,論理演算子がある
●加減乗除剰余記号
 それぞれ,+,-,*,/,¥である
●比較演算子
 =,#(<>のこと),>,<
 真のとき1,偽のとき0を値とする
●論理演算子
 AND,OR,XORの3種があり,それぞれ,&,;,!で表す
 

■ステートメント

●.(ピリオド)
 .変数名=式
左辺の項に右辺の式の値を代入する。BASICのLET文と同じ
●INC
 INC 1文字変数
変数の値に1を加える。機械語と同じ,キャリは立たない
●DEC
 DEC 1文字変数
変数の値に-1を加える
●ADC
 ADC 1文字変数
キャリフラグの値を加える
具体的には,
  .B=O .A=A+1 ADC B
とすると,A=255のとき,B=1となる
●GOTO
 GOTO ラベル
指定行へ分岐する。コマンドとラベルの間のスペースは1個だけ
●GOSU8
 GOSUB ラベル
サブルーチンを呼び出す
●RETURN
 RETURN
GOSUBに対応するRETURN。または,BASICのEND文
●IF
 IF 式,ラベル
式の値が0以外(要するに真)ならば,指定行へ分岐する
●REPEAT〜UNTIL
 REPEAT
 UNTIL 式
式の値が1になるまで,REPEATとUNTILのあいだのプログラムを繰り返す。なお,途中でGOTOなどで抜け出してもかまわない
●END
 END
この命令によってコンパイルを終了する
●"str"
ダブルクォーテーションで囲まれた文字列をそのまま出力する
●'ctrl'
シングルクォーテーションで図まれた文字列をコントロールコードとして出力する
  D……カーソルを下へ1文字分移動
  U……カーソルを上へ1文字分移動
  R……カーソルを右へ1文字分移動
  L……カーソルを左へ1文字分移動
  C……画面をクリア
  /……改行する
●PRT1
 PRT1 式
式の値を10進右詰め3桁で出力する
●PRT2
 PRT2 式1,式2
式1を上位バイト,式2を下位バイトとみなした2バイトの値を10進右詰め5桁で出力する
●HEX2
 HEX2 式
式の値を16進2桁で出力する
●HEX4
 HEX4 式1,式2
式1を上位バイト式2を下位バイトとみなして,16進4桁で出力する
●CHR
 CHR 式
式の値のASCIIコードを出力する
●WIDCH
 WIDCH 式
画面の桁数を指定する
●LOCATE
 LOCATE 式1,式2
式1をX座標,式2をY座標とする位置へカーソルを移動する
●BELL
 BELL 式
式の回数だけビープ音を鳴らす
●WIND1
 WIND1 式1,式2
特殊変数[がアクセスする番地を決める。式1が上位バイト,式2が下位バイトを表す
●WIND2
 WIND2 式1,式2
特殊変数]がアクセスする番地を決める。WIND1と同様
●CALL
 CALL 式1,式2
式1を上位バイト,式2を下位バイトとするアドレスのマシン語サブルーチンをコールする
●PUTA
 PUTA 式
式の値をAccに与える
●GETA
 GETA 変数
Accの値を変数に与える
●PUTDE
 PUTDE 式1,式2
式1の値をDレジスタに,式2の値をEレジスタに与える
●GETDE
 GETDE 変数1,変数2
Dレジスタの値を変数1,Eレジスタの値を変数2に与える
●@GOTO
 @GOTO 式
式の値のラベルへ分岐する
●@G05UB
 @GOSUB 式
式の値のラベルのサブルーチンを呼ぶ
●@IF
 @IF 式 ステートメント
式の値が真ならば,式以降のステートメントを実行する。ふつうのBASICのIF文
●PU5H
 PUSH 式
式の値をスタックに積む
●POP
 POP 1文字変数
スタックから値を取り出す
●LOOPA
 LOOPA ラベル
変数Aの値を-1にし,その結果が0でなければラベルへ分岐する。機械語のDJNZと同様
●LOOPB
 LOOPB ラベル
変数Bの値を-1し,その結果が0でなければラベルへ分岐する。機械語のDJNZと問様
●;B
 ;B
BASICのSTOP文と同等(TTIのみ)
 

■関数

●(I
 (I
キーが押されるのを待って1文字入力し,そのASCIIコードを値とする
●(G
 (G
リアルタイムキー入力。どのキーも押されていないならば0,なにかのキーが押されていれば,そのASCIIコードを値とする
●(F
 (F
カーソルを点滅させて1文字入力する
●(R
 (R
0〜255までの乱数を返す
●(X
 (X
カーソルのX座標を値とする
●(Y
 (Y
カーソルのY座標を値とする
●%R
 式%R
式の値を1ビット分,右にずらす
●%L
 式%L
式の値を1ビット分,左にずらす
●(S
 (S
カーソル位置の文字コードを値とする
 
表 エラーメッセージ
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)