!***********************************!
!                                   !
!              LIFE.BAS             !
!        Conway's Game of Life      !
!    Implemented under AlphaBASIC   !
!        By David F. Pallmann       !
!                                   !
!***********************************!

       MAP1 A(20,40), S, 1             !source array
       MAP1 B(20,40), S, 1             !destination array
       MAP1 I, F, 6                    !loop index
       MAP1 J, F,6                     !loop index
       MAP1 R, F, 6                    !current row
       MAP1 C, F, 6                    !current column
       MAP1 LR, F, 6                   !low row
       MAP1 HR, F, 6                   !high row
       MAP1 LC, F, 6                   !low column
       MAP1 HC, F, 6                   !high column
       MAP1 COUNT, F, 6                !life count
       MAP1 TEXT, S, 80                !text line
       MAP1 LOW, F, 6                  !
       MAP1 HIGH, F, 6
       MAP1 GEN, F, 6
       MAP1 TOTAL, F, 6

INIT:   PRINT TAB(-1,0);
       FOR I = 1 TO 20
           FOR J = 1 TO 40
               B(I,J) = " "
               NEXT J
           NEXT I

SCREEN: PRINT TAB(-1,11);
       FOR I = 1 TO 20
           PRINT TAB(I+1,1); "|";
           PRINT TAB(1,I+1); "-";
           PRINT TAB(1,I+21); "-";
           PRINT TAB(I+1,42); "|";
           PRINT TAB(22,I+1); "-";
           PRINT TAB(22,I+21); "-";
           NEXT I
       PRINT TAB(1,1); "+"; TAB(1,42); "+";
       PRINT TAB(22,1); "+"; TAB(22,42); "+";
       PRINT TAB(-1,12);
       PRINT TAB(3,52); "==  LIFE  ==";

ENTRY:  PRINT TAB(5,50); "Enter pattern";
       PRINT TAB(7,50); "Use VUE control chars";
       PRINT TAB(9,50); "Use SPACEs and STARs";
       XCALL life2, B(1,1), 20, 40, 1, 1

GET2:   PRINT TAB(5,50); TAB(-1,9);
       PRINT TAB(7,50); TAB(-1,9);
       PRINT TAB(9,50); TAB(-1,9);

DISPLAY:
       LR = 20 : HR = 0
       LC = 40 : HC = 0
       TOTAL = 0
       FOR I = 1 TO 20
           PRINT TAB(I+1,2);
           FOR J = 1 TO 40
               IF B(I,J)="" THEN B(I,J) = " "
               PRINT B(I,J);
               IF B(I,J)="*" THEN TOTAL = TOTAL+1 : CALL WINDOW
               NEXT J
           NEXT I
       I = GEN+6
       IF I>20 THEN I = I-15
       PRINT TAB(I,45); "Generation"; GEN;
       PRINT  " - Pop."; TOTAL;
       GEN = GEN+1
       IF TOTAL=0 THEN PRINT TAB(22,50); : END

MOVE:   FOR I = 1 TO 20
           FOR J = 1 TO 40
               A(I,J) = B(I,J)
               NEXT J
           NEXT I

GENERATE:
       FOR I = LR-1 TO HR+1
           FOR J = LC-1 TO HC+1
               CALL SCAN
               NEXT J
           NEXT I
       GOTO DISPLAY

SCAN:   COUNT = 0
       FOR R = I-1 TO I+1
           FOR C = J-1 TO J+1
               IF R<1 OR R>20 THEN GOTO NEXT
               IF C<1 OR C>40 THEN GOTO NEXT
               IF R=I AND C=J THEN GOTO NEXT
               IF A(R,C)<>" " THEN COUNT = COUNT+1

NEXT:           NEXT C
           NEXT R

       B(I,J) = " "
       IF A(I,J)=" " AND COUNT = 3 THEN B(I,J) = "*"
       IF A(I,J)="*" AND COUNT>1 AND COUNT<4 THEN B(I,J) = "*"
       RETURN

WINDOW: IF I<LR THEN LR = I
       IF I>HR THEN HR = I
       IF J<LC THEN LC = J
       IF J>HC THEN HC = J
       RETURN

       END