やりたいことが遅くでできない時、速いCPUに変えるのは簡単ですが、その分コストアップするので製品化する際の値段に直接響きます。
IchigoJamではじめるARMマシン語、待望(?)のその4、公開です!
「8ビットマイコン時代に逆戻り? アセンブリ言語が人気上昇 - ITmedia ニュース」
1列に並んだLEDをすばやく振ると文字や絵が浮かび上がるものをバーサライターと呼びます(海外ではPOV=残像)。
4つのLEDをIchigoJamのOUT1〜OUT4につないで・・・
こんなプログラムを打ち込んで、振ってみましょう!(動画 on Vine)
10 LET[0],`0110,`1001,`1001,`0110:N=4 20 FOR I=0 TO N:OUT[i]:OUT0:WAIT1:NEXT 30 WAIT 5 40 GOTO20
10行目のデータとデータの数(N)を変更するとパターンを変えられます。
この1列のLEDをモーターでぐるぐる回転させて、その上に文字や絵を浮かび上がらせたい場合、BASICではちょっと速度が足りないかもしれません。
そんな時、CPUパワーをフルに使えるマシン語を使います!
IchigoJamのCPU、LPC1114の説明書(ユーザーマニュアル)を開きます。(LPCマイコン情報:LPC1100 (X)L Cortex-M0搭載-低消費電力内)
LPC1114FN28とFDH28のピン配置で、OUT1〜OUT4は、PIO1_0〜PIO1_3であることがわかります。
続いて、メモリーマッピングを見るとそのピンの操作はGPIO PIO1として、#50010000にマッピングされていることがわかります。
GPIOの項目を見ると、#50010000のアドレスから書き換えたいピンをbitに変更して2bitずらしたところを足したメモリに書き込めばいいことがわかります。
つまり、OUT1〜OUT4の状態を変更するプログラムを擬似的に表すと
[#50010000+`111100]=R0
となります。
ただ、32bitのアドレスを値で指定してメモリを直接書き込む命令はないため、前回のマシン語表を見て、分解します。
R4=#50 R4=R4<<8 R4=R4+1 R4=R4<<8 R4=R4<<8 R4=R4+`00111100 [R4]=R0 RET
これをマシン語に変換します。
R4=#50 `00100 100 01010000 R4=R4<<8 `00000 01000 100 100 R4=R4+1 `00110 100 00000001 R4=R4<<8 `00000 01000 100 100 R4=R4<<8 `00000 01000 100 100 R4=R4+`00111100 `00110 100 00111100 [R4]=R0 `01110 00000 100 000 RET `0100011101110000
できたマシン語を打ち込みます。
16bitの2進数をIchigoJamのメモリ#700から順番に書く、簡易モニターを使って打ち込んでみます。
10 A=#700 20 ?"AD:";HEX$(A) 30 INPUT N 40 ?"VAL:";HEX$(N,4) 50 POKE A,N:A=A+1 60 POKE A,N>>8:A=A+1 70 GOTO 20
できたら、呼び出してみましょう
?USR(#700,1) OK ?USR(#700,15) OK ?USR(#700,0) OK
OKと出ずにフリーズしてしまったら、それは残念ながらどこか打ち間違えて、暴走してしまったことになります。 あきらめて、本体の電源を切ってやり直しましょう。
- やってみよう
マシン語でPOVをつくってみよう
LEDやOUT5,6を使ってもっと大きなPOVをつくってみよう
IN1の入力をマシン語で読み取って、モーターで回りながら上を認識させてみよう(ヒント、GPIO0を読みだすと入力になる)
- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!