DCPU-Bas is a simple QuickBASIC-like compiler for virtual DCPU in Notch's 0x10c Game, written in Go language.
Compiler structure and engine is heavily inspired by Let's Build a Compiler, by Jack Crenshaw.
- Arithmetics: + - * / %
- Boolean operators: & ~ !
- Bit shifts: << >>
- Relational operators: == <> < > <= >=
- Loading custom fonts
- Control structures: IF, LOOP
- Variables (both integer and string)
- Statements: CLS, LOCATE, PRINT, COLOR, KEY, INPUT, POKE, GOTO, RND, FONT
- Functions: STR, CHR, VAL, LEN, PEEK, SQR
Here's a sample program (you can find it in samples/input.bas) that asks for your name and then displays it back to you:
DIM MyName PRINT "Enter your name: "; CONTINUE MyName = INPUT PRINT " " PRINT "Hello, "; MyName; "!" END
Easiest way is to get the binaries from the downloads section.
You can also build it from the latest sources. In that case, you need to:
- Get and setup Go
- Get the latest sources and unpack them to a directory
- On the command line, within that directory, type:
That should do it.
Below are language statements and functions explained:
IF condition THEN ... [ELSE ...] END IF
Executes a code block if condition is met. Optional ELSE block executed if condition is NOT met.
LOOP [WHILE condition] ... END WHILE
Loops through a code block. Whe condition is supplied, loops while the condition is met.
Clears whole 32x16 screen (video buffer at 0x8000)
PRINT expression [; expression][; CONTINUE] PRINT
Prints expression(s) at current screen cursor location. Multiple expressions can be joined with semi-colon (;).
After printing all expressions cursor position will be set to next row, column 1, unless CONTINUE keyword is given at the end of expression list.
A = "World" PRINT "Hello "; A PRINT "A sentence within "; CONTINUE PRINT "the same line."
PUTCHAR "c" PUTCHAR expression
Fast way (5x faster than PRINT "c") to output a single character to video buffer at current cursor position. It can be either a string literal c in double quotes, or a math expression (which could be a single number) returning character ascii code.
LOCATE Y[, X]
Sets current cursor location to X, Y. Set's only Y if X is not provided.
COLOR FOREGROUND, BACKGROUND
Sets current output color to FOREGROUND and BACKGROUND. Both these values can be 0 to 15.
DIM Code Code = KEY
Used in an expression, it returns character code of last pressed key.
DIM Char Char = STR(expression)
Returns an ASCII character from given character code.
DIM Code Code = STR(expression)
Returns a character code from first character of an ASCII string (opposite to STR)
DIM Number Number = VAL(expression)
Returns an integer representation of a number in string variable (e.g. input from user)
DIM Length Length = LEN(expression)
Returns length (how many letters) of a string.
DIM YourName YourName = INPUT
Waits for user to enter a string followed by ENTER key, and returns this string as expression. User input is displayed on the screen.
DIM MemoryValue MemoryValue = PEEK(address)
Reads directly the memory and returns a number representing word at given memory address.
POKE address, value
Writes directly to memory, sets word at address to given value.
:label GOTO label
An unconditional jump into another place in the program code, defined by a label.
Label definitions must start with a colon (:).
Use it with caution, there are no checks performed, so you can break your code easily by abusing this statement. For example, nothing will prevent you to jump right into a LOOP or IF structure, but it can have unpredictable results.
DIM RandomValue RandomValue = RND
Generates a pseudo-random 16-bit integer (from 0 to 65535).
To get a number from a specific range, use modulo division:
RandomValue = RND % 100 + 1 gives you a number from 1 to 100.
Note: Every program always starts with the same seed, meaning that it will have a same set of random numbers generated. To update the seed randomly, use user's keyboard input - ask for something using INPUT statement, or wait for a keypress using KEY statement. These statements update the generator seed by multiplying it with amount of time that has passed before a keystroke, which should be random enough. Credit: Linear congruentrial generator used by this statement is coded by Entroper.
DIM Result Result = SQR(expression)
Computes square root of expression.
Loads custom font from text file and replaces current terminal font with it. Font file can specify only selected characters.
For a sample font file please refer to fonts/box.txt file. Every letter in font file starts with letter ascii code, and then 8 lines 4 character each follow, where dot (.) is an empty space and capital o (O) is a solid "pixel".
Program MUST end with an
You can browse sample/ directory for sample .bas source files, as well as output/ directory for compiled .s (assembly) files of these samples. There are couple of web-based emulators that you can try these with, most notable: deNULL's.
This code is licenced on the terms of the MIT Licence.