Skip to content

maciej-trebacz/DCPU-Bas

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

71 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DCPU-Bas - 0xBASIC language for DCPU-16

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.

Features

  • 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

How the language looks like

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

How to get it.

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: go build

That should do it.

Language documentation

Below are language statements and functions explained:

IF

Usage:

IF condition THEN
	...
[ELSE
	...]
END IF

Executes a code block if condition is met. Optional ELSE block executed if condition is NOT met.

LOOP

Usage:

LOOP [WHILE condition]
	...
END WHILE

Loops through a code block. Whe condition is supplied, loops while the condition is met.

CLS

Usage:

CLS

Clears whole 32x16 screen (video buffer at 0x8000)

PRINT

Usage:

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.
Example:

A = "World"
PRINT "Hello "; A
PRINT "A sentence within "; CONTINUE
PRINT "the same line."

PUTCHAR

Usage:

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

Usage:

LOCATE Y[, X]

Sets current cursor location to X, Y. Set's only Y if X is not provided.

COLOR

Usage:

COLOR FOREGROUND, BACKGROUND

Sets current output color to FOREGROUND and BACKGROUND. Both these values can be 0 to 15.

KEY

Usage:

DIM Code
Code = KEY 

Used in an expression, it returns character code of last pressed key.

STR

Usage:

DIM Char
Char = STR(expression)

Returns an ASCII character from given character code.

CHR

Usage:

DIM Code
Code = STR(expression)

Returns a character code from first character of an ASCII string (opposite to STR)

VAL

Usage:

DIM Number
Number = VAL(expression)

Returns an integer representation of a number in string variable (e.g. input from user)

LEN

Usage:

DIM Length
Length = LEN(expression)

Returns length (how many letters) of a string.

INPUT

Usage:

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.

PEEK

Usage:

DIM MemoryValue
MemoryValue = PEEK(address)

Reads directly the memory and returns a number representing word at given memory address.

POKE

Usage:

POKE address, value

Writes directly to memory, sets word at address to given value.

GOTO

Usage:

: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.

RND

Usage:

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.

SQR

Usage:

DIM Result
Result = SQR(expression)

Computes square root of expression.

FONT

Usage:

FONT "file.txt"

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".

END

Program MUST end with an END statement.

Demos

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.

Licence

This code is licenced on the terms of the MIT Licence.

About

QuickBasic-like compiler for DCPU in 0x10c game

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published