1. シンプルに 1+1 を計算するRustプログラム
2. エルチカ(LEDをチカチカさせるループ)
3. かわくだりゲーム in Rust!
4. CPUに書き込んでいるので、ケーブルを外しても動きます!
Rustで書くメイン関数はこんな感じです。c4ijをベースに作っていただいた rust4ij by mitsuji を fork して改造しながら使いました。
main関数の返り値は、IchigoJAM BASICのコンソールで表示されます。マシン語起動用のBASICコードは、Makefile内にあります。
fn main(_param:i32, _ram:i32, _rom:i32, _divfunc: fn(u32, u32) -> u64) -> i32 { return 1 + 1; }
i32は符号付き32bit整数、u32は符号なし32bit整数。fnは関数を表します。
エルチカはこんな感じ。実際には、IchigoJam用のライブラリ以外、余計なものをリンクしないような設定が6行、加わります。(src on GitHub)
fn main(_param:i32, _ram:i32, _rom:i32, _divfunc: fn(u32,u32) -> u64) -> i32 { loop { out(7, 1); wait(10); out(7, 0); wait(10); } }
led関数を定義しておくのもいいですね。コンパイル型の言語の場合、使わない関数はメモリを消費しないので、分かりやすいライブラリをいろいろ作っていくのがお得です。
ゲームもこのように作れます。IchigoJAM BASIC版、C言語版、Ruby版、Armマシン語版とも比べてみましょう。
fn main(_param:i32, _ram:i32, _rom:i32, _divfunc: fn(u32, u32) -> u64) -> i32 { cls(); let mut x:u32 = 15; let mut score:u32 = 0; loop { locate(x, 5); putc(236 as char); locate(rnd(32), 23); putc('*'); putc(10 as char); wait(3); let c:u32 = inkey(); if c == 28 { x -= 1; } if c == 29 { x += 1; } if scr(x, 5) != 0 { break; } score += 1; } putstr(b"SCORE:\0" as *const u8); putnum(score); putc(10 as char); return 0; }
Rustの真骨頂は、メモリ管理にあり!ここまではほぼBASICやC言語などと変わらない感じですが、必要に応じてメモリを確保したり開放したりする際、Rustらしさがでてくるはず。 プログラムで7KBまで、RAMも1KBくらいはフリーで使えるので、IchigoJam BASICでは難しい大作づくりにチャレンジするのもおもしろいかも!?
MacとUSBシリアルで接続して、sector指定書き込み対応のlpc21ispを使用して、書き込みます。
LEDを付ける out(7, 1) だけのプログラムを逆アセンブルしてみました(make disasm)
Disassembly of section .data: 00000000 <.data>: 0: b580 push {r7, lr} 2: af00 add r7, sp, #0 4: 20d8 movs r0, #216 ; 0xd8 6: 8802 ldrh r2, [r0, #0] 8: 2007 movs r0, #7 a: 2101 movs r1, #1 c: 4790 blx r2 e: 2000 movs r0, #0 10: bd80 pop {r7, pc} 12: 0000 movs r0, r0 14: ffec 7fff ; <UNDEFINED> instruction: 0xffec7fff 18: 0001 movs r1, r0 ...
素直でコンパクトなマシン語になってました!
小さいコンピューターにコンパクトに実装するのが好きうれしい Rust でした!
links
- Rust Programming Language
- taisukef/rust4ij: Rust language for IchigoJam (forked from rust4ij by mitsuji)
- 高専でなぜC言語を学ぶのか? IchigoJamマシン語生成プログラム c4ij で作る、C言語版かわくだり