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
USRcalls. - 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: SincePIis non-zero,NOT PIevaluates to 0. UsingOin place of the literal0saves tokenized bytes.SGN PI: Always evaluates to 1; used at line 50 (G=G+SGN PI) as a byte-saving alternative toG=G+1.VAL "number"inGOTO/GOSUB: Used throughout (e.g.,GOTO VAL "7000",GOSUB VAL "8000") as a memory optimization — the tokenized number in aVALstring 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 onCON, replacing a chain of IF statements.- String doubling loop: Lines 7060–7077 build
B$andC$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 byIF 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 onlyGOTO 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]) usesLIST 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 aUSR HRcheck, so the machine code likely substitutes a shorter wait or a keypress-sensitive pause.
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.