ZX-PAINT is a full-featured bitmap painting program that interfaces with an external “SCRAM” board, using machine code routines extensively via USR calls to handle input, output, and rendering. The program supports multiple drawing tools including freehand plotting, line drawing, rectangle drawing, flood fill-style operations, and custom 8×8 tile pattern editing, with coordinates tracked through memory-mapped registers accessed via PEEK. Output can be directed to either the screen or a printer (via LPRINT), with hardcopy support through COPY. The initialization routine at line 9000 sets up a 192×32-character string buffer, seeds coordinate registers, and uses LPRINT to send raw hex data (likely font or sprite data) to connected hardware. A notable technique throughout is the use of VAL with string expressions in GOTO and GOSUB to compute branch targets dynamically, and USR calls are used both as hardware interface functions and as Boolean flags controlling conditional execution.
Program Analysis
Program Structure
The program is organized into functional blocks separated by line number ranges. The REM at line 0 contains encoded data (likely machine code or lookup tables encoded as BASIC tokens). Lines 1–5 form a startup/dispatch stub. The main tool dispatch runs from line 70 upward, branching via computed GOTO VAL "150+K*50"-style expressions. High-level tool routines occupy the 100–4800 range, and initialization is at lines 9000–9130.
| Line Range | Purpose |
|---|---|
| 0 | REM block — encoded machine code / data tables |
| 1–5 | Startup: GOSUB to 9000, dispatch via USR, key scan |
| 25–70 | Hardware init (POKE R/C registers), tool branching |
| 100–190 | Shared three-point input subroutine (N3) |
| 200–350 | Tool setup stubs (line, shape, fill modes) |
| 400–560 | CLS confirm, screen copy, hardcopy |
| 1000–1120 | Pen color / mode selection |
| 2000–2510 | Drawing tools: freehand, circle, flood, cursor readout |
| 3000–3900+ | Line and rectangle primitives (up, down, left, right) |
| 4000–4800 | Pattern editor, speed select |
| 9000–9130 | Initialization, SAVE, startup message |
Machine Code Usage
Machine code is invoked pervasively through USR. Many conditionals take the form IF USR H THEN ..., where H holds the address of a routine that returns a Boolean result (non-zero = true). Separate USR entry points handle keyboard scanning (USR I), pen position reads (PEEK A / PEEK B after a USR call), pattern rendering (RAND USR E), and hardware initialization. The literal addresses 19466, 22144, 22274, 22333, 22353, 22387, 22427, 22474, 22484, 22613, 22928, 23018, 23039, 23065, 23076, 23110 appear in USR VAL "..." calls, pointing to machine code routines stored either in the REM block or in RAM above BASIC.
The initialization at line 9060 sends a hex string via LPRINT — almost certainly raw font or sprite bitmap data being transmitted to the SCRAM board’s own processor or memory.
Key BASIC Idioms
- Computed branches:
GOTO VAL "150+K*50",GOTO VAL "1950+USR P*50"— tool dispatch is entirely arithmetic, avoiding a long IF/THEN chain. - USR as Boolean:
IF USR H THEN ...— the machine code routine at addressHreturns 0 or 1, gating entire blocks of BASIC. - Symbolic register variables:
A,B,R,C,H,I,J,P,Q,E,L,M,N0–N8are all pre-loaded numeric constants acting as named addresses and parameters, keeping lines short. - RAND USR for side effects:
RAND USR Ediscards the return value, using the call purely for its side effect (pattern rendering or hardware sync). - String arithmetic in pattern editor: Line 4670 builds a byte value by testing individual characters of the input string and summing weighted
CODEvalues — a compact bit-packing idiom without bitwise operators. - DIM G$ as buffer reset:
DIM G$(N8,N7)and similar calls reallocate the string array to establish a fresh working buffer for each tool mode.
Notable Techniques
The three-point input subroutine (starting at line 100) reads two or three coordinate pairs by polling the hardware joystick/tablet via USR, storing results into X, Y, V, W, T, U. This drives every drawing primitive (line, rectangle, arc) from the same shared input loop, with K=S as the abort sentinel.
The pattern editor (lines 4400–4800) accepts 8 rows of binary strings (e.g. "10110101"), converts each to a byte, and POKEs it directly into a tile table in RAM. It then re-renders the tile live using RAND USR E after each row, giving immediate visual feedback.
The rectangle-fill primitives (lines 3900–4290) implement directional growth: up (WU), down (WD), left (WL), right (WR) each sort their coordinate pair and loop, incrementing a delta N and LPRINTing drawing commands to the SCRAM board each iteration.
Line 9105 uses SAVE "ZX-PAIN[T]" to save the program. The startup message at line 9110 explicitly warns the user not to RUN the loaded program directly and instructs enabling the SCRAM board first, confirming the program requires external hardware to function.
Bugs and Anomalies
- Line 4610:
LET N=N-(J$="B")+(LEN J$=N0)— this modifies the FOR loop variableNdirectly to implement back-step and skip, an intentional but fragile idiom that depends on the BASIC interpreter re-evaluatingNat each NEXT. - Line 2310:
PRINT ;;;;AT 107,N4;— the row value 107 far exceeds normal screen coordinates, suggesting this is a deliberate out-of-bounds PRINT used to communicate data to the SCRAM board via the printer channel rather than a display operation. - Lines 3 and 25:
IF USR 19466 THENandIF USR H THEN RUN— these conditionally restart the program if the hardware signals a reset condition, acting as a watchdog.
Content
Image Gallery
Source Code
0 REM [Z][X][-][P][A][I][N][T] ## GOSUB # <> DIM LN F? CLEAR#OUORND[S]C IF TAN LN [M]RNDY2 GOSUB #<>5▟▝TAN CLEARACS #▚/▖ CLEARACS #LEN LN [M]RND<>5<>RNDTAN NEXT CLEARACS #: NEXT Y▘4▒ CLEARACS #LEN : PRINT Y▘# ( CLEAR▟W4 CLEAR▞"" CLEARACS ##C▝▞[K])4 5 4<>5:INKEY$ /▒)4 ▌ASN 1INKEY$ ;# GOSUB ###[:]"" GOSUB # E£RND) RUN ▙;Y2 GOSUB #Y PRINT ▘▛▝ CLEARACS ##CODE [P]▝LN [>]▝LN 4▝<>5<>RND#[8]▝ PRINT # RETURN,C▝INT / LET TAN SCROLLLN #? FASTLN LN + LPRINT TAN SCROLLLN #?#[B]:LN #INKEY$ PRINT LN #INKEY$ 7LN #INKEY$ # LET #TAN SCROLL RETURN#C▀ RETURN;""6-RNDTAN TO / PAUSE Y3[)]K▝INT (Y[Z][(]SQR INT 2LN #INKEY$ LN #INKEY$ / INPUT LN #INKEY$ /[H]LN #INKEY$ / SLOW5 6 RETURNZA4##<▘ COPY*Q GOSUB [K]TAN A ##▞▌ACS 9ACS =( IF ,,▘ 4,,TAN LN [~~]INKEY$ ##ACS ZACS ZACS Z##STR$ LN [J]INKEY$ LET J NEW▛W#TAN LN [>]INKEY$ ##LN #INKEY$ VAL LN #INKEY$ AT LN [J]INKEY$ #TAN 2 COPY/▝2 STR$ LN [*]INKEY$ SGN GOSUB # UNPLOT ZLN CODE INKEY$ ##?( CLEARACS .*PI▌4▝▞▒▛( CLEAR#TAN Y COPY/▘[J]/▝ MWRNDLN [*]INKEY$ # RETURN,4▛ GOSUB # UNPLOT ZLN [*]INKEY$ ## GOSUB # UNPLOT Z6 UNPLOT ZVAL #[)]-▘K▖ GOSUB #- COPY4▝- FAST# CLEAR#Y LET [(]2▘K▖ GOSUB #2 COPY4▝2 CLEAR#X#[W]S▞##- /▝2 GOSUB #ZRND84▘96INKEY$ RND#[B]3#A 6#RNDAT VAL Y[Z][(] CLEAR#WLN [W]#/,, CLEAR#INKEY$ ▞ CLEAR###,, CLEAR## GOSUB #ZRND CLEAR#PI GOSUB PIS▛ CLEAR## GOSUB #XRNDAT #▙##▄# CLEARO#UPIRND CLEAR[Y]#4[U]TAN LN #INKEY$ LN 4+ LOAD K LET $[M]H?▖O#[~~]+▞(## FOR 5 ACS TACS 3K▘; FOR D FOR ( POKE TAN Y COPY/▘[J]MWRND CLEARACS #[-]7LN [>]INKEY$ 5[+]▘6#RNDI 6#RND#6INKEY$ RND GOSUB # UNPLOT Z GOSUB ##RND FASTLN #INKEY$ LPRINT #6#RND6#RNDLN #INKEY$ CBLN #INKEY$ LN #INKEY$ M#RNDLN #INKEY$ C;LN #INKEY$ LN AT PI GOSUB ##RND TO LN #INKEY$ LN AT PI CLEARACS #CHR$ GOSUB ##RNDE#RND FASTEINKEY$ RND GOSUB ##RND▞▞ACS EACS .( IF GOSUB #6INKEY$ RND FOR E#RND▞▞ACS EACS .( IF GOSUB #6#RND GOSUB ##RNDLN PEEK PIU#RND##ACS +[£] PRINT ACS <[0]MRNDRNDEINKEY$ RND GOSUB ##RNDLN PEEK PIU#RND##ACS +[£]MZRND##ACS <[0]AT # CLEARACS ##C)E#RND#[P]C▞F6#RND/? CLEARACS #[-]Y[Z][(]S▞ CLEAR#WLN [W]# LPRINT F#[P]4█TAN CLEARQX▘LN #INKEY$ COS LN #INKEY$ MXRNDLN #INKEY$ COS LN [>]INKEY$ LN #INKEY$ [S]S▀#INKEY$ #LN ▜INKEY$ #INKEY$ LN ▜INKEY$ #PI GOSUB #YRND[)]W PRINT LN #INKEY$ [S]K▀#INKEY$ # GOSUB #RNDRND[(]W4▘XSGN # GOSUB #PIRND CLEAR#INKEY$ CLEAR#ZLN ▜INKEY$ LN CODE INKEY$ 6#RND CLEAR## CLEAR#RND CLEAR#ZLN ▜INKEY$ LN CODE INKEY$ 6#RND CLEAR##TAN GOSUB ##RNDE#RND CLEAR##[J]R*( UNPLOT M#RND CLEAR##[J]▌C▖R*( UNPLOT J CLEAR##▌TAN #[A] FOR ##J[A][K]# FOR TAN #VAL ▘4 ##,,#LN ###AT ( LET [J][5]/ SLOWLN ACS #4*) 4544▘ STEP * GOSUB [K]▞4F#( UNPLOT CLEARPX4 REM TAN LN R# FAST[B] GOSUB # LPRINT C: FASTVAL STR$ LN ##Y COPYSGN AT LPRINT F/ FOR CLEAR[A]#LN ## CLEARPX4<>TAN VAL 5 )4 ;( CLEAR FOR E#RND; FASTE#RND;SGN AT TAN #VAL ▘4 ##[B] GOSUB PI#LN ###AT ( LOAD [J]###LN ACS #4*) COPYR5 TO R▘ STEP * GOSUB [S]▞47#( UNPLOT CLEARPX4 REM TAN LN R#LN [T]# FAST[B] GOSUB # LPRINT C: FASTVAL STR$ LN SQR #Y COPYSGN AT LPRINT F/ FOR CLEAR[A]#LN SQR # CLEARPX4 AND TAN LN ACS #4+5 COPYR▞4#[B]ACS -F( CLS[8]4 POKE CLEARPX4 GOTO TAN LN R##▖U#RNDVAL PRINT FASTSTR$ INKEY$ # PRINT FAST[B] GOSUB # LPRINT C+#[4]# LET #ACS * PRINT #J[A]# LET PRINT [K]#▞ COPYF/ SLOW#[4]### LET #ACS *[4] PRINT #J[A]# LET [K]#SGN LPRINT ▘4 FOR ,, FOR ,, LET AT ([Y] CLEARPX4[L]TAN LN ACS #4-5 4[B]▞4ACS 27( CLSYS[W]4 NEXT CLEARPX4 FOR TAN LN R##▖U#RND FOR VAL PRINT FASTSTR$ # PRINT FAST[B] GOSUB # LPRINT C+#[4]# LET #ACS 3 PRINT #J[A]# LET PRINT [K]#▞ COPY7/ SLOW#[4]### LET #ACS 3[4] PRINT #J[A]# LET [K]#SGN LPRINT ▘4 FOR ,, FOR ,, LET AT ([Z] CLEARPX4[L]TAN ###Y[Z][(]STR$ VAL PRINT LN ## LET AT SGN TAN 2 COPY/▝2 STR$ LN <>#SGN CLEAR##UINKEY$ RND5ZRND PRINT FASTLN RETURN#+C▞WLN ▖#/ RUN CLEAR#PI LPRINT LET F FASTLN RETURN#+C▞£LN ▖#/ RUN CLEAR## LPRINT URNDRND PRINT FASTLN RETURN#+C▞XLN ▖#/ RUN CLEAR#PI LPRINT LET 7LN RETURN#+COS $LN ▖#/ SAVE ##[A]##J##J[6][N]#)4 ;( LOAD TAN LN ACS #4+5 4▘ /#J#7YS[W]4 RUN CLEARPX4 GOTO TAN LN R#▖J FAST[B] GOSUB # LPRINT C: FASTVAL STR$ LN ##Y COPYSGN AT LPRINT F/ REM U#RNDJLN ## CLEARPX4 AND TAN M$( LN [J]INKEY$ FAST TO FAST5[X]#6-RNDLN 0)AT GOSUB #-RNDK▝INT 6777# RETURN▝4 PLOT 7#Y""[>]S LOAD 77#Y4[)]S SCROLL77 CLEAR#X▞ SGN TAN LN [>]INKEY$ ##Y4[)]MYRNDLN #INKEY$ SCROLLM[X]# SCROLL RETURN$4SIN ##INKEY$ VAL [J]# FOR GOSUB PI FOR AT TAN LN RAND # PRINT LN AT # LET ▞# FASTC0 RETURN,4[E] SCROLL RETURNA▞[A]C£ RETURNO▞[Q]C▞ RETURNX▞[I]4[*]LN #INKEY$ 4 CLS#M## LPRINT UYRNDINKEY$ :4VAL PRINT STR$ YS[U]4▖SGN -4STR$ ,#>7< CLEARPYATN <#( REM FOR LPRINT ,, FOR LET AT MYRND CLEARPX4 OR TAN Y /▝Y>M[4]#LN RAND #4[S]LN AT #UYRNDINKEY$ :4VAL PRINT STR$ YS[U]4▖SGN -4STR$ # PRINT ,# LET >7< CLEARPYATN <#( SCROLL FOR LPRINT ,, FOR LET AT MYRND CLEARPX4CHR$ TAN 7# RETURN0K▝INT 1 RETURNGK IF CHR$ 0TAN LN [U]##ACS 4ACS 4ACS 4ACS 4LN [U]#█#7# RETURN"#TAN SCROLL RETURN"TAB 9#7#ACS #C▝CHR$ RND) 77 FAST▞▒## FOR ;( CLEAR FOR 5 S; FOR LPRINT TAN LN STEP #7LN TAN #>4▀## </ POKE ##[B]4## CLEAROY CLEARACS Y#4/7#[B]C LET ACS #4?▞ COPY[B]*S▖ACS // SAVE #J[5][Q]# FOR F CLEARPZ CLEARACS Z#""#[B]4▀#/ LIST ACS #""▞ COPY[B]ACS 3S▖ACS (/ RUN #J[5][Q]#TAN VAL #Y,,[(]#ACS )S▌( IF AT /[P]AT ##ACS ;S/( IF CLEAR#WLN ## CLEAROY CLEARACS Y#""7 CLEAR#W##/[-] CLEARACS #CHR$ ##VAL ACS ;( UNPLOT AT ** CLEARACS #[-] CLEAR#WVAL Y,,[(]#[J]#ACS >ACS <ACS ▘W( RUN ACS >ACS <ACS ▘WK RUN ACS .ACS ,,XACS .ACS ;X4 RAND #AT Y,,#[(]ACS ;+( CLSACS ,,+K CLS#PIACS <ACS ▘( IF PIACS ;ACS .( IF #TAN LN [~~]INKEY$ VAL PRINT LN 1+Y▒LN 1+LN R0LN LN +LN [B]:Y▛[)]# GOSUB ##RND LET AT #ACS UACS UACS U5YRND#7#7#LN CODE INKEY$ FASTVAL LN #INKEY$ MINKEY$ RNDLN #INKEY$ LN STEP ##LN #INKEY$ TAB *# FOR ▘▛ ,,6#RND GOSUB ##RND GOSUB PI6PIRNDAT SGN CLEARACS #[-] CLEAR##Y▒[)]#/▝:▒STR$ VAL EPIRND#F6PIRNDMWRND CLEARACS ##TAB [A]▝##LN =# CLEARPINKEY$ ASN [A]▝AT LPRINT [B])4 GOSUB ## RETURN3COS URNDRNDMYRNDMZRND$ FOR 4COS E#RND6PIRND/[Y]LN [V]▝##GC SAVE ACS RNDC POKE LN [X]▛#▞ #TAN SCROLL RETURN#4,,LN ,,#LN 0#/K SCROLL RETURN,C> RETURN;CG RETURN#C# RETURNAT C# RETURNTAB C#/# GOSUB # RETURNZ# NEW LIST LEN ( RETURNRNDCODE FAST#ATN STEP #/CHR$ #LEN ▒#[J]# GOSUB # RETURNZTAN ▞ COPY SCROLL RETURN#COS RETURN,4▖Y▖/" RETURN;4LEN ▖# RETURN▀ASN 9#M CLSZ/ SLOW GOSUB # RETURNZ/SGN LN #INKEY$ ## RETURN[T]ABS [▒]INKEY$ # RETURNRNDABS ▙INKEY$ GOSUB # RETURNZ TO /[)]LN #INKEY$ NEWZ GOSUB # RETURNZ[T]#K GOTO Y▒█#/ NEWLN #? CLEARACS ▘#CODE STR$ .LN SAVE <#[L]C OR ,VAL STR$ LN ##SGN AT <"/ LIST 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 # RETURNZ PRINT YZ[)]>= STEP #LN 0# LET VAL M#RND[B]*[B]**- ACS >#5 2; FASTACS TLN [J]INKEY$ SGN U CLSZ RETURN▖ASN 7# RETURN▝CPI RETURN▘CEY▒ PRINT STR$ , PRINT U CLSZ[B]4~~ CLEARACS ##C▖ LET J/▘ LET #)4 ;SGN LET <X4 STEP AT ££ GOSUB # RETURNZTAN U#RND RETURNASINT RETURN[A]KACS FAST5 2; FOR LPRINT /TAB U#RND▛ FAST5 0S LET A,/ GOSUB CLEARACS ##Y[S]C▝Y[C][S]SQR ▘ TAN #VAL ) 45 5ACS SACS SACS S# GOSUB [K]F#( UNPLOT AT TAN ▘ ""LN 0## NEW# PRINT SCROLLLN 0) AND #$ASN 9#7 FAST▞▌[J]#7( UNPLOT SGN LET TAN LN AT INKEY$ #?( CLEARLN ##SQR Y▟>TAN LN AT INKEY$ ##LN 4+ FASTLN ## LPRINT LN PLOT ;#[~~]+LN AT INKEY$ #▞ / REM <># PRINT LN SCROLL▝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 CLS14PEEK Y▖PEEK CLS LET RETURN GOSUB ASN ▛▝#STR$ RND)KY GOSUB # UNPLOT Z CLEARACS ##4~~2S CLEAR#W[B]4▝2RND GOSUB ##RND#LEN ▖##CHR$ ▖##▜#VAL LN LOAD #AT #[X]▛ GOSUB # UNPLOT ZLN [~~]# RETURN#TAN LN ~~#4 CLS▘COS TAN )[(]RNDLN #INKEY$ C>STR$ LN #INKEY$ #LN #INKEY$ ▖SGN ,LEN █><( RAND TAN ▞4[J]><( UNPLOT TAN LN #INKEY$ RETURN4) ▞K▞LN NEXT ##▛#INT .▘4 ,,# RETURNS**#TAN LN #INKEY$ RETURN4K GOSUB LN #INKEY$ [B]***- #5 Y;6#RND##INKEY$ LN ## GOSUB # UNPLOT ZY[Z][(]K▝CHR$ RND##ACS WACS 1ACS WACS 1ACS WACS 1ACS GOTO 6 DIM Z#J NEW▛WM#RND) FOR Z GOSUB ##RNDY▒ PRINT #>~~VAL #U#RND RETURN▌S)JLEN ,,[B]##: C:3ACS ;( CLS/▛#[J]ACS )*( CLS[I]#7<#>#[I]#FLN ##<AT ▀ LET X4SIN TAN LN #INKEY$ TAB *#E DIM Z) FOR Z▞▒VAL ,#7<,#FLN ##<AT ( LET TAN #A #2▒#[E] NEW█# FAST GOSUB # GOSUB ###SGN 5 RZ PRINT ##2▒DK▌[?] GOSUB #/,,▗ GOSUB #S▀ GOSUB PIXW14 GOTO # LET K LLIST ACS #4▘ FOR ACS #COS FOR [B] GOSUB # GOSUB #TAN TAN LN [V]▝G4 IF TAN GOSUB # UNPLOT Z# RETURN COPY4▖▞[Z]/▞ RETURN""4▝▞ Y[Z][(] GOSUB # UNPLOT ZTAN LN IF INKEY$ )▘ .#[N]4 CLSTAN LN [~~]INKEY$ GOSUB # UNPLOT ZLN #INKEY$ M## CLEARACS #CHR$ LN >=#LN ##VAL PRINT LN CODE INKEY$ 2 COPY LET AT VAL PRINT LN ## LET AT LN ## E9RND##GC LPRINT LN ▝##:$)VAL ##M# CLEARACS #CHR$ /ATN CLEARQW COPY CLEARACS #[-]/£ CLEARQW / POKE CLEARO CLEAR CLEARP UNPLOT LN ## CLEAR#W CLEARACS ##4[E]LN [N]#/[9] CLEARO CLEAR/ REM CLEARO UNPLOT / PLOT CLEARO UNPLOT / STEP CLEARP CLEAR/ PLOT CLEARP CLEAR/CHR$ CLEARP UNPLOT / PLOT CLEARP UNPLOT /ATN TO RETURN;CM RETURN#C▝INT + LPRINT ▘ ## TO RETURN THENC▝INT ) FAST SCROLL);#STR$ :()1#▞ FOR GOSUB [5]C▌77 REM P##7# FOR VAL TAN SGN ):#STR$ :?) INPUT # SCROLL# SCROLL RETURN#CSQR RETURN;4 RUN F#7 RETURN$C▘#/INT :▌)[.]#F#7/VAL :▖)[G]#/ POKE FF#77:▀)[U]#/[M]YX: GOSUB [T]77#:▀)[(]#/[6]C GOTO PID=PIR>#9#D##E DIM #M9#P##S9#9#D NEW#LD#R[<]#U##9#G##P0#S##9#C[W]#DTAB #EATN #R##1ABS #2 INPUT #3 SAVE #4▝#5▛#6 CLEAR#7 DIM #8 NEXT ####[:]#X█#A##B OR INKEY$ C CONT PID(PIF CONT #I##L▚#P##R:#S##T##U▖#W##$##9# LPRINT ## LLIST 9# SCROLL9# LOAD 9# LIST 9# PAUSE 9# PRINT [D]# PLOT FOR INKEY$ RUN ACS RND SAVE 9# RAND 8# CLS[0]INKEY$ UNPLOT LOAD INKEY$ CLEARSGN RND RETURN[Z]RND COPY[:]#9# LIST LIST LIST LIST LIST LIST LIST LIST WWWW LIST LIST LIST LIST #### LIST LIST LIST LIST ???? LIST LIST LIST LIST LIST LIST LIST LIST WWWWWWWWWWWW####WWWW????WWWW#[9]#[9]#[9]#[9] LIST LIST LIST LIST #[9]#[9]#[9]#[9] LIST LIST LIST LIST ##RND RNDRNDRND [4]E##[:][E] ##[▒]#▙## RND8 ▖ ##PI# # 6##CODE #PI4 ▜PIPI#PI#█ ▒▖#[8]▒ ▝▖▒▖▝ LIST ##RND#RND# #USR [Y]▜# #4I44# E# INPUT #E ▙▙##CC RND[8]RNDRND#▖▒ RND█ ▖▖▒ £# (-,,,,0(█▜[£]▜▜▜[:]█ LIST ▖~~▝▖▒: LIST [:]▙▜▙[~~]▜█ LIST >-,2>>(█[:][▒][£]▙[~~]▜ LIST (=/0,,= LIST █[:]PIPI8C/((=E8##▜█ ▖[~~] IF [A][6][8] RND[8][6] NEW[E][A] COS [C]ATN [E][E]ATN #▜[~~][▒][▒]# TAB [6][A][E][E]LEN STEP ▜ASN [:][▒] NEW LLIST ▜EXP ▜▜▜ RND[8][~~][E][A]#£ [C][C] GOTO [E][E][E] SLOWRND### SLOW #4A6[6]#▖ [C][C]ASN ATN [E][E] ▜▜▜▜▜ LLIST [4] REM INPUT [I][E][E] ""[G][E][E][E][E] RND[8][E][E][E]# ""[G][E]ASN [£][▒]▒ RND[A][E][E][A]PI7 ""[G][E]COS [C][C] #▚#86ATN SLOW####PI [4][E][E][E][E]# [4][E][E][E]## [4][E][E][E] INPUT [E] [4][E]##[E][E] [4][E]##PIPI▖ STEP IPI#[▒] INPUT #0#CATN #DABS #E>=#R0#1 LLIST #2 RETURN#3▒#4>#5*#6$#7 RAND #8▀#[;]# ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█ █ RND "" ███RND█""█""""RND""█"" """"RNDRNDRND█RND RND COPY COPY COPY COPY COPY COPY COPY COPY COPY# COPY<> COPY# COPY<>#<>#<>#<>#<>[E]#[E]#[E]#[E]#[▒]6[▒]6[▒]6[▒]6[▒] 6 [▒] 6 █ ▒ █ ▒ COPY# COPY# COPY# COPY# [E] [E] [E] [E] COPY COPY COPY COPY ""£[$][L]K▀.**█▖RND▒▘4▝(<>[V]# INPUT <>[V]# INPUT 6#[▒])6#[▒])[E][E][E][E][E][E][E][E] COPY COPY 66666666▒ [E] ▒ [▒] 66 COPY666 COPY6▝▝ COPY▝▝▝▝▝███ COPY▒▒▒ COPY4RND█INKEY$ 6=▒( ( [E] [▒]=6INKEY$ [▒] RND█ ▒▖▝ 4 ▖~~ RND[4]#▙▘▘▘▙#T#6*[?]#6# SAVE ~~▖▖#[4]RNDRND#▘▘▀▜#K£▝INKEY$ Y▒▒= STOP██▖▒(4#[E] COPY▝D#▙INKEY$ 6[=]#[>][?][?]#[/] SAVE SAVE #[,,][K][K][K][Z] [Z][Z][K]C( (C#[E]#PI▟/88/▟PI4#[▒]▌▝▌[▒]#PI[9]#88#[9]PI COPY▟▟▟▟▟▟ COPY LIST [(][(][(][(][(][(] LIST #▟████▟# STEP [(]████[(] STEP COPY██#:▘▘ COPY LIST ██RND4(( LIST , ▘▝▗▖▌▄▀▐█▒*?,,▛[~~][,,][▒](-+=><)""▟▜~~▞$/▙;▚:[,] ▘▝▗▖▌▄▀▐█▒[*][?],,▛[~~][,,][▒][(][-][+][=][>][<][)]["]▟▜~~▞[$][/]▙[;]▚[:]"[4]";#0?#54#69#7E#8J#9,##£### STR$ #- PIVAL 55 LN ▌<AT ,, FOR E£RND7;SGN TAN #Y▘ACS CK▝Y▖ACS DK▘▛ PRINT LN [*]##▛ RETURN(K▞?K▝ INPUT [?]#1C▌ LET J[4]/▝ LET [K] RETURN▒S▝ INPUT [?]#TAN GOSUB #QRND# RETURN COPY4▖▞J/▞ RETURNK4▝▞ YJ[(] PRINT # RETURNRND4▖: /▞ RETURN COPY4▝:Z GOSUB #QRND LET TAN LN [H]# GOSUB ###==###LN ~~#ASN ;#LN 4#/ PRINT LN [Z]RNDE£RND6WRNDE UNPLOT Z# RETURNSIN S▝I""YK[W]S▝AK6 UNPLOT Z##Y[Z][(]LN CODE INKEY$ 6YRND▞/VAL ▞▒VAL ▘4 FAST#,,#▞▖Y [R]ACS <ACS *ACS <ACS *ACS >ACS *ACS >ACS *5[▒]#STR$ - #;SGN #EWRND7# RETURN#C IF 6WRND#(USR LPRINT 7AT (VAL ▘S ,,AT ([V]53/6QRND CLEARACS #CHR$ LN <>#VAL PRINT #ACS CACS DLN [*]##2▘ LET AT STR$ VAL PRINT LN ,,# LET AT LN ,,#SGN #E9RND##GC OR LN [X]▛#:$)###M# CLEARACS #CHR$ /SIN CLEARQINKEY$ ▘ CLEARACS #[-]/£ CLEARQINKEY$ / POKE CLEAROR CLEARPQLN <># CLEARACS ##4[C] CLEAR#INKEY$ LN [H]#/[4] CLEAROR/ REM CLEAROQ/ PLOT CLEAROQ/ STEP CLEARPR/ PLOT CLEARPR/CHR$ CLEARPQ/ PLOT CLEARPQ/ATN LN ACS RNDE£RND7▞/VAL ▞▒VAL ) ▞▖ FAST#ACS #5[*]#C▌ACS [Z]5[B]#▗WVAL ▞ #,,#ACS )ACS >ACS )ACS >7#ACS )ACS <ACS )ACS <AT LPRINT 7(PEEK FASTEYRND#▘4 FAST,,# LPRINT 76YRND LPRINT AT ([T] FASTEYRND▘S ,,6YRND LPRINT AT 7([A]#E~~ Y[Z][(]VAL PRINT LN ▛#Y▛[<]# GOSUB # STEP Z LET AT LN CODE INKEY$ FASTVAL 5#U GOSUB # STEP Z[B] GOSUB PI FOR AT LPRINT CLEAR# STEP Y▒[)]#TAN ACS #ASN IF INKEY$ GOSUB # UNPLOT ZLN ▗#VAL #3( CLEARAT /▛VAL #3( CLEARAT **VAL ,##?ACS ,,( CLS*AT LN ▞PI▘4 [B]TAN LN [)]# RETURN0S RAND RETURNAK PRINT CHR$ 0▞ #VAL LN ##AT TAN ▘ Y>M[4]## CLEARQY4#▚#LN RUN #LN ##LN [)]# RETURN1S RAND RETURNAK PRINT CHR$ 0▞ #VAL LN RUN #AT TAN FAST5#L; FOR LPRINT U#RND NEW█U RETURNZ?▞▒VAL PRINT ,#CGS0 NEW LIST PRINT # NEW?# LET [K]#<STR$ )4 ;SGN LET AT ( STOPAT £ GOSUB # RETURNZTAN ACS ZACS ZACS ZACS Z PRINT # NEW LIST />=S~~ACS BACS BACS BACS B/ATN NEW?/ REM LN [~~]##[Z]# E-RND FAST SCROLLLN [D]#LN [)]# RETURN#ASN ;# RETURN64£U[U]#X RETURN COPY4)YB/$ RETURN74 SLOWU[U]#W RETURNC4▘[J]M[U]#LN [T]# LPRINT 6-RND/ASN Y #- 5▒ FASTLN ▌<)[S]#;)#UAT GOSUB [K]TAN VAL LN SIN # AND [B]▝[B] GOSUB PIY3[W]AT COS $.4 GOSUB )#U:▒/ NEWVAL LN SIN # AND [B]▝,,YS[W]AT COS $<4 LOAD )#U:▒/ CONT LN ~~#ASN ;# GOSUB # UNPLOT ZLN ▗#VAL FASTSTR$ LN SQR #SGN LPRINT ▘4 ,,AT YS[W]C( CLEAR# STEP #[B]4▌:▒)#U<LN REM #E UNPLOT ZG4▘H6 UNPLOT Z/VAL E-RND FAST SCROLLLN ~~#ASN ;#LN CONT # LPRINT 6-RND/ LOAD E-RND FAST SCROLLLN ~~#ASN ;#LN CONT # CLEAR# CLEAR▖Y[Z][(]K▝▞[Z] CLEAR# CLEAR LPRINT 6-RND/ LPRINT LN ~~#ASN ;# GOSUB # UNPLOT Z2 COPYY[Z][(]VAL LN PLOT INKEY$ LN ##LN ~~# LPRINT C SCROLL GOSUB # UNPLOT ZLN OPILN ##/**LN ~~#CCHR$ GOSUB # UNPLOT Z2 COPYY[Z][(]VAL LN PLOT INKEY$ LN ##LN ~~#AT C""E UNPLOT ZVAL LN OPILN ## LPRINT 6 UNPLOT Z FASTLN ~~#/ DIM LN ##LN [)]#▘2 TAN E-RND FAST SCROLLLN ~~#ASN ;# GOSUB # UNPLOT Z GOSUB ##RND2 COPYY[Z][(]LN PLOT INKEY$ LN ##LN ~~#C FASTLN =#LN ## LPRINT 6-RND/USR )[4]▀.#[N]4 CLSTAN ▞ #,,#-$2▘ PRINT STR$ M##5##6-RNDLN [D]# LET X RETURN COPY4▘[J]#STR$ LN 5#LN [V]▝GASN [A]▝SGN LET / OR 5 SAVE #) Y▘K GOSUB [K] GOSUB # RETURNZE-RND FAST CLEARACS #[-]LN ##LN ## CLEARACS ##ATN 2#LN O#ACS 5ACS 5Y[Z][(]#LN █#LN [V]▝##G4£ CLEARACS ##ATN 2#LN LOAD #/NOT VAL LN LOAD #AT CLEARACS ##C#ACS RND4GACS ""LN [X]▛# RETURN#4▒ CLEARACS ##C#/# RETURNRNDK[M][B]4▖Y[£]/BLEN █ CLEARACS ##C3CHR$ [.]5##/9LN [X]▛# RETURN#C[~~] RETURNRNDK[(] CLEARACS ##4" RETURN"4▝Y""LN G#/[A][B]C▌CHR$ .5C#LN B#/ LET LN [X]▛#:▛)###M##;# CLEARACS #[2] CLEARACS #CHR$ ### CLEARACS # THEN/ NEXT CLEARP RETURN/ATN CLEARO COPY/SIN CLEARP COPY/TAB CLEARO RETURN/[X] GOSUB # RETURNZ# RETURN COPY4▖:Z/▌ RETURNRNDUSR STEP ## RETURN COPY4▖▞[S]/▞ RETURN[T]S▝▞ GOSUB # RETURNZU CLSZ RETURN▖COS ACS ▟TAN 5 Y2▒ CLEARACS ##C:I(2/ CLEARACS ##C▖I42CU CLSZ RETURN▖4▘#6#RNDTAN LN 7?) ▖LN #?K/( RETURN.#[N]4 POKE 5 4▘ /VAL LN 2▀7AT "#[L]4 PRINT ▘; TAN AT LN ##/ PLOT :▘Y#<= RETURNPEEK COPY3K LOAD SQR **K PAUSE STR$ 2[=]▞,1<= RETURN*ACS ##S PRINT ( PRINT SGN 4▖ RETURN#K OR ZACS )KCHR$ TAN LN 7?5 4) /LN [X]##7.#[N]4 PLOT /[O]LN 7?) ▖LN #?K[D]( RETURN.#[N]4 POKE 5 S▘ ▞/[?]LN 7?5 S) ▞/INT E-RND FAST SCROLL FAST▘£ ,,▘0▒SGN FASTVAL STR$ GOSUB #-RND#LN [D]#SGN AT LPRINT £( LOAD #;#E-RND FAST SCROLL▞▒ FOR EMRNDSTR$ GOSUB #-RND<<#76MRNDVAL ▞▒[J]ACS ▘K▝Y█><( PRINT LN [D]#AT LPRINT (<=#;#
1 GOSUB VAL "9E3"
2 GOTO CODE ";"
3 IF USR 19466 THEN
4 LET K=USR I
5 RETURN
25 IF USR H THEN RUN
30 POKE R,CODE "A"
40 POKE C,CODE "M"
50 LET K=USR P
70 GOTO VAL "150+K*50"
100 GOSUB N3
105 IF K=S THEN RETURN
110 LET X=PEEK A
115 LET Y=PEEK B
120 IF USR H THEN LPRINT P;X,Y,G
125 IF USR H THEN PLOT X,Y
130 GOSUB N3
135 IF K=S THEN GOTO CODE "[T]"
140 LET V=PEEK A
145 LET W=PEEK B
150 IF USR H THEN LPRINT P;V,W,F
155 IF USR H THEN PLOT V,W
160 GOSUB N3
165 IF K=S THEN GOTO CODE "[O]"
170 LET T=PEEK A
175 LET U=PEEK B
180 IF NOT F THEN IF USR H THEN UNPLOT V,W
185 IF NOT G THEN IF USR H THEN UNPLOT X,Y
190 RETURN
200 POKE R,CODE "C"
210 POKE C,CODE "P"
220 LET L=CODE "COS "
230 GOTO VAL "1950+USR P*50"
250 POKE R,CODE "G"
260 POKE C,CODE "T"
270 LET L=CODE " IF "
280 GOTO VAL "2900+USR P*100"
300 POKE R,CODE "8"
310 POKE C,CODE "C"
320 GOTO VAL "980+USR P*20"
350 GOTO USR VAL "22474"
400 DIM G$(N8,N7)
410 IF USR H THEN LPRINT G$;N0,N0,G$
415 IF USR H THEN PRINT AT N0,N0;;"█[S][U][R][E][?]█"
420 LET K=USR I
425 IF USR H THEN LPRINT P$;N0,N0,G$
430 IF K=CODE "Y" THEN IF USR H THEN CLS
440 GOTO M
450 GOTO USR VAL "22928"
500 GOTO USR VAL "23018"
550 IF USR H THEN COPY
560 GOTO M
600 IF USR H THEN RETURN
610 PRINT " GOTO 25 TO RESTART."
620 STOP
1000 GOTO M
1020 POKE O,N0
1030 GOTO VAL "USR 22613+300"
1040 POKE O,N1
1050 GOTO VAL "USR 22613+300"
1060 POKE O,N4
1070 GOTO VAL "USR 22613+300"
1080 POKE O,N2
1090 GOTO VAL "USR 22613+300"
1100 GOTO USR VAL "23039"
1120 GOTO USR VAL "23065"
2000 GOTO M
2050 GOTO USR VAL "19476"
2100 GOTO USR VAL "21525"
2150 IF USR VAL "22333" THEN PRINT PEEK A,PEEK B,CODE "COS ","["]"
2160 GOTO L
2200 IF USR VAL "22353" THEN PRINT PEEK A,PEEK B,N1,"["]"
2210 GOTO L
2250 GOTO USR VAL "22274"
2300 IF USR H THEN LPRINT S$;N0,N0,P$
2310 IF USR VAL "22144" THEN PRINT ;;;;AT 107,N4;"["]["]["]["]["]";TAB N4;"["]["]["]["]["]";,
2330 IF USR H THEN LPRINT S$;N0,N0,P$
2340 GOTO L
2350 GOTO USR VAL "22387"
2400 GOTO USR VAL "22427"
2450 GOSUB N3
2455 IF K=S THEN GOTO L
2460 LET X=PEEK A
2465 LET Y=PEEK B
2470 IF USR H THEN LPRINT P;X,Y,G
2475 IF USR H THEN PLOT X,Y
2477 GOSUB N3
2480 IF K=S THEN GOTO L
2481 LET V=PEEK A
2482 LET W=PEEK B
2484 IF USR H THEN PLOT V,W
2486 IF USR H THEN PLOT X,Y
2488 GOSUB N3
2490 IF K=S THEN GOTO L
2491 LET T=PEEK A
2492 LET U=PEEK B
2493 LET XR=ABS (X-V)
2494 LET YR=ABS (Y-U)
2495 IF USR H THEN LPRINT C;X,Y,XR,YR
2497 IF NOT G THEN IF USR H THEN UNPLOT X,Y
2498 GOTO VAL "2450"
2500 IF USR VAL "22484" THEN PRINT PEEK B,PEEK 16473,PEEK A,PEEK 16472
2510 GOTO L
3000 GOTO M
3100 IF USR H THEN RAND CODE "3"
3110 GOTO L
3200 GOSUB N3
3205 IF K=S THEN GOTO L
3210 LET X=PEEK A
3215 LET Y=PEEK B
3220 IF USR H THEN LPRINT P;X,Y,G
3225 IF USR H THEN PLOT X,Y
3230 GOSUB N3
3235 LET U=PEEK A
3240 LET V=PEEK B
3245 IF NOT G THEN IF USR H THEN UNPLOT X,Y
3250 IF USR H THEN LPRINT I;N1,Y,V,X,U
3255 GOTO VAL "3200"
3300 IF USR H THEN LPRINT G$;N0,N0,S$
3310 GOTO L
3400 IF USR H THEN LPRINT P$;N0,N0,S$
3410 GOTO L
3500 IF USR H THEN LPRINT S$;N0,N0,S$
3510 GOTO L
3600 IF USR H THEN LPRINT P$;N0,N0,S$,A
3610 GOTO L
3700 IF USR H THEN LPRINT P$;N0,N0,S$,O
3710 GOTO L
3800 IF USR H THEN LPRINT P$;N0,N0,S$,X
3810 GOTO L
3900 GOSUB VAL "100"
3910 IF K=S THEN GOTO L
3920 IF Y<=W THEN GOTO VAL "3960"
3930 LET G=Y
3940 LET Y=W
3950 LET W=G
3960 IF U<=W THEN GOTO VAL "3900"
3970 LET N=U-W
3980 IF USR H THEN LPRINT WU;N,Y,U,X,V
3990 GOTO VAL "3900"
4000 GOSUB VAL "100"
4010 IF K=S THEN GOTO L
4020 IF W<=Y THEN GOTO VAL "4060"
4030 LET G=Y
4040 LET Y=W
4050 LET W=G
4060 IF U>=W THEN GOTO VAL "4E3"
4070 LET N=W-U
4080 IF USR H THEN LPRINT WD;N,Y,U,X,V
4090 GOTO VAL "4E3"
4100 GOSUB VAL "100"
4110 IF K=S THEN GOTO L
4120 IF X>V THEN GOTO VAL "4160"
4130 LET G=X
4140 LET X=V
4150 LET V=G
4160 IF T>=V THEN GOTO VAL "4100"
4170 LET N=V-T
4180 IF USR H THEN LPRINT WL;N,Y,W,X,T
4190 GOTO VAL "4100"
4200 GOSUB VAL "100"
4210 IF K=S THEN GOTO L
4220 IF X<V THEN GOTO VAL "4260"
4230 LET G=X
4240 LET X=V
4250 LET V=G
4260 IF T<=V THEN GOTO VAL "4200"
4270 LET N=T-V
4280 IF USR H THEN LPRINT WR;N,Y,W,X,T
4290 GOTO VAL "4200"
4300 DIM G$(CODE ",,",CODE "~~")
4310 IF USR H THEN LPRINT G$;N0,N0,G$
4320 IF USR H THEN PRINT AT N0,N0;,"[S]ELECT SPEED, 0 TO 9"
4330 POKE VAL "19830",USR Q
4340 IF USR H THEN LPRINT P$;N0,N0,G$
4350 GOTO L
4400 DIM G$(VAL "114",CODE "~~")
4440 LET X=PEEK J
4450 POKE J,N0
4460 RAND USR E
4470 IF USR H THEN LPRINT S$;CODE "Y",N0,G$
4480 IF USR H THEN PRINT ;,AT CODE "RND",N0;
4490 IF USR VAL "23076" THEN PRINT TAB 17;"7"
4500 IF USR H THEN PRINT AT CODE "[/]",N0;," [S]ELECT PATTERN "
4510 IF USR VAL "22144" THEN PRINT ;;;;AT 132,N2;"["]["]["]["]["]["]";TAB N2;"["]["]["]["]["]["]";,
4520 RAND VAL "PEEK J*8+20920"
4530 IF USR H THEN PRINT ;;AT CODE "RND",N0;
4540 IF USR VAL "23110" THEN PRINT "█ █ █ "
4550 IF USR H THEN PRINT ;,AT CODE "[/]",N0;"[B]=[B][A][C][K]-[U][P] [N]/[L]=[S][K][I][P] ";TAB N0;"1=";;"█";," 0="" """
4560 IF USR H THEN CLEAR
4570 FOR N=N0 TO N7
4580 IF USR H THEN PRINT AT CODE "[C]",N0;"[I]NPUT [R][O][W] ";N;" PATTERN"
4590 INPUT J$
4600 IF LEN J$>N8 THEN GOTO VAL "4590"
4610 LET N=N-(J$="B")+(LEN J$=N0)
4620 IF N=N8 THEN GOTO VAL "4730"
4630 IF N<N0 THEN GOTO VAL "4570"
4640 LET Y=VAL "PEEK J*8+20920+N"
4650 IF LEN J$=N0 THEN GOTO VAL "4580"
4655 IF J$="B" THEN GOTO VAL "4580"
4660 LET J$=J$+"0000000"
4670 LET V=CODE "█"*(J$(N1)="1")+CODE "RND"*(J$(N2)="1")+CODE "4"*(J$(N3)="1")+CODE "("*(J$(N4)="1")+N8*(J$(N5)="1")+N4*(J$(N6)="1")+N2*(J$(N7)="1")+(J$(N8)="1")
4680 IF USR H THEN PRINT ;;AT N*N8+64,N0;"█" AND J$(N1)="1";" " AND J$(N1)<>"1";"█" AND J$(N2)="1";" " AND J$(N2)<>"1";"█" AND J$(N3)="1";" " AND J$(N3)<>"1";"█" AND J$(N4)="1";" " AND J$(N4)<>"1";"█" AND J$(N5)="1";" " AND J$(N5)<>"1";"█" AND J$(N6)="1";" " AND J$(N6)<>"1";"█" AND J$(N7)="1";" " AND J$(N7)<>"1";"█" AND J$(N8)="1";" " AND J$(N8)<>"1"
4690 POKE Y,V
4700 RAND USR E
4710 IF USR H THEN PRINT ;;;;AT 132,N2;"["]["]["]["]["]["]";TAB N2;"["]["]["]["]["]["]";,
4720 NEXT N
4730 IF USR H THEN PRINT AT CODE "[C]",N0;;"[F][I][N][I][S][H][E][D][?] ";,
4740 IF USR I<>CODE "Y" THEN GOTO VAL "4500"
4750 IF USR H THEN RUN
4760 IF USR H THEN LPRINT P$;CODE "Y",N0,G$
4770 DIM G$(N1,N1)
4780 POKE J,X
4790 RAND USR E
4800 GOTO L
9000 DIM S$(VAL "192",VAL "32")
9010 POKE A,VAL "126"
9020 POKE B,VAL "96"
9030 POKE VAL "19830",N0
9040 POKE J,N0
9050 RAND USR E
9060 IF USR H THEN LPRINT SD;6,"10 24 42 81 00 41 22 14 F7 81 81 81 00 81 81 F7 34 42 81 81 00 81 42 34"
9070 RETURN
9100 DIM S$(N1,N1)
9105 SAVE "ZX-PAIN[T]"
9110 PRINT "ZX-PAINT LOADED",,,,"[C][A][U][T][I][O][N] DO NOT RUN ",,,"ENABLE SCRAM BOARD THENPRESS A KEY TO START"
9120 IF INKEY$ ="" THEN GOTO VAL "9120"
9130 GOTO N1
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.