2019-05-20
プログラミングしていると自分言語が作りたくなる時期が来ます。
IchigoJam BASICでコンパイラを作りたくなった時、書かれた数式を評価できたら便利です。

1 S="R0=1<<4+5"

容量の都合と優先度の関係で、数式を評価する関数 EVAL (BASICではVAL) に対応していない IchigoJam BASIC ですが、実は数式を解釈するINPUTコマンドとキーバッファ操作を組み合わせれば実現できます。

まずはINPUTコマンドの実験

INPUT N:?N ?1<<4+5 261

計算してくれました!変数も関数も実は使えます。

次に予め数式をかいてみましょう

CLS:?" 3*5":LC0,0:INPUT N:?N 15

あとはエンターキーを押せば、Nに数式を評価した結果が入ります。
特殊キー、Home(18 = #12)を使って、行頭へカーソルを移動させておくこともできます。

?" 3*5";CHR$(18);:INPUT N:?N 15

あとは、メモリ内、キーバッファを直接操作して、入力したことにすれば自動化できます。

?"1<<5";CHR$(18);:POKE#1003,1,10:INPUT"",N:?N 32

メモリマップを見ると、#1003がキーバッファの数、その後がキーバッファとなっています。 POKEコマンドで、キーバッファの数を1、キー入力の値としてエンターを表す10をいれておくと、INPUTを呼び出した瞬間、帰ってきます。 (INPUTあとに空文字列指定で、?非表示に)

これを活用して、R0レジスタに数をいれるだけのコンパイラを作ってみます。

10 S="R0=1<<4+5" 20 A=#700 30 C="R0=":GSB@SCMP 40 IF F ?STR$(S+3);:GSB@EVAL:POKE A,N,32:A=A+2 50 POKE A,#70,#47:?USR(#700,0):END 100 @SCMP:F=1:FORI=0TOLEN(C)-1:F=F*(ASC(C+I)=ASC(S+I)):NEXT:RTN 110 @EVAL:?CHR$(18);:POKE#1003,1,10:INPUT"",N:RTN

40行、R0=n は、マシン語表を見ると、32(=1<<5)とレジスタ番号を足したものに、値と並べることがわかります。 Arm Cortex-M0は、下位が先に来る、リトルエンディアンなので、N,32の順番にメモリに書き込んでコンパイル完了!Armマシン語を生成されました。

ちょっと実験

10 S="R0=1<<10+12" RUN 12 OK ?N 1036

おや、Nの値はちゃんと計算されているのに、コンパイルしたプログラムはおかしいですね。
マシン語表を見ると、u8、つまり8bitまでしか対応していないわけです。

16bitまで対応させるに

R0=N>>8 R0=R0<<8 R0+=N&#FF

と、コンピューターくんに分かるように噛み砕いてあげましょう。

マシン語表を見ながらメモリに書くマシン語にします。(&#FFはなくても一緒なので省略)

N>>8,32 0,2 N,48

これをコンパイラに組み込んで、できあがり!

40 IF F ?STR$(S+3);:GSB@EVAL:POKE A,N>>8,32,0,2,N,48:A=A+6 RUN 1<<10+12 1036 OK

こんな調子で、自分だけのアセンブラ、自分だけのコンパイラを作っていきます。
Enjoy create an own computer language!

Maker Faire Bay Area では、IchigoJamで動くFORTHも人気だったとか!
モノ作りの祭典 MakerFaire は出会いの場!共に創ろう令和時代、中経連「中部圏イノベーション促進プログラム」にぜひお越しください!
キーバッファとIoTを使って、遠隔から任意コマンドを動かす技!
BASICコマンドをLTE送信!PCやスマホからIchiogoSodaを遠隔制御 | ボクにもわかる電子工作のブログ

- 連載、IchigoJamではじめる、Armマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語
8. アセンブラを使って楽しよう
9. マシン語で高速SPI
10. マシン語を制するもの時間を制す
11. 画面をイチゴで埋め尽くす12の方法
12. レジスタ不足に上位レジスタとスタック操作
13. コンパイラはじめのいっぽ、EVAL実現法とマシン語生成
14. サイズを取るかスピードを取るか、割り算のアルゴリズムとマシン語実装
15. マシン語化で1万倍速!? セットで学ぶアルゴリズムとコンピューター

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS