MAP	equ	$9000
WIDTH	equ	160
HEIGHT	equ	100
 
;-------+-------+-------+-------+-------+
 
	org	$d000
 
start	proc
	local	L1
 
	call	init
L1:
	call	update
	call	check
	jp	L1
	endp
 
;-------+-------+-------+-------+-------+
 
init	proc
	local	L1,L2,L3,L4
				; MAP 0クリア
	ld	hl, MAP
	ld	(hl), $00
	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
	jr	z, L3		; if (x == 0) break
 
	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), $03
	pop	hl
	jp	L1
L3:
				; セミグラフィック
	ld	hl, $f300+81
	ld	de, 120
	ld	b, 25
L4:
	ld	(hl), $80
	add	hl, de
	djnz	L4
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
check	proc
	local	L1,L2,L9
 
	ld	hl, MAP+WIDTH*2+2
	ld	c, HEIGHT-4
L1:
	ld	b, WIDTH-4
L2:
	bit	7, (hl)
	jr	z, L9
 
	push	hl
 
;	ld	de, -WIDTH-1
	ld	de, -(WIDTH+1)
	add	hl, de
	inc	(hl)
	inc	hl
	inc	(hl)
	inc	hl
	inc	(hl)
 
	ld	de, WIDTH-2
	add	hl, de
	inc	(hl)
	inc	hl
	inc	hl
	inc	(hl)
 
	add	hl, de
	inc	(hl)
	inc	hl
	inc	(hl)
	inc	hl
	inc	(hl)
 
	pop	hl
L9:
	inc	hl
	djnz	L2
 
	ld	de, 4
	add	hl, de
	dec	c
	jp	nz, L1
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
update	proc
	local	L1,L2,L3,L4,L5,L6,L7
 
	ld	hl, $f300
	ld	(pline), hl
 
	ld	hl, MAP
	ld	b, 0
L1:
	ld	c, 0
L2:
	ld	a, (hl)
	or	a
	jp	m, L4
				; if (a >= 0)
	cp	3
	jr	z, L3
				; count != 3
	ld	(hl), $00
	jp	L6
L3:				; count == 3
	call	pset
	ld	(hl), $80
	jp	L6
L4:				; if (a < 0)
	and	$0e
	cp	$02
	jr	z, L5
				; count != 2or3
	call	preset
	ld	(hl), $00
	jp	L6
L5:				; count == 2or3
	ld	(hl), $80
L6:
	inc	hl
 
	inc	c
	ld	a, c
	cp	WIDTH
	jp	nz, L2
 
	inc	b
	ld	a, b
	and	$03
	jr	nz, L7
	exx
	ld	hl, (pline)
	ld	de, 120
	add	hl, de
	ld	(pline), hl
	exx
L7:
	ld	a, b
	cp	HEIGHT
	jp	nz, L1
 
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
pset	proc
	push	hl
				; a = ((x&1)<<2) | (y&3)
	call	point
				; (hl) |= a
	or	(hl)
	ld	(hl), a
 
	pop	hl
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
preset	proc
	push	hl
 
	call	point
				; (hl) &= !a
	cpl
	and	(hl)
	ld	(hl), a
 
	pop	hl
	ret
	endp
 
;-------+-------+-------+-------+-------+
; in	c	x
;	b	y
; out	hl	vram
;	a	mask
point	proc
				; a = ((x&1)<<2) | (y&3)
	ld	a, c
	and	$01
	rlca
	rlca
	ld	e, a
	ld	a, b
	and	$03
	or	e
				; a = (mask + a)
	ld	hl, mask
	ld	e, a
	ld	d, 0
	add	hl, de
	ld	a, (hl)
				; hl = pline + x/2
	ld	hl, (pline)
	ld	e, c
	srl	e
;	ld	d, 0
	add	hl, de
 
	ret
	endp
 
;-------+-------+-------+-------+-------+
 
mask	db	$01,$02,$04,$08,$10,$20,$40,$80
 
