BYTE XMAIN,YMAIN,LIVECOL=708, DEATHCOL=709,BIRTHCOL=710, CONSOL=53279 CARD ARRAY LINEPT(40) PROC GR5INIT() ;INITIALIZE A GR. 5 SCREEN. WE MUST ;DO THIS TO UTILIZE THE SPECIAL PLOT ;ROUTINES WHICH I STOLE FROM AN ;OLD ANALOG MAGAZINE. CARD SCRN=88 BYTE LINE GRAPHICS(5) FOR LINE=0 TO 39 DO LINEPT(LINE)=SCRN+20*LINE OD LIVECOL=8 RETURN PROC PLOT5(BYTE X,Y,COL) ;HERE IS THE STOLEN PLOT ROUTINE. IT ;IS MUCH FASTER THAN THE OS ROUTINES, ;BUT IT DOES NO CHECKING FOR ILLEGAL ;VALUES. IT IS EASILY ADAPTABLE FOR ;GR. 7 USE. BYTE POINTER PIXEL BYTE ARRAY COLFIL=[0 85 170 255], MASK=[63 207 243 252], MASK2=[192 48 12 3] PIXEL=LINEPT(Y)+(X RSH 2) PIXEL^=PIXEL^&MASK(X&3) % (COLFIL(COL) & MASK2(X & 3)) RETURN BYTE FUNC LOCATE5(BYTE X,Y) ;HERE'S ANOTHER STOLEN ROUTINE. AGAIN ;IT IS MUCH FASTER THAN OS ROUTINES, ;BUT DOES NO TESTS FOR ILLEGAL VALUES. BYTE POINTER PIXEL BYTE ARRAY MASK=[192 48 12 3] PIXEL=LINEPT(Y)+(X RSH 2) RETURN ((PIXEL^ & MASK(X & 3)) RSH (((X & 3) XOR 3) LSH 1)) PROC PAUZ(CARD X) ;A SIMPLE ROUTINE TO DO NOTHING FOR A ;GIVEN PERIOD OF TIME. CARD LOOP FOR LOOP=1 TO X DO OD RETURN PROC PUTDOTS() ;THIS ROUTINE READS THE JOYSTICK AND ;MOVES A BLINKING CURSOR AROUND THE ;SCREEN. A CELL IS ACTIVATED IF ;ONE ISN'T THERE, AND DEACTIVATED IF ;IT IS THERE. BYTE XPOS=[39],YPOS=[18],STIK=632, STRIG=644,HOLD,NEXTX,NEXTY, XLP,YLP BYTE ARRAY DELTAX = [0 0 0 0 0 1 1 1 0 255 255 255 0 0 0 0], DELTAY = [0 0 0 0 0 1 255 0 0 1 255 0 0 1 255 0] DEATHCOL=14 HOLD=LOCATE5(XPOS,YPOS) PRINTE("JOYSTICK BUTTON TO PLACE OR ERASE") PRINTE("PUSH OPTION & SELECT TO CLEAR SCREEN") PRINTE("PUSH START TO START") DO PLOT5(XPOS,YPOS,2) PAUZ(2000) IF STRIG=0 AND HOLD=1 THEN HOLD=0 SOUND(0,121,10,8) PAUZ(4000) SNDRST() ELSEIF STRIG=0 AND HOLD=0 THEN HOLD=1 SOUND(0,29,10,8) PAUZ(2000) SNDRST() FI NEXTX=XPOS+DELTAX(STIK) NEXTY=YPOS+DELTAY(STIK) IF NEXTX<>XPOS OR NEXTY<>YPOS THEN PLOT5(XPOS,YPOS,HOLD) XPOS=NEXTX IF XPOS>75 THEN XPOS=4 ELSEIF XPOS<4 THEN XPOS=75 FI YPOS=NEXTY IF YPOS>38 THEN YPOS=1 ELSEIF YPOS<1 THEN YPOS=38 FI SOUND(0,60,10,8) PAUZ(2000) SNDRST() HOLD=LOCATE(XPOS,YPOS) FI PAUZ(2000) IF CONSOL=1 THEN HOLD=0 FOR YLP=1 TO 38 DO FOR XLP=1 TO 18 DO POKE(LINEPT(YLP)+XLP,0) OD OD FI UNTIL CONSOL=6 OD PLOT5(XPOS,YPOS,HOLD) RETURN PROC PIXELCHEK(BYTE XB,Y) ;THIS ROUTINE CHECKS ALL THE PIXELS ;IN THE BYTE OF SCREEN MEMORY PASSED ;TO IT FOR BIRTH OR DEATH. IF A ;PIXEL IS EMPTY AND HAS THREE LIVE ;NEIGHBORS A BIRTH WILL OCCUR IN THE ;NEXT GENERATION. IF A PIXEL IS LIVE ;AND HAS MORE THAN THREE LIVE ;NEIGHBORS IT WILL DIE IN THE NEXT ;GENERATION. BYTE LPX,LPY,LP,X,COUNT=[0],HOLD ;CONVERT X BYTE VALUE TO A PIXEL AND ;CHECK ITS EIGHT NEIGHBORS. ;MULTIPLY BY FOUR FOR PIXEL VALUE. X=XB LSH 2 ;CHECK FIRST PIXEL AND THE THREE ;WHICH FOLLOW IT. FOR LP=X TO X+3 DO ;CHECK THE EIGHT SURROUNDING PIXELS. FOR LPY=Y-1 TO Y+1 DO FOR LPX=LP-1 TO LP+1 DO HOLD=LOCATE5(LPX,LPY) IF HOLD=1 OR HOLD=2 THEN COUNT==+1 FI OD OD ;THESE ARE THE POSSIBLE CASES OF ;BIRTH AND DEATH. WE ADD ONE IF HOLD ;IS ONE BECAUSE WE COUNTED IT IN THE ;SEARCH OF THE SURROUNDING PIXELS. ; ;IF A DEATH IS TO OCCUR WE RESET THE ;PIXEL COLOR TO COLOR 2. IT IS ;VISIBLE, BUT MARKED FOR DEATH IN THE ;NEXT GENERATION. ; ;IF A BIRTH IS TO OCCUR WE RESET THE ;PIXEL COLOR TO THREE. IT IS ;INVISIBLE, BUT MARKED FOR BIRTH IN ;THE NEXT GENERATION. HOLD=LOCATE5(LP,Y) IF HOLD=1 AND (COUNT<3 OR COUNT>4) THEN PLOT5(LP,Y,2) ELSEIF HOLD=0 AND COUNT=3 THEN PLOT5(LP,Y,3) FI COUNT=0 OD RETURN PROC CHEKBYTE() ;THIS ROUTINE DOES A CHECK ON EACH ;SCREEN BYTE AND ITS FOUR ORTHOGONAL ;NEIGHBORS. IF ANY OF THESE ARE ;GREATER THAN ZERO IT CALLS PIXELCHEK ;TO CHECK THE INDIVIDUAL PIXELS OF ;THE BYTE. THIS SAVES TIME FOR EACH ;PASS, SINCE BYTE OPERATIONS ARE SO ;MUCH FASTER THAN PIXEL OPERATIONS. ;THERE COULD BE ROOM FOR IMPROVEMENT ;IN THIS ROUTINE. BYTE XLP,YLP BYTE POINTER XBYTE,XPLUS,XMINUS, YPLUS,YMINUS ;YLP=NUMBER OF ROWS IN A GR.5 SCREEN. ;XLP=NUMBER OF BYTES IN EACH ROW ; (FOUR PIXELS TO THE BYTE). ;XBYTE=POINTER TO BYTE BEING CHECKED ;XPLUS=BYTE BEING CHECKED + 1 ;XMINUS=BYTE BEING CHECKED - 1 ;YPLUS=BYTE BELOW CURRENT BYTE ;YMINUS=BYTE ABOVE CURRENT BYTE ; I'M SO CONFUSED !!! FOR YLP=1 TO 38 DO FOR XLP=1 TO 18 DO XBYTE=LINEPT(YLP)+XLP XPLUS=XBYTE+1 XMINUS=XBYTE-1 YPLUS=XBYTE+20 YMINUS=XBYTE-20 IF YPLUS^>0 THEN PIXELCHEK(XLP,YLP) ELSEIF (XPLUS^&$C0)>0 THEN PIXELCHEK(XLP,YLP) ELSEIF XBYTE^ >0 THEN PIXELCHEK(XLP,YLP) ELSEIF (XMINUS^&$03)>0 THEN PIXELCHEK(XLP,YLP) ELSEIF YMINUS^ >0 THEN PIXELCHEK(XLP,YLP) FI OD OD RETURN PROC RESETSCRN() ;THIS ROUTINE MASKS ALL THE BYTES OF ;SCREEN MEMORY WITH A HEX $55. THIS ;SETS ALL THE DEATH PIXELS TO 00 AND ;ALL THE BIRTH PIXELS TO 01, WHILE ;LEAVING THE STATIC CELLS UNHARMED. BYTE X,Y,MASK=[$55],HOLD BYTE POINTER BPOINT FOR Y=1 TO 38 DO BPOINT=LINEPT(Y) FOR X=1 TO 18 DO BPOINT^==&MASK BPOINT==+1 OD OD RETURN PROC PRINTINST() PRINTE("PRESS SELECT TO DRAW") PRINTE("PRESS OPTION TO QUIT") PRINTE(" ") RETURN PROC MAIN() ;THIS IS THE MAIN ROUTINE. IT ;INITIALIZES THE SCREEN AND STARTS ;CYCLING THROUGH THE GENERATIONS. ;AFTER CHEKBYTE IS EXECUTED IT ;CHANGES COLOR REGISTER VALUES TO ;MAKE THE BIRTHS APPEAR AND THE ;DEATHS DISAPPEAR. IT THEN CALLS ;RESETSCRN TO CLEAR OUT BIRTHS AND ;DEATHS. ALL THE WHILE IT LOOKS FOR ;THE FUNCTION KEYS TO BE PRESSED TO ;INVOKE THE CELL EDITOR OR TO END ;THE PROGRAM. ; ; ROBERT ROSENBACH ; DECEMBER, 1986 GR5INIT() PRINTINST() DO IF CONSOL=5 THEN PUTDOTS() PRINTINST() FI DEATHCOL=8 BIRTHCOL=0 CHEKBYTE() DEATHCOL=0 BIRTHCOL=8 SOUND(0,20,10,10) PAUZ(3000) SNDRST() RESETSCRN() IF CONSOL=3 THEN EXIT FI POKE(77,0) OD RETURN