ＶＴＬ＿ｏｎ＿ＦＰＧＡ[その２　ＧＡＭＥ８６インタープリター]

#効能
　VTL_on_FPGAのGAME80コンパイラーをパソコン上で動作させることが出来ます。
#元ネタ
　スクラッチからでは能力的にも時間がかかりそうなので、下記サイトのものを使わせてもらっています。
　Linux用なので、IOをWindowsにちょこちょこと書き換えて動かしています。
　VTLソースの編集は外部エディタで行うので、ラインエディタ系は動かない可能性大。
　　[［たけおか ぼちぼち日記］](https://ameblo.jp/takeoka/entry-11004344172.html)
　※許諾については記載が無いので、黙って使わせていただいておりますが、問題あれば取り下げます。

#ＧＡＭＥ８６インタープリター
　ソースはここに上げています。
  　[［GAME86］](https://github.com/hi631/VTL_on_FPGA/tree/master/game86)
　VS2017(無償版)でコンパイルしており、「game86.sln」でコンパイルできるはずです。
　VS2017無い場合も、へんな命令は使っていないつもりなので、その辺のコンパイラでも可と思う。
　それもめんどうな場合は「game86.exe」を起動してみてください。
　※但し、「誰も使っていない怪しいソフト」として、ノートンなどがクレームをつける恐れあり。

　起動すると下記が表示されます。
　「ESC」キーで実行中の中断、「\」キーで終了します。
  VTL及びGAME-IIIのコマンドを打ち込むと実行できます。

```
--- VTL_on_FPGA Interpreter ---
G>>

```

#改変、機能追加

　GAME86に、VTL_on_FPGAとして機能させる為に下記機能に変更、追加を行っている。
　1.配列は標準では16ビットモードで動作　　A:0) -> 8bit  A(0) -> 16bit  A[0) -> 32bit
　2.行の途中からのコメントを許容。※判りやすくなる

```
  　　10 A=$1000 * 開始番地  <- 「*」以降はコメントとなり、実行されない。
```
　3.ソース格納エリアを２分割(コンパイラとコンパイルターゲットソースを格納)するコマンドを追加。
　　[P0 メモリアドレス $0000 - $7FFF コンパイルターゲットソースを格納
　　[P1 メモリアドレス $8000 - $FFFF GAME86上で動作するコンパイラ(GM80)を格納
　4.デバッグコマンドとして[Txを追加。
　　[T0 デバッグコマンド([T1 - [T3)を無効化
　　[T1 トレース実行(実行中の行番号を表示)
　　[T2 ステップ実行(行番号毎に中断)
　　[T3 ブレーク有効(ソース中に !! マークが有れば中断)
　　※中断後に、］(+ret)で再スタートする。
　5.プログラムのロード、セーブ
　　[LO xxxx ファイルxxxxからプログラムをロードする。
　　[SA xxxx ファイルxxxxにプログラムをセーブする
　　[L0 xxxx ファイルxxxxからプログラムを、[P0にマージしながらロードする
　　[L1 xxxx ファイルxxxxからプログラムを、[P1にマージしながらロードする
　6.FPGAへの書き込み支援
　　[MR xxxx ファイルxxxxにVTL機械語を、verilogソース形式で格納(但し32bit)
　　[MM xxxx ファイルxxxxにVTL機械語を、mif形式で格納(但し32bit)
　　[MH xxxx ファイルxxxxにVTL機械語を、バイト形式で格納
　　[MC xxxx ファイルxxxxにVTL機械語を、coe形式で格納(但し32bit)
　　[CW      クリップボードにVTL機械語を、バイト形式で格納
　　※[MHでFPGAに機械語を受け渡す、[CWはデバッグ時に使用
　　※32bitモードは、今回は使用しない
　7.コンパイル操作支援
　　(1)［￥￥　VTL_on_FPGAに必要なソースをすべてロードし、コンパイルを実行
　　　"[P0 [LO gm80\\gm80.gm [L0 gm80\\moni.gm [L0 gm80\\bios.gm [L0 gm80\\gm80ovf.gm [P1 [LO gm80\\gm80.gm [L1 gm80\\gm80ovp.gm #=1"
　　(2)［＠＠　VTL_on_FPGAのモニター部分をロードし、コンパイルを実行
　　　"[P0 [LO gm80\\moni.gm  [P1 [LO gm80\\gm80.gm #=1"
　　(3)［［［　test.gmをロードし、コンパイルを実行
　　　"[p0 [LO gm80\\test.gm [p1 [LO gm80\\gm80.gm #=1"
　8.グラフィック(20180722追加)
　　拡張IOに合わせたグラフィックが表示可能です。
　　<\$18=1　ウインドを表示。
　　<\$18=0　ウインドをリフレッシュ
　　<\$15=XX　X座標を指定
　　<\$16=YY　Y座標を指定
　　<\$18=CC　指定した色を表示(但しWinではリフレッシュが必要)
#GAME86の文法
[［GAME86 Compiler for MS-DOS 1.00C記］より](https://www.mztn.org/game86/)
　※インタープリターは上記URLとは別物です。

```
    <行番号>   1 ? 32767
    <10進定数> 0 ? 65535
    <16進定数> $0000 ? $FFFF
    <文字定数> "文字"
    <変数名>   A ? Z または冗長形(ABC等 先頭1文字が有効)
    <1バイト配列> ::= 変数名 ( <式> )
                      変数の値 + 2 * 式の値 のアドレスの内容を値とする．
    <2バイト配列> ::= 変数名 : <式> )
                      変数の値 + 式の値 のアドレスの内容を値とする．
    <定数> ::= <10進定数> | <16進定数> | <文字定数>
    <変数> ::= <変数名> | <1バイト配列> | <2バイト配列>
    <式> ::= <項> | <項> <二項演算子> <項>
    <項> ::= <定数> | <変数> | <配列> |（ <式> ）| <単項演算子> <項>
    <二項演算子> ::= + | - | * | / | = | <> | < | > | <= | >=
                    比較演算 は 真:1, 偽:0の値を取る．
    <単項演算子> ::= - | + | % | ' | #
                     + は絶対値, % は直前に実行した除算の余り,
                     ' は乱数, #は否定．
    <行> ::= <行番号> スペース <文> [ 空白 <文> ] 改行
             | <行番号> スペース以外の文字 コメント 改行

    <文>
        <変数>=<項>     変数への代入
        #=<項>            <項>の値の行番号の文にジャンプ(GOTO)
                          行番号がなければ行番号より大きい最初の行へジャンプ
        #=-1              プログラムの終了(END)
        !=<項>            <項>の値の行番号のサブルーチンへジャンプ(GOSUB)
        ]                 サブルーチンから戻る(RETURN)
        ;=式              式の値が真の場合は次の文に進み，
                          偽の場合は次の行を実行．
        @                 DO
        @=(式)            UNTIL
        変数=初期値,ステップ FOR
        @=式              NEXT
        /                 改行出力
        "文字列"          文字列出力
        ?=<項>            <項>の結果を数値出力 左詰め
        ??=<項>           <項>の結果を数値出力 16進4桁
        ?$=<項>           <項>の結果の下位1バイトを数値出力 16進2桁
        ?(n)=<項>         <項>の値の数値出力 n桁で右詰め
        $=<項>            <項>の値の下位バイトを文字コードとする１文字を出力
        .=<項>            <項>の値の下位バイトの数だけ空白を出力
        '=<項>            <項>の値で乱数シードを設定
        <変数>=?          10進数値を入力して変数に代入
        <変数>=$          1文字を入力して変数に代入

```


## その他
　とりあえず動いているのレベルであり、状況によっては動かない可能性が有ります。
　上記記載のハード、ソフトは無保証であり、各自の責任においてご利用願います。