JH8CHUのホームページ>Tiny言語>Tiny BASIC (VTL版)

VTLによるTiny BASIC(工事中)


工事中(2015/09/21)。
  1. VTLの問題点と対策

    No.問題点対策備考
    1変数がA〜Zまでの26種類しか使えない。 演算やパラメータの受け渡しは、原則スタックを使う。 
    2変数が全て広域変数であり、
    局所変数が使えない。
    (同上) 
    3サブルーチンからの戻りアドレスは変数「!」に
    格納されるが、サブルーチン内 にてジャンプや
    更にサブルーチンの呼び出しを実行すると
    変数「!」が破壊されるため、戻り行番号が
    破壊されメイン・ルーチンに戻れなくなる。
    サブルーチンの冒頭で戻り行番号を格納している
    変数!の値を 戻りアドレスを格納するための
    専用スタック(=リターン・スタック)に 格納する。
    メイン・ルーチンに戻るときは、リターン・スタック
    から戻り行番号を取り出す。
     
    4バイト・アクセスのための機能がない バイトアクセスのために変数「^」と変数「\」を用意する。
    変数「^」はバイトアクセスするためのポインタ。
    X=\でポインタが示すバイトアドレスのデータを変数Xに代入。
    \=Xでポインタが示すアドレスにバイトデータで変数Xを格納。
    配列の要素eとバイトアドレスptrはptr = e * 2の関係がある。
     
    5ディスク・アクセスのための機能がない  
    61文字の入力変数「$」をパソコン上で実現する
    場合、既存の言語の多くは文字入力する際、
    Enterキーを押すまで制御が戻らない。
      
    7DATA文がない   

  2. 変数の割当

    1. プログラム・カウンタ
      VTLの実行行を示すポインタで変数#そのものです。
    2. パラメータ・スタック
      変数:Pを割り当てます。

    3. リターン・スタック
      変数:Rを割り当てます。
    4. 作業用
      変数X、Y、Zは処理ルーチン内で自由に消費してよいものとします。
  3. 処理ルーチン一覧

    行番号名称パラメータ
    スタック
    処理備考
    1000PSHR  --- 変数Xをリターンスタックにプッシュします。
    サブルーチンの冒頭で変数!に格納されたメインルーチンの
    戻りアドレスをリターンスタックに積むときに使用します。
     
    1100RET  --- サブルーチンからメインルーチンに戻ります。そのために
    リターンスタックに格納された戻りアドレスを変数「#」に代入します。
     
    1200LIT --- u変数Xの値をスタック(TOS)に積みます。 デバッグ用
    1300DDOTu --- 符号なし16bit整数uを10進で画面に表示し、
    TOSは捨てます。
    デバッグ用
    1400GETLNptr --- nキーボードから文字列を入力し、配列のバイトアドレスptr
    以降の配列に格納します。入力された文字数はnとなります。
     
    1500PUTLN ptr1 c --- ptr2配列のバイトアドレスptr1以降の文字列を区切り
    文字cの直前まで画面に出力します。
    ptr2は文字列の区切り文字の次のバイトアドレスになります。
     
    1600MSG ptr1 --- ptr2配列のバイトアドレスptr1以降の文字列を区切り
    文字0x00の直前まで画面に出力します。
    ptr2は文字列の区切り文字の次のバイトアドレスになります。
     
    1700SKPBLptr1 --- ptr2 配列のバイトアドレスptr1以降の文字列の先頭の空白をスキップし
    空白以外の最初の文字のアドレスをptr2に求めます。
     
    2000ROTn1 n2 n3 --- n2 n3 n1スタック上の三つのデータをn1がトップに
    来るように順番を変えます。
     
    2100SWAPn1 n2 --- n2 n1スタック上の二つのデータn1とn2の順番を 交換します。 
    2???CMINTn1 n2 --- c z2つの符号付き16bit整数n1とn2を比較します。
    n1=n2のときz=1。n1≠n2のときz=0。
    n1≧n2のときc=1。n1<n2のときc=0。
    廃止予定
    2???ABSn1 --- n2 f符号付き整数n1の絶対値をn2に求めます。
    またn1の符号がfとなります。n1≧0のときf=0、n1<のときf=1です。
    廃止予定
    2???DIVIDu1 u2 --- u3 u4符号なし整数u1をu2で割り、その余りu3と商u4を求めます。
    廃止予定
    3000WINTn u --- 符号付整数nを指定された桁数uで画面に出力します。  
    3400WLINEptr1 --- ptr2 配列のバイトアドレスptr1から始まるテキストの1行を表示します。
    ptr2は文字列の区切り文字の次のバイトアドレスになります。
     
    4000ERWHTptr --- エラーメッセージ"WHAT?"を表示してエラー処理を行います。
    ptrはエラーの場所を示すポインタです。
     
    4100ERHOWptr --- エラーメッセージ"HOW?"を表示してエラー処理を行います。
    ptrはエラーの場所を示すポインタです。
     
    4200ERSRYptr --- エラーメッセージ"SORRY"を表示してエラー処理を行います。
    ptrはエラーの場所を示すポインタです。
     
    5000GINTptr1 --- ptr2 u1 u2配列のバイトアドレスptr1からの文字列を整数u1に
    変換します。u2は数字の桁数です。またu1<32768です。
     
    5300GETLc --- ptr画面にプロント文字cを表示して、ターミナルから文字列を入力し
    ライン・バッファに格納します。
    入力文字列の最終アドレス+1がptrとして戻ります。
     
    6000SRCHn1 --- n1 ptr1 f 行番号n1より大きい行番号を持つ行を探します。
    f=0:行番号n1と同じ行番号が見つかった。
     その行番号の先頭アドレスがptr1。
    f=1:行番号n1より大きい行番号が見つかった。
     その行番号の先頭アドレスがptr1。
    f=65535:行番号n1以上の行番号を持つ行はなかった。
     ptr1はテキストの最終アドレス+1。
     
    6400TR2ptr1 ptr2 ptr3 --- 配列のバイトアドレスptr1からptr2-1までの内容をptr3-1より
    前の領域にコピーします。 コピーの順番はptr2-1からptr1に
    向かって行われます。
     
    6600TRNSFptr1 ptr2 ptr3 --- 配列のバイトアドレスptr1からptr2-1までの内容を
    ptr3以降にコピーします。 コピーの順番はptr1からptr2に
    向かって行われます。
     
    6800SKIPLptr1 --- ptr2  
    7000TSCR2ptr ---  
    9000START ---  
    10000EDITR ---  
    11000KWCPRptr1 --- ptr1:命令文の文字列の先頭アドレス。
     命令文は行バッファまたはテキストバッファのどちらか。
     変数「,」に検索するテーブルの行番号が設定されていること。
     
    12000BYE --- BYEコマンドを実行し、BASICを終了します。  
    13000LISTptr1 --- LISTコマンドを実行します。
    ptr1:コマンドの続きのバッファアドレス。
     
    14000NEWptr1 --- NEWコマンドを実行します。
    ptr1はダミーです。
     
    15000RUNptr1 --- RUNコマンドを実行します。
    ptr1:コマンドの続きのバッファアドレス。
     
    16000EXPR0ptr1 --- u1 ptr2括弧による式のくくり出し処理を行います。
    ptr1:構文解析中のプログラムへのポインタです。
     
    16400FACTRptr1 --- u1 ptr2ptr1以降の文字列を算術因子として評価し、u1に求めます。  
    16600RNDptr1 --- u1 ptr2乱数を発生させ、u1に返します。
    RND(<式>)の形式で、<式>の値がuのときu1は1〜uです。
     
    16700ABSptr1 --- u1 ptr2絶対値を求め、u1に返します。
    ABS(<式>)の形式です。<式>がオーバーするとエラーになります。
     
    16800RSIZEptr1 --- u1 ptr1テキスト・バッファの残りサイズをu1に返します。
    ptr1は不変です。(RSIZEでは未使用)
     
    16900FNSIZptr1 --- u1 ptr1テキスト・バッファの残りサイズをu1に返します。
    SIZE関数の処理です。ptr1は不変です。(RSIZEでは未使用)
     
    17000TSTVptr1 --- ptr1 ff
    ptr1 --- ptr2 ptr3 tf
    ptr1からのテキストが変数かどうか調べます。
     ff:ptr1からのテキストは変数ではない。
     tf:ptr1からのテキストは変数である。変数の格納アドレスはptr3。
     
    17300NUMBptr1 --- u1 ptr2ptr1以降のテキストを数値u1に変換します。
    数値に変換出来ないときはエラーとなります。
     
    17400VARptr1 --- u1 ptr2ptr1以降が変数かどうか調べ、変数なら内容をu1に 返します。
    変数でなければ整定数への変換を試み、その値をu1に返します。
     
    17700TERMptr1 --- u1 ptr2  
    17920MULTptr1 --- u1 ptr2  
    18300DIVptr1 --- u1 ptr2  

  4. データ構造

  5. 処理詳細

    1. PSHR
      (1)機能
      行番号名称パラメータ
      スタック
      処理備考
      1000PSHR --- 変数Xをリターンスタックにプッシュします。
      サブルーチンの冒頭で変数!に格納されたメインルーチンの
      戻りアドレスをリターンスタックに積むときに使用します。
       

      (2)処理内容
        VTLではサブルーチンがメインルーチンに戻る際に必要となる戻りアドレスが
        変数!に格納されていますが、変数!が破壊されてもよいよいにサブルーチンの
        冒頭で戻りアドレスをリターン・スタックに格納するために使用します。
        本ルーチンを呼び出すことにより変数!が破壊されてしまうため
        戻りアドレスは変数Xに格納してから、本ルーチンを呼び出します。
        なお本ルーチンを使用したときは、サブルーチンから戻るときに、RETを使用します。

      (3)ソース・リスト
        1000 R=R-1
        1010 :R)=X
        1020 #=!

        [解説]
        1000 リターン・スタックのポインタをデクリメント
        1010 変数X(戻りアドレス)をリターン・スタックに格納
        1020 このルーチンを呼び出したサブルーチンに戻る

    2. RET
      (1)機能
      行番号名称パラメータ
      スタック
      処理備考
      1100RET --- サブルーチンからメインルーチンに戻ります。そのために
      リターンスタックに格納された戻りアドレスを変数「#」に代入します。
       

      (2)処理内容

      (3)ソース・リスト
        1100 !=:R)
        1110 R=R+1
        1120 #=!

        [解説]
        1100 リターン・スタックに積まれたメイン・ルーチンの戻り行番号を変数!に戻す。
        1110 リターン・スタックのポインタをデクリメント
        1120 メイン・ルーチンにジャンプ

    3. PUTLN
      (1)機能
      行番号名称パラメータ
      スタック
      処理備考
      1200PUTLNc addr1 --- addr2addr1以降の文字列を区切り文字cの直前まで
      ディスプレイに出力します。
       

      (2)処理内容

      (3)ソース・リスト
        1200 X=!
        1210 #=1000
        1220 X=:P)
        1230 Y=:P+1)
        1240 Z=:X)
        1250 $=Z
        1260 X=X+1
        1270 #=((Z=Y)=0)*1240
        1280 P=P+1
        1290 :P)=X
        1300 #=1100

        [解説]
        1300
        1310
        1320

    4. GETLN
      (1)機能
      行番号名称パラメータ
      スタック
      処理備考
      1400GETLNaddr1 --- addr2キーボードから文字列を入力しaddr1以降の
      バッファ・メモリに格納します。
       

      (2)処理内容

      (3)ソース・リスト
        1400 X=!
        1410 #=1000
        1420 X=:P)
        1430 Y=0
        1440 Z=$
        1450 #=((Z=8)=0)*1490
        1460 #=(Y=0)*1440
        1470 Y=Y-1
        1480 #=1440
        1490 #=((Z=13)=0)*1530

        [解説]
        1400
        1410
        1420

    5. SKPBL
      (1)機能
      行番号名称パラメータ
      スタック
      処理備考
      1600SKPBLaddr1 --- addr2addr1以降の文字列の先頭の空白をスキップし
      空白以外の最初の文字のアドレスをaddr2に求めます。
       

      (2)処理内容

      (3)ソース・リスト

        [解説]
        1600
        1610
        1620

    6. LIT
    7. DDOT
    8. CMINT
    9. ABS
    10. DIVID
    11. WINT
    12. WLINE
    13. ERWHY
    14. ERWHT
    15. ERSRY


JH8CHUのホームページ>Tiny言語>Tiny BASIC (VTL版)


Copyright (C)2015 Masahiro.Matsuda(JH8CHU), all rights reserved.