100 REM LIFE 110 REM BY YALE U 120 DIM A(1116),D(2,9) 130 DIM B0(200),D0(100) 135 CALL 'FIX'(1500) 140 Z$=CHR$(127) 150 GOSUB 460 160 R=0\REM GEN IS OFF AT THE START 170 CALL "INIT" 180 P1=0 190 G1=0 200 CALL "SUBP"(5) 210 FOR I=256 TO 656 STEP 25 215 CALL "APNT"(I,212,1,6) 220 FOR J=1 TO 16 230 CALL "RDOT"(0,25) 240 NEXT J\NEXT I 250 CALL "ESUB" 260 G=1 270 GOSUB 1120 \GOSUB 1040 280 FOR S=0 TO 1116\A(S)=0\NEXT S 290 GO TO 330 300 E=(X-6)/25\F=(Y-12)/25\S=31*E+F\IF A(S)=1 THEN 340 310 A(S)=1\CALL "APNT"(X-6,Y-12,-1,-6)\CALL "TEXT"(Z$) 320 GOSUB 1060 330 CALL 'LPEN'(H,T,X,Y) 340 CALL 'LPEN'(H,T,X,Y)\IF H=0 THEN 340 350 IF T=5 THEN 300 360 IF T=1 THEN 1260 \REM END 370 IF T=2 THEN 170 \REM CLEAR SCREEN 380 IF T=4 THEN 330 \REM FREEZE 390 REM HERE IF T=0 400 IF G=0 THEN 420 410 G=0\CALL 'OFF'(5)\REM KILL GRID 420 CALL 'ON'(4)\CALL 'OFF'(3)\R=1\REM RUNNING 430 GOSUB 570 440 CALL 'ON'(3)\CALL 'OFF'(4)\R=0\REM STOPPED 450 GO TO 360 460 REM DECISION TABLE 470 REM BIRTH=0,SURVIVAL=1,DEATH=2,NOTHING=3 480 FOR F=0 TO 8 490 D(0,F)=3 500 D(1,F)=2 510 NEXT F 520 REM UNOCCUPIED SQUARE 530 D(0,3)=0 540 REM OCCUPIED 550 D(1,2)=1\D(1,3)=1 560 RETURN 570 REM NEW GENERATION 580 L0=I0-1\L1=I1+1\M0=J0-1\M1=J1+1 590 IF L0>0 THEN 610 600 L0=1 610 IF M0>0 THEN 630 620 M0=1 630 IF L1<35 THEN 650 640 L1=34 650 IF M1<30 THEN 670 660 M1=29 670 GOSUB 1040 \N0=0\N1=0\B1=0 680 FOR E=L0 TO L1\S=31*E+M0 690 P=A(S-32)+A(S-1)+A(S+30) 700 C=A(S-31)+A(S)+A(S+31) 710 FOR F=M0 TO M1\S=31*E+F 720 N=A(S-30)+A(S+1)+A(S+32) 730 D1=D(A(S),P+C-A(S)+N) 740 IF D1>2 THEN 830 750 IF D1=2 THEN 820 755 IF D1=1 THEN 770 \B1=B1+1 760 REM BIRTH OR SURVIVAL 770 N0=N0+1\B0(N0)=S 780 REM FIND RANGE OF SUBSCRIPTS 790 GOSUB 1060 800 GO TO 830 810 REM DEATHS 820 N1=N1+1\D0(N1)=S 830 P=C\C=N\NEXT F 840 CALL 'LPEN'(H,T)\IF H=0 THEN 870 \IF T=3 THEN 870 850 I0=L0+1\I1=L1-1\J0=M0+1\J1=M1-1\REM SAVE RANGES 860 RETURN\REM GO FIND OUT WHAT HAPPENED 870 NEXT E 880 REM UPDATE A MATRIX AND DISPLAY NEW 890 IF P1=1 THEN 910 900 GOSUB 1110 910 IF N0>0 THEN 920 \T=2\RETURN 920 G1=G1+1 930 CALL 'SUBP'(P0)\FOR K=1 TO N0 940 S=B0(K)\E=INT(S/31)\F=S-31*E\A(S)=1 950 CALL 'APNT'(25*E,25*F,-1,-6)\CALL 'TEXT'(Z$) 960 NEXT K 970 CALL 'APNT'(900,100,-1,-5)\CALL 'TEXT'('GEN=',STR$(G1)) 972 CALL 'APNT'(900,70,-1,-5)\CALL 'TEXT'('POP=',STR$(N0)) 974 CALL 'APNT'(900,40,-1,-5)\CALL 'TEXT'('BIR=',STR$(B1)) 976 CALL 'APNT'(900,10,-1,-5)\CALL 'TEXT'('DTH=',STR$(N1)) 980 CALL 'ESUB'\IF P1=0 THEN 990 \CALL 'ERAS'(30-P0)\CALL 'SAVE' 990 P1=1\P0=30-P0 1000 FOR K=1 TO N1 1010 A(D0(K))=0 1020 NEXT K 1030 GO TO 570 1040 REM INIT MIN & MAX 1050 I0=34\J0=29\I1=1\J1=1\RETURN 1060 IF E>=I0 THEN 1070 \I0=E 1070 IF E<=I1 THEN 1080 \I1=E 1080 IF F>=J0 THEN 1090 \J0=F 1090 IF F<=J1 THEN 1100 \J1=F 1100 RETURN 1110 CALL 'INIT' 1120 P0=10\CALL 'SUBP'(1) 1130 CALL 'APNT'(900,500,1,-5)\CALL 'TEXT'(Z$,' END') 1140 CALL 'ESUB' 1150 CALL 'SUBP'(2) 1160 CALL 'APNT'(900,400,1,-5)\CALL 'TEXT'(Z$,' NEW') 1170 CALL 'ESUB' 1180 CALL 'SUBP'(3)\CALL 'OFF'(3) 1190 CALL 'APNT'(900,300,1,-5)\CALL 'TEXT'(Z$,' GO') 1200 CALL 'ESUB' 1210 CALL 'SUBP'(4)\CALL 'OFF'(4) 1220 CALL 'APNT'(900,200,1,-5)\CALL 'TEXT'(Z$,' STOP') 1230 CALL 'ESUB'\IF R=0 THEN 1250 1240 CALL 'ON'(4)\RETURN 1250 CALL 'ON'(3)\RETURN 1260 CALL 'INIT'\END