SBTCVM, being as different to binary as any balanced ternary computer, virtual or not, has plenty of differences that keep existing languages from it (without a shipload of work that is)
In light of this, i wound up creating a second programming language for it, called SSTNPL, or SBTCVM Simplified Ternary Numeric Programming Language. This is the beginning of a series of tutorials on its use, and best practices when working with it.
In part 1, we will take a look at using the 'keyprompt' command in two types of menus, to create a simple program that lets a user change a boolean value.
First thing you'll need is SBTCVM gen 2-9, SBTCVM's latest and greatest iteration, featuring among other things, SSTNPL's compiler.
Once you have that, you can proceed with creating a *.stnp file in the VMUSER directory. (note: if you prefix the .stnp with 'auto_' you can also place it in a subdirectory there)
For this tutorial however, i recommend downloading the example program from the gist embedded in the following section, and placing the *.stnp in VMUSER.
To make things easier, i marked each section clearly with comments
#### LIKE THIS ####
First off, lets look at the VARS section. as SSTNPL is fairly static, we need to let it know what variables we will be using. We do this with the
The first example uses signed decimal, via the @ prefix.
The second is plain balanced ternary.
The third uses the given character's code value in SBTCVM's text encoding. This means integer variables can act as 'characters' as well.
first, we see a
label. This lets us use both
gsub (subroutine goto) to jump to that location.
- print: prints raw text
- prline: prints raw text, but appends a newline
- newline: prints a newline character
- dumpd: dumps the specified variable in signed decimal as this is used to print our boolean value (called
keyprompt Is a input loop macro that waits for the user to press a key, then continues.
set is used to set values returned by several operations to variables.
set the variable
kb to the value returned by
Its at this point in
main that we check
kb against literal character values (letters prefixed with a
if kb,:q gsub quit If
kb is equal to the character code of
quit as a subroutine
as you might guess, we need to loop here. since we have a label at the top of main, we can jump there:
goto both by itself and in conditionals, does not affect return, while
gsub does. This lets you do complex jumps within subroutines, so its important to note.
On a quick touch, exiting an SSTNPL program is simple enough. just use:
This will neatly shutdown the VM.
This section is similar to main, but its acting as a 'value selection' rather than a 'subroutine selection'
looking past the label, we see
val. This, when used with
set can be used to directly change the value of variables. here, we use it to reset a return flag.
after a nifty
prline message telling the user to press 1 or 0, we then run
keyprompt in a loop as before.
how this 'value selector' works, is it uses pairs of conditional variable sets of both our boolean value variable
value and our return flag
if kb,:0 =retflg @1
if kb,:0 =value @0
Ooh what have we here? literal decimal integers, using the
this variable set mode works by setting the variable immediately following the
= sign, and using the variable or literal just next to that as the data value to use. so if you had a variable called
bob and wanted to set using that:
if kb,:0 =value bob
while we are talking about literals i should mention the ternary literal:
if kb,:0 =value *+0-
same idea as the decimal and character literals, just with a
handily, we can conditionally return from subroutines in SSTNPL using conditionals, rather than the usual
return command, we do:
if retflg,@1 return
This means it will only return when
value has been set via the user either pressing 1 or 0.
As before, we jump to the label we used for the beginning of the loop.
SSTNPL is fairly low-level, but that doesn't mean it isn't quite useful, if you want to mess around with SBTCVM, and lack good understanding of low level computing.
The takeaway from this, is other than the underlying logic, the overall structure of balanced ternary machines are similar to binary ones, as they both are digital computers and need to be programmed. Hope you found this interesting.