Macro-Life

Products: Macro-Life
Developer(s): Gregory Harder
Date: 1986
Type: Cassette
Platform(s): TS 1000
Tags: Demo

Macro-Life is a Conway’s Game of Life cellular automaton simulator that runs on a high-resolution BASIC environment 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

VariablePurpose
HRUSR entry point address (19400) for the machine code Life engine
GOJump target for the main loop and step value in some FOR loops (set to 20 at line 7110)
OZero constant (NOT PI, always 0), used instead of the literal 0
GGeneration counter, incremented by SGN PI (always 1) each loop
FFast/slow flag; 0 = slow mode, 1 = fast mode
DISDisplay polarity; 0 = normal, 1 = reversed
CONChosen 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.

Content

Appears On

Related Products

Adapted by Gregory C. Harder from the Spectrum program by Toni Baker. High resolution version of Conway’s Game of Life....

Related Articles

Related Content

Image Gallery

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 <X4 TO AT ££ GOSUB #AT ZTAN U<=Z RETURNASEXP  RETURN[A]KASN  FAST5 2; FOR  LPRINT /AT U<=Z▛ FAST5 0S LET A,/ GOSUB  CLEARACS ##Y[S]C▝Y[C][S]SQR ## NEW▛▙#VAL ) 45 5ACS SACS SACS S# GOSUB [K]F#( UNPLOT AT TAN LN COS RNDY*C▀LN [H]RND)  WEAT Z FAST GOSUB #AT Z GOSUB #£RND< PRINT ▞4,VAL STR$ LN ##SGN AT <( PRINT  LET X4 GOSUB  LPRINT 6AT ZTAN LN COS RNDCATN LN [H]RNDW PRINT #Y""CHR$ ▒( UNPLOT ## LET /LEN 7LN [T]RNDLN ,,INKEY$ LN [4]RNDTAN Y COPY/▘[J]MVAL Z CLEARACS #[:]LN ## GOSUB #NOT ZE-RNDLN ## GOSUB # OR ZE-RND7LN [T]RNDLN ,,INKEY$  GOSUB #<=ZE#Z FAST GOSUB ##ZE OR Z FASTLN £PI LPRINT 6#ZENOT Z FASTLN £PI LPRINT 6#ZE<=ZLN £PI LPRINT 6#ZTAN LN +#4.UINT Z5 4##▘4 ,,▘ STEP * GOSUB [K]▞4F#( UNPLOT X4 DIM TAN USGN Z RETURN C##UPEEK Z#VAL Y[Z][(]VAL  PRINT WVAL LN  LET RNDSGN Y▒[S]4*UABS Z[<] RETURN▒S?#▘4  GOSUB PI# LET AT #LEN ▒#/ OR #?( CLEAR2 COPYS▘0 LET AT VAL LN SGN INKEY$ AT #▞ UABS Z##▀[B] GOSUB PIPIK[U]AT ▌USQR Z[S]4[L]USQR Z#EPEEK ZY COPY[W]4▘8# FASTVAL Y[Z][(]2 LN SGN INKEY$ AT £ LPRINT 94 LIST 5INT ZP4▟TAN LN +#40UINT Z5 COPYR##▘4  GOSUB PI▘ STEP * GOSUB [S]▞47#( UNPLOT X4 CONT TAN USQR Z RETURN[Z]C##UPEEK Z#VAL Y[Z][(]VAL  PRINT XVAL LN  LET RNDSGN Y▒[S]4-UABS Z[<] RETURN▒S:#▘4 ,,# LET AT #LEN ▒#/ AND #?( CLEAR2 COPYS▘0 LET AT VAL LN SGN INKEY$ AT #▞ UABS Z##▀[B] GOSUB PIPIK[V]AT ▖USGN Z RETURN C▀[S]4[I]USGN Z#EPEEK ZY COPY[W]4▘8# FASTVAL Y[Z][(]2 LN SGN INKEY$ AT £ LPRINT 94 LIST 5INT ZPTAB ▗#TAN LN +#4*UINT Z#5 COPYR▞4#[B]ACS -F( CLS[8]4 POKE 14 INPUT TAN USGN Z#UPEEK Z#VAL Y[Z][(]VAL  PRINT £LN  LET RND#?( CLEAR2 COPYS▘0 LET AT VAL LN SGN INKEY$ AT UABS Z£[T]4 STEP AT ▌# RETURN COPYC▒USQR Z##[U]KSQR  GOSUB #SGN Z#INKEY$ #USTR$ Z# FASTVAL Y[Z][(]2 LN SGN INKEY$ AT ▌ LPRINT H4 LIST 5INT ZP4[B]TAN LN +#41UINT Z#5 4[B]▞4ACS 27( CLS▘ S[B] FAST GOSUB PI LPRINT 4 INPUT 14 CONT TAN USGN Z#UABS Z#VAL Y[Z][(]VAL  PRINT $LN  LET RNDY,,[(]##▛( CLEAR2 COPYS▘0 LET AT VAL LN SGN INKEY$ AT UPEEK Z$[T]4>=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 </ PAUSE 7LN [H]RND RETURN4) ▞SSTR$ LN [*]RNDINT .▘4 ,,# RETURNS**CHR$ /#TAN 7LN [H]RND RETURN4K SCROLLLN [4]RND[B]***- #5 Y;6**Z SCROLLLN [T]RND GOSUB # AND ZTAN LN ##Y[Z][(]K▝CHR$ RND##ACS WACS 1ACS WACS 1ACS WACS 1ACS  GOTO 6>=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 ##<AT ▀ LET XTAB ACS #TAN LN COS RNDTAB SQR #E>=Z) STOPZ▞▒VAL ,#7<,#LN ##F<AT ( LET TAN  CLEARACS #EXP LN ##E-RND# RETURN,4$7 GOSUB ##Z FASTLN [4]# LPRINT LN [T]RND#~~PIVAL 5ORND##[S]C UNPLOT  CLEAR[-]#M#RNDLN £#AT LN [4]#U#RND CLEAR[Y]O4 CLSTAN LN COS RNDY C▀LN [H]RNDM#RNDTAN 1""AT Y▖PEEK  CLS0LN ###["]INKEY$  GOSUB ##INKEY$ <<7# RETURN#C*STR$ LN [H]RND#LN ▞INKEY$ ▖SGN ##ACS [W],LEN █>#<( 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 <TAN 2 ▞▒LN ""#( CLSTAN - =PEEK  COPY# RETURNRNDK)2 LN ""#LN #?ABS [A]▀#[B]4 SCROLL/ SCROLL2 PEEK  COPYLN ""##[B]C PRINT LN PEEK #04CHR$ LN PEEK ## RETURN[E]4EXP LN PEEK ##LN PEEK #STR$ PEEK  COPYLN PEEK ##SGN 7.#[N]4 PAUSE TAN  FASTLN ## PRINT STR$ VAL 5WRND FASTLN <>#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#/<ACS ▘K?#X/▞ACS ,,K▛#W[H] NEW3[H]##[A]COS ▖TAN 5 4) #▘ /STR$  GOSUB [K] LPRINT )4 [B]:█▞ VAL  FASTLN [=]#LN [L]#LN [3]#LN [3]#LN [D]#LN [D]#LN [=]#LN [=]## LPRINT AT ACS [O] RETURN▝S£ RETURN▖K▒ RETURN▀4▒#[Q]/▀#J[A]#ACS  POKE ACS ,,KVAL LN [P]## NEW34[X]LN [3]## INPUT #[P]4[O]TAN 
  10 GOTO VAL "7000"
  20 POKE VAL "16418",O
  30 IF F THEN FAST
  40 IF USR VAL "20161" THEN REM [S][T][A][R][T]
  50 LET G=G+SGN PI
  70 IF F THEN SLOW
  80 IF USR HR THEN CLEAR
  90 PRINT AT VAL "23",VAL "8";"[G][E][N][E][R][A][T][I][O][N][:] ";G
 100 POKE VAL "16418",VAL "2"
 110 IF USR HR THEN PAUSE VAL "100"
 120 IF INKEY$ <>"" 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 CON<VAL "1" OR CON>VAL "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 A<VAL "1" OR A>VAL "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$ 

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

Scroll to Top