2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

何をするのか

IchigoJamでライフゲームの世代交代の計算をする。

ライフゲーム - Wikipedia

正方形のグリッドにおいて、各マスは「生」または「死」の状態をとる。
世代交代とは、

  • 「生」のマスは、8近傍の「生」のマスの数が2または3なら「生」のまま、そうでないなら「死」になる
  • 「死」のマスは、8近傍の「生」のマスの数が3なら「生」になり、そうでないなら「死」のまま

という計算である。
今回は白で「生」を、黒で「死」を表現した。

BASICでやってみた

今回は、「女王蜂」の両側に「ブロック」を配置し、30世代周期でもとに戻るパターンを用意した。
1個だと寂しいので、左右反転して2個並べてみた。

ブロック (ライフゲーム) - Wikipedia

↓「女王蜂」はここを参照した。
シャトル (ライフゲーム) - Wikipedia

まず、配列に初期パターンを格納する。
その後、「配列のデータをVRAMに反映する → VRAMのデータをもとに配列のデータを更新する」を繰り返す。

ソースコード

10 'ライフゲーム
20 LET[0],0,0,0,0,0,0,0,0,0,#4000,0,#5000,0,#2800,#600,#2460
30 LET[16],#600,#2860,0,#5000,0,#4000,0,0,0,0,2,0,#A,0,#614,#60
40 LET[32],#624,#60,#14,0,#A,0,2,0,0,0,0,0,0,0,0,0
50 G=0
60 FOR I=0 TO #2FF
70 POKE#900+I,([I/16]>>(15-I%16))&1
80 NEXT
90 LOCATE0,0:?G
100 POKE#909,#5B:POKE#91F,#5D
110 FOR I=0 TO 47:[I]=0:NEXT
120 FOR Y=2 TO 22:FOR X=1 TO 30
130 P=#900+Y*32+X:C=PEEK(P-33)+PEEK(P-32)+PEEK(P-31)+PEEK(P-1)+PEEK(P+1)+PEEK(P+31)+PEEK(P+32)+PEEK(P+33)
140 IF C=3 OR (PEEK(P) AND C=2) K=Y*2+X/16:[K]=1<<(15-X%16)|[K]
150 POKE#908+Y,#23:NEXT:NEXT
160 WAIT 6
170 G=G+1:IF G>9999 G=0
180 GOTO 60

実行結果

YouTube動画 (14分16秒)
実行結果(YouTube)

30世代の計算を行うのに、約13分32秒(812秒)かかった。

マシン語でやってみた

BASIC版は頑張っている感はあるものの遅すぎて実用的でないため、
「配列のデータをVRAMに反映する」「VRAMのデータをもとに配列のデータを更新する」それぞれをマシン語に移植してみた。

埋め込んだマシン語のソースコード

@START
	R3 = PC + 64 ' 配列の先頭アドレス (コードは#700から)
	R2 = R3 + 1
	R2 += 255 ' VRAMの先頭アドレス
	R0 & R0
	IF !0 GOTO @UPDATE
	' 描画処理を行う
	R12 = R4
	R1 = 3
	R1 = R1 << 8 ' カウンタ
	R1 -= 1
@DRAW_LOOP
	R0 = [R3 + 0]W
	R4 = 15
	R4 &= R1
	IF !0 GOTO @DRAW_LOOP_NOARRAYINC
	R3 += 2
@DRAW_LOOP_NOARRAYINC
	R0 >>= R4
	R4 = 1
	R0 &= R4
	[R2 + 0] = R0
	R2 += 1
	R1 -= 1
	IF CS GOTO @DRAW_LOOP
	R4 = R12
	RET
@UPDATE
	' 更新処理を行う
	PUSH {R4, R5, R6, R7}
	R0 = 92
	R1 = 0
@UPDATE_INIT_LOOP
	[R3 + R0]L = R1
	R0 -= 4
	IF CS GOTO @UPDATE_INIT_LOOP
	R6 = R2
	R6 -= 33
	R4 = 2
