Extended BASIC Screen Draw Demos

Products: Extended Basic
Developer(s): Frits Beniest
Date: 198x
Type: Program
Platform(s): TS 1000

Three short drawing demos for Frits Beniest’s Extended BASIC, each on the 64 × 44 PLOT grid. T spells out TIMEX in straight lines. 8 BALL fills most of the screen with black, then uses UNCIRCLE to draw a large white circle with a figure 8 made from two smaller circles inside it. FACE draws a round face with circular eyes, a nose and mouth, and fills a rectangle across the middle with a gray stipple. Each picture is made from only a few commands, such as DRAW;x1,y1,x2,y2, and CIRCLE;r,x,y,, written in REM lines.

Every program begins with a line 0 that carries the Extended BASIC machine code, headed “EX. BASIC AUT: FRITS BENIEST (C)” and “VERSIE 2.1” (Dutch for “version”). That code makes up most of each 4.7–4.9 KB file. The tape has no label. The Extended BASIC package and a separate Extended BASIC demo are also in the archive.

Program Analysis

Program Structure

Each program has the same pattern. Line 0 starts with IF USR . THEN RETURN and holds the extension code in the rest of the line, and line 1 is SLOW. After that, the program alternates GOSUB 0 with a REM holding the drawing commands. Commands are separated by colons, and each parameter is followed by a comma. Multiple shapes can share one command, so CIRCLE;20,30,25,4,20,30,4,38,30, draws the face outline and both eyes.

  • T: five REM lines of DRAW commands for the letters T, I, M, E and X along the top of the screen.
  • 8 BALL: PAPER;1,24,1,33,█, fills the area with solid blocks, then UNCIRCLE draws the ball outline (radius 20) and the two circles of the 8 in white.
  • FACE: CIRCLE for the head and eyes, DRAW for the nose and mouth, and PAPER;3,22,10,20,▒, to fill a block with the stipple character.

Notable Techniques

  • The extension lives in line 0, which can’t be entered or edited from the keyboard, so it is protected from accidental changes.
  • The drawing commands sit in ordinary REM lines that BASIC itself ignores, and GOSUB 0 hands control to the extension through USR before returning.
  • PAPER takes a fill character as its last parameter, which allows both solid (█) and stippled (▒) fills.

Related Products

22 new commands for your TS1000. Advanced screen utilities make your ZX81 look more like a monochrome 2068. Includes READ,...

Related Content

Image Gallery

