Compucolor.org – Virtual Media

Listing of file='GROW.MAC;03' on disk='vmedia/life2-sector.ccvf'

;===========================================================
;
;	DEVELOP AND DISPLAY NEXT GENERATION
;
;===========================================================
;
BEGSC	EQU	24576
BEGWR	EQU	24704
ENDWR	EQU	28443
ENDSC	EQU	28671
CENTSC	EQU	26686

	PUBLIC	BEGSC,BEGWR,ENDWR,ENDSC,CENTSC

READY	EQU	81FFH
KBCHA	EQU	81FEH

CURSCCI EQU	8
NORMCCI	EQU	2
CR	EQU	13
INDIV	EQU	42	;INDIVIDUAL IN WORLD
BLANK	EQU	32

	EXTRN	BMPCNT,GETCH,INDEX,JMPTAB,OSTR

	ENTRY	GROW

GROW:	LXI	H,GENERLINE
	CALL	OSTR
	LXI	H,BOTTOM2
	CALL	OSTR
	LHLD	CURSLOC	;CLEAR CURSOR CCI
	INX	H
	MVI	M,NORMCCI
;
;CLEAR NEIGHBOR COUNT SPACE
;
GEN:	DI
	LXI	H,0
	DAD	SP
	SHLD	SAVSTK
	MVI	A,128
	LXI	D,0
	LXI	SP,FINNCS
CLRNCS: PUSH	D
	PUSH	D
	PUSH	D
	PUSH	D
	PUSH	D
	PUSH	D
	PUSH	D
	PUSH	D
	DCR	A
	JNZ	CLRNCS
	LHLD	SAVSTK
	SPHL
	EI
;
;	 MAIN LIFE ALGORITHM
;
	MVI	A,1
	STA	DEAD
	LXI	D,BEGNCS
	LXI	H,BEGWR
LLOOP:	MOV	A,M
	CPI	INDIV	;INDIVID. PRESENT?
	JNZ	NOINDIV
	XRA	A
	STA	DEAD		;LIFE PRESENT IN GENERATION
	XCHG

	LXI	B,-65
	DAD	B
	INR	M
	INX	H
	INR	M
	INX	H
	INR	M
	LXI	B,126
	DAD	B
	INR	M
	INX	H
	INR	M
	INX	H
	INR	M
	LXI	B,-64
	DAD	B
	INR	M
	DCX	H
	DCX	H
	INR	M
	INX	H	;SET BACK TO ORIG
	XCHG		;ALL NEIGHBORS FOR THIS SPACE INCREMENTED
NOINDIV:
	INX	H
	INX	H	;NEXT SCREEN LOC.
	INX	D	;NEXT NCS LOC.
	MOV	A,H
	CPI	70H	;CHK FOR END OF SCREEN
	JNZ	LLOOP
;
;	CHECK FOR STABLE WORLD
;
	LDA	SCHK	;DO WE WANT TO DO STABLITY CHECK?
	ORA	A
	JNZ	LIVEDIE		;NO
	LXI	H,BEGNCS
	LXI	D,STBCHK
	LXI	B,ENDNCS-BEGNCS
SCLOOP: MOV	A,M
	XCHG
	CMP	M	;SAME?
	JNZ	MVSTAB	;NO.
	INX	H
	XCHG
	INX	H
	DCX	B
	MOV	A,C
	ORA	B
	JNZ	SCLOOP
	MVI	A,2
	STA	DEAD	;INDICATE STABLE WORLD

;	SAVE COUNT SPACE FOR NEXT STABILITY CHECK

MVSTAB:
	LXI	H,BEGNCS
	LXI	D,STBCHK
	LXI	B,ENDNCS-BEGNCS
MVSLOOP:
	MOV	A,M
	XCHG
	MOV	M,A
	INX	H
	XCHG
	INX	H
	DCX	B
	MOV	A,C
	ORA	B
	JNZ	MVSLOOP
;
;	DETERMINE WHO LIVES AND WHO DIES
;
LIVEDIE:
	LXI	H,BEGNCS
	LXI	B,ENDNCS-BEGNCS
	LXI	D,BEGWR
