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

マシン語でLEDを光らせよう! - IchigoJamではじめるARMマシン語その4

2016/08/08 23:55:00
#KidsIT #IchigoJam #ARM 

やりたいことが遅くでできない時、速い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のアドレスを値で指定してメモリを直接書き込む命令はないため、前回のマシン語表を見て、分解します。

R3=#50 R3=R3<<8 R3=R3+1 R3=R3<<16 R3=R3+`00111100 [R3]L=R0 RET

これをマシン語に変換します。

R3=#50 `00100 011 01010000 R3=R3<<8 `00000 01000 011 011 R3=R3+1 `00110 011 00000001 R3=R3<<16 `00000 10000 011 011 R3=R3+`00111100 `00110 011 00111100 [R3]L=R0 `01100 00000 011 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と出ずにフリーズしてしまったら、それは残念ながらどこか打ち間違えて、暴走してしまったことになります。 あきらめて、本体の電源を切ってやり直しましょう。

(追記)当初、計算にレジスタR4を使っていましたが、ARMのABI(Application Binary Interface = 関数呼び出し規約)にて、破壊して使って良いレジスタはR0-R3までと分かり、R3に変更しました。(日本語解説、32ビットへの誘い

- やってみよう
マシン語でPOVをつくってみよう
LEDやOUT5,6を使ってもっと大きなPOVをつくってみよう
IN1の入力をマシン語で読み取って、モーターで回りながら上を認識させてみよう(ヒント、GPIO0を読みだすと入力になる)

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語
8. アセンブラを使って楽しよう
9. マシン語で高速SPI
10. マシン語を制するもの時間を制す
11. 画面をイチゴで埋め尽くす12の方法

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