@UPDATE_OUTER_LOOP
	R5 = 1
@UPDATE_INNER_LOOP
	R0 = R4 << 5
	R0 = R0 + R5
	R0 = R0 + R6
	R1 = [R0 + 0]
	R7 = [R0 + 1]
	R1 = R1 + R7
	R7 = [R0 + 2]
	R1 = R1 + R7
	R0 += 64
	R7 = [R0 + 0]
	R1 = R1 + R7
	R7 = [R0 + 1]
	R1 = R1 + R7
	R7 = [R0 + 2]
	R1 = R1 + R7
	R0 -= 32
	R7 = [R0 + 0]
	R1 = R1 + R7
	R7 = [R0 + 2]
	R1 = R1 + R7
	R1 - 3
	IF EQ GOTO @UPDATE_LIVE
	R1 - 2
	IF NE GOTO @UPDATE_CONTINUE
	R7 = [R0 + 1]
	R7 & R7
	IF 0 GOTO @UPDATE_CONTINUE
@UPDATE_LIVE
	R0 = R4 << 1
	R1 = R5 >> 4
	R0 = R0 + R1
	R0 = R0 << 1
	R0 = R0 + R3
	R1 = 15
	R1 &= R5
	R7 = 15
	R7 = R7 - R1
	R1 = 1
	R1 <<= R7
	R7 = [R0 + 0]W
	R7 |= R1
	[R0 + 0]W = R7
@UPDATE_CONTINUE
	R5 += 1
	R5 - 30
	IF LS GOTO @UPDATE_INNER_LOOP
	R4 += 1
	R4 - 22
	IF LS GOTO @UPDATE_OUTER_LOOP
	POP {R4, R5, R6, R7}
	RET

ソースコード

10 'ライフゲーム (マシンゴ ver.)
20 LET[0],0,0,0,0,0,0,0,0,0,#4000,0,#5000,0,#2800,#600,#2460
30 LET[16],#600,#2860,0,#5000,0,#4000,0,0,0,0,2,0,#A,0,#614,#60
40 LET[32],#624,#60,#14,0,#A,0,2,0,0,0,0,0,0,0,0,0
50 POKE#700,63,163,90,28,255,50,0,66,17,209,164,70,3,33,9,2,1,57,24,136,15,36,12,64,0,209,2,51,224,64,1,36,32,64,16,112,1,50,1,57,243,210,100,70,112,71,240,180,92,32,0,33,25,80,4,56,252,210,22,70
60 POKE#73C,33,62,2,36,1,37,96,1,64,25,128,25,1,120,71,120,201,25,135,120,201,25,64,48,7,120,201,25,71,120,201,25,135,120,201,25,32,56,7,120,201,25,135,120,201,25,3,41,4,208,2,41,16,209,71,120,63,66
70 POKE#776,13,208,96,0,41,9,64,24,64,0,192,24,15,33,41,64,15,39,127,26,1,33,185,64,7,136,15,67,7,128,1,53,30,45,211,217,1,52,22,44,207,217,240,188,112,71
80 G=0
90 I=USR(#700,0)
100 LOCATE0,0:?G
110 I=USR(#700,1)
120 WAIT 6
130 G=G+1:IF G>9999 G=0
140 GOTO 90

実行結果

YouTube動画 (0分42秒)
実行結果(YouTube)

30世代の計算をするのに、約3秒しかかからなかった。
BASIC版の約270倍速いということである…といいたいところだが、ここには`WAIT 6`の時間も含まれる。
これは0.1秒待つということなので、30世代で3秒待つ…すなわち、計算時間はほぼゼロになってしまった。
マシン語つよい。 (BASICがよわい?)

IchigoJamとは

2,000円前後で購入することができ、BASICによるプログラミングが可能なパソコン。
こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)

また、プログラムをWebブラウザ上で実行できるサービスもある。
IchigoJam web by WebAssembly
※マシン語を用いるプログラムは、今のところこのサービスでは動かない

※「IchigoJam」はjig.jpの登録商標

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?