use atari

type 
    scrx:0..39 
    scry:0..23 
    cellx:1..38
    celly:1..22

;screens
s1@$8000:array(scrx,scry) of byte
s2@$8400:array(scrx,scry) of byte
header:array(scrx,0) of byte
footerRun:array(scrx,0) of byte
footerEdit:array(scrx,1) of byte

;Display Lists
const gr0s1:array of dl_command =
	2 times BLANK8,
	CHR0+LMS, header,
	BLANK1 
	CHR0+LMS, s1, 
	23 times CHR0,
	BLANK1,
	CHR0+LMS,footerRun, 
	NEXT, gr0s1

const gr0s2:array of dl_command =
	2 times BLANK8,
	CHR0+LMS, header,
	BLANK1 
	CHR0+LMS, s2, 
	23 times CHR0, 
	BLANK1,
	CHR0+LMS,footerRun, 
	NEXT, gr0s2

const gr0edit:array of dl_command =
	2 times BLANK8,
	CHR0+LMS, header,
	BLANK1 
	CHR0+LMS, s1, 
	23 times CHR0, 
	BLANK1,
	CHR0+LMS,footerEdit,
	CHR0 
	NEXT, gr0s2

;random screen initialisation
smear:proc(mask:byte = 1) =
	for x:cellx
	    for y:celly
	        s1(x,y) = RANDOM bitand mask

edit:proc =
	SDLSTL = gr0edit
	x:cellx = 20
	y:celly = 12
	CH = none
	until CH = ESC
		buf = s1(x,y)
		bCH:KEY = CH bitand $7F ;[CONTROL] key is ignored
		if bCH <> $7F
			if bCH = 6 ;left
				if x>1 dec x ;x = x - 1
			else if bCH = 7 ;right
				if x<38 inc x ;x = x + 1
			else if bCH = 14 ;up
				if y>1 dec y ;y = y - 1
			else if bCH = 15 ;down
				if y<22 inc y ;y = y +1
			else if bCH = SPACE
				s1(x,y) = 1-buf
			else if bCH = DEL
				smear 0;s1 = 0
			else if bCH = R
				smear 1
			CH = none
		else
			s1(x,y) = "*"
			s1(x,y) = buf

;--------------------------------------------------------------------
;The rules are:
;Any alive cell that is touching less than two alive neighbours dies.
;Any alive cell touching four or more alive neighbours dies.
;Any alive cell touching two or three alive neighbours does nothing.
;Any dead cell touching exactly three alive neighbours becomes alive.


header(0,0)=   " Atalife - simple Life by pirx/5oft.pl  "
footerRun(0,0)="       Press [[Esc]] /[[E]] to edit.       "
footerEdit(0,0)="  Use cursor keys and [[Space]] to edit.  "
footerEdit(0,1)="[[Del]]-clear, [[R]]-random, [[Esc]]-continue."

smear 1
CH = none

main@

SDLSTL = gr0s1
for x:cellx
	for y:celly
		;life making
		v=s1(x-1,y-1)+s1(x,y-1)+s1(x+1,y-1)+s1(x-1,y)+s1(x+1,y)+s1(x-1,y+1)+s1(x,y+1)+s1(x+1,y+1)
		if s1(x,y) = 0
			if v=3 s2(x,y)=1
			else s2(x,y)=0
		else 
			if v<2 or v>3 s2(x,y)=0
			else s2(x,y)=1

SDLSTL = gr0s2
for x:cellx
	for y:celly
		;life making
		v=s2(x-1,y-1)+s2(x,y-1)+s2(x+1,y-1)+s2(x-1,y)+s2(x+1,y)+s2(x-1,y+1)+s2(x,y+1)+s2(x+1,y+1)
		if s2(x,y) = 0
			if v=3 s1(x,y)=1
			else s1(x,y)=0
		else 
			if v<2 or v>3 s1(x,y)=0
			else s1(x,y)=1

if CH = ESC or CH = E 
	edit
	CH = none

goto main
