Compucolor.org – Virtual Media

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

;===========================================================
;
;	DEVELOP AND DISPLAY NEXT GENERATION
;
;===========================================================
;
BEGSC	EQU	6000H
BEGWR	EQU	6080H
ENDWR	EQU	6F7FH
ENDSC	EQU	6FFFH
CENTSC	EQU	26686

	PUBLIC	BEGSC,BEGWR,ENDWR,ENDSC,CENTSC

NOLINS	EQU	30
NOCOLS	EQU	64

	PUBLIC	NOLINS,NOCOLS

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,CMPHD,CMPMEM,GETCH,INDEX,JMPTAB
	EXTRN	MOVEDN,OSTR
	EXTRN	SND,SNDOFF,SNDSET
	EXTRN	PITCH,AMP
	EXTRN	CURSLOC

	ENTRY	GROW

GROW:	LXI	H,50
	MVI	A,15
	CALL	SNDSET
	LXI	H,0
	SHLD	TEMP
	MVI	A,4
	STA	OSCCNT
	LXI	H,GENERLINE
	CALL	OSTR
	LXI	H,BOTT2
	CALL	OSTR
	LHLD	CURSLOC	;CLEAR CURSOR CCI
	INX	H
	MVI	M,NORMCCI
;
;CLEAR NEIGHBOR COUNT SPACE
;
GEN:	XRA	A
	LXI	B,BUFLEN
	LXI	H,NCS
CLRNCS:	XRA	A
	MOV	M,A
	INX	H
	DCX	B
	MOV	A,B
	ORA	C
	JNZ	CLRNCS
;
;	 MAIN LIFE ALGORITHM
;
	MVI	A,1
	STA	DEAD
	LXI	H,BEGNCS
	LXI	D,BEGWR
	MVI	C,NOLINS
LLOOP:	MVI	B,NOCOLS
LL10:	LDAX	D
	CPI	INDIV	;INDIVID. PRESENT?
	JNZ	NOINDIV
	XRA	A
	STA	DEAD	;LIFE PRESENT IN GENERATION
	CALL	INCNBR

NOINDIV:
	INX	D
	INX	D	;NEXT SCREEN LOCN
	INX	H	;NEXT NCS LOCN
	DCR	B
	JNZ	LL10
	DCR	C
	JNZ	LLOOP

;
;	DETERMINE WHO LIVES AND WHO DIES
;
LIVEDIE:
	LXI	D,BEGNCS
	LXI	H,BEGWR
	MVI	C,NOLINS
DLOOP:	MVI	B,NOCOLS
DLP10:	LDAX	D	;CHECK NEIGHBOR COUNT
	CPI	3
	JNZ	NOT3
	MVI	M,INDIV	;THIS SPACE LIVES
	JMP	EGEN
NOT3:	CPI	2
	JZ	EGEN
	MVI	M,BLANK	;THIS SPACE DIES
EGEN:	INX	D	;NEXT NCS SPACE
	INX	H	;NEXT SCREEN SPACE
	INX	H
	DCR	B
	JNZ	DLP10
	DCR	C
	JNZ	DLOOP

	LHLD	PITCH	;SAVE LAST NUMBER OF INDIVIDS
	SHLD	TEMP
	LXI	H,0
	LXI	D,BEGWR
	LXI	B,(ENDWR-BEGWR)/2
CNTLP:	LDAX	D
	CPI	INDIV
	JNZ	NONE
	INX	H
NONE:	INX	D
	INX	D
	DCX	B
	MOV	A,B
	ORA	C
	JNZ	CNTLP
	DAD	H
	DAD	H
	DAD	H
	MOV	A,H
	CMA
	MOV	H,A
	MOV	A,L
	CMA
	MOV	L,A
	INX	H
	LXI	D,2000
	DAD	D
	SHLD	PITCH
	CALL	SND

	LXI	H,LOWORD	;INCREMENT GENERATION NO.
	CALL	BMPCNT