pline	ds	2		; 行頭アドレス
 
data	db	36,12
	db	34,13, 36,13
	db	24,14, 25,14, 32,14, 33,14, 46,14, 47,14
	db	23,15, 27,15, 32,15, 33,15, 46,15, 47,15
	db	12,16, 13,16, 22,16, 28,16, 32,16, 33,16
	db	12,17, 13,17, 22,17, 26,17, 28,17, 29,17, 34,17, 36,17
	db	22,18, 28,18, 36,18
	db	23,19, 27,19
	db	24,20, 25,20
 
	db	24,75, 27,75
	db	23,76, 25,76, 26,76, 28,76
	db	24,77, 27,77
	db	24,78, 27,78
	db	23,79, 25,79, 26,79, 28,79
	db	24,80, 27,80
 
	db	130,30, 131,30, 132,30, 133,30, 134,30, 135,30, 136,30, 137,30, 138,30, 139,30
 
	db	150,90, 151,90, 152,90
 
	db	0,0
 
	end	start
 

10 ' life game
20 defint a-z:width 80,25:console ,,0,0:print chr$(12);
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,0C,D0,CD,77,D0,CD,47,D0,C3,03,D0,21,00,90,36
 1010 data 00,11,01,90,01,7F,3E,ED,B0,21,00,D1,4E,23,46,23
 1020 data 79,B7,28,15,E5,21,00,00,11,A0,00,19,10,FD,09,11
 1030 data 00,90,19,36,03,E1,C3,1C,D0,21,51,F3,11,78,00,06
 1040 data 19,36,80,19,10,FB,C9,21,42,91,0E,60,06,9C,CB,7E
 1050 data 28,19,E5,11,5F,FF,19,34,23,34,23,34,11,9E,00,19
 1060 data 34,23,23,34,19,34,23,34,23,34,E1,23,10,E0,11,04
 1070 data 00,19,0D,C2,4C,D0,C9,21,00,F3,22,FE,D0,21,00,90
 1080 data 06,00,0E,00,7E,B7,FA,9A,D0,FE,03,28,05,36,00,C3
 1090 data AA,D0,CD,CB,D0,36,80,C3,AA,D0,E6,0E,FE,02,28,08
 1100 data CD,D3,D0,36,00,C3,AA,D0,36,80,23,0C,79,FE,A0,C2
 1110 data 84,D0,04,78,E6,03,20,0C,D9,2A,FE,D0,11,78,00,19
 1120 data 22,FE,D0,D9,78,FE,64,C2,82,D0,C9,E5,CD,DC,D0,B6
 1130 data 77,E1,C9,E5,CD,DC,D0,2F,A6,77,E1,C9,79,E6,01,07
 1140 data 07,5F,78,E6,03,B3,21,F6,D0,5F,16,00,19,7E,2A,FE
 1150 data D0,59,CB,3B,19,C9,01,02,04,08,10,20,40,80,00,00
 1200 data 24,0C,22,0D,24,0D,18,0E,19,0E,20,0E,21,0E,2E,0E
 1210 data 2F,0E,17,0F,1B,0F,20,0F,21,0F,2E,0F,2F,0F,0C,10
 1220 data 0D,10,16,10,1C,10,20,10,21,10,0C,11,0D,11,16,11
 1230 data 1A,11,1C,11,1D,11,22,11,24,11,16,12,1C,12,24,12
 1240 data 17,13,1B,13,18,14,19,14,18,4B,1B,4B,17,4C,19,4C
 1250 data 1A,4C,1C,4C,18,4D,1B,4D,18,4E,1B,4E,17,4F,19,4F
 1260 data 1A,4F,1C,4F,18,50,1B,50,82,1E,83,1E,84,1E,85,1E
 1270 data 86,1E,87,1E,88,1E,89,1E,8A,1E,8B,1E,96,5A,97,5A
 1280 data 98,5A,00,00,*
 
最終更新:2019年11月09日 18:06
添付ファイル