Source Code

   0 IF USR . THEN RETURN FROM    EX. BASIC  AUT: FRITS BENIEST   (C) 070/988735 [V][E][R][S][I][E]█[2][.][1]##[-][-][~~]RND[E]#VAL #▀-~~=▒▘[,,]#▘ U£RND#U(RNDLEN  SCROLL[S]COS INT $▞▞INKEY$ ( SAVE INT # #C▀7( POKE INT #6USR RNDTAN  Y▖[S]ATN #INKEY$ [(]#FLN #INKEY$ $COS 2~~#LN NINKEY$ $COS 2##LN NINKEY$ TAN FLN #INKEY$  RETURN COS ##▄>=#INKEY$ ( IF TAN      6USR RNDLN ▝#COS  RETURN:TAN    TAN  PLOT SQR Y3 PLOT SQR INT 3   AT STR$ LN ATN INKEY$ LN  INKEY$ LN EXP INKEY$ ▞=VAL  FASTSTR$ ▞▀,[Y]4~~LN LN INKEY$ <( PLOT AT AT AT TAN SGN  LPRINT <<<<<AT ( STOPINT . CLEARACS 5▚/▖ CLEARACS 5LEN #[J]# FOR  FASTLN EXP INKEY$ [;]INKEY$  RETURNOASN ##INT . CLEARQ5▘#M#; FOR LN ###TAN R##UND#PI   7 TO 6ABS RNDLN  STOP#77#7#YC[U]▘  **<#F#. FOR LN **,,#7# GOSUB #▛RNDLN  LLIST RND7777) PRINT #LN #INKEY$ #SGN # COPYVAL STR$ LN LN INKEY$ LN ▘INKEY$  FASTLN  RUN # LPRINT SGN ><AT ( GOSUB TAN F▖[S]C▌FLN EXP INKEY$  RETURN,COS INT ##7## RETURN C▞[>]K▀#[(]**INT #    CLEARACS 5▚#C# CLEARACS 5LEN / RUN U5RNDACS ▗/▌U5RNDACS SIN M5RND# REM PI RETURN COS  PRINT LN 4+ LET LN 1+ LOAD ▌OLN [B]:TAN  FOR LN  LOAD RNDLN [(]PILN [9]PILN [M]PILN EXP PILN ##4 LOAD TAN )**RND▞▖STR$ LN ▒PILN LN INKEY$ LN ▘INKEY$ LN ▞#>SGN TAN  FOR ▞,LN QPI7▞6LN QPITAN 5<=RND#F£RND,,:5XCOS ,,/ CLSTAN  FASTU>=RND#LN ?#( CLS LPRINT ,, FAST+4 POKE  LPRINT TAN #LEN #TAN  FOR LN  LOAD RND)**RND▞▖STR$ LN ▒PISGN  FOR 7#7##F#F :RNDLN  STEP PI7LN  STEP PI:K7LN  STEP PI7LN  STEP PI5**RND)XRND▞▝LN ##<▞▝LN ##2 5YRNDLN ##77LN ##7UZRND#LN ##5WRND#- ACS #42URNDRND#LN ## GOSUB ##RND- UPIRND#LN ## GOSUB ##RNDSTR$ U#RND/.UXRND#LN ## GOSUB ##RND- U#RND#LN ## GOSUB ##RNDSTR$ UPIRNDAT LN #PI GOSUB ##RND5WRNDACS #4:ACS #C▝ACS  THENACS #C(ACS  NEW/£ACS #C▝ACS  NEWACS #C▝ACS  THEN)#RND7#4▌U#RND/▀UPIRND#▖ E#RND)Z ;6#RNDLN  FASTPILN ##TAB ##TAN 7▞▀) DIM ##,[T]""7<( SAVE TAN DAT77#7#7;TAN MMMM7777LN LN INKEY$ M FAST77 FOR [B]E=RND GOSUB # LPRINT TAN MMMECHR$ RNDLN  PAUSE ,, FOR 6CHR$ RNDTAN MMMMLEN RNDECHR$ RNDLN INKEY$ #COS  PRINT E(RND6CHR$ RNDLN £#>=## LET LN INKEY$ #COS  PRINT LN .#/ LOAD TAN M FAST77 FOR E£RND[B] GOSUB # LPRINT TAN MMINT #INT ▘ FOR LN  LOAD RND6-RNDLN ##/,,LN  GOTO #LN ##>=## FASTLN  SAVE #4▌LN  AND #C▀ LPRINT / DIM SGN LN  LOAD RND    6 THENRNDTAN 8MMMMLN 1+E0RND▘▌  GOSUB PI60RND GOSUB #CHR$ RND< GOSUB [K]TAN MMME THENRNDLN ▝#4▛7LN ##LN LN INKEY$ 6-RNDLN [U]# TO 6 THENRND RETURN,COS INT # FOR LN  LOAD RNDLN LN INKEY$ LN ▘INKEY$ LN 6PILN ##EUSR RNDLN #INKEY$ 4 LOAD TAN E(RND6CHR$ RNDE▝RNDTAN VAL ACS S▖ACS T£Y;[(]#E£RND)5 /▘;( CLEAR#;AT LN [;]#YJ[(]#Y▘ACS CK▝Y▖ACS DK▘▛ PRINT ?K▝ INPUT [?]#LN [)]#C▌ LET J[4]/▝ LET [K] RETURN▒S▝ INPUT [?]#TAN [-]#TAN ACS ACS [:]TAN <7/▌ACS <[-]▞▛[B]ACS <ACS >( RAND TAN 7[-]▞▛[B]ACS ,ACS .( RAND TAN #RND GOSUB TAN E#RND GOSUB ##RNDUWRNDACS #4▀;/▛[*] GOSUB #K▝##6#RND FOR LN ##TAN VAL UWRNDACS #4▌5#RND/▀5#RNDACS #4▀O/▘PLN ##5WRND#ACS #4▌M#RND/▀M#RND GOSUB ##RNDLN  GOSUB #AT (ACS TAN  FAST FOR #7# FOR SGN ▘<>#VAL  DIM EUSR RNDLN LN INKEY$  RETURN:4▞LN LN INKEY$ # RETURNINKEY$ EABS RND6-RND▘▘ TAN LN ?#S▌LN -INKEY$ /~~LN 6PILN E#LN *##TAN ...#FY9[-]7#TAN LN 2#LN [B]:TAN E0RND▘▌ ,,60RND GOSUB PI FOR ECHR$ RND7 GOSUB [K]TAN . LN ##E£RND76:RNDY M>=RND24-/:5LN EXP PITAN 7Q▘7Q57Q LN [I]PITAN  GOSUB #£RND55 <;▘ RUN ▝ GOSUB [K]▞4 FOR Q 7( CLSLN Q#TAN TAN     FOR LN  LOAD RND)**RND▞▘STR$ LN ▒PISGN ,W#VAL LN ##AT ( RAND TAN U5RNDACS #TAN XXLN [)]#4,,Q TAN AT TAN LN [H]#S▖LN **,,TAN  LPRINT TAN  RETURN-C,, RETURN+4▘ SCROLLLN  OR =TAN  SCROLLLN  OR = FASTLN ▐.LN [4], LPRINT TAN E THENRND7LN ##7F6 THENRNDTAN .E THENRND7LN  PRINT #6 THENRNDTAN ..▘  4▝INT #▀7/ PAUSE ..ECHR$ RND7#Q 7#Q 7#[L]CODE #~~TAN ECHR$ RND7#7#7LN [2],,TAN ..F=S▝INT #LEN 4LN G#7▒#LN USR #7 FASTLN  CONT #VAL LN ,#AT  LPRINT #[L]COS  GOSUB #CHR$ RND<<< GOSUB [K]TAN .LN E#LN [G]#LN [-]#TAN  RETURN$4▌LN C#/▀LN ##TAN  SCROLLLN [U]# TO 6USR RND#LN [~~]+4▌# RETURNRNDS▝INT =##LN **,,TAN ,ACS #C▝Y[?]#<7"#[L]COS STR$  GOSUB #WRND GOSUB #;SGN S LPRINT STR$ VAL 6:RNDLN ##E:RNDAT SGN /ABS   FOR LN  LOAD RNDLN ##LN LN INKEY$ LN ▘INKEY$ LN 6PI RETURN$ PRINT ATN 0PILN C## LET  PRINT #C▝LEN 4LEN 4LN G# LET  PRINT CODE I# LET ATN V# FOR E(RNDF6WRNDE:RNDLN [B]#6:RNDLN >#EUSR RNDLN #INKEY$ F4[V]TAN [B]E:RND GOSUB #£RND< GOSUB #)5 Y/ GOSUB #S▀X/ RAND MURND;#[+]MTRNDTAN ...UURND RETURN/4▞E£RND7/,,[B]E:RND)5  GOSUB #6:RNDLN >#TAN INT * FASTLN 0PI RETURNT4 PLOT LN 0PI RETURNAC▝ LPRINT TAN  LPRINT )**RNDSTR$ ▞▝LN ▒PI LPRINT :/LN  STEP PI7:4LN  STEP PIE£RND7U**RND RETURN C▛#)5 ;( CLEARU OR RND- #;6:RNDLN >#EUSR RNDTAN ... FOR FLN  LOAD RND)**RND▞▘STR$ LN ▒PILN LN INKEY$ LN ▘INKEY$ LN 6PILN E#SGN ,# GOSUB #LN [<]#EUSR RNDLN #INKEY$ F4 AND TAN [W] FOR LN  LOAD RND)**RND▞▝STR$ LN ▒PI LPRINT #7# CLEARACS V#C▒ GOSUB INKEY$  PEEK  RETURN#/£ACS INKEY$  PRINT ATN F? LET  GOSUB INKEY$ ATN 7?EUSR RNDLN #INKEY$ F4SQR TAN INT #ACS RNDC IF LN 6PIACS #"" RETURN)4 LIST FFY([Y]4 DIM 77STR$ LN ▘#SGN ACS #COS Y[?]TAN LN EXP =**INT #LN 2#LN STR$ . FASTLN [7]= LPRINT TAN .7#7#7TAN [Y]COS  RETURN#**ACS  COPY[Y]ACS [Z]TAN EUSR RNDLN #INKEY$ FTAN  FAST5 OR RND##<▞▝# POKE PI90 FOR LN  LOAD RNDLN [(]PI)**RNDSTR$ 5WRND FOR ▘▖  GOSUB [K]SGN LN [9]PILN [M]PI6#RNDSTR$ EUSR RND)<>RND▞▘LN ▒PI#.., OR SGN  OR   RETURNEC: RETURNWC~~ RETURNNCA RETURNSC6INT -VAL  OR AT  OR  RETURNEC▝ACS COS  CLEAR#55YRND▞▝25LN VAL #E#RNDLN ###># PRINT VAL  LPRINT VAL SGN ▞▌LN ##; FAST OR AT  OR ▞  LET  RETURNS4▝ACS "" CLEAR#55WRND▞▝2;LN VAL #E#RND CLEARACS 5#C? OR STR$  OR AT )5 /▘;( CLEAR6#RNDLN R#LN ##COS )>=RNDLN LN INKEY$ LN ▘INKEY$ LN ▞#>### GOSUB #(RND GOSUB #;Z** GOSUB #£RND GOSUB #;TAN  OR VAL STR$  OR  FASTLN [8]#[B] CLEARACS 5#C▀;/▝ GOSUB #LN A#S▌)WRND FOR  GOSUB [K]LN  IF #4 LPRINT #[E]#U<>RND RETURN COS LN [8]##STR$ AT # CLEARACS 5# PRINT ATN ## LET CODE [?]#LN  IF #4 CONT TAN LN ##COS  #)WRND[Y]COS  FOR  GOSUB [4] FOR  STEP / RUN LN ##COS #)VRND FOR ,, FOR [Y]COS  FOR  GOSUB [C] FOR  STEP / RUN  RUN  OR STR$  OR AT ▞ VAL E#RND FAST)WRND GOSUB [K] LPRINT AT VAL          OR VAL  OR SGN AT TAN 4:X#70( POKE /$▝[(]W#7( NEXT )**RND5WRND▘▖  GOSUB [K]TAN F- ;Y# GOSUB [T]TAN    E#RND)5  CLEARACS 5#4▀;/▝ GOSUB #6#RND OR + OR TAN ..)5 /▘;( CLEAR6#RNDTAN RNDTAN TAN )WRND FOR TAN  FOR LN  LOAD RND)**RND▞▀STR$ LN ▒PILN ## LPRINT 2▀STR$ - #VAL LN ##AT 7#▝▀#▝▀SGN 14 GOTO LN ##LN ##4STR$ TAN    ▞ASN [*]VAL  GOSUB #WRNDACS #CODE ABS #▞▌LN ##EYRNDACS #4▒ GOSUB #K,,ACS SIN /▌;K▝ACS ▗6YRND FOR ACS #CODE ABS #▞▌LN ##EWRNDACS #4▛;K~~ACS [?]/▞ GOSUB #K▝ACS INT 6WRND PRINT  GOSUB #PIRNDLN [V]INKEY$ M#RND[*][M]4/ GOSUB #RNDRNDEYRNDLN [V]INKEY$ M#RND[*][M]4▛ GOSUB ##RNDLN  OR # LET AT ([$]TAN 5 COPY COPY GOSUB # FOR TAN [*]5#RND#7# FOR  GOSUB PICOS  FOR #F#YZ[T]**YJ[S]**LN  GOSUB #TAN .MOV##PRIVAL #CLS[O]INKEY$ OUTINT #DRA#PIFILL#REAASN #IN;[6]#RES##SCR[4]INKEY$ UND#PICIR#PIUNC#PILEF##RIG##MID##KEY[<]INKEY$ PAPT#UNPP#COP##.5WRND#7#7 FASTAT TAN Y▝/▞Y▘/▝Y▖M5RND# LOAD #EWRND[*] FASTLN  <[U]>=#PIE**RND# FOR  GOSUB ### LPRINT TAN STR$ LN LN INKEY$ LN ▘INKEY$ LN 6PI RETURN$CODE GPILN 0PILN C#LEN 4LN G#SGN #><#><EUSR RNDTAN LN  LLIST #COS EWRND FASTLN "# LPRINT AT #[L]4▝ LET TAN  FASTVAL LN 1#AT  LPRINT  LET  FASTVAL LN N#AT SGN 777LN ##TAN    EYRNDUWRND[X]""UXRND[W]TAN  FOR LN  LOAD RND)WRNDLN ["]#LN ["]#)**RND▞▘ CLEARACS 5#C▘▖LN ▒PILN [K]#LN U#LN 1#LN ##LN ##4NOT TAN  CLEARACS 5#COS LN ##K▖LN "#TAN LN O##PILN #~~TAN 7#7#7TAN  CLEARACS 5#COS LN ##**VAL #PILN O#,,AT LN #~~TAN  CLEARACS 5#COS LN 6#5**RNDWRNDLN "#TAN ##TAN LN [V]▝###Y =COS LN [X]▛▘INKEY$ LN 6PI RETURN$4$LN 0PILN C#LEN 4LN G#RTAN LN E#RZTAN LN ▝#**7PILN A#TAN 0 FOR LN  LOAD RND CLEARACS 5# PRINT C")**RND▞▝LN ▒PIEUSR RNDLN ~~LN ##CHR$ 0K▘[*]/▛LN [2]##TAN LN "# LET C▛LN [2]##[R]COS ▘▘ LN ,#ECHR$ RND777#TAN 5**RNDY4[Y]**#Y [T]ZTAN  CLEARACS 5#C▀#7TAN  CLEARACS 5#C▛[Y]4▝Q 7TAN  PRINT [*][Y]4▖ LET #7TAN  LET 7TAN Y▘/▌Y▝/▘[*] CLEAR#5##PI FOR LN #INKEY$ COS INT .LN RND#-/##▒LN RND#5TRNDQ57Q/TAN F- ;#Y#[Y]COS [*][>]C▀Q + CLEARACS 5#C▝FF7$C▝/ SCROLLY#WTAN .STR$ )5  CLEARACS 5#C▀;/▝ GOSUB #SGN TAN STR$  FAST##)5  GOSUB ##[P]## LPRINT SGN TAN VAL  FAST[*]##7( UNPLOT  LPRINT AT TAN  LPRINT SGN STR$ PI)5  CLEARACS 5#4,,/▘;( CLEAR/▖ GOSUB #( UNPLOT SGN AT #[L]COS STR$ LN A#SGN S▀LN [3]#LN [?]#COS +COS LN ....................
   1 SLOW
  10 GOSUB 0
  21 REM CIRCLE;20,30,25,4,20,30,4,38,30,
  25 GOSUB 0
  30 REM DRAW;30,25,25,22,:DRAW;30,20,30,25,:DRAW;20,15,40,15,40,15,30,12,20,15,
  40 GOSUB 0
  50 REM PAPER;3,22,10,20,▒,

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