福野泰介の一日一創 - create every day

mrubyのmgemのように、IchigoJamをC言語で拡張する方法をつくりました。
最大バイナリサイズ、なんと3KB!

IchigoJamのプログラムは、USBシリアル経由でターミナルなどで接続すれば、PS/2キーボードやテレビを用意することなく、らくらく開発! 完成したプログラムをサクっと転送するのに便利なツール「bas2bin for IchigoJam

これを使えば、BASICのファイルをIchigoJamに書き込むバイナリファイルにできるので、4ファイルまとめて書き込めるので、ワークショップ用などでまとめて準備する時、実製品として出荷するときなどに便利です。(初公開は2016/2/28

今回、C言語でつくったマシン語プログラムをIchigoJamのファイル1〜3へ書き込み、呼び出すマシン語プログラムを追加開発!

bas2bin/src/main.c の、main関数を使って開発し、ファイル1-3の3KBへ書き込んだプログラムを、ファイル0に書き込んだ起動用マシン語が入ったBASICプログラムから呼び出します。

__attribute__ ((section(".MAIN"))) int main(int param, int ram, int rom, int (*divfunc)()) { //return param + 1; return divfunc(100, param); // == 100 / param }

* 割り算はIchiogoJam内のバイナリを使えるので、400byte節約できます。

呼び出し用、ファイル0におかれる IchigoJam BASICプログラム (entry.bas)

1 '3KB asm 10 POKE#700,3,180,5,73,8,120,1,40,0,208,4,73,5,49,139,70,3,188,88,71,112,71,0,0,0,100,0,0,0,116,0,0 20 ?"100/3=";USR(#700,3)

実行すると、100/3の「33」と表示され、無事マシン語が呼び出されたことを確認できます。

IchigoJamはOSサイズ24KB、LPC1114FDH28のROMサイズ32KBの後ろ8KBをユーザーファイル用としています。 残念なことに4KB単位でしか消去できないので、1KB x 4のユーザープログラムを交互に書き込む仕組みになっています。

この後ろ3ファイル、3KBにマシン語をおき、25KB目か29KB目のどちらかマシン語がある方を呼び出しています。 FILESで見ても、1-3は何もでなかったりおかしな表示になる部分が、マシン語です。 先頭4byteを使って、マシン語が書き込まれているかどうかを判定しているので、厳密には3068byte(3KB-4B)まで。 利便性を削って、ファイル0の領域にも食い込ませれば、約4KB使ったオールマシン語プログラムも!

IchigoJam、どんな拡張しましょう!?
初回起動時に動く、すごいデモプログラムを作るのも楽しいかも!

bas2bin for IchigoJam - src on GitHub

呼び出し用のマシン語プログラム、asm15ソースがこちら (entry.bas)

PUSH {R0,R1} R1=[@FILE1A]L R0=[R1] R0-1 IF 0 GOTO 2 R1=[@FILE1B]L R1+=5 R12=R1 POP {R0,R1} GOTO R12 @FILE1A DATA L (24+1) * 1024 @FILE1B DATA L (24+4+1) * 1024

ファイル1の場所にマシン語があるかどうかチェックして、破壊可能なレジスタR12を使って呼び出し!

links
- USB-シリアルモジュール - ショップのふうせん
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1
- Ruby on Jam! IchigoJamで動くROM8KBのミニ Ruby VM と、mruby ver2.0対応はじめのいっぽ - mmruby for LPC1114

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像