非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

昔ながらの BASIC(1)

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

停止します。