Listing of file='LIFE.SRC;01' on disk='vmedia/life-sector.ccvf'
;-------------------------------------------------------- ; GAME OF LIFE ; FOR CCII ; WRITTEN BY B. BARLOW 11-80 ; ; THIS LIFE PROGRAM USES THE SUITS CYCLINDRICAL WORLD, ; AND THE "LET ME BE YOUR NEIGHBOR" ALGORITHM. ; THE PROGRAM FEATURES: ; .SPEED (ASSEMBLY LANGUAGE) ; .EASY STARTING DEFINITIONS WITH THE CURSOR PAD ; .STOPS ON DEAD OR STABLE WORLDS ; .PAUSES ON COMMAND ; ;-------------------------------------------------------- ; ; MAJOR PROGRAM BLOCKS (THERE ARE 6) ARE DELINEATED: ; ;=========================================================== ; ; SET UP ; ;========================================================= ; CURSLEFT EQU 26 CURSRGHT EQU 25 CURSUP EQU 28 CURSDOWN EQU 10 HOME EQU 8 ; BEGSCRN EQU 24576 BEGWRLD EQU 24704 ENDWRLD EQU 28443 ENDSCRN EQU 28671 CENTSCRN EQU 26686 ; KBDFL EQU 81DFH INPVECT EQU 81C5H ; CURSCCI EQU 8 NORMCCI EQU 2 CR EQU 13 INDIV EQU 42 ; INDIVIDUAL IN WORLD BLANK EQU 32 ; ; SET VECTOR TABLE FOR EITHER CCII VERSION OF SOFTWARE ; ORG 8200H START: LXI H,0 DAD SP LXI SP,STACK PUSH H ;SAVE CALLERS STACK IN OURS PUSH PSW PUSH D PUSH B LDA 0002H CPI 37H ;37H IS OLD (6/78) ROM JZ STARTLIFE LXI H,JTAB LXI D,NEWVEC LXI B,LENTAB OLAY: LDAX D MOV M,A INX H INX D DCX B MOV A,B ORA C JNZ OLAY JMP STARTLIFE JTAB: OS: JMP 33F4H MOVDH: JMP 344BH MOVHD: JMP 3444H CMPHD: JMP 344DH CMPDH: JMP 3453H SUBHD: JMP 3459H ADHLA: JMP 3518H ANHD: JMP 351DH NEGH: JMP 3524H MULHD: JMP 3562H DIVHD: JMP 3581H XORHD: JMP 3533H LENTAB EQU $-JTAB NEWVEC: JMP 182AH JMP 1871H JMP 187AH JMP 1883H JMP 1889H JMP 188FH JMP 194EH JMP 1953H JMP 195AH JMP 1998H JMP 19B7H JMP 1969H ; END OF VERSION VECTOR SET UP ; STARTLIFE: LXI H,CLRSCRN CALL OS LDA JTAB STA INPVECT LXI H,INPCHAR SHLD INPVECT+1 ;SET UP INPUT CHAR LINKAGE MVI A,31 STA KBDFL ;POINT TO OUR ROUTINE ; ;=========================================================== ; ; PRINT DIRECTIONS ; ;=========================================================== ; LXI H,D1 CALL OS LXI H,D2 CALL OS LXI H,D3 CALL OS LXI H,D4 CALL OS LXI H,D5 CALL OS LXI H,D6 CALL OS LXI H,D7 CALL OS LXI H,D8 CALL OS LXI H,D9 CALL OS LXI H,D10 CALL OS WAITFORKEY: XRA A STA READY CALL GETCH ;GET A CHARACTER ; ;========================================================= ; ; DEFINE INITIAL POPULATION ; ;========================================================= ; DEFPOP: LXI H,CLRSCRN CALL OS LXI H,TOP1 CALL OS LXI H,BOTTOM1 CALL OS ;SET UP INITIAL POPSCREEN LXI H,CENTSCRN CALL CURSOR ;PUT CURSOR IN CENTER OF SCREEN DIPCHAR: CALL GETCH LDA KBCHAR CPI 82 JZ ENDDIP ;IF USER TYPED "R"(UN) CPI CURSUP JNZ CH1 LXI D,-128 CALL LIMIT ;HANDLE CURSOR UP KEY CNC CURSOR JMP CH99 CH1: CPI CURSLEFT JNZ CH2 LXI D,-2 CALL LIMIT CNC CURSOR JMP CH99 CH2: CPI CURSRGHT JNZ CH3 LXI D,2 CALL LIMIT CNC CURSOR JMP CH99 CH3: CPI CURSDOWN JNZ CH4 LXI D,128 CALL LIMIT CNC CURSOR JMP CH99 CH4: CPI HOME JNZ CH5 LXI H,CENTSCRN CALL CURSOR JMP CH99 CH5: CPI CR JNZ CH99 MOV A,M CPI INDIV JZ CH6 MVI M,INDIV ;IF NOT ONE BEFORE, MAKE IT ONE NOW JMP CH99 CH6: MVI M,BLANK ;IF IT WAS ONE, ERASE IT CH99: JMP DIPCHAR ;DO IT AGAIN ENDDIP: ;;========================================================== ; ; DEVELOP AND DISPLAY NEXT GENERATION ; ;=========================================================== LXI H,GENERLINE CALL OS LXI H,BOTTOM2 CALL OS LHLD CURSLOC ;CLEAR CURSOR CCI INX H MVI M,NORMCCI ; ;CLEAR NEIGHBOR COUNT SPACE GEN: DI LXI H,0 DAD SP SHLD SAVSTACK MVI A,128 LXI D,0 LXI SP,ENDNCS CLRNCS: PUSH D PUSH D PUSH D PUSH D PUSH D PUSH D PUSH D PUSH D DCR A JNZ CLRNCS LHLD SAVSTACK SPHL EI ; ; MAIN LIFE ALGORITHM ; MVI A,1 STA DEAD LXI D,BEGWRLDNCS LXI H,BEGWRLD 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 UNIVERSE ; LDA SCHK ;DO WE WANT TO DO STABLE CHECK? JNZ LIVEDIE ;NO LXI H,BEGWRLDNCS LXI D,STABLECHECK LXI B,ENDWRLDNCS-BEGWRLDNCS 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,BEGWRLDNCS LXI D,STABLECHECK LXI B,ENDWRLDNCS-BEGWRLDNCS 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,BEGWRLDNCS LXI B,ENDWRLDNCS-BEGWRLDNCS LXI D,BEGWRLD DLOOP: MOV A,M ;CHECK NEIGHBOR 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. ; ; INCREMENT GENERATION NO. ; LXI H,LOWORD NXTDIG: MOV A,M ANI 15 ;CLEAR ZONE ORI 30H ;MAKE ASCII INR A ;INCREMENT LOW ORDER DIGIT CPI 3AH JNZ ENDI ;NO OVERFLOW MVI A,30H MOV M,A DCX H DCX H ;IN SCREEN MEMORY JMP NXTDIG ENDI: MOV M,A ;========================================================== ; ; END? ; LDA DEAD CPI 0 ;CHECK FOR DEAD OR STABLE WORLDS JZ CHKEYS ;NO. CPI 1 JNZ ND LXI H,DEADMSG ;DEAD. CALL OS JMP ANOTHER ND: CPI 2 JNZ CHKEYS LXI H,STABLEMSG ;STABLE CALL OS JMP ANOTHER CHKEYS: LDA KBCHAR CPI 81 ; 'Q' JNZ NQ LXI H,QUITMSG CALL OS JMP EXIT NQ: CPI 83 ; 'S' JNZ NS LXI H,STOPMSG CALL OS JMP ANOTHER NS: CPI 80 ; 'P' JZ CHKEYS CPI 79 ;'O' JNZ NOTO XRA A STA READY CALL GETCH ;WAIT FOR NEXT CHARACTER JMP GEN ;DO NXT GENERATION NOTO: CPI 65 ; 'A' JNZ NOTA MVI A,0 ;DO STABILITY CHK STA SCHK JMP NOTB NOTA: CPI 66 ; 'B' JNZ NOTB MVI A,255 STA SCHK ;DO NOT DO STABILITY CHECK NOTB: JMP GEN ;NEXT GENERATION ;=========================================================== ; ; ANOTHER? ; ;=========================================================== ; ANOTHER: LXI H,ANOTHERMSG CALL OS CALL GETCH LDA KBCHAR CPI 89 ; 'Y' JZ DEFPOP CPI 78 ; 'N' JZ EXIT JMP ANOTHER ;********************************************************** ; ; EXIT/LEAVE ; ;********************************************************** ; EXIT: LXI H,CLRSCRN CALL OS POP B POP D POP PSW POP H SPHL ;RESTORE FCS STACK LXI B,0 ;SIGNAL NO ERRORS RET ; ;---------------------SUBROUTINE-------------------------- ; ; CURSOR ; ; H,L --> DESIRED CURSOR POS ; CURSLOC --> OLD POS ; ; CURSLOC --> NEW POS ; CURSOR: INX H MVI M,CURSCCI ;SET BKG/FGD COLOR FOR CURSOR DCX H PUSH H LHLD CURSLOC INX H MVI M,NORMCCI ;SET OLD SPOT TO NORMAL COLORS POP H SHLD CURSLOC RET ;---------------------SUBROUTINE-------------------------- ; ; LIMIT ; ; H,L CONTAIN CURRENT CURSOR LOC ; D,E CONTAIN INCREMENT ; ; CARRY FLAG 0 - OK, WITHIN LIMITS ; H,L -->DESIRED CURSOR POS ; 1 - NOT OK. H,L CHANGED, BUT NOT VALID. ; LIMIT: DAD D STC ;TEMPORARILY EVERYTHING'S OK CMC RET ;----------------------SUBROUTINE-------------------------- ; ; GETCH ; GETCH: LDA READY CPI 80H JNZ GETCH ;IF 80H, A CHAR IS READY XRA A STA READY RET ;------------------------SUBROUTINE----------------------- ; ; INPCHAR ; ; INTERRUPT ROUTINE GIVEN CONTROL ON KEYBOARD INPUT ; INPCHAR: PUSH PSW MOV A,E ;CH IN E STA KBCHAR MVI A,80H STA READY POP PSW EI RET ; ;------------------------DATA------------------------------- DS 100 STACK: CURSLOC: DB 0,0 CLRSCRN: DB 12,29,18,30,16,15,27,24,239 TOP1: DB 8,6,39 DB ' ' DB 'PRESS RETURN TO GENERATE AN INDIVIDUAL ' DB 6,NORMCCI,239 BOTTOM1: DB 3,0,31,6,39 DB ' ' DB 'PRESS R TO RUN ' DB ' ',6,NORMCCI,3,64,0,239 D1: DB 6,5,3,20,1,'COMPUCOLOR ',6,1,'LIFE',6,NORMCCI,239 D2: DB 3,4,3,'WELCOME TO THE WORLD OF COMPUCOLOR LIFE. IT IS A CYLINDRICAL ',239 D3: DB 10,13,' WORLD; WHAT GOES OFF ONE SIDE COMES BACK ON THE OTHER.' DB 10,13,' ',239 D4: DB 'DEFINE THE INITIAL POPULATION BY POSITIONING THE CURSOR AND' DB 10,13,' ',239 D5: DB 'PRESSING RETURN. ERASE THE SAME WAY. (THE CURSOR IS RED.)' DB 10,13,10,13,' ',239 D6: DB 'PRESS R TO START THE GENERATIONS. PRESS P TO PAUSE.' DB 10,13,10,13,' ',239 D7: DB 'LIFE WILL STOP WHEN THE POPULATION STABILIZES OR DIES.' DB 10,13,10,10,' ',239 D8: DB 'PRESS ANY KEY TO BEGIN THE DEFINITION STEP...' DB 239 D9: DB ' ' D10: DB ' ' DB 3,64,0 DB 239 ; ; MESSAGES ; DEADMSG: DB 3,31,31,11,3,31,31,6,1,' WORLD DIED ',239 STABLEMSG: DB 3,31,31,11,3,31,31,6,4,' WORLD STABILIZED ',239 ANOTHERMSG: DB 3,0,31,6,2,'ANOTHER ROUND? ',3,64,0,239 GENERLINE: DB 3,0,0,6,39 DB ' GENERATION 0 ' DB 239 BOTTOM2: DB 3,0,31,6,39 DB ' COMMAMDS: P(AUSE) O(NE STEP) S(TOP) Q(UIT) ' DB 3,64,0,239 LOWORD EQU BEGSCRN+80 QUITMSG: DB 3,31,31,11,3,31,31,6,1,'QUITTING AS REQUESTED!!!!',239 STOPMSG: DB 3,31,31,11,3,31,31,6,1,'STOPPED PER REQUEST. ',239 DEAD: DB 0 ; KEYBOARD INTERACTION KBCHAR: DB 0 READY: DB 0 ; ; DATA ; SCHK: DB 0 ;STABILITY CHECK FLAG SAVSTACK: DW 0 NCS: DS 2048 ENDNCS: DS 1 STABLECHECK: DS 2048 ;SPACE TO HOLD COUNT FOR STABILITY CHK BEGWRLDNCS EQU NCS+64 ENDWRLDNCS EQU NCS+2048-64 ; END START