Simple graphics language

From ScienceZero
Revision as of 22:13, 14 April 2011 by Bjoern (Talk | contribs)

Jump to: navigation, search

A simple graphics language for microcontrollers

We start with a very simple reverse polish notation interpreter with a preprocessor stage

Sample code:

360 for 1 forward 1 right next

Registers:

0 X
1 Y
2 Angle
3 Scale
4 Colour
5 Pen up/down
6 Nested If counter
7

Stack diagrams:

( things read from the stack -- things written on the stack )
x - x position
y - y position
n - number
Example:
  ( n n -- n )
  This means that two numbers were read from the stack, then one number was written back.
  For example a simple addition reads two numbers and writes back the result.

Commands

Define function:
  To < function name > < code > End
 
Absolute commands
  setcolour     ( colour -- )
  readcolour    ( -- colour )
  setpos        ( x y -- )
  readpos       ( -- x y )

Relative commands:
  penup         ( -- )
  pendown       ( -- )
  forward       ( length -- )
  backward      ( length -- )
  left          ( angle -- )
  right         ( angle -- )
 
Loops:
  for           ( n -- )
  next          ( -- )
  do            ( -- )
  again         ( -- )

Conditionals:
  if            ( n -- )
  else
  endif

Data processing:
  +             ( n n -- n )
  -             ( n n -- n )
  lsl           ( n n -- n ) 
  lsr           ( n n -- n )
  and           ( n n -- n )
  or            ( n n -- n )
  eor           ( n n -- n )
  not           ( n -- n )

The dictionary

The dictionary is a string like "SetcolourReadcolourSetposReadpos", each word starts with an upper case character. The first compiler pass adds all functions to the end of this table.

The function jump table

This table contains the address of each function, in the same order as the functions appear in the dictionary. It is filled in during the second pass when the code position is known.

Interpreter

do
  read opcode
  if number then add number to the data stack
  if hardwired command then execute
  if function then look up the address in the function jump table and call it
again