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

フルカラーLED、WS2812B 16x16 をあやつるマシン語プログラムのパッチ(差分) on IchigoJam

2018/02/05 23:55:00
#IchigoJam #maker #KidsIT #arm 

32x8マトリクスに続き、16x16マトリクスが到着。
そのままつなぐと、左右の方向が合わずでたらめな表示になる。32x8用プログラムを修正しましょう。

16x16の配線を見ると、こちらも16コが1行毎にジグザグになっているので、32コで折り返すところを16にして、8行ではなく16行にすればOK。 3箇所書き換えます。

R1+=R12 R0+=1 R2=15 ' for 16x16 R0&R2 IF !0 GOTO @LOOP_DATA R2=R0>>4 ' for 16x16 R2-16 ' for 16x16

#700からのマシン語なので、前回のプログラムにこの3箇所POKEコマンドで書き換えれば16x16用ドライバのできあがり!

35 POKE#734,15:POKE#73C,16:POKE#73A,2

画面の左上から16x16の領域にある文字コードを256色の色コードとして表示するプログラムになりました!
こういうプログラムの差分をパッチと呼び、パッチを適応することをパッチを当てると言います。
プログラミングは積み重ね。いかに流用して楽するかを考えましょう。


マシン語を解説する本「機械のコトバ
コンピューターとアルゴリズムをベースとした、プログラミング言語の成り立ちが丁寧に解説されています。

迷路とは何か?移動とは何か?
0と1を記憶したり、反転したりすることしかできないプリミティブなコンピューターをひとつひとつ理論を積み上げていく楽しさは、数学や物理のおもしろさに通じます。

興味を持ったら、ひとまずやってみる!が一番!

接続用のケーブルは、マトリクスLEDについているコネクターを流用して、3ピンのピンヘッダーをはんだづけ&ホットボンドがいい感じでした。

links
- IchigoJamの画面からダイレクトであやつる、256色カラー32x8電光掲示板!Armマシン語ジグザグドライバ for WS2812B
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1

IchigoJamの画面からダイレクトであやつる、256色カラー32x8電光掲示板!Armマシン語ジグザグドライバ for WS2812B

2018/02/04 23:55:00
#IchigoJam #maker #KidsIT #arm 

配列を使ったフルカラーLEDを制御の関連で発見した32x8の256コ並んだフルカラーLED、3699円!
Amazon.co.jp: Quimat Arduino用RGB LED パネル 5050 SMD WS2812B IC 個別にアドレス可能 256ピクセルLEDライトledスクリーン led壁 広告ボードなど作成QWS03: DIY・工具・ガーデン

配列バージョンだと102コしか制御できないので、1灯を1byte/8bitで表す256色モードを開発。IchigoJamの画面がちょうど32文字なので、上から8行を使った画面そのまま表示が完成!

「さばえ」と読めますか?
キーボードのInsertキーで挿入モードから上書きモードに変更し、お絵かきしてマシン語呼び出すRUNでOK!

こちらが画面そのまま送信WS2812Bドライバです。(128byte)

10 POKE#700,240,181,114,182,9,36,36,2,9,25,1,36,164,70,27,76,11,120,91,9,0,240,31,248,11,120,155,8,7,34,19,64,0,240,25,248,11,120,3,34,19,64,91,0,0,240,19,248,97,68,1,48,31,34,16,66,234,209,66,9 20 POKE#73C,8,42,8,208,31,49,1,35,93,66,172,70,26,66,225,209,2,49,156,70,222,231,98,182,240,189,128,37,155,0,255,34,34,96,3,39,9,38,43,66,1,208,9,39,3,38,1,63,253,209,0,34,34,96,1,62,253,209,109,8 30 POKE#778,239,209,112,71,4,0,1,80 40 U=USR(#700,0)

画面に好きな文字を書いて、8行目から下でRUNで表示されます!
(32x8のWS2812Bはいつものごとく、5V-VCC,DIN-OUT1,GND-GNDで接続)


