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