Trying out BASIC
A little while ago, Usborne released some of their classic 80s programming books for free[1]. While it may not a have been a complete collection, it's still pretty cool to be able to experience such an elegant piece of computer science history.
The books were aimed at teaching kids to program in the Beginner's All-purpose Symbolic Instruction Code (BASIC) programming language. It's a high level general purpose language that aimed to lower the barrier to entry to other languages at the time like FORTRAN.
Since quite a number of readers were so fond of these books[2], I wanted to get a sense of what they experienced exploring the material. This motivated me to completely ignore the disclaimer on Usborne's website -
Please note
These books were written for 1980s computers such as the ZX Spectrum and BBC Micro. The programs will not run on modern computers...
and give BASIC a try by reading and entering some of the examples given in the books.
Getting Basic
The first step was getting a basic interpreter or compiler. This was not as straight forward as one would assume because there are many flavors/dialects[3] of Basic. Some of the books even had to provide short basic conversion charts to help readers write BASIC code compliant with their platform.
Although there are a lot of perfectly good emulators and interpreters online, such as jsbeeb a javascript bbmicro emulator and Applesoft BASIC in Javascript, I wanted something offline. With a bit of Googling, my options came down to mostly[4],
- Chipmunk Basic
- Free Basic - I ended up going with this
- Brandy Basic
I ended up going forward with FreeBasic not for any reason in particular other than it just seemed like the best one to go with. Installing the tools was simple enough.
By referencing instructions in their installation guide, I wrote a small vagrant script which provisions a VM, installs the needed dependencies as well as downloads and Installs the compiler
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.provision "shell", inline: <<-SHELL
sudo apt-get update
sudo apt-get --assume-yes install gcc libncurses5-dev libffi-dev libgl1-mesa-dev libx11-dev libxext-dev libxrender-dev libxrandr-dev libxpm-dev
wget "http://downloads.sourceforge.net/project/fbc/Binaries%20-%20Linux/FreeBASIC-1.05.0-linux-x86_64.tar.gz"
tar zxf FreeBASIC-1.05.0-linux-x86_64.tar.gz
cd FreeBASIC-1.05.0-linux-x86_64
sudo ./install.sh -i
SHELL
end
Programming in BASIC
It's pretty simple enough getting started.
You write your code in a
*.bas
file, compile by invokingfbc
on said file, then run the generated executable to see the output.
Interestingly, unlike most modern programming languages, BASIC is not case sensitive meaning that the print
commands used in the following lines of code are functionally equivalent.
PRINT "B: Do you feel in charge?"
print "D: ... I paid you a small fortune!"
Print "B: And this give you...power over me?"
As expected, there were issues running examples used in the book straight out of the box. Using the default settings, some commands like LET
and $
suffixes didn't work.
Using the default settings, some commands like
LET
and$
suffixes didn't work.
This meant that this examples such as this wouldn't compile
LET B = 365
LET D$ = "DAYS IN THE YEAR"
LET L$ = "EXCEPT LEAP YEAR"
PRINT B
PRINT D$
PRINT L$
END
but instead return an error message similar to the following
HelloWorld.bas(1) error 145: Only valid in -lang deprecated or fblite or qb, found 'LET' in 'LET B = 365'
To resolve this we will have to compile using the fblite
language dialect[5] using the -lang
flag
$ fbc -lang fblite HELLO.bas
Once compiled, you can run the program using the generated executable.
$ ./HELLO
365
DAYS IN THE YEAR
EXCEPT LEAP YEAR
Conclusion
After playing with it for a while, a good chunk of the code works. However, there are still a couple of compatibility issues. For example,
PRINT TAB(15, 9)
doesn't compile since there is no tab function that allows a row offset to be specified.
PRINT TAB(15); "Hello World"
> Hello World
In conclusion, I guess part of the appeal is figuring out ways of porting over and adapting ideas learned from the text over to your own platform- Guaranteed to be hours of fun :)
Footnotes and References
See this Reddit thread for instructions on how to download them all at once ↩︎
Discussion on HackerNews and r/programming ↩︎
These links worked as of the time of this writing, The previous direct download links were removed and replaced with Google Drive links. ↩︎
This is not nor does it pretend to be a complete list. ↩︎