Dragons is a fractal dragon curve generator that plots iterative dragon curves on screen using BASIC with embedded machine code routines. The program accepts user-defined direction-reversal sequences (strings of “L” and “R” characters, or a randomly generated sequence), a size parameter up to 13 iterations for 16K machines, and a scale factor, then builds the full turn sequence via a doubling algorithm in the GOSUB at line 500. An auto-center routine (lines 695–880) pre-calculates the bounding box of the curve and offsets the starting coordinates so the dragon fits the display. A fast-mode option allows mid-draw interruption via any keypress, dropping into a menu (line 8000) offering options to start a new dragon, save the screen, toggle display reversal, copy to printer, or stop.
Program Analysis
Program Structure
The program is organized into clearly labeled sections, each preceded by a REM banner. The main flow is:
- Lines 0–1: Dense encoded data in
REMstatements (machine code and/or compressed data) - Line 2:
GOTO VAL "5E3"— jumps to the startup routine at line 5000 - Lines 5–170: Core plotting loop (
PLOTwith direction stepping) - Lines 495–590:
SEQUENCE— builds the dragon turn sequence by doubling - Lines 695–880:
CENTER— bounding-box calculation and auto-centering - Lines 995–1030:
TAKE A LOOK— display/pause helper usingUSR HR - Lines 4995–5920:
START— main initialization and user input - Lines 7995–8700:
MENU— post-draw interactive menu - Lines 9000–9020:
SAVEwith hardware notice
Machine Code Usage
Throughout the program, calls to USR HR (where HR = VAL "19400", i.e., address 19400) gate nearly every significant action: plotting, pausing, saving, running, and randomizing. This is a standard technique for embedding a machine code routine that performs a conditional hardware check or provides a copy-protection/scrambler-board interlock. The variable HR is set at line 5050. Address 19400 falls in the ZX81/TS1000 system RAM area, and the machine code stored in the REM lines at 0 and 1 is loaded there. The RAND VAL "31" calls (lines 5910, 8510) use RANDOMIZE 31 as a seed or a call to a specific ROM routine.
Key BASIC Idioms
GOTO VAL "5E3"and similar — scientific notation strings passed toVALas a memory-saving way to encode large line numbers in fewer bytes.LET O=NOT PIat line 5010 setsO=0(sinceNOT PIis 0 on the ZX81), andLET I=PI/PIat line 5020 setsI=1, avoiding storing integer literals.LET N2=I+I(=2) andLET N4=VAL "4"— repeated small constants stored in variables for efficiency.("L" AND B$(K)="R")+("R" AND B$(K)="L")at line 550 — the ZX81 string AND idiom: returns the string if the condition is true, else empty string, used here to flip L/R in the mirror sequence.LET LT=N2**N-Iat line 5300 —**is the ZX81 exponentiation operator, computing 2^N−1, the number of segments in an N-iteration dragon curve.LET P=VAL "INT (RND+.5)"at line 5240 — passing an expression string toVALto evaluateINT(RND+0.5), generating a random 0 or 1.IF D$="" THEN LET D$="L"— defaulting to the classic single-fold dragon curve.
Dragon Curve Algorithm
The sequence-building subroutine (lines 500–590) implements the standard dragon curve doubling: for each iteration, a new fold direction is appended, then the existing sequence is mirrored and reversed with L/R swapped. The variable SP tracks the current sequence pointer, growing as SP = SP*2 + 1 each iteration (line 570: LET SP=SP*N2+I). The direction array D$() holds the user-supplied reversal sequence, cycling via IP.
The plotting loop (lines 20–170) steps through the turn sequence stored in B$(). Between each segment it takes SC steps in the current direction, then at each turn point takes N2 (=2) diagonal steps combining the old and new direction vectors, producing smooth corner joins. The direction is encoded as an integer 1–4 (up/left/down/right), with wrap-around handled at lines 100–110 and 790.
Auto-Center Routine
The CENTER subroutine (lines 700–880) pre-traces the entire curve without plotting, accumulating the bounding box in XL, XH, YL, YH. It then scales these by (N4+SC) and computes the offset so the curve is centered on screen. If the scaled bounding box exceeds the screen dimensions (XM=255, YM=191), the user is prompted to enter coordinates manually or start a new dragon.
Menu and Interaction
After plotting completes (line 180 calls SLOW then jumps to line 8000), a menu is presented offering six options. Navigation is handled by reading CODE Q$ against the ASCII codes of “1”–”6″ (lines 8080–8090), then dispatching via computed GOTO: GOTO VAL "8100"+VAL "1E2"*(VAL Q$), which maps choices 1–6 to lines 8200, 8300, 8400, 8500, 8100 (copy), and 8700 (stop).
The fast-mode interrupt at line 65 checks INKEY$ during drawing and calls GOSUB VAL "1E3" (line 1000) if a key is held, which uses USR HR to pause and display the partial curve.
Direction Vectors
The four direction unit vectors are stored in arrays X() and Y(), initialized as:
| D | Direction | X(D) | Y(D) |
|---|---|---|---|
| 1 | Up | 0 | -1 |
| 2 | Left | 1 | 0 |
| 3 | Down | 0 | 0 (unset) |
| 4 | Right | -1 | 0 |
Line 5600 uses LET Y(INT PI)=I, which evaluates INT(3.14159…)=3, setting Y(3)=1 for the down direction — an economical use of the PI constant already in memory.
Notable Techniques
- All boundary constants (
O,I,N2,N4,HR,YM,XM) are pre-computed into short-name variables to reduce token length in inner loops. DIM B$(LT+I)allocates exactly the right string length for the full turn sequence.- The
SAVE Q$,Sat line 8330 saves a screen snapshot to tape under a user-supplied name. - The
PAUSE YMcalls (lines 5430, 5710) use the screen height value (191) as a short pause duration rather than introducing another constant. - Input validation for the direction string (lines 5150–5200) loops character by character checking for “L”, “R”, or “G”, jumping to an error message and retry if any invalid character is found.
Content
Image Gallery
Source Code
0 REM [C]█[1][9][8][7]█[S][M][C]##▘ ""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 ####<=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 <= RETURNY,X4 CLEARPEEK COPYY>X4 CLEAR#7##>#<= RETURNYDX4 CLEARPEEK COPYY4X4 CLEARF7RTAN ▘ █VAL LN STEP #AT ▌TAB B#▀ GOSUB #LN STEP #LN ##$LN STEP # CLEAR FAST LET #:[E]LN STEP #LN ###LN STEP #LN ###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##/( RETURNP4▌),,RND/▖ GOSUB #(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
2 GOTO VAL "5E3"
5 REM [P][L][O][T]
10 IF USR HR THEN PLOT X,Y
20 FOR J=I TO LT
30 FOR K=I TO SC
40 LET X=X+X(D)
50 LET Y=Y+Y(D)
60 IF Y>=O AND Y<=YM AND X>=O AND X<=XM THEN IF USR HR THEN PLOT X,Y
65 IF INKEY$ <>"" AND F THEN GOSUB VAL "1E3"
70 NEXT K
80 LET D1=D
90 LET D=D+(B$(J)="R")-(B$(J)="L")
100 IF D<I THEN LET D=N4
110 IF D>N4 THEN LET D=I
120 FOR K=I TO N2
130 LET X=X+X(D1)+X(D)
140 LET Y=Y+Y(D1)+Y(D)
150 IF Y>=O AND Y<=YM AND X>=O AND X<=XM THEN IF USR HR THEN PLOT X,Y
160 NEXT K
170 NEXT J
180 SLOW
190 GOTO VAL "8E3"
495 REM [S][E][Q][U][E][N][C][E]
500 FOR J=I TO N
510 LET IP=IP+I
520 IF IP>L THEN LET IP=I
530 LET B$(SP+I)=D$(IP)
540 FOR K=I TO SP
550 LET B$(N2*SP+N2-K)=("L" AND B$(K)="R")+("R" AND B$(K)="L")
560 NEXT K
570 LET SP=SP*N2+I
580 NEXT J
590 RETURN
695 REM [C][E][N][T][E][R]
700 FOR J=I TO LT
710 LET SX=SX+X(D)
720 LET SY=SY+Y(D)
730 IF SX<XL THEN LET XL=SX
740 IF SX>XH THEN LET XH=SX
750 IF SY<YL THEN LET YL=SY
760 IF SY>YH THEN LET YH=SY
770 LET D=D+(B$(J)="R")-(B$(J)="L")
780 IF D<I THEN LET D=N4
790 IF D>N4 THEN LET D=I
800 NEXT J
810 LET XH=XH*(N4+SC)
820 LET XL=XL*(N4+SC)
830 LET YL=YL*(N4+SC)
840 LET YH=YH*(N4+SC)
850 LET XD=XH-XL
860 LET YD=YH-YL
870 SLOW
880 RETURN
995 REM [T][A][K][E]█[A]█[L][O][O][K]
1000 IF USR HR THEN RUN
1010 IF USR HR THEN PAUSE XM
1020 FAST
1030 RETURN
4995 REM [S][T][A][R][T]
5000 IF USR VAL "19400" THEN CLS
5010 LET O=NOT PI
5020 LET I=PI/PI
5030 LET N2=I+I
5040 LET N4=VAL "4"
5050 LET HR=VAL "19400"
5070 LET YM=VAL "191"
5080 LET XM=VAL "255"
5090 SLOW
5100 PRINT "[,,][~~][,,][~~]█[D][R][A][G][O][N]█[C][U][R][V][E]█[G][E][N][E][R][A][T][O][R]█[~~][,,][~~][,,]",,,,"SIZE OF DRAGON-UP TO 13 FOR 16K?"
5110 INPUT N
5120 PRINT ,,,,"DIRECTION-REVERSAL-SEQUENCE?",,,"STR$ OF L▘S AND R▘S... FOR EX- AMPLE: LLRRLRRR.",,," INPUT ""G"" TO GENERATE A RANDOM SEQUENCE.",,,,"DEFAULT=""L"", THE CLASSIC DRAGON CURVE."
5130 INPUT D$
5140 IF D$="" THEN LET D$="L"
5150 FOR P=I TO LEN D$
5160 IF D$(P)="L" OR D$(P)="R" OR D$(P)="G" THEN NEXT P
5170 IF P=LEN D$+I THEN GOTO VAL "5210"
5180 CLS
5190 PRINT "IMPROPER INPUT TRY AGAIN.",
5200 GOTO VAL "5120"
5210 IF D$<>"G" THEN GOTO VAL "5270"
5220 LET D$=""
5230 FOR J=I TO N
5240 LET P=VAL "INT (RND+.5)"
5250 LET D$=D$+("L" AND P)+("R" AND NOT P)
5260 NEXT J
5270 CLS
5280 PRINT "DIRECTION-REVERSAL-SEQUENCE:",,,D$
5290 LET L=LEN D$
5300 LET LT=N2**N-I
5310 DIM B$(LT+I)
5320 PRINT
5330 PRINT "SCALE (1 TO ?)"
5340 INPUT SC
5350 LET SC=ABS SC
5360 CLS
5370 PRINT "AUTO-CENTER DRAGON CURVE (Y/N)?"
5380 INPUT Q$
5390 CLS
5400 PRINT "STANDBYE...",,,,"█[G][E][N][E][R][A][T][I][N][G]█[T][H][E]█[D][R][A][G][O][N]█[S][E][Q][U][E][N][C][E]█"
5410 LET SP=O
5420 LET IP=O
5430 PAUSE YM
5440 FAST
5450 GOSUB VAL "5E2"
5460 CLS
5470 IF Q$="Y" THEN GOTO VAL "5550"
5475 SLOW
5480 PRINT " INPUT STARTING X COORD.: ";
5490 INPUT X
5495 PRINT X
5500 PRINT ,," INPUT STARTING Y COORD.: ";
5510 INPUT Y
5515 PRINT Y
5520 PRINT ,," INPUT STARTING DIRECTION...",,,"1=UP 2=LEFT 3=DOWN 4=RIGHT"
5530 INPUT SD
5540 IF X<O OR X>XM OR Y<O OR Y>YM OR SD<I OR SD>N4 THEN GOTO VAL "5460"
5550 DIM X(N4)
5560 DIM Y(N4)
5570 LET X(N2)=I
5580 LET X(N4)=-I
5590 LET Y(I)=-I
5600 LET Y(INT PI)=I
5610 IF Q$<>"Y" THEN GOTO VAL "5820"
5620 LET SX=O
5630 LET SY=O
5640 LET D=I
5650 LET SD=I
5660 LET XH=-I
5670 LET XL=I
5680 LET YH=-I
5690 LET YL=I
5700 PRINT ,,"STANDBYE...[C][E][N][T][E][R][I][N][G]"
5710 PAUSE YM
5720 GOSUB VAL "7E2"
5730 IF YD<=YM AND XD<=XM THEN GOTO VAL "5780"
5740 PRINT ,," PLOT WON▘T FIT.",,,," INPUT (S)TARTING X,Y COORD. OR (N)EW DRAGON."
5750 INPUT Q$
5760 IF Q$<>"N" THEN GOTO VAL "5460"
5770 GOTO VAL "8200"
5780 LET SX=(XM-XD)/N2-XL
5790 LET SY=(YM-YD)/N2-YL
5800 LET X=SX
5810 LET Y=SY
5820 LET D=SD
5830 PRINT ,," SLOW OR FASTMODE (S/F)?"
5840 INPUT Q$
5850 LET F=Q$="F"
5860 IF F THEN PRINT ,,"PEEK AT CURVE BY HOLDING DOWN A KEY."
5870 PRINT ,,"REVERSED DISPLAY (Y/N)?"
5880 INPUT Q$
5890 LET DP=Q$="Y"
5900 IF USR HR THEN RUN
5910 IF DP THEN IF USR HR THEN RAND VAL "31"
5920 IF F THEN FAST
5930 CLS
7000 GOTO VAL "10"
7995 REM [M][E][N][U]
8000 PAUSE I
8010 CLS
8020 PRINT "[M][E][N][U]",,,,"1. START NEWDRAGON","2. SAVE SCREEN",,"3. DISPLAY",,"4. REVERSE DISPLAY","5. COPY",,"6. STOP"
8030 PRINT ,,"SEQUENCE= ";D$
8040 PRINT
8050 PRINT "SCALE= ";SC;TAB O,,"DIRECTION= ";SD
8060 LET Q$=INKEY$
8070 IF Q$="" THEN GOTO VAL "8060"
8080 IF CODE Q$<CODE "1" OR CODE Q$>CODE "6" THEN GOTO VAL "8060"
8090 IF Q$<>"5" THEN GOTO VAL "8100"+VAL "1E2"*(VAL Q$)
8100 IF USR HR THEN COPY
8110 PAUSE I
8120 GOTO VAL "8060"
8200 CLS
8210 PRINT "ERASE PREVIOUS DRAGON (Y/N)?"
8220 INPUT Q$
8230 CLS
8240 IF Q$="Y" THEN RUN
8250 CLEAR
8260 GOTO VAL "5010"
8300 CLS
8310 PRINT " SAVE NAME?"
8320 INPUT Q$
8330 IF USR HR THEN SAVE Q$,S
8340 GOTO VAL "8010"
8400 IF USR HR THEN RUN
8410 IF INKEY$ <>"" THEN GOTO VAL "8410"
8420 IF INKEY$ ="" THEN GOTO VAL "8420"
8430 GOTO VAL "8110"
8500 IF USR HR THEN RUN
8510 IF USR HR THEN RAND VAL "31"
8520 GOTO VAL "8110"
8700 STOP
9000 SAVE "DRAGON[S]"
9010 PRINT "DRAGONS LOADED, ENABLE SCRAM BOARD THENPRESS A KEY"
9020 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.