画面に表示して呼び出すだけなので、ゲームづくりも簡単にいけそうですねっ


256色は、MSXのSCREEN8に習って、G 3bit, R 3bit, B 2bit の計8bitで256色を表します。

POKE#900,`00011100:RUN:'RED POKE#900,`11100000:RUN:'GREEN POKE#900,`00000011:RUN:'BLUE

やってみると一目瞭然。`から始まる8bitの2進数、あれこれいじって試してみましょう。

FOR I=0 TO 255:POKE#900+I,I:NEXT:RUN

256色、全部表示

100 POKE#900+RND(256),RND(256):U=USR(#700,0):CONT GOTO100

ランダム

100 POKE#900+31+32*RND(8),RND(256):U=USR(#700,0):SCROLL LEFT:CONT GOTO100

流星

COPY#F00,#900,#100:SAVE

32x8の画面をプログラム領域末尾に保存

10 CLS:LC0,8:COPY#900,#F00,#100:U=USR(#700,0)

このプログラムと一緒に保存しておくと、ドライバ設定後、32x8の画面を読み出して、WS2812B表示として復元可能!

好きな文字をスクロール表示する、電光掲示板プログラム

50 CLS:S=" IchigoJam":POKES+1,255:P=0:C=RND(256) 60 A=ASC(S+P/8):FORI=0TO7:N=PEEK(A*8+I):POKE#900+31+I*32,N>>(7-P&7)&1*C:NEXT 70 U=USR(#700,0):SCROLL LEFT:P=P+1:P=P%(LEN(S)*8):IF !P C=RND(256) 80 GOTO 60

Armマシン語ドライバ解説と応用
32x8のマトリクス状にならんだWS2812B、配線のしやすさからか、ジグザグに並んでいました。

一番上の行は左から右につながっていて、2行目は折り返して右から左へとつながっている。

色の8bit対応と、ジグザグに対応したドライバのasm15表記のArmマシン語コードがこちら。

' OUT1用 WS2812B 32x8 @OUTを変更でOUT1-4で変更可能、パラメータは0を指定 ' R0 - data count ' R1 - data address #900(VRAM)から1byte 1pixel G3bit,R3bit,B2bit ' R2 - temp OUT value 0/#FF, & 15 ' R3 - data value, temp ' R4 - GPIO address ' R5 - bit count ' R6 - wait count buf ' R7 - wait count ' R12 - increment or decrement address @WS2812B PUSH {LR,R4,R5,R6,R7} CPSID R4=9 R4=R4<<8 R1=R1+R4 R4=1 R12=R4 R4=[@OUT]L @LOOP_DATA R3=[R1] ' G R3=R3>>5 GOSUB @SEND_BYTE R3=[R1] ' R R3=R3>>2 R2=7 R3&=R2 GOSUB @SEND_BYTE R3=[R1] ' B R2=3 R3&=R2 R3=R3<<1 GOSUB @SEND_BYTE R1+=R12 R0+=1 R2=31 R0&R2 IF !0 GOTO @LOOP_DATA R2=R0>>5 R2-8 IF 0 GOTO @END R1+=31 R3=1 R5=-R3 R12=R5 R2&R3 IF !0 GOTO @LOOP_DATA R1+=2 R12=R3 GOTO @LOOP_DATA @END CPSIE POP {PC,R4,R5,R6,R7} @SEND_BYTE R5=#80 R3=R3<<2 ' 数を大きくするともっと明るくなる @LOOP_BIT R2=#FF [R4]L=R2 R7=3 '(3*4+1)=13 <- 16.8+-7.2 R6=9 '(9*4+1)=37 <- 43.2+-7.2 R3&R5 IF 0 GOTO @SKIP R7=9 '(9*4+1)=37 <- 43.2+-7.2 R6=3 '(3*4+1)=13 <- 16.8+-7.2 @SKIP R7-=1 'wait R7*4+1 clock IF !0 GOTO -1 R2=0 [R4]L=R2 R6-=1 'wait R6*4+1 clock IF !0 GOTO -1 R5=R5>>1 IF !0 GOTO @LOOP_BIT RET @OUT DATA L #50010004

R0〜R15まで16コあるレジスタ、R8〜R15は使える命令が5コに制限されます。(Cortex-M0 Armマシン語表より)

Rd=Rm Rd+=Rm Rn-Rm GOTO Rm GOSUB Rm

32コデータを送信する毎に、壊しちゃってOKなR12を使って1足したり1引いたりすることで命令数をできるだけ少なく作っています。
(R8,R9,R10,R11:マシン語から戻るときに元の値にしておけば自由に使ってOK、R12:破壊してOK、R13:スタックレジスタ、R14:リンクレジスタ、R15:プログラムカウンタ)

1Mbit、EEPROMからデータを流し込んで動画にするのも楽しそうですね!
32x8の場合256byteなので、128KBで512枚分、秒間10コマで51.2秒分作成可能。

R2-8 を R2-16 や、R2-24 に変更すれば 32x8 を2つ(32x16)や3つ(32x24)接続した大スクリーンにも対応できます。
フルカラーLED、WS2812B 16x16 をあやつるマシン語プログラムのパッチ(差分) on IchigoJam」(追記)

変数の保存を諦めれば、#800の変数領域から1KB使った32x32送信もいけちゃいます。(R4=9をR4=8に変更)

コンパクトなArmマシン語とお手軽なIchigoJam BASICの使いわけ、楽しいですよ!
はじめてのマシン語 - IchigoJamではじめるARMマシン語その1

Kawaii Programmable Game Machine 'Pokitto' - フィンランド生まれのArm Cortex-M0+搭載モバイルゲーム機でかわくだりゲーム

2018/01/29 23:55:00
#arm #game 

Maker Faire Bay Area 2017、お向かいで展示していたかわいいゲーム機、Pokittoが到着!
I got a cute game machine Pokitto exhibited our other side at Maker Faire Bay Area 2017.

IchigoJamのかわくだりゲームを移植してみました。
I translated the KAWAKUDARI (rafting) GAME program from IchigoJam.


It's nice work with game controller - 10字キーの操作感がいい感じ!

main program of KAWAKUDARI GAME on POKITTO - かわくだりゲームPokitto版

int main() { pkt.begin(); pkt.display.setColor(1); cls(); int x = 12; while (pkt.isRunning()) { if (pkt.update()) { if (scr(x, 5)) { wait(1); x = 12; cls(); } if (pkt.buttons.rightBtn()) { x++; } else if (pkt.buttons.leftBtn()) { x--; } lc(x, 5); print(CHAR_ME); lc(random(sw), sh - 1); print(CHAR_ENEMY); scrollUp(); draw(); } } }

for Mbed LPC11U68 using PokittoLib (tutorial and API)


It's works! - 動きました!


Just pressing C button to load and run your program if you put your bin file to the micro SD card. マイクロSDカードにbinファイルを入れておけば、起動後にスタートボタン的場所にあるCボタンを押してローダーから起動可能!


Cute document! - 付属のドキュメントもかわいい!
My favorite game 'CRABATOR' - お気に入りのミニRPG


How cute this PCB is! - なんとかわいいプリント基板!


Arm Cortex-M0+ / LPC11U68 RAM36KB ROM256KB!

all program of KAWAKUDARI GAME on POKITTO for Mbed - かわくだりゲームPokitto版

#include "Pokitto.h" Pokitto::Core pkt; const int sw = 27; const int sh = 24; uint8_t buf[sw * sh]; void cls() { for (int i = 0; i < sw * sh; i++) buf[i] = 0; } int lx, ly; void lc(int x, int y) { lx = x; ly = y; } void print(char c) { buf[lx + ly * sw] = c; } void scrollUp() { for (int i = sw; i < sw * sh; i++) buf[i - sw] = buf[i]; for (int i = sw * sh - sw; i < sw * sh; i++) buf[i] = 0; } void draw() { for (int i = 0; i < sw * sh; i++) { int x = i % sw; int y = i / sw; pkt.display.bufferChar(x * 8 + 4, y * 8, (char)buf[i]); } } int scr(int x, int y) { return buf[x + y * sw]; } #define CHAR_ME 32 #define CHAR_ENEMY 10 int main() { pkt.begin(); pkt.display.setColor(1); cls(); int x = 12; while (pkt.isRunning()) { if (pkt.update()) { if (scr(x, 5)) { wait(1); x = 12; cls(); } if (pkt.buttons.rightBtn()) { x++; } else if (pkt.buttons.leftBtn()) { x--; } lc(x, 5); print(CHAR_ME); lc(random(sw), sh - 1); print(CHAR_ENEMY); scrollUp(); draw(); } } }

links
- POKITTO
- Pokitto - easy-to-learn and program Gaming Gadget! by Daniel deBeer — Kickstarter
- 十字キー+ABボタンでゲームを自作——ARMマイコン搭載ゲームコンソール「Pokitto」 | fabcross
- IchigoJam - BEST IN CLASS at Maker Faire Bay Area 2017 / メイカーフェアで教育優秀賞受賞!

Armマシン語でライフゲーム - IchigoJamとRaspberry Pi用IchigoJam RPi(beta)で動く!

2018/01/28 23:55:00
#arm #IchigoJam #rasppi 

1995年のMSX-FANで出会ってから、シンプルな法則から生まれる多彩な結果に魅了されたライフゲーム。
一日一創でも、広大なライフゲームチェックボックスでつくったもの光の3原色をレイヤー表示したものなど作ってました。

IchigoJam BASICでも、10x10くらいなら配列を使ったプログラミングの練習にもちょうどいい感じでできます。
シミュレーション入門 / こどもパソコン IchigoJam でつくるライフゲーム
IchigoJam でも IchigoJam RPi(1.2b16以降) でも同じプログラムで動きます!

IchigoJam-FANにて、紹介あったArmマシン語でサクサク全画面で動くライフゲーム!
IchigoJam RPi vs LPC1114 マシン語ルーチンで動作違いを確認(戻り値の動き)
asm15 assembly表記にしてみました。

こちらちょうど1kbyte(=1024byte)になったライフゲームプログラム。(ベースプログラム by KubotaProject

1 'L-GAME 10 POKE#7D0,240,181,132,70,0,32,0,35,0,36,37,0,0,38,45,66,6,208,1,45,4,208,2,45,2,208,3,61,1,54,246,231,66,9,87,1,199,27,2,180 20 POKE#7F8,0,33,18,66,4,209,54,66,9,209,23,33,73,1,6,224,22,42,4,209,2,46,2,209,23,33,73,1,73,66,63,66,3,209,45,66,6,209,32,49 30 POKE#820,4,224,31,47,2,209,2,45,0,209,32,57,10,0,2,188,23,24,127,25,32,37,110,67,191,25,33,63,9,34,18,2,191,24,125,92,101,69,0,209 40 POKE#848,1,51,1,52,9,44,196,209,143,36,36,1,100,90,198,8,247,0,199,27,53,25,7,38,246,27,111,92,132,24,1,34,178,64,102,92,102,69,7,209 50 POKE#870,3,43,9,208,4,43,7,208,255,36,98,64,23,64,2,224,3,43,1,209,23,67,111,84,64,28,66,9,23,42,162,209,0,224,132,70,0,32,9,34 60 POKE#898,18,2,143,35,27,1,91,90,0,36,230,8,247,0,231,27,245,24,7,38,246,27,111,92,247,64,1,37,47,64,165,24,1,47,1,209,64,28,103,70 70 POKE#8C0,111,84,100,28,101,9,23,45,235,209,240,189 100 CLS:S=#700:W=0:FORI=0TO95:POKES+I,0:NEXT 110 FORI=0TO255:G=RND(736):M=G/8+S:F=7-G%8:R=PEEK(M):R=R|1<<F:POKEM,R:NEXT 120 WAIT3:LC0,23:?DEC$(USR(#7D0,#ED),5);:CONT

#700からのメモリに1マス1bitの生命データを置き、USRのマシン語読み出しで1世代進めています。
asm15形式にした、Armマシン語プログラムはこちら。(ベースプログラム by KubotaProject

' LIFE GAME - START ADDRESS #7D0 PUSH {LR,R4-R7} R12=R0 R0=0 @LP0 R3=0 R4=0 @LP1 R5=R4<<0 R6=0 @LP2 R5&R5 IF 0 GOTO @JP1 R5-1 IF 0 GOTO @JP1 R5-2 IF 0 GOTO @JP1 R5-=3 R6+=1 GOTO @LP2 @JP1 R2=R0>>5 R7=R2<<5 R7=R0-R7 PUSH {R1} R1=0 @TOP R2&R2 IF !0 GOTO @BOTTOM R6&R6 IF !0 GOTO @LEFT R1=23 R1=R1<<5 GOTO @LEFT @BOTTOM R2-22 IF !0 GOTO @LEFT R6-2 IF !0 GOTO @LEFT R1=23 R1=R1<<5 R1=-R1 @LEFT R7&R7 IF !0 GOTO @RIGHT R5&R5 IF !0 GOTO @JP5 R1+=32 GOTO @JP5 @RIGHT R7-31 IF !0 GOTO @JP5 R5-2 IF !0 GOTO @JP5 R1-=32 @JP5 R2=R1<<0 POP {R1} R7=R2+R0 R7=R7+R5 R5=#20 R6*=R5 R7=R7+R6 R7-=#21 R2=9 R2=R2<<8 R7=R7+R2 R5=[R7+R1] R5-R12 IF !0 GOTO @JP2 R3+=1 @JP2 R4+=1 R4-9 IF !0 GOTO @LP1 @PREP R4=143 R4=R4<<4 R4=[R4+R1]W R6=R0>>3 R7=R6<<3 R7=R0-R7 R5=R6+R4 R6=7 R6=R6-R7 R7=[R5+R1] R4=R0+R2 R2=1 R2<<=R6 @JUDGE R6=[R4+R1] R6-R12 IF !0 GOTO @JPB R3-3 IF 0 GOTO @JP3 R3-4 IF 0 GOTO @JP3 @DEATH R4=#FF R2^=R4 R7&=R2 GOTO @JPMEM @JPB R3-3 IF !0 GOTO @JP3 R7|=R2 @JPMEM [R5+R1]=R7 @JP3 R0=R0+1 R2=R0>>5 R2-23 IF !0 GOTO @LP0 GOTO @JPX2 @MEM2VRAM R12=R0 @JPX2 R0=0 R2=9 R2=R2<<8 R3=#8F R3=R3<<4 R3=[R3+R1]W R4=0 @LPX1 R6=R4>>3 R7=R6<<3 R7=R4-R7 R5=R6+R3 R6=7 R6=R6-R7 R7=[R5+R1] R7>>=R6 R5=1 R7&=R5 R5=R4+R2 R7-1 IF !0 GOTO @JPX1 R0=R0+1 R7=R12 @JPX1 [R5+R1]=R7 R4=R4+1 R5=R4>>5 R5-23 IF !0 GOTO @LPX1 POP {PC,R4-R7}

asm15 assemblerでアセンブルできます。

asm15 assemblerのアップデート
- R8からR15レジスタに未対応の一部命令を追加しました。
- レジスタに代入できるのは8bit/1byteの符号なし定数までなど、範囲制限のある数値で超える場合にエラーが出るようにしました。

IchigoJam、ラズパイ、スマホで動くArmマシン語、興味持った方はこちらからどうぞ!
はじめてのマシン語 - IchigoJamではじめるARMマシン語その1

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