MAP	equ	$c000
WIDTH	equ	40
HEIGHT	equ	24
 
;-------+-------+-------+-------+-------+
 
	org	$d000
 
start	proc
	local	L1
 
	call	init
L1:
	call	disp
	call	count
	call	check
	jp	L1
	endp
 
;-------+-------+-------+-------+-------+
 
init	proc
	local	L1,L2
				; MAP 0クリア
	ld	hl, MAP
	ld	(hl), 0
	ld	de, MAP+1
	ld	bc, WIDTH*HEIGHT-1
	ldir
				; 初期配置
	ld	hl, data
L1:
	ld	c, (hl)		; x
	inc	hl
	ld	b, (hl)		; y
	inc	hl
	ld	a, c
	or	a
	ret	z		; if (x == 0) return
 
	push	hl
	ld	hl, 0
	ld	de, WIDTH
L2:
	add	hl, de
	djnz	L2
	add	hl, bc
 
	ld	de, MAP
	add	hl, de		; hl = MAP + (WIDTH * y + x)
	ld	(hl), $80
	pop	hl
	jp	L1
	endp
 
;-------+-------+-------+-------+-------+
 
disp	proc
	local	L1,L2
 
	ld	hl, $f300
	ld	de, MAP
	ld	c, HEIGHT
L1:
	ld	b, WIDTH
L2:
	ld	a, (de)
	or	a
	ld	a, ' '
	jr	z, L3
	ld	a, '*'
L3:
	ld	(hl), a
	inc	hl
	inc	hl
	inc	de
	djnz	L2
 
	push	de
	ld	de, 40
	add	hl, de
	pop	de
	dec	c
	jp	nz, L1
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
count	proc
	ld	de, MAP
	call	count2
	ld	de, MAP+1
	call	count2
	ld	de, MAP+2
	call	count2
	ld	de, MAP+WIDTH
	call	count2
	ld	de, MAP+WIDTH+2
	call	count2
	ld	de, MAP+WIDTH*2
	call	count2
	ld	de, MAP+WIDTH*2+1
	call	count2
	ld	de, MAP+WIDTH*2+2
	call	count2
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
count2	proc
	local	L1,L2,L3
 
	ld	hl, MAP+WIDTH+1
	ld	c, HEIGHT-2
L1:
	ld	b, WIDTH-2
L2:
	ld	a, (de)
	or	a
	jp	p, L3
	inc	(hl)
L3:
	inc	hl
	inc	de
	djnz	L2
 
	inc	hl
	inc	hl
	inc	de
	inc	de
	dec	c
	jp	nz, L1
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
check	proc
	local	L1,L2,L3,L4,L5
 
	ld	hl, MAP+WIDTH+1
	ld	de, 0
	ld	c, HEIGHT-2
L1:
	ld	b, WIDTH-2
L2:
	ld	a, (hl)
	ld	(hl), 0
	or	a
	jp	m, L3
				; if (a >= 0)
	cp	3		; count == 3
	jr	z, L4
	jp	L5
L3:				; if (a < 0)
	and	$0f
	cp	2		; count == 2or3
	jr	z, L4
	cp	3
	jp	nz, L5
L4:
	ld	(hl), $80
;	inc	de		; life++
L5:
	inc	hl
	djnz	L2
 
	inc	hl
	inc	hl
	dec	c
	jp	nz, L1
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
data	db	26,2
	db	24,3, 26,3
	db	14,4, 15,4, 22,4, 23,4, 36,4, 37,4
	db	13,5, 17,5, 22,5, 23,5, 36,5, 37,5
	db	2,6, 3,6, 12,6, 18,6, 22,6, 23,6
	db	2,7, 3,7, 12,7, 16,7, 18,7, 19,7, 24,7, 26,7
	db	12,8, 18,8, 26,8
	db	13,9, 17,9
	db	14,10, 15,10
 
	db	4,15, 7,15
	db	3,16, 5,16, 6,16, 8,16
	db	4,17, 7,17
	db	4,18, 7,18
	db	3,19, 5,19, 6,19, 8,19
	db	4,20, 7,20
 
	db	16,20, 17,20, 18,20
 
	db	0,0
 
	end	start
 

10 ' life game
20 defint a-z:width 40,25
30 p=&hd000:def usr=p
40 read d$:if d$<>"*" then poke p,val("&h"+d$):p=p+1:goto 40
50 a=usr(0)
 
 1000 data CD,0F,D0,CD,3B,D0,CD,5E,D0,CD,A9,D0,C3,03,D0,21
 1010 data 00,C0,36,00,11,01,C0,01,BF,03,ED,B0,21,D8,D0,4E
 1020 data 23,46,23,79,B7,C8,E5,21,00,00,11,28,00,19,10,FD
 1030 data 09,11,00,C0,19,36,80,E1,C3,1F,D0,21,00,F3,11,00
 1040 data C0,0E,18,06,28,1A,B7,3E,20,28,02,3E,2A,77,23,23
 1050 data 13,10,F2,D5,11,28,00,19,D1,0D,C2,43,D0,C9,11,00
 1060 data C0,CD,8F,D0,11,01,C0,CD,8F,D0,11,02,C0,CD,8F,D0
 1070 data 11,28,C0,CD,8F,D0,11,2A,C0,CD,8F,D0,11,50,C0,CD
 1080 data 8F,D0,11,51,C0,CD,8F,D0,11,52,C0,CD,8F,D0,C9,21
 1090 data 29,C0,0E,16,06,26,1A,B7,F2,9C,D0,34,23,13,10,F6
 1100 data 23,23,13,13,0D,C2,94,D0,C9,21,29,C0,11,00,00,0E
 1110 data 16,06,26,7E,36,00,B7,FA,C1,D0,FE,03,28,0E,C3,CE
 1120 data D0,E6,0F,FE,02,28,05,FE,03,C2,CE,D0,36,80,23,10
 1130 data E2,23,23,0D,C2,B1,D0,C9,1A,02,18,03,1A,03,0E,04
 1140 data 0F,04,16,04,17,04,24,04,25,04,0D,05,11,05,16,05
 1150 data 17,05,24,05,25,05,02,06,03,06,0C,06,12,06,16,06
 1200 data 17,06,02,07,03,07,0C,07,10,07,12,07,13,07,18,07
 1210 data 1A,07,0C,08,12,08,1A,08,0D,09,11,09,0E,0A,0F,0A
 1220 data 04,0F,07,0F,03,10,05,10,06,10,08,10,04,11,07,11
 1230 data 04,12,07,12,03,13,05,13,06,13,08,13,04,14,07,14
 1240 data 10,14,11,14,12,14,00,00,*
 
最終更新:2019年11月06日 11:01
添付ファイル