"ピッ"という音を鳴らす。"ピー"という音を鳴らす。Arの内容に対応する音階を鳴らす。(Arの内容+1)×0.1秒間プログラムの実行を停止する。データメモリの内容を2進LEDに点灯する。5F番地の内容を上位、5E番地の内容を下位に表示する。データメモリからArの内容を引き、10進数に直してデータメモリに入れる。データメモリにArの内容を加え、10進数に直してデータメモリに入れる。桁上げがある場合は一つ前の番地の値に1を加える。†GMC-4では、プログラムを命令セットで表現し手でコードに翻訳することで、プログラミングします。これではミスも多く、小さなプログラムを作るのでも大変です。そこで、以下のような簡易言語から命令セットに変換するコンパイラーを作成しました。命令セットからコードに翻訳するアセンブラが、以下のサイトにあります。02はバグのようで必ず最初のJUMPの値が正しくセットされません。†GMC-4の元になった「FX-マイコン」のシミュレータが以下のURLに公開されています。http://homepage2.nifty.com/kocha_web/fxms/fxms.htmlこれを使って生成されたコードが正しく動作するか試してみます。$ZでAレジスターの値、Zレジスターの値をそのまま使うことを指定できるようにしました。条件レジスタの制約がきつく、比較が>と==のみとなりました。引き算は、変数に対してのみ可能です。コンパイラーの処理する言語仕様を以下に示します。†コンパイラーは、ANTLRを使って作成しました。構文のチェックやデバッグは、ANTLRWorksを使いました。†ANTLRでは、字句解析と構文解析が1つにまとまっているので、字句解析は以下の部分だけです。;以下に構文解析の各処理について説明します。最初に、変数宣言での変数名の登録について説明します。Main.javaに変数用のメソッドをいくつか定義しました。index.intValue()));}これを使って変数宣言は、次のようになります。';';宣言された変数をsymtableに登録するだけです。比較の結果はZレジスタに入り、Zレジスタが0の時に条件に一致するようにしました。これは、JUMP命令がZレジスタが0の時だけ通過し、通過後Zレジスタを1に戻す仕様になっているからです。);kye()関数の場合、KA命令を実行し、その結果のZレジスタの値をそのまま使います。>演算は、Aレジスタの値から(定数+1)を引いて判断します。CIYの比較命令を使います。ここでは、プログラムが組める最低限の演算にとどめました。演算はAレジスタに結果が入るようにしました。項には、定数と変数が指定されますので、その値をAレジスタにセットする命令を出力します。$Aを使うことができます。命令セットの制限が強いので、今回は引き算は、変数に対する処理のみとしました。$Aは、key()関数でセットされたAレジスタの値を使用するために導入しました。if文、while文、関数呼び出しを定義します。複合文は、{と}で文を複数宣言することを定義するだけです。†if文は、elseなしの簡単なものとしました。statement;@initと@afterで囲まれた部分は、if文の最初と終わりに呼び出されるものです。ここでは、JUMP先のラベルの生成とレベル付けを行っています。if文の比較の後で、JUMP命令を入れるだけの簡単な構造にしています。continueなしの簡単なものにしています。終了ラベル付けを行っていました。†プログラム全体は、変数宣言と文のならびと定義し、終了したら、終了サウンドをならし、無限ループに入ります。;これだけの処理で、コンパイラーができるのです。†GMC-4コンパイラーのEclipseプロジェクトを以下のファイルをダウンロードしてください。0皆様のご意見、ご希望をお待ちしております。コンパイラーの作成を追加しました。19:14:35始めまして。wiki」に登録させていただきました。巣さま、ありがとうございます。17:14:16ArduinoでGMC-4を作ってみました。