Demos included with MiniBASIC
Tags: programming, basic, minimicro, beginners
Published: 2023-03-01 16:21:01

The recent [announcement](https://dev.to/joestrout/announcing-minibasic-1i6f) of [MiniBASIC](https://joestrout.itch.io/minibasic) has been met with surprising (and gratifying) enthusiasm!  So I thought today I would go over the demos included with it.

You can find these by doing `cd demo` to change to the demo directory, and then `dir` to list the files.  (Note that in MiniBASIC, unlike in [MiniScript](https://miniscript.org), quotes are not require around file names that contain no punctuation; but they're always accepted.  So `cd "demo"` would also work.)

![Screen shot of demo directory](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t7onxyeb21wti0e1bb21.png)

Here you find almost a dozen demos of various sizes (plus GAME.TXT, which is a Silver Mountain save file — more on that later).  Let's take a quick look at each one.

## Alien Letters

To launch the first demo, enter `load alienLetters` followed by `run`.

![Screen shot of Alien Letters game](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1io17552qhd1kwojnlyr.png)

This is a game I wrote when I was in middle school, on an Apple ][.  I found it somehow still hanging around my hard drive, made minor changes to convert the  old sound routine (which relied on poking a small machine-language program into memory) to MiniBASIC's `SOUND` command, and threw it into the demo directory.

The game is a typing tutor: as letters fall from the top of the screen, you must press the corresponding letter to shoot them before they reach the ground.  The game gets harder over time by starting the letters closer to the ground.

The set of letters, and how many fall at once, are both set by line 30 (use `list -100` to list up to line 100):

```basic
30 LT$ = "ASDFJKL;":NL = 3: REM  LETTERS USED, NO. OF LETTERS FALLING AT ONCE
```

Currently it's set to the QWERTY home row keys, three at a time.  You can retype this line (or use `edit 30` to edit it) if you want to change this.

## ASCII Table

![Screen shot of ASCII table](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/814077j6x8y32pwbrmwh.png)

Despite the name, the **asciiTable** program displays not only ASCII characters (code points 0-127) but also code points 128-255.    This is a handy reference for values you can use with `CHR$(n)`.  For example, if you want to print the µ (mu) symbol, you'll find this in the chart as 181, so `PRINT CHR$(181)` will do it.

(Keep in mind that MiniBASIC is not case-sensitive, and `?` is a shortcut for `PRINT`, so `? chr$(181)` would work just as well.)

This program also demonstrates combining graphics and text — the vertical lines are graphics, done with the PLOT and LINE commands.  When the text scrolls, the graphics do not, which may be surprising when you first see it.  Use `CLS` to clear the screen.

## Blackjack

This is another program from my youth.  It required no changes to get running in MiniBASIC.  However, as I was inspecting the code, I did notice a bug: line 360 read

```basic
360  PRINT "Shuffling...": FOR A = 1 TO 13: FOR B = 1 TO 4:CU(A,C) = 0: NEXT : NEXT 
```

This references `CU(A,C)`, when it should have been `CU(A,B)`.  So, I finally fixed this bug... 38 years later!

## Colors

The **colors** demo simply draws a color chart, showing the built-in 16-color palette (which is the same as the Commodore 64).

![Screen shot of color table](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vmy2mrnca4s08sv1oc8q.png)

You can use these numeric values with the `COLOR` command.  For example, `COLOR 8` will change both the text and the graphics-drawing color to orange.  You can also use strings with arbitrary HTML colors, whether they're part of the standard palette or not.  For example, `COLOR "#FFCCCC"` will get you a light pink.  Use `COLOR 5` to go back to the default green.

## Drawing

The **drawing** program demonstrates the six drawing commands in MiniBASIC: `PLOT`, `LINE`, `RECT`, `ELLIPSE`, `POLY`, and `IMAGE`.

![Screen shot of drawing demo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dx4xqfkia57bahx1x2lp.png)

You just press the number of the one you want to see, and then watch as it both shows the code and the result of using that command.

One thing this demo does _not_ currently demonstrate is the `PEN` command, which changes the line thickness of subsequent drawing.  Try adding `59 PEN 4` to see what that looks like.

## Lemonade

This one is an in-progress port of the original Lemonade Stand game from Apple, circa 1979.  This classic game was perhaps the first economic simulation game to reach the general public, and was hugely popular.

It's still in-progress because of two things:

1. It uses the Apple's "low-resolution graphics" mode, which doesn't port easily to MiniBASIC.  And it does it via some funky tricks, like printing characters to the text screen which, when lores graphics are turned on, happen to form blocks of color.  Yikes.

2. It also uses a machine-language routine to make music.  I have attempted to convert the parameters to this routine into the corresponding notes four our SOUND command, but it's not quite right, so the music is a bit out of tune.

So I will keep working on it.  Unless some kind and ambitious reader out there wants to help — pull requests are gratefully accepted!

## Silver Mountain

**silverMountain** is the complete code from the Usborne book [_Mystery of Silver Mountain_](https://drive.google.com/file/d/0Bxv0SsvibDMTZ0xkNW5Id3NLVVk/view?resourcekey=0-zd1AmVtIaboWogtXloOIxA).  To get this code into MiniBASIC, I first tried OCR (optical character recognition), but it didn't do very well.  So I ended up just typing it in, line by line, just like we would have done in the old days.

Then I spent a couple days debugging it... _also_ like we would have done in the old days!

![Screen shot of Silver Mountain game](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q9igt4qgx8d6o2a6ssxy.png)

But now I believe it to be complete and correct.  But I must warn you: _this is a hard game!_  You will need to actually read the [book](https://drive.google.com/file/d/0Bxv0SsvibDMTZ0xkNW5Id3NLVVk/view?resourcekey=0-zd1AmVtIaboWogtXloOIxA) and study the pictures for clues.  For example, just because nothing on the screen says there is a pot, doesn't mean you don't have to "EXAMINE POT" to find some critical item.  The pictures in the book are the only way you would know to do this.

I did make some minor enhancements to the original program: I made it accept both lowercase and uppercase text, and I added a few synonyms, like "LOOK" for "EXAMINE", as well as a "QUIT" command.  You'll find my changes on lines 270 and 351-359.

## Sounds

The **sounds** program demonstrates usage of MiniBASIC's `SOUND` command.

![Screen shot of sounds demo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3q2lzutbrut79qgfw4k8.png)

Again, you just press the key of the demo you want to run; but in this case, it just plays the sound.  The code for each demo is already on the screen.

The `SOUND` command takes four parameters:

1. frequency (if > 0) or note (if <= 0), or array of same
2. duration (in seconds)
3. volume (0-1, or an array of values 0-1)
4. waveform (0-4)

By varying these parameters, you can make a variety of interesting sounds, all very much in character for the first wave of home computers.

## Spirograph

This is a very simple drawing demo, using a little bit of `SIN` and `COS` to draw a many-pointed star.  This demo (and its code) were featured in the [original announcement](https://dev.to/joestrout/announcing-minibasic-1i6f).

## Star

**star** is a neat little program I found over on a forum called [Basic4All](http://basic4all.epizy.com).  It draws an 8-pointed star on the text screen.

![Screen shot of star demo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gn3o0khfp0p944w9ltoz.png)

It does this with surprisingly little code, using `TAB` to position the cursor.

```basic
5 CLS
10 FOR m = 5 TO 9
20 FOR n = m - 4 TO 22 - m
30 PRINT TAB(27 + m, 3 + n); "*"
40 PRINT TAB(27 + n, 3 + m); "*"
50 PRINT TAB(27 + 18 - m, 3 + n); "*"
60 PRINT TAB(27 + n, 3 + 18 - m); "*"
70 NEXT n
80 NEXT m
90 VTAB 24 : END
```

## 10 Print

Finally, the **tenPrint** program is our version of the classic [**10 PRINT**](https://10print.org/) demo:

![Screen shot of tenPrint demo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3pfzce2jh5kpqls1asvd.png)

The core of this program is the 1-line infinite loop:

```basic
10 PRINT CHR$(47 + 45 *(RND(1) > 0.5)); : GOTO 10
```

This is slightly different from the famous Commodore 64 version, because that uses the PETSCII character set which has diagonal lines at code points 205 and 206.  We have to use slash and backslash, which are at code points 47 and 92.  But otherwise, it's basically the same.

To break out of this infinite loop, just press Control-C.

# Wrap-up

And that's it for the contents of the `demo` directory, at least at the time of this writing.  I will probably add a few more as time goes on.

Do you have some cool BASIC code lying around, or an idea for a new MiniBASIC program?  Let me know!  Maybe I'll include it as a demo (with attribution, of course) in a future update to MiniBASIC!