Listing of file='GROW.MAC;12' 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,3 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 MVSTAB ;NO LXI H,OSCCNT DCR M JNZ MVSTAB LXI H,OSCMSG ;OSCILLATORY - FINISH RUN CALL OSTR JMP FINITO ; ; 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 ;COUNT FOR OSCILLATION CHK OSCCNT: DB 3 BEGNCS EQU NCS+NOCOLS ENDNCS EQU NCS+BUFLEN-NOCOLS END