;
;	CHECK FOR STABLE WORLD AND OSCILLATIONS
;
	LDA	SCHK	;DO WE WANT TO DO STABLITY CHECK?
	ORA	A
	JNZ	FINTST		;NO
	LXI	H,BEGNCS
	LXI	D,STBTAB
	LXI	B,ENDNCS-BEGNCS
	CALL	CMPMEM	;SEE IF SAME AS LAST TIME
	JNZ	OSC		;NO
	LXI	H,STBMSG
	CALL	OSTR		;INDICATE STABLE WORLD
	JMP	FINITO

OSC:	LHLD	PITCH	;SAME NUMBER OF INDIVIDS AS LAST TIME?
	XCHG
	LHLD	TEMP
	CALL	CMPHD
	JNZ	FIXCNT		;NO - RESET OSCILLATION COUNT
	LXI	H,OSCCNT
	DCR	M
	JNZ	MVSTAB
	LXI	H,OSCMSG	;OSCILLATORY - FINISH RUN
	CALL	OSTR
	JMP	FINITO

FIXCNT:	MVI	A,4	;MUST HAVE SAME NO. OF INDIVIDS
	STA	OSCCNT	;   FOUR TIMES IN A ROW
;
;	SAVE COUNT SPACE FOR NEXT STABILITY CHECK
;
MVSTAB:
	LXI	H,BEGNCS
	LXI	D,STBTAB
	LXI	B,ENDNCS-BEGNCS
	CALL	MOVEDN

;==========================================================
;
;	END?
;
FINTST:	LDA	DEAD
	ORA	A	;CHECK FOR DEAD OR STABLE WORLDS
	JZ	CHKEYS		;NO
	LXI	H,DEADMSG	;DEAD
	CALL	OSTR
	JMP	FINITO

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

FINITO:	CALL	SNDOFF
	RET

;===========================================================
;
;	UPDATE NEIGHBORS
;

INCNBR:	PUSH	B
	LXI	B,-(NOCOLS+1)
	DAD	B
	INR	M
	INX	H
	INR	M
	INX	H
	INR	M
	LXI	B,2*NOCOLS-2
	DAD	B
	INR	M
	INX	H
	INR	M
	INX	H
	INR	M
	LXI	B,-NOCOLS
	DAD	B
	INR	M
	DCX	H
	DCX	H
	INR	M
	INX	H	;SET BACK TO ORIGINAL POSITION
;	ALL NEIGHBORS FOR THIS SPACE INCREMENTED
	POP	B
	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
;
CMDADR:	DW	CHECK
	DW	NOCHK
	DW	ONESTP
	DW	CHKEYS
	DW	STOP
;
;	MESSAGES
;
TOP1:
	DB	8,6,21H,11,3,20,0
	DB	'PRESS RETURN TO GENERATE AN INDIVIDUAL'
	DB	6,NORMCCI,239
BOTT1:
	DB	3,0,31,6,21H,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
OSCMSG:
	DB	3,31,31,11,3,31,31,6,7
	DB	' WORLD OSCILLATING ',239

GENERLINE:
	DB	8,6,21H,11,3,20,0
	DB	'GENERATION          0',239
BOTT2:
	DB	3,0,31,6,21H,11
	DB	'   COMMANDS:   P(AUSE)   O(NE STEP)   S(TOP)'
	DB	3,64,0,239

LOWORD	EQU	BEGSC+80

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

BUFLEN	EQU	2048

NCS:	DS	BUFLEN
FINNCS:	DS	1
STBTAB: DS	BUFLEN
	DS	2
	;SPACE TO HOLD COUNT FOR STABILITY CHK

TEMP:	DW	0	;LAST PITCH VALUE
OSCCNT:	DB	3	;COUNT FOR OSCILLATION CHK
BEGNCS	EQU	NCS+NOCOLS
ENDNCS	EQU	NCS+BUFLEN-NOCOLS

	END