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
DRAWcommands 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, thenUNCIRCLEdraws the ball outline (radius 20) and the two circles of the 8 in white. - FACE:
CIRCLEfor the head and eyes,DRAWfor the nose and mouth, andPAPER;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 0hands control to the extension throughUSRbefore returning. - PAPER takes a fill character as its last parameter, which allows both solid (
█) and stippled (▒) fills.
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.


