Simons' BASIC
Simons' BASIC was an extension to BASIC 2.0 for the Commodore 64 home computer. Written by British programmer David Simons in 1983, who was then just 16 years old at the time, it was distributed by Commodore in cartridge format.
It is widely, but incorrectly, called "Simon's BASIC", because of confusion between the first name "Simon" and the surname "Simons".
Features
Simons' BASIC added 114 additional keywords to BASIC 2.0. These included commands to ease the coding of sprites, high-resolution and multicolor graphics, and sound. In addition, commands were also implemented to aid in structured programming. Keywords to assist in writing and editing BASIC programs, similar to those in the VIC-20 Programmer's Aid cartridge, were also included. Also, programs written in Simons' BASIC could employ hexadecimal numbers in assignments and calculations by including a $ prefix, or binary numbers by utilizing a % prefix.Because a portion of the cartridge data was mapped into memory at addresses $8000–$9FFF, which overlapped part of the standard C64 BASIC RAM, the amount of available memory for BASIC programs was 8 KB less than that of a standard C64 configuration.
A further extension was also written by Simons and released by Commodore on floppy disk and tape as Simons' Basic Extension. This software is also known as Simons' Basic 2. It could not be released on cartridge because the original Simons' Basic cartridge had to be present in order to use the extension. Simons' Basic Extension added another 91 extra commands including a much coveted RENUMber command which also took care of renumbering the destinations of GOTO and GOSUB statements.
The 114 keywords
Sprite (MOB) handling keywords
- MOB SET – enables a sprite and defines its attributes
- MMOB – positions a sprite on the screen
- RLOCMOB – causes a sprite to smoothly move from one location to another
- CMOB – sets up the two global colors for multicolor sprites
- MOB OFF – disables a sprite
- DETECT – initializes sprite collision detection
- CHECK – checks for a sprite collision
High resolution graphics handling keywords
- HIRES – initializes a high-resolution graphics mode
- MULTI – initializes a multicolor graphics mode
- NRM – returns to the text display
- LOW COL – changes the plotting colors
- HI COL – returns to the original plotting colors
- PLOT – draws a pixel
- LINE – draws a line
- CIRCLE – draws a circle
- ARC – draws an arc
- ANGL – draws the radius of a circle
- PAINT – performs a flood fill
- REC – draws a hollow rectangle
- BLOCK – draws a solid rectangle
- DRAW – draws a user-defined set of lines
- ROT – sets scaling factors for DRAW
- CHAR – plots a text character on a high-resolution screen
- TEXT – plots a text string on a high-resolution screen
- TEST – determines whether a pixel is plotted or empty
Other graphics handling keywords
- COLOUR – sets the background and border colors.
- CSET – selects a character set
- MEM – copies character ROM to RAM
- BCKGNDS – configures extended background color mode
- FLASH – sets up a screen color to flash
- OFF – cancels a previous FLASH directive
- BFLASH – causes the screen border to flash
- FCHR – fills an area of the text screen with a given character code
- FCOL – changes character colors for a selected area of the screen
- FILL – a combination of FCHR and FCOL
- MOVE – copies a section of the screen
- INV – displays a screen area in reverse
- LEFT – scrolls the screen left
- RIGHT – scrolls the screen right
- UP – scrolls the screen up
- DOWN – scrolls the screen down
- GRAPHICS – reserved variable that always equals $D000
- SCRSV – saves a text screen to tape or disk
- SCRLD – loads a text screen from tape or disk
Sound handling keywords
- MUSIC – plays a series of notes based on the contents of a string variable
- PLAY – determines whether the program continues to run during MUSIC
- VOL – specifies the master sound volume
- WAVE – specifies a voice type
- ENVELOPE – sets ADSR parameters for a SID voice
- SOUND – reserved variable that always equals $D400
Keyboard input handling keywords
- FETCH – takes user input with restrictions defined by the command
- INKEY – checks for a function key press
- ON KEY – checks for a given keypress, then performs a branch if present
- DISABLE – disables the previous ON KEY directive
- RESUME – reenables the previous ON KEY directive
Input peripheral handling keywords
- JOY – reads a joystick
- POT – reads a paddle
- PENX – reads the light pen's horizontal position
- PENY – reads the light pen's vertical position
Sprite/custom character definition keywords
- @ – describes one line in a sprite or custom character graphic
- DESIGN – uses neighbouring @ lines to define a sprite or custom character
Error trapping keywords
- ON ERROR – sets up a routine to trap error conditions
- OUT – ends an error handling routine
- NO ERROR – cancels ON ERROR and restores normal BASIC error handling
Disk handling keywords
- DIR – displays the disk directory without destroying the BASIC program in memory
- DISK – sends a string to the disk drive's command channel
Printer handling keywords
- HRDCPY – sends the text screen to the printer
- COPY – sends the high-resolution screen to the printer
String manipulation keywords
- INSERT – inserts one string into the middle of another
- INST – similar to INSERT, but overwrites rather than inserting.
- PLACE – searches for one string in the middle of another
- DUP – duplicates a character string a given number of times.
Text formatting keywords
- PRINT AT – prints a string at a given screen location
- CENTRE – centers a character string on the screen.
- USE – formats numeric data in strings based on a template, just like PRINT USING on other advanced versions of BASIC on other computers, e.g. the Commodore 128, for example.
- LIN – returns the vertical position of the cursor
Maths keywords
- MOD – performs a division operation and returns the remainder
- DIV – performs a division operation and returns the integer quotient
- FRAC – isolates the fractional portion of a number
- EXOR – performs an exclusive-OR logical operation
Programmer's aid keywords
- AUTO – automatically generates line numbers as a BASIC program is entered
- RENUMBER – renumbers a BASIC program
- OLD – undeletes a program accidentally removed by the NEW command
- KEY – assigns a string as a macro to a function key
- DISPLAY – displays all function key macros
- MERGE – merges a BASIC program from tape or disk into the program currently in memory
- PAGE – displays a BASIC program listing in page format
- OPTION – highlights Simons' BASIC keywords when using the LIST command
- DELAY – varies the rate at which the LIST command scrolls the screen
- FIND – searches the program for a string
- TRACE – displays the line numbers as a program is running
- RETRACE – displays results of a trace
- DUMP – displays all variable values except for arrays
- COLD – resets the C64
Security-related keywords
- DISAPA – marks a BASIC program line for hiding
- SECURE – hides all lines marked with DISAPA so that they cannot be viewed with LIST
Structured programming keywords
- ELSE – allows an alternative branch for IF/THEN conditionals
- REPEAT – start of a REPEAT/UNTIL loop structure
- UNTIL – defines the loop condition for a REPEAT/UNTIL loop structure, and marks its end
- RCOMP – reinstates the most recently used IF/THEN/ELSE conditional
- LOOP – defines the start of a loop that will run until an EXIT IF conditional is true
- EXIT IF – the conditional is true, so it exits the current LOOP/END LOOP structure
- END LOOP – defines the end of a loop that will run until an EXIT IF conditional is true
- PROC – defines the start of a named subroutine
- END PROC – defines the end of a named subroutine
- CALL – jump to a named subroutine defined with PROC/END PROC, and stay there
- EXEC – call a named subroutine defined with PROC/END PROC, then return
- LOCAL – redefines variables for use in structures
- GLOBAL – reverses the effects of a previous LOCAL command
Miscellaneous keywords
- CGOTO – equivalent to GOTO, but accepts calculated expressions
- RESET – moves the DATA pointer to a given line number
- PAUSE – pauses program execution for a specified number of seconds
Other
- $ and % are also considered keywords, for a total of 114.
Trivia
Reception
Creative Computing stated that Simons' BASIC "almost makes the 64 into a new computer. " It praised the "very fine manual" as a contrast to Commodore's usually poor documentation, and predicted that it would become "the standard language for programming the machine … Commodore had better be planning to manufacture lots of copies because they will go fast". Ahoy! wrote "If you do any programming in BASIC and should happen to see this product on a dealer's shelf, do not ask any questions—do not hesitate—just buy it!" The magazine praised Simons' BASIC's power and "excellent manual", and stated that "its price makes it one of the biggest bargains available for the Commodore 64". RUNs review was less favorable, stating that its "many powerful and useful commands … were, unfortunately, implemented very poorly for a commercial package. There is very little command parameter checking, and many things have been overlooked or ignored."The original SIMONS' BASIC cartridge has no provisions for reading the error channel on the Commodore 1541 and Commodore 1571 disk drives, nor can it perform a DIRectory listing of files or issue a DISK command on any disk drive other than Drive #8 when more than one disk drive is connected to the Commodore 64. And while most "standard" BASIC 2.0 keywords can be abbreviated by typing the first or first and second letters and then holding down the SHIFT key while typing the second letter after that, all SIMONS' BASIC keywords must be completely spelled out in full exactly as shown in the accompanying user's manual. This includes the commands COLOUR, and CENTRE, both of which are spelled correctly for the British and are incorporated that way into SIMONS' BASIC.