#効能
VTL_on_FPGAのGAME80コンパイラーをパソコン上で動作させることが出来ます。
#元ネタ
スクラッチからでは能力的にも時間がかかりそうなので、下記サイトのものを使わせてもらっています。
Linux用なので、IOをWindowsにちょこちょこと書き換えて動かしています。
VTLソースの編集は外部エディタで行うので、ラインエディタ系は動かない可能性大。
[たけおか ぼちぼち日記]
※許諾については記載が無いので、黙って使わせていただいておりますが、問題あれば取り下げます。
#GAME86インタープリター
ソースはここに上げています。
[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.ソース格納エリアを2分割(コンパイラとコンパイルターゲットソースを格納)するコマンドを追加。
[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記]より
※インタープリターは上記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桁で右詰め
$=<項> <項>の値の下位バイトを文字コードとする1文字を出力
.=<項> <項>の値の下位バイトの数だけ空白を出力
'=<項> <項>の値で乱数シードを設定
<変数>=? 10進数値を入力して変数に代入
<変数>=$ 1文字を入力して変数に代入
その他
とりあえず動いているのレベルであり、状況によっては動かない可能性が有ります。
上記記載のハード、ソフトは無保証であり、各自の責任においてご利用願います。