--- title: "Macro-Life" id: 51388 type: "computer_media" slug: "macro-life" url: "http://localhost/computer_media/macro-life/" markdown_url: "http://localhost/computer_media/macro-life.md" published_at: "2023-07-29T22:15:23+00:00" modified_at: "2026-04-03T07:59:19+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2019/02/20230809-041332.jpg" excerpt: "A Conway's Game of Life simulator with nine starting colony patterns, machine code generation logic, hi-res display, and an in-run menu for saving or restarting." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 1000" slug: "ts1000" taxonomy: "post_tag" url: "http://localhost/tag/ts1000/" model: - name: "Timex/Sinclair 1000" slug: "ts-1000" taxonomy: "model" url: "http://localhost/model/ts-1000/" indiv: - name: "Gregory Harder" slug: "gregory-harder" taxonomy: "indiv" url: "http://localhost/indiv/gregory-harder/" genre: - name: "Demo" slug: "demo" taxonomy: "genre" url: "http://localhost/type/demo/" media_type: "Cassette" programmers: - name: "Gregory Harder" slug: "gregory-harder" taxonomy: "indiv" url: "http://localhost/indiv/gregory-harder/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Macro-Life%20%281986%29%28Harder%2C%20Gregory%29%28US%29%28TS1000%29%28Program%29.zip" mediadate: "1986" related_products: - id: 35781 title: "Macro-Life" type: "product" url: "http://localhost/product/macro-life/" media_type_tags: "Demo" --- # Macro-Life Macro-Life is a Conway’s Game of Life cellular automaton simulator that runs on a [high-resolution BASIC environment](http://localhost/product/sram-hires-extended-basic/) with a static RAM board. The program drives its core generation logic through machine code routines invoked via USR calls, with the HR variable holding the entry-point address (19400 decimal). Nine initial colony configurations are provided, including squares, crosses, circles, rays, grids, frets, random scatter, and two “strange” patterns, each set up through LPRINT commands that communicate drawing instructions to the hi-res subsystem. Variables O, B$, and C$ are initialized to support both normal and reversed display modes, and a fast/slow mode toggle (variable F) controls whether FAST/SLOW is applied between generations. A mid-run menu (line 9000) allows the user to display, save to tape, continue, restart with a new configuration, or stop; screen saving is handled at line 9180 via a SAVE with a user-supplied title string. The zipfile contains both a 16K and a 32K version, the 32K version saves the screen in high memory for improved speed and more options.” *** ## Program Analysis ### Program Structure The program is organized into distinct functional regions separated by REM labels: - Lines 0–3: Dense REM blocks holding machine code or data used by `USR` calls. - Lines 10–150: Main generation loop — runs the Life algorithm, updates the generation counter, handles keypress escape, and loops back via `GOTO GO`. - Lines 300–1400: Initial colony configuration routines (square, cross, circles, rays, grid, frets, random, strange I, strange II), each ending with `GOTO GO`. - Lines 5000–7360: Initialization and startup — sets constants, prompts for display mode, speed, and colony choice, then jumps into the appropriate config block. - Lines 8000–8020: One-key input subroutine (PAUSE 0 / INKEY$ idiom via a polling loop). - Lines 9000–9240: Mid-run menu (display, save to tape, continue, new config, stop). - Lines 9900–9920: SAVE block with a decorative banner embedded in the SAVE line. - Line 16000: Stub REM at high line number, likely a sentinel. ### Machine Code Integration All computationally intensive operations — running a generation, clearing the hi-res screen, seeding the display — are handled through `USR HR`, where `HR` is set at line 7000 to the value `19400` (decimal). This address points into the static RAM board’s address space. The machine code is stored in the REM lines at the top of the listing (lines 0–3), a standard technique for embedding binary data in BASIC programs. The `IF USR HR THEN ...` idiom is used pervasively throughout: because the machine code routine returns a value, the `IF` test gates subsequent BASIC statements, but the primary purpose of each call is the side effect performed by the machine code, not the boolean result. ### Key Variables | Variable | Purpose | | --- | --- | | `HR` | USR entry point address (19400) for the machine code Life engine | | `GO` | Jump target for the main loop and step value in some FOR loops (set to 20 at line 7110) | | `O` | Zero constant (`NOT PI`, always 0), used instead of the literal 0 | | `G` | Generation counter, incremented by `SGN PI` (always 1) each loop | | `F` | Fast/slow flag; 0 = slow mode, 1 = fast mode | | `DIS` | Display polarity; 0 = normal, 1 = reversed | | `CON` | Chosen initial configuration number (1–9) | | `B$`, `C$` | Border strings built by repeated doubling in a FOR loop (lines 7060–7077) | | `A$` | General key-input variable | ### Notable BASIC Idioms - **`O = NOT PI`**: Since `PI` is non-zero, `NOT PI` evaluates to 0. Using `O` in place of the literal `0` saves tokenized bytes. - **`SGN PI`**: Always evaluates to 1; used at line 50 (`G=G+SGN PI`) as a byte-saving alternative to `G=G+1`. - **`VAL "number"` in `GOTO` / `GOSUB`**: Used throughout (e.g., `GOTO VAL "7000"`, `GOSUB VAL "8000"`) as a memory optimization — the tokenized number in a `VAL` string is shorter than an inline numeric literal in some contexts. - **`GOTO VAL "400+100*CON"`**: A computed GOTO using a VAL expression to dispatch into the correct colony configuration block based on `CON`, replacing a chain of IF statements. - **String doubling loop**: Lines 7060–7077 build `B$` and `C$` by concatenating each with itself four times, producing 32-character strings from 1-character seeds efficiently. - **Polling input loop** at line 8000–8010: `LET A$=INKEY$` followed by `IF A$="" THEN GOTO VAL "8000"` is the standard single-keypress wait. ### Colony Configuration Dispatch The nine initial configurations (lines 500–1400) are reached via `GOTO VAL "400+100*CON"`. Each configuration block uses `LPRINT` commands with special codes (`D`, `C`, `U` etc.) to communicate drawing commands to the hi-res BASIC subsystem — these are not printer output in the conventional sense but hi-res API calls. After setup, each block ends with `GOTO GO` to enter the main loop, where `GO=20` points to line 20, the start of the generation cycle. ### Hi-Res BASIC Environment The program targets an extended BASIC environment with a static RAM board providing high-resolution graphics. The `LPRINT` statements with numeric and string arguments (e.g., `LPRINT D;O,VAL "96",VAL "255",VAL "96"`) are extended BASIC commands that invoke hi-res drawing primitives for lines, circles, and user-defined graphics. `LPRINT U;"[A]";"..."` at lines 7150–7160 loads UDG (user-defined graphic) data. The generation counter is displayed at screen position 23,8 using `PRINT AT`. ### Mid-Run Menu (Lines 9000–9240) Pressing any key during the generation display pause (line 120) calls the menu subroutine at 9000. Options include: display the last generation (9130), save the screen to tape with a user-supplied title (9180 via `SAVE A$,S`), continue, start a new configuration (`RUN`), or stop. The tape save at line 9230 uses the two-argument `SAVE` form to save a named block, consistent with the hi-res environment’s extended BASIC. ### Anomalies and Observations - Line 1200 (`REM [S][1]`) contains only `GOTO GO`, making configuration 8 (“Strange I”) a no-op that immediately enters the generation loop without setting up any initial pattern — possibly intentional (starts from a blank or whatever residual state exists). - Line 1300 (`REM [S][2]`) uses `LIST VAL "9110"` as its setup, which lists program text to the hi-res display rather than drawing graphics — an unusual approach for “Strange II.” - The `IF USR HR THEN ...` guard on almost every statement means the machine code controls which BASIC statements actually execute, giving the MC routine fine-grained control over program flow beyond simple computation. - Line 7330 uses `PAUSE VAL "4E4"` (40000 frames ≈ very long pause) gated by a `USR HR` check, so the machine code likely substitutes a shorter wait or a keypress-sensitive pause. ## Source Code ``` 0 REM [M][A][I][N]█[C][O][R][E]█##▘ ""LN RUN ##[P]#Y2 GOSUB #<>5▟▝TAN PRINT # RETURN,C▌LN [*]RNDINT / LET TAN 6-RNDLN #? FASTLN LN + LPRINT TAN LN [H]RND PRINT LN [4]RND7LN [H]RND# LET #TAN 7# RETURN#C▀ RETURN;""6-RNDTAN A ##▞▌ACS 9ACS =( IF ,,▘ 4,,TAN 7LN [T]RNDLN [4]RNDLN ,,INKEY$ ##ACS ZACS ZACS Z##STR$ LN STR$ RND LET J NEW▛W#TAN Y3[)]K▌LN [*]RNDINT (Y[Z][(]SQR LN [*]RNDINT 25 6AT ZA4##<▘ COPY*Q GOSUB [K]TAN NEXT Y▞# ( CLEARLEN LIST W4 CLEAR▞"" CLEARACS ##C▝▞[K])4 5 4##INKEY$ ▌ASN #INKEY$ ;# GOSUB ###[R]<=E£RND ###) RUN ▙;Y2 GOSUB #Y PRINT ▘▛▝ CLEARACS ##CODE [P]▝LN [>]▝LN 4▝<>5GINKEY$ #[8]▝ CLEARACS #▚/▖ CLEARACS #LEN E£RND▘9 GOSUB PIF FOR 5 █;6#INKEY$ FOR GOSUB [K]LN F?<>5GINKEY$ TAN 7LN [T]RNDLN [4]RND##LN ▞INKEY$ VAL 7LN [H]RNDAT LN STR$ RND#TAN 2 COPY/▝2 STR$ 7LN [T]RNDLN ,,INKEY$ SGN GOSUB ##ZLN LET RND##?( CLEARACS .*PI▌4▝▞▒▛( CLEAR#TAN Y COPY/▘[J]MVAL Z CLEARACS #[:]7LN [T]RNDLN ,,INKEY$ # RETURN,4"7 GOSUB ##ZLN [T]RNDLN ,,INKEY$ ## GOSUB ##ZVAL #[)]-▘K▖ GOSUB #- COPY4▝- FAST##MSQR Z LET [(]2▘K▖ GOSUB #2 COPY4▝2 ##MINT Z#[W]S▞##- /▝2 GOSUB #SGN Z6PEEK Z#[B]3#A 6STR$ ZAT VAL Y[Z][(] PRINT UVAL Z# LET CLEARACS ##4▌LN SGN INKEY$ /▀LN ##UPEEK Z#▞ USTR$ Z##,,#MSTR$ Z GOSUB #SGN ZUUSR Z# GOSUB PIS▒#MSTR$ Z GOSUB #INT ZAT #▙##▄#5CHR$ ZOUUSR Z[Y]4[N] GOSUB ##ZTAN Y COPY/▘[J]MVAL Z7LN [T]RNDLN [4]RNDVAL 7LN [H]RND#I 6INT Z#6SGN ZAT Y▘ PRINT VAL VAL EINT Z GOSUB #SGN Z▞▌VAL ACS EACS .( IF [R] GOSUB #6INT Z GOSUB #SGN ZAT ACS GACS 1( IF ;6SGN Z GOSUB #INT ZAT #ACS <[~~]##ACS +[£]#Y[Z][(]S,, PRINT UVAL Z# LET LN SGN INKEY$ AT LET W RETURNASN S[O]TAN Y▘MINT ZLN COS RNDCOS LN [H]RNDMINT ZLN TAN RNDCOS 7LN [T]RNDLN [4]RND[S]S▀#INKEY$ #LN (INKEY$ #INKEY$ LN (INKEY$ #PI GOSUB #SQR Z[)]W PRINT 7LN [T]RND[S]K▀#INKEY$ # GOSUB #ABS Z[(]W4▘XSGN # GOSUB #USR ZUPEEK Z#USGN Z#[B]LN INPUT RND6CHR$ ZUABS Z#USGN Z#[B]LN INPUT RND6**Z£TAN LN +#4*UINT Z#5 4▘ /#J#7"#[L]4 RUN +4 INPUT TAN USTR$ ZECHR$ Z GOSUB #**Z6 AND Z GOSUB #>=Z PRINT FAST GOSUB # LPRINT C#UPEEK ZLN INKEY$ STR$ VAL #3ZACS <( IF AT ACS .*( CLS#SGN 7 FAST[B] GOSUB # LPRINT C▌#J#/ NEXT UABS ZLN INKEY$ Y,,[(]#VAL ,*ZACS 1( IF AT ACS +3( CLS>▘4 E>=Z,,6>=Z FOR E AND Z,,6 AND Z LET X4[A]5INT ZP4[?]TAN UUSR Z RETURN▒4▖,J/NOT UPEEK ZLN INKEY$ VAL ,3ZACS +( IF AT ACS 1*( CLS#UABS ZJ NEW▛C$#,VAL ?ACS 0( CLSAT ACS ▖( UNPLOT #/[E]E(RND#[T]COS RETURN█4▌LN [*]RNDINT ▘VAL LN PAUSE ,,AT FOR / GOTO PRINT SCROLL FAST:RND▟#LN ##7 FAST▞▌[J]#( CLEARSGN LPRINT LET TAN LN SCROLLRND#?( CLEARLN ##K▀Y▟>LN COS RNDTAB SQR #TAN LN SCROLLRND FASTAT LN 4+ FASTLN ##AT FAST##LN PLOT ;LN [~~]+ LPRINT / STEP LN SCROLLRND#▞ / SLOW###Y[Z][(]STR$ VAL PRINT LN SGN INKEY$ LET AT SGN TAN 2 COPY/▝2 STR$ LN C#SGN USTR$ Z#UPEEK Z5SGN Z PRINT FASTLN [D]#+C▞WLN [J]#/ RUN UUSR Z# LPRINT LET F FASTLN [D]#+C▞£LN [J]#/ RUN USTR$ Z# LPRINT UABS Z PRINT FASTLN [D]#+C▞XLN [J]#/ RUN UUSR Z# LPRINT LET 7LN [D]#+COS $LN [J]#/ SAVE LN 7?2"" CLEARACS ##C▝2[K]5 4[J]PEEK CLSLN #?ABS ▐▒<= CLS*K CLS-4▞▒#<= CLS3K CLS# NEW█PEEK CLSACS )( PAUSE 7+4 FOR <= CLS3K CLSLN ##/SGN 76-RNDLN #?LN [B]:##▘▘COS CLEARACS V#""( RAND $4 PLOT .#[N]4 INPUT TAN 7# RETURN#4,,LN OR #LN RUN #/L7# RETURN,C> RETURN;CG RETURN#C# RETURNAT C# RETURNTAB C#/# GOSUB #AT Z# NEW LIST LEN ( RETURNRNDCODE [O]#ATN [J]#/STR$ #LEN ▒#[J]# GOSUB #AT ZTAN ▞ COPY7# RETURN#COS RETURN,4▖Y▖/" RETURN;4VAL ▖# RETURN▀ASN SQR #M""Z/ STOP GOSUB #AT Z/SQR 7LN [T]RND## RETURN[T]ABS =INKEY$ # RETURNRNDABS "INKEY$ GOSUB #AT Z/[?]7LN [H]RND NEWZ GOSUB #AT Z[T]#K GOTO Y▒█#/ NEW6-RNDLN #? FAST CLEARACS ▘#CODE STR$ .LN SAVE < LPRINT FAST#[L]C£,VAL STR$ LN K#SGN AT <"/ LIST LPRINT /CODE RETURN""4▖Y"/U PRINT NEW# RETURNRNDK▛ LET CLEARACS ▘LEN /G CLEARACS ▘#C~~[J] CLEARACS ▘▚LN ##/▖ CLEARACS ▘LEN LET LN #,,~~ PRINT VAL NEW#LN ##AT ▀ LET RETURN█S LET CLEARACS ▘▚[J] GOSUB #AT Z PRINT YZ[)]>=[J]#LN RUN # LET VAL M<=Z[B]*[B]**- ACS >#5 2; FASTACS TLN STR$ RNDSGN U""Z RETURN▖ASN SQR # RETURN▝C# RETURN▘CFY▒ PRINT STR$ , PRINT U""Z[B]4"U<=ZACS #C▖ LET J/▘ LET #)4 ;SGN LET =AT ▌# RETURN COPYC▒USQR Z##[U]KATN USGN Z#UPEEK Z#USTR$ Z# FASTVAL Y[Z][(]2 LN SGN INKEY$ AT ▌ LPRINT H4 LIST 5INT ZP4[6]TAN 7# RETURN0K▌LN [*]RNDINT 1 RETURNGK RUN CHR$ 0TAN LN ▝##ACS 4ACS 4ACS 4ACS 4LN ▝#█#7# RETURN"#TAN 7# RETURN"TAB SQR #7#ACS #C▝CHR$ RND) 77 FAST▞▒A # FOR ;( CLEAR FOR 5 S; FOR LPRINT 7LN =#>4▌76-RNDTAN =Z#J NEW▛WM#RND) STOPZ GOSUB #**ZY▒ PRINT #>~~VAL #U#RND RETURN▌S)JLEN ,,[B]##: C:3ACS ;( CLS/▛#[J]ACS )*( CLS[Q]#7<#>#[Q]#FLN ##=Z) STOPZ▞▒VAL ,#7<,#LN ##F#<( POKE TAN ▞4[J]##ACS [W]>#<( RUN TAN E-RND# RETURN;C# RETURN#C▌LN [*]RNDINT + LPRINT 6-RND▘ TAN E-RND# RETURN THENC▌LN [*]RNDINT ) FAST7#)""#STR$ RETURN LLIST ASN ## RETURN SCROLLASN [:]RND RETURN LOAD ASN B# RETURN LIST ASN 3# RETURN PAUSE ASN ## RETURN PRINT ASN ## RETURN PLOT ASN [Y]INKEY$ RETURN RUN ASN ▟INKEY$ RETURN SAVE ASN [~~]# RETURN RAND ASN ## RETURN CLSASN ;INKEY$ RETURN UNPLOT ASN TAB INKEY$ RETURN CLEARASN ▗INKEY$ RETURN RETURNASN [*]RND RETURN COPYASN /# RETURN LPRINT 4[9]SGN )[J]#STR$ 7# RETURNXC##7# RETURN#C[<] RETURN;4 PLOT # RETURNAASN [▒]# RETURNBASN [B]INKEY$ RETURNCASN [B]PI RETURNDASN SCROLLINKEY$ RETURNIASN ## RETURNLASN [5]# RETURNPASN ## RETURNRASN [T]# RETURNS42F#7 RETURNDASN ## RETURNEASN ▞# RETURNMASN 8# RETURNPASN [1]# RETURNSASN ##/# RETURNTASN ## RETURNUASN F# RETURNW4UF#7 RETURNDASN ## RETURNLASN "# RETURNRASN ▟# RETURNUASN LEN #/57#7# RETURN#C; RETURN;4 PLOT # RETURNCASN [F]PI RETURNDASN FOR INKEY$ RETURNRASN [X]# RETURNTASN ###SQR # 1 REM FAST##▞▛ACS 5>=?#USR RETURN#Y▀X4 CLEAR GOSUB #▌TAB LLIST #ACS 5>=?#USR RETURN#TAN PEEK COPYY,X4 CLEAR<= RETURNY>X4 CLEAR#7##>#PEEK COPYYDX4 CLEAR<= RETURNY4X4 CLEARF7RTAN ▘ █VAL LN STEP #AT ( RAND ▀<>,,LN STEP #<>,,<>,,$LN STEP #<>,,<>,,:[E]LN STEP #<>,,<>,,"#LN STEP #<>,,<>,,"#LN STEP # CLEAR FAST LET ##LN STEP #7.#[N]4 PLOT TAN LN SCROLL▝76-RNDLN #? FASTLN SAVE < LPRINT 7#[K]C: RETURN5K~~# RETURNSCOS RETURNVCOS RETURNPCOS INT 0LN ## PRINT ##VAL ) ▝LN ##SGN LN 8# LET E=RND RETURNS4▛5 4##/( RETURNV4▞ GOSUB #(RND/▀),,RND GOSUB # FOR LN 8##▛▝<= RETURN*S CLS: £<= RETURN*K IF #LEN SCROLLACS #AT [J] GOSUB PIAT GOSUB PISGN C,,-▝LN ## LET LPRINT / TO 5WRND,[Y]4 LIST 7<"#[L]4 PRINT LET LPRINT RETURNS4,,5 4LN <>##▛▝ RETURNV4>E(RNDLN <>#FLN [1]=SGN LPRINT LN ▛▝##▞5,,RND/ GOTO 3 REM █[M][A][C][R][O][-][L][I][F][E]█## GOSUB ## RETURN#45A#/1;# RETURN#4*A#/"" THEN GOSUB VAL "9000" 130 IF USR HR THEN RUN 140 IF USR HR THEN PAUSE VAL "200*F" 150 GOTO GO 300 REM [I][N][I][T][I][A][L]█[C][O][N][F][I][G][S][.] 500 REM █ 510 IF USR HR THEN LPRINT R;VAL "68",VAL "148",VAL "88",VAL "168" 520 GOTO GO 600 REM [X] 610 IF USR HR THEN LPRINT D;O,VAL "96",VAL "255",VAL "96";D;VAL "128",O,VAL "128",VAL "191" 620 GOTO GO 700 REM [O] 710 FOR I=O TO VAL "80" STEP VAL "10" 720 IF USR HR THEN LPRINT C;VAL "128",VAL "96",I 730 NEXT I 740 GOTO GO 800 REM [*] 810 FOR I=O TO VAL "252" STEP VAL "3" 820 IF USR HR THEN LPRINT D;VAL "128",O,I,VAL "191" 830 NEXT I 840 GOTO GO 900 REM [G] 910 IF USR HR THEN LPRINT U;"[A]";"01,01,01,01,01,01,01,FF" 920 IF USR HR THEN PRINT ;;;;AT O,O; 930 FOR I=O TO VAL "23" 940 IF USR HR THEN PRINT B$ 950 NEXT I 960 GOTO GO 1000 REM [F] 1010 FOR I=VAL "60" TO VAL "140" STEP GO 1020 IF USR HR THEN LPRINT D;O,I,VAL "255",I 1030 NEXT I 1040 FOR I=VAL "16" TO VAL "256" STEP VAL "32" 1050 IF USR HR THEN LPRINT D;I,VAL "60",I,VAL "140" 1060 NEXT I 1070 GOTO GO 1100 REM [R][N][D] 1110 FOR I=O TO VAL "50" 1120 IF USR HR THEN PRINT ;;AT VAL "RND*183",VAL "RND*63";CHR$ VAL "(RND*254)" 1130 NEXT I 1140 GOTO GO 1200 REM [S][1] 1210 GOTO GO 1300 REM [S][2] 1310 LIST VAL "9110" 1320 IF USR HR THEN LIST 1330 GOTO GO 1400 REM [Y][O][U][R]█[C][O][N][F][I][G][S][.]█[H][E][R][E][,]█[U][S][E][1][0][0]█[L][I][N][E]█[N][O][.]█[I][N][T][E][R][V][A][L][S][,]█[C][H][A][N][G][E]██[L][I][N][E][S]█[7][2][7][0][-][7][3][0][0]█[T][O]█[S][U][I][T][.] 5000 REM 6000 REM [I][N][I][T][I][A][L] 7000 LET HR=VAL "19400" 7010 IF USR HR THEN CLS 7020 IF USR HR THEN RUN 7030 IF USR HR THEN RAND 7040 IF USR HR THEN RAND VAL "31" 7045 LET O=NOT PI 7055 LET B$="[A]" 7057 LET C$="[B]" 7060 FOR I=O TO VAL "4" 7070 LET B$=B$+B$ 7075 LET C$=C$+C$ 7077 NEXT I 7090 LET G=O 7110 LET GO=VAL "20" 7120 IF USR HR THEN PRINT ;;TAB VAL "16";"[M][A][C][R][O][-][L][I][F][E]█[S][R][A][M]",,,,,TAB VAL "16";"█[B][Y]█[T][O][N][I]█[B][A][K][E][R]█",,,TAB VAL "10";"[Z][X]█[C][O][M][P][U][T][I][N][G]█[O][C][T][.]█[8][6][.]" 7130 IF USR HR THEN PRINT ,,,,"A MACHINE CODE PROGRAM ORIGINAL-LY WRITTEN FOR THE ZX SPECTRUM AND CONVERTED TO RUN ON THE ZX81EQUIPED WITH STATIC RAM BOARD AND SRAM HI*RES EXTENDED BASIC.",,,,,"CONVERTED BY G.C. HARDER, FEB 86" 7140 IF USR HR THEN PRINT ,,,, 7150 IF USR HR THEN LPRINT U;"[A]";"00,00,00,00,00,FF,FF,00[B]00,FF,FF,00,00,00,00,00" 7160 IF USR HR THEN PRINT ;;;;B$,,,,;;" DO YOU WANT THE DISPLAY TO BE";TAB VAL "15";"[N]ORMAL OR [R]EVERSED?",;;;;C$;; 7170 GOSUB VAL "8000" 7180 LET DIS=O+(A$="R") 7190 IF A$<>"N" AND A$<>"R" THEN GOTO VAL "7160" 7200 IF USR HR THEN PRINT ;;;;B$;;TAB VAL "13";" SLOW OR FASTMODE?","THE SCREEN TAKES OVER ONE MINUTETO ""DEVELOP"" WHEN IN SLOWMODE, BUT IS INTERESTING TO WATCH.",;;;;C$;; 7210 GOSUB VAL "8000" 7220 LET F=O+(A$="F") 7230 IF A$<>"S" AND A$<>"F" THEN GOTO VAL "7200" 7240 IF USR HR THEN CLS 7250 IF USR HR THEN CLEAR 7260 IF USR HR THEN PRINT TAB VAL "10";"CHOOSE INITIAL COLONY";TAB VAL "19";"CONFIGURATION",,,,;TAB VAL "19";"ENTER NUMBER" 7270 IF USR HR THEN PRINT ,,,,TAB GO;"1. SQUARE";TAB GO;"2. CROSS";TAB GO;"3. CIRCLES";TAB GO;"4. RAYS";TAB GO;"5. GRIDS";TAB GO;"6. FRETS";TAB GO;"7. RANDOM";TAB GO;"8. STRANGE I";TAB GO;"9. STRANGE II" 7280 INPUT CON 7290 IF USR HR THEN RUN 7300 IF CONVAL "9" THEN GOTO VAL "7240" 7310 IF USR HR THEN PRINT ,,,,"AFTER EACH GENERATION HAS BEEN COMPLETED, THE GENERATION NUMBERWILL BE DISPLAYED FOR A SHORT TIME. PRESSING ANY KEY DURING THIS PERIOD WILL ESCAPE FROM THEGENERATION LOOP." 7320 IF USR HR THEN PRINT AT VAL "180",O;"PRESS A KEY TO START [M][A][C][R][O][-][L][I][F][E]." 7330 IF USR HR THEN PAUSE VAL "4E4" 7340 IF NOT DIS THEN IF USR HR THEN RAND 7350 IF CON<>VAL "8" THEN IF USR HR THEN CLS 7360 GOTO VAL "400+100*CON" 8000 LET A$=INKEY$ 8010 IF A$="" THEN GOTO VAL "8000" 8020 RETURN 8910 REM [M][E][N][U] 9000 CLS 9010 IF USR HR THEN RETURN 9020 PRINT "1. DISPLAY LAST GENERATION.",,,"2. SAVE LAST GENERATION TO TAPE.",,"3. CONTINUE.",,,,"4. RUN NEWCONFIGURATION.",,,"5. STOP",,,,"[E][N][T][E][R]█[N][U][M][B][E][R]" 9030 INPUT A 9040 CLS 9050 IF AVAL "5" THEN GOTO VAL "9000" 9060 IF A=VAL "5" THEN STOP 9070 IF A=VAL "4" THEN RUN 9080 IF A=VAL "3" THEN RETURN 9090 IF A=VAL "2" THEN GOSUB VAL "9180" 9100 IF A=VAL "1" THEN GOSUB VAL "9130" 9110 GOTO VAL "9000" 9120 REM [D][I][S][P][L][A][Y] 9150 IF USR HR THEN RUN 9160 IF INKEY$ ="" THEN GOTO VAL "9160" 9170 RETURN 9180 REM [S][C][R][E][E][N][S][A][V][E] 9190 PRINT " INPUT TITLE: START TAPE BEFORE PRESSING ENTER" 9200 INPUT A$ 9230 IF USR HR THEN SAVE A$,S 9240 RETURN 9900 REM [S][A][V][E] 9910 SAVE "MACRO-1[6]" ▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜ ▌██[M][A][C][R][O][-][L][I][F][E]█[B][Y]█[T][O][N][I]█[B][A][K][E][R]██▐ ▌[A][D][A][P][T][E][D]█[B][Y]█[G][.][C][.][H][A][R][D][E][R]█[F][E][B]█[8][7]▐ ▌██[F][E][E][L]█[F][R][E][E]█[T][O]█[D][I][S][T][R][I][B][U][T][E]███▐ ▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟ 9920 RUN 16000 REM ## GOSUB #████████████████████████████████##INKEY$ ```