「C++ の調査(8) - 非専門的シンギュラリティー研究所」から「C++ の調査(10) - 非専門的シンギュラリティー研究所」で ChatGPT を使いながら簡単な BASIC インタープリターを作成しました。これについても今後ポインターのラッパークラスを作っていく予定です。
最初は「プログラム電卓」が TypeScript で書かれているので、これを C++ に変換して TypeScript から C++ に変換する方法を調べようと思ったのですが、C# で書かれたものがあったため、いったん C++ で動作するものを作って、そこに C# 版を C++ に書き換えたものを付け加えていくという方針にしました。
「C++ の調査(10) - 非専門的シンギュラリティー研究所」でコンパイル機能を ChatGPT を使って追加しましたが、これを書き直していくことにします。このコンパイラーはスタックを使うものになっています。最終的に 68000 に書き直すとしてもスタックは使うことになると考えられるので、まずはこれを拡張していくのが良いと思われます。
まずは BASIC を改造して、アセンブリ言語のインタープリターを作っていきます。
「FORTH電卓」も C# で書かれたものがあったため、これを C++ に書き換えたものを付け加えていくこともできると考えられます。
アセンブリ言語の仕様
数値
PUSH 数値
数値をスタックに置きます。
変数
LOAD 変数名
変数の値をスタックに置きます。
STORE 変数名
スタック上の値を変数に格納します。
数値演算
ADD
スタック上の2つの値の和をスタックに置きます。
SUB
スタック上の2つの値の差をスタックに置きます。
MUL
スタック上の2つの値の積をスタックに置きます。
DIV
スタック上の2つの値の商をスタックに置きます。
NEG
スタック上の1つの値の反数(符号を反転した値)をスタックに置きます。
比較演算
比較演算の結果は、真のとき -1、偽のとき 0 とします。
EQ
スタック上の2つの値が「等しい」の結果をスタックに置きます。
NE
スタック上の2つの値が「等しくない」の結果をスタックに置きます。
LT
スタック上の2つの値が「小さい」の結果をスタックに置きます。
LE
スタック上の2つの値が「小さいか等しい」の結果をスタックに置きます。
GT
スタック上の2つの値が「大きい」の結果をスタックに置きます。
GE
スタック上の2つの値が「大きいか等しい」の結果をスタックに置きます。
ジャンプ
「行き先」は行番号とします。
JMP 行き先
次の処理を行う位置を「行き先」に移動します。
JNZ 行き先
スタック上の値が 0 ではないとき、次の処理を行う位置を「行き先」に移動します。そうではないときは次の行から継続します。
サブルーチン
CALL 行き先
次の処理を行う位置を「行き先」に移動します。その後の処理で RET が実行されると、次の行に戻って継続します。
RET
次の処理を行う位置を、CALL の次の行に戻します。
入出力
IN 変数名
変数に値を入力します。
OUT
スタック上の値を出力します。
停止
HALT
停止します。
コメント
REM
BASIC と同様のコメントを使うことができます。







