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

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

2018/01/28
#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