DLOOP:	MOV	A,M	;CHECK NEIGHBOUR COUNT
	CPI	3
	JNZ	NOT3
	XCHG		 ;THIS SPACE LIVES
	MVI	M,INDIV
	XCHG
	JMP	EGEN
NOT3:	CPI	2
	JZ	EGEN	;THIS SPACE DIES
	XCHG
	MVI	M,BLANK
	XCHG
EGEN:	INX	H	;NEXT NCS SPACE
	INX	D	;NEXT SCREEN SPACE
	INX	D
	DCX	B
	MOV	A,C
	ORA	B	;ZERO YET?
	JNZ	DLOOP	;NO
;
	LXI	H,LOWORD	;INCREMENT GENERATION NO.
	CALL	BMPCNT

;==========================================================
;
;	END?
;
	LDA	DEAD
	ORA	A	;CHECK FOR DEAD OR STABLE WORLDS
	JZ	CHKEYS		;NO
	CPI	1
	JNZ	ND
	LXI	H,DEADMSG	;DEAD
	CALL	OSTR
	RET

ND:	CPI	2
	JNZ	CHKEYS
	LXI	H,STBMSG	;STABLE
	CALL	OSTR
	RET

CHKEYS: LDA	KBCHA
	LXI	H,CMNDS
	CALL	INDEX
	JNZ	GEN

	LXI	H,CMDADR
	CALL	JMPTAB
	PCHL

CHECK:	MVI	A,0	;DO STABILITY CHK
	STA	SCHK
	JMP	GEN

NOCHK:	MVI	A,255
	STA	SCHK	;DO NOT DO STABILITY CHECK
	JMP	GEN	;NEXT GENERATION

ONESTP:	XRA	A
	STA	READY
	CALL	GETCH	;WAIT FOR NEXT CHARACTER
	JMP	GEN	;DO NEXT GENERATION

STOP:	LXI	H,STOPMSG
	CALL	OSTR
	RET


;------------------------DATA-------------------------------
;
;	LIST OF VALID COMMANDS
;
CMNDS:	DB	'C'	;DO STABILITY CHECK
	DB	'N'	;NO STABILITY CHECK
	DB	'O'	;ONE-STEP
	DB	'P'	;PAUSE
	DB	'S'	;STOP
	DB	0	;END OF LIST
;
;	JUMP TABLE FOR COMMANDS
;
CMNADR:	DW	CHECK
	DW	NOCHK
	DW	ONESTP
	DW	CHKEYS
	DW	STOP
;
;	MESSAGES
;
TOP1:
	DB	8,6,22H,11,3,20,0
	DB	'PRESS RETURN TO GENERATE AN INDIVIDUAL'
	DB	6,NORMCCI,239
BOTTOM1:
	DB	3,0,31,6,22H,11,3,20,31
	DB	'PRESS R TO RUN'
	DB	6,NORMCCI,3,64,0,239
DEADMSG:
	DB	3,31,31,11,3,31,31,6,1
	DB	'  WORLD DIED  ',239
STBMSG:
	DB	3,31,31,11,3,31,31,6,4
	DB	'  WORLD STABILIZED  ',239
GENERLINE:
	DB	8,6,22H,11,3,20,0
	DB	'GENERATION          0',239
BOTTOM2:
	DB	3,0,31,6,22H,11
	DB	' COMMANDS:   P(AUSE)   O(NE STEP)   S(TOP)'
	DB	3,64,0,239

LOWORD	EQU	BEGSC+80

QUITMSG:
	DB	3,31,31,11,3,31,31,6,1
	DB	'QUITTING AS REQUESTED',239
STOPMSG:
	DB	3,31,31,11,3,31,31,6,1
	DB	'STOPPED PER REQUEST.  ',239
;
;      DATA
;
DEAD:	DB	0
SCHK:	DB	0	;STABILITY CHECK FLAG
SAVSTK:	DW	0
NCS:	DS	2048
FINNCS:	DS	1
STBCHK: DS	2048	;SPACE TO HOLD COUNT FOR STABILITY CHK
BEGNCS	EQU	NCS+64
ENDNCS	EQU	NCS+2048-64

	END