--- /dev/null
+/**
+ * Goldelox constants. Modified to be more C-like.
+ */
+#pragma once
+
+#ifndef __GL_TYPES_H__
+#define __GL_TYPES_H__
+
+#include <stddef.h>
+#include <stdint.h>
+
+typedef unsigned short gl_word_t;
+typedef unsigned long gl_dword_t;
+typedef gl_word_t * gl_word_array_t;
+typedef unsigned char * gl_byte_array_t;
+typedef unsigned char * gl_sector_t;
+
+/* new added types! */
+/* Serial Interface */
+struct gl_serif_t {
+ int (*write_tx) (const void *, size_t);
+ int (*read_rx) (void *, size_t, uint32_t);
+ int (*flush_rx) ();
+};
+
+
+typedef struct gl_serif_t gl_serif_t;
+
+
+/* "COM" port interface */
+struct gl_display_t {
+ struct gl_serif_t *serif;
+};
+
+typedef struct gl_display_t gl_display_t;
+#endif
--- /dev/null
+/*
+ //----------------------------------
+ // 4DGL - GOLDELOX-GFX2 PLATFORM
+ //----------------------------------
+
+
+*/
+/*
+ System Primitives for 4DGL GOLDELOX GFX2 Platform
+*/
+
+
+//==============================================//
+// initialization table additional commands //
+//==============================================//
+#define INIT_TABLE_END 0xFF // end of initialization table marker
+#define INIT_TABLE_DELAY 0xFE // insert delay value
+#define INIT_TABLE_16BIT_INDEX_REG_MODE 0xFD // 16 bit display index register
+#define INIT_TABLE_8BIT_INDEX_REG_MODE 0xFC // 8 bit display index register
+#define INIT_TABLE_16BIT_DUMMY_READ 0xFB // 16 bit display dummy read
+#define INIT_TABLE_PORTRAIT 0xFA // initial screen mode requirement
+#define INIT_TABLE_LANDSCAPE 0xF9
+#define INIT_TABLE_PORTRAIT_R 0xF8
+#define INIT_TABLE_LANDSCAPE_R 0xF7
+
+//==============================================//
+// putch, putstr, putnum and print redirection //
+// constants //
+//==============================================//
+#define APPEND 0x0000
+#define COM0 0xFF04
+#define TEXT 0xFF08
+#define MDA 0xFF10
+
+//==============================================//
+// general number formatting constants //
+// for 'print' and 'putnum' //
+//==============================================//
+ // string processing constants
+#define STR 0x0080 // display as string
+#define CHR 0x0081 // display as single char
+
+
+
+ // binary, no leading zeroes
+#define BIN 0x0002 // binary, 16 digits, no leading zeroes
+#define BIN1 0x0102 // binary, 1 digit, no leading zeroes
+#define BIN2 0x0202 // binary, 2 digits, no leading zeroes
+#define BIN3 0x0302 // binary, 3 digits, no leading zeroes
+#define BIN4 0x0402 // binary, 4 digits, no leading zeroes
+#define BIN5 0x0502 // binary, 5 digits, no leading zeroes
+#define BIN6 0x0602 // binary, 6 digits, no leading zeroes
+#define BIN7 0x0702 // binary, 7 digits, no leading zeroes
+#define BIN8 0x0802 // binary, 8 digits, no leading zeroes
+#define BIN9 0x0902 // binary, 9 digits, no leading zeroes
+#define BIN10 0x0A02 // binary, 10 digits, no leading zeroes
+#define BIN11 0x0B02 // binary, 11 digits, no leading zeroes
+#define BIN12 0x0C02 // binary, 12 digits, no leading zeroes
+#define BIN13 0x0D02 // binary, 13 digits, no leading zeroes
+#define BIN14 0x0E02 // binary, 14 digits, no leading zeroes
+#define BIN15 0x0F02 // binary, 15 digits, no leading zeroes
+#define BIN16 0x0002 // binary, 16 digits, no leading zeroes
+
+ // binary, with leading zeroes
+#define BINZ 0x1002 // binary, 16 digits, leading zeroes
+#define BIN1Z 0x1102 // binary, 1 digit, leading zeroes
+#define BIN2Z 0x1202 // binary, 2 digits, leading zeroes
+#define BIN3Z 0x1302 // binary, 3 digits, leading zeroes
+#define BIN4Z 0x1402 // binary, 4 digits, leading zeroes
+#define BIN5Z 0x1502 // binary, 5 digits, leading zeroes
+#define BIN6Z 0x1602 // binary, 6 digits, leading zeroes
+#define BIN7Z 0x1702 // binary, 7 digits, leading zeroes
+#define BIN8Z 0x1802 // binary, 8 digits, leading zeroes
+#define BIN9Z 0x1902 // binary, 9 digits, leading zeroes
+#define BIN10Z 0x1A02 // binary, 10 digits, leading zeroes
+#define BIN11Z 0x1B02 // binary, 11 digits, leading zeroes
+#define BIN12Z 0x1C02 // binary, 12 digits, leading zeroes
+#define BIN13Z 0x1D02 // binary, 13 digits, leading zeroes
+#define BIN14Z 0x1E02 // binary, 14 digits, leading zeroes
+#define BIN15Z 0x1F02 // binary, 15 digits, leading zeroes
+#define BIN16Z 0x1002 // binary, 16 digits, leading zeroes
+
+ // binary, with leading blanked
+#define BINZB 0x2002 // binary, 16 digits, leading blanks
+#define BIN1ZB 0x2102 // binary, 1 digit, leading blanks
+#define BIN2ZB 0x2202 // binary, 2 digits, leading blanks
+#define BIN3ZB 0x2302 // binary, 3 digits, leading blanks
+#define BIN4ZB 0x2402 // binary, 4 digits, leading blanks
+#define BIN5ZB 0x2502 // binary, 5 digits, leading blanks
+#define BIN6ZB 0x2602 // binary, 6 digits, leading blanks
+#define BIN7ZB 0x2702 // binary, 7 digits, leading blanks
+#define BIN8ZB 0x2802 // binary, 8 digits, leading blanks
+#define BIN9ZB 0x2902 // binary, 9 digits, leading blanks
+#define BIN10ZB 0x2A02 // binary, 10 digits, leading blanks
+#define BIN11ZB 0x2B02 // binary, 11 digits, leading blanks
+#define BIN12ZB 0x2C02 // binary, 12 digits, leading blanks
+#define BIN13ZB 0x2D02 // binary, 13 digits, leading blanks
+#define BIN14ZB 0x2E02 // binary, 14 digits, leading blanks
+#define BIN15ZB 0x2F02 // binary, 15 digits, leading blanks
+#define BIN16ZB 0x2002 // binary, 16 digits, leading blanks
+
+ // signed decimal, no leading zeroes
+#define DEC 0x050A // signed decimal, 5 digits, no leading zeroes
+#define DEC1 0x010A // signed decimal, 1 digit, no leading zeroes
+#define DEC2 0x020A // signed decimal, 2 digits, no leading zeroes
+#define DEC3 0x030A // signed decimal, 3 digits, no leading zeroes
+#define DEC4 0x040A // signed decimal, 4 digits, no leading zeroes
+#define DEC5 0x050A // signed decimal, 5 digits, no leading zeroes
+
+ // signed decimal, with leading zeroes
+#define DECZ 0x150A // signed decimal, 5 digits, leading zeroes
+#define DEC1Z 0x110A // signed decimal, 1 digit, leading zeroes
+#define DEC2Z 0x120A // signed decimal, 2 digits, leading zeroes
+#define DEC3Z 0x130A // signed decimal, 3 digits, leading zeroes
+#define DEC4Z 0x140A // signed decimal, 4 digits, leading zeroes
+#define DEC5Z 0x150A // signed decimal, 5 digits, leading zeroes
+
+ // signed decimal, leading zeroes blanked
+#define DECZB 0x250A // signed decimal, 5 digits, leading blanks
+#define DEC1ZB 0x210A // signed decimal, 1 digit, leading blanks
+#define DEC2ZB 0x220A // signed decimal, 2 digits, leading blanks
+#define DEC3ZB 0x230A // signed decimal, 3 digits, leading blanks
+#define DEC4ZB 0x240A // signed decimal, 4 digits, leading blanks
+#define DEC5ZB 0x250A // signed decimal, 5 digits, leading blanks
+
+ // unsigned decimal, no leading zeroes
+#define UDEC 0x450A // unsigned decimal, 5 digits, no leading zeroes
+#define UDEC1 0x410A // unsigned decimal, 1 digit, no leading zeroes
+#define UDEC2 0x420A // unsigned decimal, 2 digits, no leading zeroes
+#define UDEC3 0x430A // unsigned decimal, 3 digits, no leading zeroes
+#define UDEC4 0x440A // unsigned decimal, 4 digits, no leading zeroes
+#define UDEC5 0x450A // unsigned decimal, 5 digits, no leading zeroes
+
+ // unsigned decimal, with leading zero's
+#define UDECZ 0x550A // unsigned decimal, 5 digits, leading zeroes
+#define UDEC1Z 0x510A // unsigned decimal, 1 digit, leading zeroes
+#define UDEC2Z 0x520A // unsigned decimal, 2 digits, leading zeroes
+#define UDEC3Z 0x530A // unsigned decimal, 3 digits, leading zeroes
+#define UDEC4Z 0x540A // unsigned decimal, 4 digits, leading zeroes
+#define UDEC5Z 0x550A // unsigned decimal, 5 digits, leading zeroes
+
+ // unsigned decimal, leading zeroes blanked
+#define UDECZB 0x650A // unsigned decimal, 5 digits, leading blanks
+#define UDEC1ZB 0x610A // unsigned decimal, 1 digit, leading blanks
+#define UDEC2ZB 0x620A // unsigned decimal, 2 digits, leading blanks
+#define UDEC3ZB 0x630A // unsigned decimal, 3 digits, leading blanks
+#define UDEC4ZB 0x640A // unsigned decimal, 4 digits, leading blanks
+#define UDEC5ZB 0x650A // unsigned decimal, 5 digits, leading blanks
+
+ // hex, with leading zero's
+#define HEX 0x1410 // hex, 4 digits, leading zeroes
+#define HEX1 0x1110 // hex, 1 digit, leading zeroes
+#define HEX2 0x1210 // hex, 2 digits, leading zeroes
+#define HEX3 0x1310 // hex, 3 digits, leading zeroes
+#define HEX4 0x1410 // hex, 4 digits, leading zeroes
+
+ // hex, no leading zero's
+#define HEXZ 0x0410 // hex, 4 digits, no leading zeroes
+#define HEX1Z 0x0110 // hex, 1 digit, no leading zeroes
+#define HEX2Z 0x0210 // hex, 2 digits, no leading zeroes
+#define HEX3Z 0x0310 // hex, 3 digits, no leading zeroes
+#define HEX4Z 0x0410 // hex, 4 digits, no leading zeroes
+
+ // hex, leading zero's blanked
+#define HEXZB 0x2410 // hex, 4 digits, leading blanks
+#define HEX1ZB 0x2110 // hex, 1 digit, leading blanks
+#define HEX2ZB 0x2210 // hex, 2 digits, leading blanks
+#define HEX3ZB 0x2310 // hex, 3 digits, leading blanks
+#define HEX4ZB 0x2410 // hex, 4 digits, leading blanks
+
+// baud divisor rates
+#define MIDI 95
+#define BAUD_110 27271
+#define BAUD_300 9999
+#define BAUD_600 4999
+#define BAUD_1200 2499
+#define BAUD_2400 1249
+#define BAUD_4800 624
+#define BAUD_9600 312
+#define BAUD_14400 207
+#define BAUD_19200 155
+#define BAUD_31250 95
+#define BAUD_38400 77
+#define BAUD_56000 53
+#define BAUD_57600 51
+#define BAUD_115200 25
+#define BAUD_128000 22
+#define BAUD_256000 11
+#define BAUD_300000 10
+#define BAUD_375000 8
+#define BAUD_500000 6
+#define BAUD_600000 4
+
+
+//==============================================//
+// generic constants //
+//==============================================//
+#define ENABLE 1
+#define DISABLE 0
+#define ON 1
+#define OFF 0
+#define TRUE 1
+#define FALSE 0
+
+//==============================================//
+// joystick() function return constants //
+//==============================================//
+#define RELEASED 0
+#define UP 1
+#define LEFT 2
+#define DOWN 3
+#define RIGHT 4
+#define FIRE 5
+
+//==============================================//
+// spi_Init(...) mode arguments //
+//==============================================//
+#define SPI_SLOW 2 // 750khz
+#define SPI_MED 1 // 3mhz
+#define SPI_FAST 0 // 12mhz
+#define RXMODE_0 0 // receive sample pos
+#define RXMODE_1 1 // receive sample pos
+#define CKMODE_0 0 // transmit sample pos
+#define CKMODE_1 1 // transmit sample pos
+#define CKMODE_2 2 // transmit sample pos
+#define CKMODE_3 3 // transmit sample pos
+
+//==============================================//
+//Pin related constants //
+//==============================================//
+#define IO1 0
+#define IO2 1
+#define LO 0
+#define HI 1
+#define OUTPUT 0
+#define INPUT 1
+#define ANALOGUE_8 2
+#define ANALOGUE_10 3
+#define ONEWIRE 4
+#define SOUND 5
+
+//==============================================//
+//gfx_Set() related constants //
+//==============================================//
+#define PEN_SIZE 0 // not necessary to use (legacy mode)
+#define BACKGROUND_COLOUR 1 // screen background colour
+#define OBJECT_COLOUR 2 // line / circle / rectangle generic colour
+#define CLIPPING 3 // clipping ON / OFF
+#define TRANSPARENT_COLOUR 4 // (only on displays with specific hware feature)
+#define TRANSPARENCY 5 // 0 = OFF, 1 = ON (only on displays with specific hware feature)
+#define FRAME_DELAY 6 // legacy mode, see pokeB(IMAGE_DELAY, n);
+#define SCREEN_MODE 7 // LANDSCAPE, LANDSCAPE_R, PORTRAIT, PORTRAIT_R
+#define OUTLINE_COLOUR 8 // if not BLACK (0) , used for outline around circles and rectanglse
+#define CONTRAST 9 // set contrast ratuio in uOLED modules
+#define LINE_PATTERN 10 // used for patterned lines, 16bit value (0 = no pattern)
+#define COLOUR_MODE 11 // select 8 or 16 bit colour mode
+
+
+#define SOLID 0 // PEN_SIZE argument (gfx_Set legacy mode)
+#define OUTLINE 1 // PEN_SIZE argument (gfx_Set legacy mode)
+
+#define LANDSCAPE 0 // SCREEN_MODE (north)
+#define LANDSCAPE_R 1 // SCREEN_MODE (south)
+#define PORTRAIT 2 // SCREEN_MODE (west)
+#define PORTRAIT_R 3 // SCREEN_MODE (east)
+
+#define COLOUR8 1 // COLOUR_MODE 8 bit colour mode
+#define COLOUR16 0 // COLOUR_MODE 16 bit colour mode
+
+//==============================================//
+//txt_Set() related constants //
+//==============================================//
+#define TEXT_COLOUR 0 // text foreground colr
+#define TEXT_HIGHLIGHT 1 // text background colr
+#define FONT_ID 2 // default 0, else points to data statement font
+#define TEXT_WIDTH 3 // text width multiplier
+#define TEXT_HEIGHT 4 // text height multiplier
+#define TEXT_XGAP 5 // horizontal text gap (default 1)
+#define TEXT_YGAP 6 // vertical text gap (default 1)
+#define TEXT_PRINTDELAY 7 // for 'teletype' like effect when pronting
+#define TEXT_OPACITY 8 // text mode flag, TRANSPARENT or OPAQUE
+#define TEXT_BOLD 9 // embolden text (auto reset) - legacy
+#define TEXT_ITALIC 10 // italicize text (auto reset)
+#define TEXT_INVERSE 11 // invert text (auto reset)
+#define TEXT_UNDERLINED 12 // underline text (auto reset)
+#define TEXT_ATTRIBUTES 13 // controls BOLD/ITALIC/INVERSE/UNDERLINE simultaneously
+
+//==============================================//
+//txt_Set() related arguments //
+//==============================================//
+#define SYSTEM 0 // internal system font
+#define MEDIA 7 // font is at uSD_add
+
+
+#define TRANSPARENT 0 // TEXT_OPACITY transparent text
+#define OPAQUE 1 // TEXT_OPACITY opaque text
+
+#define BOLD 16 // TEXT_ATTRIBUTES bold text (auto reset)
+#define ITALIC 32 // TEXT_ATTRIBUTES italic text (auto reset)
+#define INVERSE 64 // TEXT_ATTRIBUTES inverse text (auto reset)
+#define UNDERLINED 128 // TEXT_ATTRIBUTES underlined text (auto reset)
+
+
+//==============================================//
+// Memory MAP //
+// system BYTE variables accesible with //
+// peekB and pokeB //
+//==============================================//
+#define VX1 128 // display hardware x1 pos
+#define VY1 129 // display hardware y1 pos
+#define VX2 130 // display hardware x2 pos
+#define VY2 131 // display hardware y2 pos
+#define SYS_X_MAX 132 // display hardware X res-1
+#define SYS_Y_MAX 133 // display hardware Y res-1
+#define WRITE_GRAM_REG 134 // device register address for write operation
+#define READ_GRAM_REG 135 // device register address for write operation
+#define IMAGE_WIDTH 136 // width of currently loaded image
+#define IMAGE_HEIGHT 137 // height of currently loaded image
+#define IMAGE_DELAY 138 // 0 if image, else inter frame delay for movie
+#define IMAGE_MODE 139 // bit 4 determines colr mode, other bits reserved
+#define CLIP_LEFT_POS 140 // left clipping point (set with gfx_ClipWindow(...)
+#define CLIP_TOP_POS 141 // top clipping point (set with gfx_ClipWindow(...)
+#define CLIP_RIGHT_POS 142 // right clipping point (set with gfx_ClipWindow(...)
+#define CLIP_BOTTOM_POS 143 // bottom clipping point (set with gfx_ClipWindow(...)
+#define CLIP_LEFT 144 // current clip value (reads as full size if clipping turned off)
+#define CLIP_TOP 145 // current clip value (reads as full size if clipping turned off)
+#define CLIP_RIGHT 146 // current clip value (reads as full size if clipping turned off)
+#define CLIP_BOTTOM 147 // current clip value (reads full size if clipping turned off)
+#define FONT_TYPE 148 // font type, 0 = system font, else pointer to user or media font
+#define FONT_MAX 149 // number of chars in current font
+#define FONT_OFFSET 150 // starting offset (normally 0x20)
+#define FONT_WIDTH 151 // current font width
+#define FONT_HEIGHT 152 // current font height
+#define TEXT_XMAG 153 // text width magnification
+#define TEXT_YMAG 154 // text height magnification
+#define TEXT_MARGIN 155 // left column for carriage return
+#define TEXT_DELAY 156 // print delay
+#define TEXT_X_GAP 157 // text horizontal gap size
+#define TEXT_Y_GAP 158 // text vertical gap size
+#define GFX_XMAX 159 // current display width-1 determined by portrait / landscape swapping
+#define GFX_YMAX 160 // current display width-1 determined by portrait / landscape swapping
+#define GFX_SCREENMODE 161 // holds current screen mode
+ //
+
+
+//==============================================//
+// system WORD variables accesible with peekW //
+// and pokeW or pointer access //
+//==============================================//
+#define VM_OVERFLOW 83 // 16bit overflow of 32bit results (see OVF() funtion)
+#define VM_COLOUR 84 // general working var for colour
+#define VM_RETVAL 85 // last value returned from any function
+#define GFX_BACK_COLOUR 86 // screen background colour
+#define GFX_OBJECT_COLOUR 87 // graphics object colour
+#define GFX_TEXT_COLOUR 88 // text forground colour
+#define GFX_TEXT_BGCOLOUR 89 // text background colour
+#define GFX_OUTLINE_COLOUR 90 // screen background colour
+#define GFX_LINE_PATTERN 91 // line draw 16bit linear pattern
+#define IMG_PIXEL_COUNT 92 // pixel count of current object (may be altered by clipping)
+#define IMG_FRAME_COUNT 93 // count of frames in currently loaded video
+#define MEDIA_HEAD 94 // media sector head position
+#define SYS_OSTREAM 95 // system output redirection
+#define GFX_LEFT 96 // virtual left point for current image
+#define GFX_TOP 97 // virtual top point for current image
+#define GFX_RIGHT 98 // virtual right point for current image
+#define GFX_BOTTOM 99 // virtual bottom point for current image
+#define GFX_X1 100 // clipped left point for current image
+#define GFX_Y1 101 // clipped top point for current image
+#define GFX_X2 102 // clipped right point for current image
+#define GFX_Y2 103 // clipped bottom point for current image
+#define GFX_X_ORG 104 // current Y origin
+#define GFX_Y_ORG 105 // current Y origin
+#define RANDOM_LO 106 // random number generator LO word
+#define RANDOM_HI 107 // random number generator LO word
+#define MEDIA_ADDR_LO 108 // uSD/FLASH absolute byte address LO
+#define MEDIA_ADDR_HI 109 // uSD/FLASH absolute byte address HI
+#define SECTOR_ADDR_LO 110 // uSD/FLASH sector address LO
+#define SECTOR_ADDR_HI 111 // uSD/FLASH sector address HI
+#define SYSTEM_TIMER_LO 112 // 1msec 32 bit free running timer LO word
+#define SYSTEM_TIMER_HI 113 // 1msec 32 bit free running timer HI word
+#define TIMER0 114 // user timer0
+#define TIMER1 115 // user timer1
+#define TIMER2 116 // user timer2
+#define TIMER3 117 // user timer3 (10msec resolution)
+#define INCVAL 118 // incrementer size
+#define TEMP_MEDIA_ADDRLO 119 // temp stroage while printing font from media storage
+#define TEMP_MEDIA_ADDRHI 120 // temp stroage while printing font from media storage
+#define GFX_TRANSPARENTCOLOUR 121 // image transparency colour
+#define GFX_STRINGMETRIX 122 // low byte = string width, hi byte = string height
+#define GFX_TEMPSTORE1 123 // low byte = last char printed, hi byte = frame timer over-ride
+ // reserved 124 // internal use
+ // reserved 125 // internal use
+#define SYS_FLAGS1 126 // system control flags word 1
+#define SYS_FLAGS2 127 // system control flags word 2
+
+//==============================================//
+// bit constants for SYS_FLAGS1 //
+//==============================================//
+#define _STREAMLOCK 0x0001 // Used internally
+#define _PENSIZE 0x0002 // object, 0=solid,1=outline
+#define _OPACITY 0x0004 // text, 0=transparent,1=opaque
+#define _OUTLINED 0x0008 // box/circle outline 0=off,1=on
+#define _BOLD 0x0010 // text, 0=normal,1=bold (auto reset)
+#define _ITALIC 0x0020 // Text, 0=normal,1=italic (auto reset)
+#define _INVERSE 0x0040 // Text, 0=normal,1=inverse (auto reset)
+#define _UNDERLINED 0x0080 // Text, 0=normal,1=underlined (auto reset)
+#define _CLIPPING 0x0100 // Used internally, 0-clipping off, 1-clipping on
+#define _STRMODE 0x0200 // Used internally
+#define _SERMODE 0x0400 // Used internally
+#define _TXTMODE 0x0800 // Used internally
+#define _MEDIAMODE 0x1000 // Used internally
+#define _PATTERNED 0x2000 // Used internally
+#define _COLOUR8 0x4000 // Display mode, 0=16bit, 1=8bit
+#define _MEDIAFONT 0x8000 // 0=internal font, 1=media font
+
+//==============================================//
+// bit constants for SYS_FLAGS2 //
+//==============================================//
+#define _MEDIA_INSTALLED 0x0001 // SD of FLASH device is installed
+#define _MEDIA_TYPE 0x0002 // 0=SD, 1=FLASH media device detected
+#define _MEDIA_READ 0x0004 // 1=MEDIA read in progress
+#define _MEDIA_WRITE 0x0008 // 1=MEDIA write in progress
+#define _OW_PIN 0x0010 // 0=IO1, 1=IO2 (Dallas OW Pin)
+#define _PTR_TYPE 0x0020 // Used internally
+#define _TEMP1 0x0040 // Used internally
+#define _TEMP2 0x0080 // Used internally
+#define _RUNMODE 0x0100 // 1=running pcode from media
+#define _SIGNED 0x0200 // 0=number printed '-' prepend
+#define _RUNFLAG 0x0400 // 1=EVE processor is running SYSTEM
+#define _SINGLESTEP 0x0800 // 1=set breakpoint for debugger
+#define _COMMINT 0x1000 // 1=buffered comms active
+#define _DUMMY16 0x2000 // 1=display needs 16bit dummy
+#define _DISP16 0x4000 // 1=display is 16bit interface
+#define _PROPFONT 0x8000 // 1=current font is proportional
+
+
+//==============================================//
+// EVE User Resources //
+//==============================================//
+#define USR_SP 128 // EVE user defined stack pointer
+#define USRVARS 129 // EVE user variables VARS[255]
+#define USRSTACK 384 // EVE machine stack STACK[128]
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+/*
+ 16 bit RGB (565) Colour Chart
+ Original work by 4D Forum Member: skadoo
+*/
+
+
+
+#define ALICEBLUE 0xF7DF
+#define ANTIQUEWHITE 0xFF5A
+#define AQUA 0x07FF
+#define AQUAMARINE 0x7FFA
+#define AZURE 0xF7FF
+#define BEIGE 0xF7BB
+#define BISQUE 0xFF38
+#define BLACK 0x0000
+#define BLANCHEDALMOND 0xFF59
+#define BLUE 0x001F
+#define BLUEVIOLET 0x895C
+#define BROWN 0xA145
+#define BURLYWOOD 0xDDD0
+#define CADETBLUE 0x5CF4
+#define CHARTREUSE 0x7FE0
+#define CHOCOLATE 0xD343
+#define CORAL 0xFBEA
+#define CORNFLOWERBLUE 0x64BD
+#define CORNSILK 0xFFDB
+#define CRIMSON 0xD8A7
+#define CYAN 0x07FF
+#define DARKBLUE 0x0011
+#define DARKCYAN 0x0451
+#define DARKGOLDENROD 0xBC21
+#define DARKGRAY 0xAD55
+#define DARKGREEN 0x0320
+#define DARKKHAKI 0xBDAD
+#define DARKMAGENTA 0x8811
+#define DARKOLIVEGREEN 0x5345
+#define DARKORANGE 0xFC60
+#define DARKORCHID 0x9999
+#define DARKRED 0x8800
+#define DARKSALMON 0xECAF
+#define DARKSEAGREEN 0x8DF1
+#define DARKSLATEBLUE 0x49F1
+#define DARKSLATEGRAY 0x2A69
+#define DARKTURQUOISE 0x067A
+#define DARKVIOLET 0x901A
+#define DEEPPINK 0xF8B2
+#define DEEPSKYBLUE 0x05FF
+#define DIMGRAY 0x6B4D
+#define DODGERBLUE 0x1C9F
+#define FIREBRICK 0xB104
+#define FLORALWHITE 0xFFDE
+#define FORESTGREEN 0x2444
+#define FUCHSIA 0xF81F
+#define GAINSBORO 0xDEFB
+#define GHOSTWHITE 0xFFDF
+#define GOLD 0xFEA0
+#define GOLDENROD 0xDD24
+#define GRAY 0x8410
+#define GREEN 0x0400
+#define GREENYELLOW 0xAFE5
+#define HONEYDEW 0xF7FE
+#define HOTPINK 0xFB56
+#define INDIANRED 0xCAEB
+#define INDIGO 0x4810
+#define IVORY 0xFFFE
+#define KHAKI 0xF731
+#define LAVENDER 0xE73F
+#define LAVENDERBLUSH 0xFF9E
+#define LAWNGREEN 0x7FE0
+#define LEMONCHIFFON 0xFFD9
+#define LIGHTBLUE 0xAEDC
+#define LIGHTCORAL 0xF410
+#define LIGHTCYAN 0xE7FF
+#define LIGHTGOLD 0xFFDA
+#define LIGHTGREEN 0x9772
+#define LIGHTGREY 0xD69A
+#define LIGHTPINK 0xFDB8
+#define LIGHTSALMON 0xFD0F
+#define LIGHTSEAGREEN 0x2595
+#define LIGHTSKYBLUE 0x867F
+#define LIGHTSLATEGRAY 0x7453
+#define LIGHTSTEELBLUE 0xB63B
+#define LIGHTYELLOW 0xFFFC
+#define LIME 0x07E0
+#define LIMEGREEN 0x3666
+#define LINEN 0xFF9C
+#define MAGENTA 0xF81F
+#define MAROON 0x8000
+#define MEDIUMAQUAMARINE 0x6675
+#define MEDIUMBLUE 0x0019
+#define MEDIUMORCHID 0xBABA
+#define MEDIUMPURPLE 0x939B
+#define MEDIUMSEAGREEN 0x3D8E
+#define MEDIUMSLATEBLUE 0x7B5D
+#define MEDIUMSPRINGGREEN 0x07D3
+#define MEDIUMTURQUOISE 0x4E99
+#define MEDIUMVIOLETRED 0xC0B0
+#define MIDNIGHTBLUE 0x18CE
+#define MINTCREAM 0xF7FF
+#define MISTYROSE 0xFF3C
+#define MOCCASIN 0xFF36
+#define NAVAJOWHITE 0xFEF5
+#define NAVY 0x0010
+#define OLDLACE 0xFFBC
+#define OLIVE 0x8400
+#define OLIVEDRAB 0x6C64
+#define ORANGE 0xFD20
+#define ORANGERED 0xFA20
+#define ORCHID 0xDB9A
+#define PALEGOLDENROD 0xEF55
+#define PALEGREEN 0x9FD3
+#define PALETURQUOISE 0xAF7D
+#define PALEVIOLETRED 0xDB92
+#define PAPAYAWHIP 0xFF7A
+#define PEACHPUFF 0xFED7
+#define PERU 0xCC27
+#define PINK 0xFE19
+#define PLUM 0xDD1B
+#define POWDERBLUE 0xB71C
+#define PURPLE 0x8010
+#define RED 0xF800
+#define ROSYBROWN 0xBC71
+#define ROYALBLUE 0x435C
+#define SADDLEBROWN 0x8A22
+#define SALMON 0xFC0E
+#define SANDYBROWN 0xF52C
+#define SEAGREEN 0x2C4A
+#define SEASHELL 0xFFBD
+#define SIENNA 0xA285
+#define SILVER 0xC618
+#define SKYBLUE 0x867D
+#define SLATEBLUE 0x6AD9
+#define SLATEGRAY 0x7412
+#define SNOW 0xFFDF
+#define SPRINGGREEN 0x07EF
+#define STEELBLUE 0x4416
+#define TAN 0xD5B1
+#define TEAL 0x0410
+#define THISTLE 0xDDFB
+#define TOMATO 0xFB08
+#define TURQUOISE 0x471A
+#define VIOLET 0xEC1D
+#define WHEAT 0xF6F6
+#define WHITE 0xFFFF
+#define WHITESMOKE 0xF7BE
+#define YELLOW 0xFFE0
+#define YELLOWGREEN 0x9E66
+
+#define F_charheight 1
+#define F_charwidth 2
+#define F_gfx_BGcolour -146
+#define F_gfx_ChangeColour -66
+#define F_gfx_Circle -51
+#define F_gfx_CircleFilled -52
+#define F_gfx_Clipping -148
+#define F_gfx_ClipWindow -65
+#define F_gfx_Cls -41
+#define F_gfx_Contrast -154
+#define F_gfx_FrameDelay -151
+#define F_gfx_GetPixel -54
+#define F_gfx_Line -46
+#define F_gfx_LinePattern -155
+#define F_gfx_LineTo -44
+#define F_gfx_MoveTo -42
+#define F_gfx_Orbit 3
+#define F_gfx_OutlineColour -153
+#define F_gfx_Polygon 4
+#define F_gfx_Polyline 5
+#define F_gfx_PutPixel -53
+#define F_gfx_Rectangle -49
+#define F_gfx_RectangleFilled -50
+#define F_gfx_ScreenMode -152
+#define F_gfx_Set -40
+#define F_gfx_SetClipRegion -68
+#define F_gfx_Transparency -150
+#define F_gfx_TransparentColour -149
+#define F_gfx_Triangle -55
+#define F_media_Flush -78
+#define F_media_Image -77
+#define F_media_Init -79
+#define F_media_ReadByte -73
+#define F_media_ReadWord -74
+#define F_media_SetAdd -71
+#define F_media_SetSector -72
+#define F_media_Video -69
+#define F_media_VideoFrame -70
+#define F_media_WriteByte -75
+#define F_media_WriteWord -76
+#define F_putCH -2
+#define F_putstr 6
+#define F_txt_Attributes -142
+#define F_txt_BGcolour -130
+#define F_txt_Bold -138
+#define F_txt_FGcolour -129
+#define F_txt_FontID -131
+#define F_txt_Height -133
+#define F_txt_Inverse -140
+#define F_txt_Italic -139
+#define F_txt_MoveCursor -28
+#define F_txt_Opacity -137
+#define F_txt_Set -29
+#define F_txt_Underline -141
+#define F_txt_Width -132
+#define F_txt_Xgap -134
+#define F_txt_Ygap -135
+#define F_BeeP -38
+#define F_sys_GetModel 7
+#define F_sys_GetVersion 8
+#define F_sys_GetPmmC 9
+#define F_blitComtoDisplay 10
+#define F_setbaudWait 11
+#define F_peekW -11
+#define F_pokeW -13
+#define F_peekB -10
+#define F_pokeB -12
+#define F_joystick -39
+#define F_SSTimeout 12
+#define F_SSSpeed 13
+#define F_SSMode 14
+
+
+
+
+
+
+
+
--- /dev/null
+/**
+ * Added - Goldelox Errors.
+ */
+
+#pragma once
+
+#ifndef __GL_ERROR_H__
+#define __GL_ERROR_H__
+
+#define GL_EOK 0x00000000
+#define GL_ENULL 0x01000001
+
+#include <stdint.h>
+
+typedef uint32_t gl_err_t;
+
+
+#endif
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <errno.h>
+#include <time.h>
+
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <termios.h>
+
+#include "Goldelox_Types4D.h" // defines data types used by the 4D Routines
+#include "Goldelox_const4D.h" // defines for 4dgl constants, generated by conversion of 4DGL constants to target language
+#include "gl_error.h"
+
+#define Err4D_OK 0
+#define Err4D_Timeout 1
+#define Err4D_NAK 2 // other than ACK received
+
+
+// 4D Global variables
+int cPort; // comp port handle, used by Intrinsic routines
+int Error4D ; // Error indicator, used and set by Intrinsic routines
+unsigned char Error4D_Inv ; // Error byte returned from com port, onl set if error = Err_Invalid
+int Error_Abort4D ; // if true routines will abort when detecting an error
+int TimeLimit4D ; // time limit in ms for total serial command duration, 2000 (2 seconds) should be adequate for most commands
+ // assuming a reasonable baud rate AND low latency AND 0 for the Serial Delay Parameter
+ // temporary increase might be required for very long (bitmap write, large image file opens)
+int(*Callback4D) (int, unsigned char) ; // or indeterminate (eg file_exec, file_run, file_callFunction) commands
+
+/*
+ * Start of 4D Intrinsic Routines
+*/
+
+void WriteBytes(gl_serif_t *serif, unsigned char *psOutput, int nCount)
+{
+ int iOut;
+ // Quick return if no device
+ if (cPort < 0)
+ {
+ Error4D = Err4D_OK;
+ return;
+ }
+ // iOut = write(cPort, psOutput, nCount);
+ iOut = serif->write(psOutput, nCount, TimeLimit4D);
+ if (iOut < 0)
+ {
+ printf("goldelox: write error \n");
+ }
+ if (iOut != nCount)
+ printf("goldelox: Write incomplete!\n");
+ return;
+}
+
+void WriteChars(unsigned char *psOutput)
+{
+ // Include NULL in output
+ WriteBytes(psOutput, strlen((char *)psOutput) + 1);
+ return;
+}
+
+void WriteWords(gl_word_t * Source, int Size)
+{
+ gl_word_t wk ;
+ int i ;
+ for (i = 0; i < Size; i++)
+ {
+ wk = *Source++ ;
+ wk = (wk >> 8) + (wk << 8) ;
+ WriteBytes((unsigned char *)&wk, 2);
+ }
+}
+
+// Return system time in ms
+// GetTickCount not used so removed
+
+// read string from the serial port
+// return code:
+// >= 0 = number of characters read
+// -1 = read failed
+int ReadSerPort(gl_serif_t *serif, unsigned char *psData, int iMax)
+{
+ int iIn, iLeft, iIdx;
+
+ // Quick return if no device
+ if (!serif)
+ {
+ Error4D = Err4D_OK;
+ *psData = '\0';
+ return iMax;
+ }
+ iIdx = 0;
+ iLeft = iMax;
+ while (iLeft > 0)
+ {
+ // iIn = read(cPort, &psData[iIdx], iLeft);
+ iIn = serif->read_rx(&psData[iIdx], iLeft, TimeLimit4D);
+ if (iIn < 0)
+ {
+ printf("goldelox: read error \n");
+ return -1;
+ }
+ // Anything?
+ if (iIn > 0)
+ {
+ // Calc remaining
+ iLeft -= iIn;
+ iIdx += iIn;
+ }
+ // Keep reading
+ }
+
+ return iMax;
+}
+
+void getbytes(unsigned char *data, int size)
+{
+ int readc;
+ readc = ReadSerPort(data, size) ;
+ if ((readc != size)
+ && (Callback4D != NULL) )
+ {
+ Error4D = Err4D_Timeout ;
+ Callback4D(Error4D, Error4D_Inv) ;
+ }
+}
+
+void GetAck(void)
+{
+ int readc;
+ unsigned char readx ;
+ Error4D = Err4D_OK ;
+ // Quick return if no device
+ if (cPort < 0)
+ {
+ Error4D = Err4D_OK;
+ return;
+ }
+ readc = ReadSerPort(&readx, 1) ;
+
+ if (readc != 1)
+ {
+ Error4D = Err4D_Timeout ;
+ if (Callback4D != NULL)
+ Callback4D(Error4D, Error4D_Inv) ;
+ }
+ else if (readx != 6)
+ {
+ Error4D = Err4D_NAK ;
+ Error4D_Inv = readx ;
+ if (Callback4D != NULL)
+ Callback4D(Error4D, Error4D_Inv) ;
+ }
+
+ return;
+}
+
+
+gl_word_t GetWord(void)
+{
+ int readc;
+ unsigned char readx[2] ;
+
+ if (Error4D != Err4D_OK)
+ return 0 ;
+
+ readc = ReadSerPort(&readx[0], 2) ;
+
+ if (readc != 2)
+ {
+ Error4D = Err4D_Timeout ;
+ if (Callback4D != NULL)
+ return Callback4D(Error4D, Error4D_Inv) ;
+ return -Error4D ;
+ }
+ else
+ return readx[0] << 8 | readx[1] ;
+}
+
+void getString(unsigned char *outStr, int strLen)
+{
+ int readc;
+
+ if (Error4D != Err4D_OK)
+ {
+ outStr[0] = '\0' ;
+ return ;
+ }
+
+ readc = ReadSerPort(outStr, strLen) ;
+
+ if (readc != strLen)
+ {
+ Error4D = Err4D_Timeout ;
+ if (Callback4D != NULL)
+ Callback4D(Error4D, Error4D_Inv) ;
+ }
+
+ // Append EOS
+ outStr[readc] = '\0' ;
+
+ return;
+}
+
+gl_word_t GetAckResp(void)
+{
+ GetAck() ;
+ return GetWord() ;
+}
+
+gl_word_t WaitForAck(void)
+{
+ int saveTimeout = TimeLimit4D;
+ void *saveCB = Callback4D;
+
+ // check once per minute
+ Callback4D = NULL;
+ TimeLimit4D = 60 * 1000;
+ do
+ {
+ GetAck();
+ } while (Error4D != Err4D_OK);
+
+ // Restore callback/timeout saves
+ TimeLimit4D = saveTimeout;
+ Callback4D = saveCB;
+
+ return GetWord();
+}
+gl_word_t GetAckRes2Words(gl_word_t * word1, gl_word_t * word2)
+{
+ int Result ;
+ GetAck() ;
+ Result = GetWord() ;
+ *word1 = GetWord() ;
+ *word2 = GetWord() ;
+ return Result ;
+}
+
+void GetAck2Words(gl_word_t * word1, gl_word_t * word2)
+{
+ GetAck() ;
+ *word1 = GetWord() ;
+ *word2 = GetWord() ;
+}
+
+gl_word_t GetAckResSector(gl_sector_t Sector)
+{
+ int Result;
+ GetAck() ;
+ Result = GetWord() ;
+ getbytes(Sector, 512) ;
+ return Result ;
+}
+
+gl_word_t GetAckResStr(unsigned char * OutStr)
+{
+ int Result ;
+ GetAck() ;
+ Result = GetWord() ;
+ getString(OutStr, Result) ;
+ return Result ;
+}
+
+gl_word_t GetAckResData(gl_byte_array_t OutData, gl_word_t size)
+{
+ int Result ;
+ GetAck() ;
+ Result = GetWord() ;
+ getbytes(OutData, size) ;
+ return Result ;
+}
+
+/*
+ * End Of Intrinsic 4DRoutines here
+*/
+
+/*
+ * Starts of 4D Compound Routines
+*/
+
+gl_word_t charheight(unsigned char TestChar)
+{
+ unsigned char towrite[3] ;
+ towrite[0]= F_charheight >> 8 ;
+ towrite[1]= F_charheight ;
+ towrite[2]= TestChar;
+ WriteBytes(towrite, 3) ;
+ return GetAckResp() ;
+}
+
+gl_word_t charwidth(unsigned char TestChar)
+{
+ unsigned char towrite[3] ;
+ towrite[0]= F_charwidth >> 8 ;
+ towrite[1]= F_charwidth ;
+ towrite[2]= TestChar;
+ WriteBytes(towrite, 3) ;
+ return GetAckResp() ;
+}
+
+void gfx_BGcolour(gl_word_t Color)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_BGcolour >> 8 ;
+ towrite[1]= F_gfx_BGcolour & 0xFF;
+ towrite[2]= Color >> 8 ;
+ towrite[3]= Color ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void gfx_ChangeColour(gl_word_t OldColor, gl_word_t NewColor)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_gfx_ChangeColour >> 8 ;
+ towrite[1]= F_gfx_ChangeColour ;
+ towrite[2]= OldColor >> 8 ;
+ towrite[3]= OldColor ;
+ towrite[4]= NewColor >> 8 ;
+ towrite[5]= NewColor ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+void gfx_Circle(gl_word_t X, gl_word_t Y, gl_word_t Radius, gl_word_t Color)
+{
+ unsigned char towrite[10] ;
+ towrite[0]= F_gfx_Circle >> 8 ;
+ towrite[1]= F_gfx_Circle ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ towrite[6]= Radius >> 8 ;
+ towrite[7]= Radius ;
+ towrite[8]= Color >> 8 ;
+ towrite[9]= Color ;
+ WriteBytes(towrite, 10) ;
+ GetAck() ;
+}
+
+void gfx_CircleFilled(gl_word_t X, gl_word_t Y, gl_word_t Radius, gl_word_t Color)
+{
+ unsigned char towrite[10] ;
+ towrite[0]= F_gfx_CircleFilled >> 8 ;
+ towrite[1]= F_gfx_CircleFilled ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ towrite[6]= Radius >> 8 ;
+ towrite[7]= Radius ;
+ towrite[8]= Color >> 8 ;
+ towrite[9]= Color ;
+ WriteBytes(towrite, 10) ;
+ GetAck() ;
+}
+
+void gfx_Clipping(gl_word_t OnOff)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_Clipping >> 8 ;
+ towrite[1]= F_gfx_Clipping & 0xFF;
+ towrite[2]= OnOff >> 8 ;
+ towrite[3]= OnOff ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void gfx_ClipWindow(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2)
+{
+ unsigned char towrite[10] ;
+
+ towrite[0]= F_gfx_ClipWindow >> 8 ;
+ towrite[1]= F_gfx_ClipWindow ;
+ towrite[2]= X1 >> 8 ;
+ towrite[3]= X1 ;
+ towrite[4]= Y1 >> 8 ;
+ towrite[5]= Y1 ;
+ towrite[6]= X2 >> 8 ;
+ towrite[7]= X2 ;
+ towrite[8]= Y2 >> 8 ;
+ towrite[9]= Y2 ;
+ WriteBytes(towrite, 10) ;
+ GetAck() ;
+}
+
+void gfx_Cls()
+{
+ unsigned char towrite[2] ;
+
+ towrite[0]= F_gfx_Cls >> 8 ;
+ towrite[1]= F_gfx_Cls ;
+ WriteBytes(towrite, 2) ;
+ GetAck() ;
+}
+
+void gfx_Contrast(gl_word_t Contrast)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_Contrast >> 8 ;
+ towrite[1]= F_gfx_Contrast & 0xFF;
+ towrite[2]= Contrast >> 8 ;
+ towrite[3]= Contrast ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void gfx_FrameDelay(gl_word_t Msec)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_FrameDelay >> 8 ;
+ towrite[1]= F_gfx_FrameDelay & 0xFF;
+ towrite[2]= Msec >> 8 ;
+ towrite[3]= Msec ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+gl_word_t gfx_GetPixel(gl_word_t X, gl_word_t Y)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_gfx_GetPixel >> 8 ;
+ towrite[1]= F_gfx_GetPixel ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ WriteBytes(towrite, 6) ;
+ return GetAckResp() ;
+}
+
+void gfx_Line(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2, gl_word_t Color)
+{
+ unsigned char towrite[12] ;
+ towrite[0]= F_gfx_Line >> 8 ;
+ towrite[1]= F_gfx_Line ;
+ towrite[2]= X1 >> 8 ;
+ towrite[3]= X1 ;
+ towrite[4]= Y1 >> 8 ;
+ towrite[5]= Y1 ;
+ towrite[6]= X2 >> 8 ;
+ towrite[7]= X2 ;
+ towrite[8]= Y2 >> 8 ;
+ towrite[9]= Y2 ;
+ towrite[10]= Color >> 8 ;
+ towrite[11]= Color ;
+ WriteBytes(towrite, 12) ;
+ GetAck() ;
+}
+
+void gfx_LinePattern(gl_word_t Pattern)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_LinePattern >> 8 ;
+ towrite[1]= F_gfx_LinePattern & 0xFF;
+ towrite[2]= Pattern >> 8 ;
+ towrite[3]= Pattern ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void gfx_LineTo(gl_word_t X, gl_word_t Y)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_gfx_LineTo >> 8 ;
+ towrite[1]= F_gfx_LineTo ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+void gfx_MoveTo(gl_word_t X, gl_word_t Y)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_gfx_MoveTo >> 8 ;
+ towrite[1]= F_gfx_MoveTo ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+gl_word_t gfx_Orbit(gl_word_t Angle, gl_word_t Distance, gl_word_t * Xdest, gl_word_t * Ydest)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_gfx_Orbit >> 8 ;
+ towrite[1]= F_gfx_Orbit ;
+ towrite[2]= Angle >> 8 ;
+ towrite[3]= Angle ;
+ towrite[4]= Distance >> 8 ;
+ towrite[5]= Distance ;
+ WriteBytes(towrite, 6) ;
+ GetAck2Words(Xdest,Ydest) ;
+ return 0 ;
+}
+
+void gfx_OutlineColour(gl_word_t Color)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_OutlineColour >> 8 ;
+ towrite[1]= F_gfx_OutlineColour & 0xFF;
+ towrite[2]= Color >> 8 ;
+ towrite[3]= Color ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void gfx_Polygon(gl_word_t n, gl_word_array_t Xvalues, gl_word_array_t Yvalues, gl_word_t Color)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_Polygon >> 8 ;
+ towrite[1]= F_gfx_Polygon ;
+ towrite[2]= n >> 8 ;
+ towrite[3]= n ;
+ WriteBytes(towrite, 4) ;
+ WriteWords(Xvalues, n) ;
+ WriteWords(Yvalues, n) ;
+ towrite[0]= Color >> 8 ;
+ towrite[1]= Color ;
+ WriteBytes(towrite, 2) ;
+ GetAck() ;
+}
+
+void gfx_Polyline(gl_word_t n, gl_word_array_t Xvalues, gl_word_array_t Yvalues, gl_word_t Color)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_Polyline >> 8 ;
+ towrite[1]= F_gfx_Polyline ;
+ towrite[2]= n >> 8 ;
+ towrite[3]= n ;
+ WriteBytes(towrite, 4) ;
+ WriteWords(Xvalues, n) ;
+ WriteWords(Yvalues, n) ;
+ towrite[0]= Color >> 8 ;
+ towrite[1]= Color ;
+ WriteBytes(towrite, 2) ;
+ GetAck() ;
+}
+
+void gfx_PutPixel(gl_word_t X, gl_word_t Y, gl_word_t Color)
+{
+ unsigned char towrite[8] ;
+ towrite[0]= F_gfx_PutPixel >> 8 ;
+ towrite[1]= F_gfx_PutPixel ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ towrite[6]= Color >> 8 ;
+ towrite[7]= Color ;
+ WriteBytes(towrite, 8) ;
+ GetAck() ;
+}
+
+void gfx_Rectangle(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2, gl_word_t Color)
+{
+ unsigned char towrite[12] ;
+ towrite[0]= F_gfx_Rectangle >> 8 ;
+ towrite[1]= F_gfx_Rectangle ;
+ towrite[2]= X1 >> 8 ;
+ towrite[3]= X1 ;
+ towrite[4]= Y1 >> 8 ;
+ towrite[5]= Y1 ;
+ towrite[6]= X2 >> 8 ;
+ towrite[7]= X2 ;
+ towrite[8]= Y2 >> 8 ;
+ towrite[9]= Y2 ;
+ towrite[10]= Color >> 8 ;
+ towrite[11]= Color ;
+ WriteBytes(towrite, 12) ;
+ GetAck() ;
+}
+
+void gfx_RectangleFilled(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2, gl_word_t Color)
+{
+ unsigned char towrite[12] ;
+ towrite[0]= F_gfx_RectangleFilled >> 8 ;
+ towrite[1]= F_gfx_RectangleFilled ;
+ towrite[2]= X1 >> 8 ;
+ towrite[3]= X1 ;
+ towrite[4]= Y1 >> 8 ;
+ towrite[5]= Y1 ;
+ towrite[6]= X2 >> 8 ;
+ towrite[7]= X2 ;
+ towrite[8]= Y2 >> 8 ;
+ towrite[9]= Y2 ;
+ towrite[10]= Color >> 8 ;
+ towrite[11]= Color ;
+ WriteBytes(towrite, 12) ;
+ GetAck() ;
+}
+
+void gfx_ScreenMode(gl_word_t ScreenMode)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_ScreenMode >> 8 ;
+ towrite[1]= F_gfx_ScreenMode & 0xFF;
+ towrite[2]= ScreenMode >> 8 ;
+ towrite[3]= ScreenMode ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void gfx_Set(gl_word_t Func, gl_word_t Value)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_gfx_Set >> 8 ;
+ towrite[1]= F_gfx_Set ;
+ towrite[2]= Func >> 8 ;
+ towrite[3]= Func ;
+ towrite[4]= Value >> 8 ;
+ towrite[5]= Value ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+void gfx_SetClipRegion()
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_gfx_SetClipRegion >> 8 ;
+ towrite[1]= F_gfx_SetClipRegion ;
+ WriteBytes(towrite, 2) ;
+ GetAck() ;
+}
+
+void gfx_Transparency(gl_word_t OnOff)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_Transparency >> 8 ;
+ towrite[1]= F_gfx_Transparency & 0xFF;
+ towrite[2]= OnOff >> 8 ;
+ towrite[3]= OnOff ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void gfx_TransparentColour(gl_word_t Color)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_gfx_TransparentColour >> 8 ;
+ towrite[1]= F_gfx_TransparentColour & 0xFF;
+ towrite[2]= Color >> 8 ;
+ towrite[3]= Color ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void gfx_Triangle(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2, gl_word_t X3, gl_word_t Y3, gl_word_t Color)
+{
+ unsigned char towrite[16] ;
+ towrite[0]= F_gfx_Triangle >> 8 ;
+ towrite[1]= F_gfx_Triangle ;
+ towrite[2]= X1 >> 8 ;
+ towrite[3]= X1 ;
+ towrite[4]= Y1 >> 8 ;
+ towrite[5]= Y1 ;
+ towrite[6]= X2 >> 8 ;
+ towrite[7]= X2 ;
+ towrite[8]= Y2 >> 8 ;
+ towrite[9]= Y2 ;
+ towrite[10]= X3 >> 8 ;
+ towrite[11]= X3 ;
+ towrite[12]= Y3 >> 8 ;
+ towrite[13]= Y3 ;
+ towrite[14]= Color >> 8 ;
+ towrite[15]= Color ;
+ WriteBytes(towrite, 16) ;
+ GetAck() ;
+}
+
+gl_word_t media_Flush()
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_media_Flush >> 8 ;
+ towrite[1]= F_media_Flush ;
+ WriteBytes(towrite, 2) ;
+ return GetAckResp() ;
+}
+
+void media_Image(gl_word_t X, gl_word_t Y)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_media_Image >> 8 ;
+ towrite[1]= F_media_Image ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+gl_word_t media_Init()
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_media_Init >> 8 ;
+ towrite[1]= F_media_Init ;
+ WriteBytes(towrite, 2) ;
+ return GetAckResp() ;
+}
+
+gl_word_t media_ReadByte()
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_media_ReadByte >> 8 ;
+ towrite[1]= F_media_ReadByte ;
+ WriteBytes(towrite, 2) ;
+ return GetAckResp() ;
+}
+
+gl_word_t media_ReadWord()
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_media_ReadWord >> 8 ;
+ towrite[1]= F_media_ReadWord ;
+ WriteBytes(towrite, 2) ;
+ return GetAckResp() ;
+}
+
+void media_SetAdd(gl_word_t HiWord, gl_word_t LoWord)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_media_SetAdd >> 8 ;
+ towrite[1]= F_media_SetAdd ;
+ towrite[2]= HiWord >> 8 ;
+ towrite[3]= HiWord ;
+ towrite[4]= LoWord >> 8 ;
+ towrite[5]= LoWord ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+void media_SetSector(gl_word_t HiWord, gl_word_t LoWord)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_media_SetSector >> 8 ;
+ towrite[1]= F_media_SetSector ;
+ towrite[2]= HiWord >> 8 ;
+ towrite[3]= HiWord ;
+ towrite[4]= LoWord >> 8 ;
+ towrite[5]= LoWord ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+void media_Video(gl_word_t X, gl_word_t Y)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_media_Video >> 8 ;
+ towrite[1]= F_media_Video ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+void media_VideoFrame(gl_word_t X, gl_word_t Y, gl_word_t Framenumber)
+{
+ unsigned char towrite[8] ;
+ towrite[0]= F_media_VideoFrame >> 8 ;
+ towrite[1]= F_media_VideoFrame ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ towrite[6]= Framenumber >> 8 ;
+ towrite[7]= Framenumber ;
+ WriteBytes(towrite, 8) ;
+ GetAck() ;
+}
+
+gl_word_t media_WriteByte(gl_word_t Byte)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_media_WriteByte >> 8 ;
+ towrite[1]= F_media_WriteByte ;
+ towrite[2]= Byte >> 8 ;
+ towrite[3]= Byte ;
+ WriteBytes(towrite, 4) ;
+ return GetAckResp() ;
+}
+
+gl_word_t media_WriteWord(gl_word_t Word)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_media_WriteWord >> 8 ;
+ towrite[1]= F_media_WriteWord ;
+ towrite[2]= Word >> 8 ;
+ towrite[3]= Word ;
+ WriteBytes(towrite, 4) ;
+ return GetAckResp() ;
+}
+
+void putCH(gl_word_t WordChar)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_putCH >> 8 ;
+ towrite[1]= F_putCH ;
+ towrite[2]= WordChar >> 8 ;
+ towrite[3]= WordChar ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void putstr(unsigned char * InString)
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_putstr >> 8 ;
+ towrite[1]= F_putstr ;
+ WriteBytes(towrite, 2) ;
+ WriteChars(InString) ;
+ GetAck() ;
+}
+
+void txt_Attributes(gl_word_t Attribs)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Attributes >> 8 ;
+ towrite[1]= F_txt_Attributes & 0xFF;
+ towrite[2]= Attribs >> 8 ;
+ towrite[3]= Attribs ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_BGcolour(gl_word_t Color)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_BGcolour >> 8 ;
+ towrite[1]= F_txt_BGcolour & 0xFF;
+ towrite[2]= Color >> 8 ;
+ towrite[3]= Color ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_Bold(gl_word_t Bold)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Bold >> 8 ;
+ towrite[1]= F_txt_Bold & 0xFF;
+ towrite[2]= Bold >> 8 ;
+ towrite[3]= Bold ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_FGcolour(gl_word_t Color)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_FGcolour >> 8 ;
+ towrite[1]= F_txt_FGcolour & 0xFF;
+ towrite[2]= Color >> 8 ;
+ towrite[3]= Color ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_FontID(gl_word_t FontNumber)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_FontID >> 8 ;
+ towrite[1]= F_txt_FontID & 0xFF;
+ towrite[2]= FontNumber >> 8 ;
+ towrite[3]= FontNumber ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_Height(gl_word_t Multiplier)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Height >> 8 ;
+ towrite[1]= F_txt_Height & 0xFF;
+ towrite[2]= Multiplier >> 8 ;
+ towrite[3]= Multiplier ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_Inverse(gl_word_t Inverse)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Inverse >> 8 ;
+ towrite[1]= F_txt_Inverse & 0xFF;
+ towrite[2]= Inverse >> 8 ;
+ towrite[3]= Inverse ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_Italic(gl_word_t Italic)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Italic >> 8 ;
+ towrite[1]= F_txt_Italic & 0xFF;
+ towrite[2]= Italic >> 8 ;
+ towrite[3]= Italic ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_MoveCursor(gl_word_t Line, gl_word_t Column)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_txt_MoveCursor >> 8 ;
+ towrite[1]= F_txt_MoveCursor ;
+ towrite[2]= Line >> 8 ;
+ towrite[3]= Line ;
+ towrite[4]= Column >> 8 ;
+ towrite[5]= Column ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+void txt_Opacity(gl_word_t TransparentOpaque)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Opacity >> 8 ;
+ towrite[1]= F_txt_Opacity & 0xFF;
+ towrite[2]= TransparentOpaque >> 8 ;
+ towrite[3]= TransparentOpaque ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_Set(gl_word_t Func, gl_word_t Value)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_txt_Set >> 8 ;
+ towrite[1]= F_txt_Set ;
+ towrite[2]= Func >> 8 ;
+ towrite[3]= Func ;
+ towrite[4]= Value >> 8 ;
+ towrite[5]= Value ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+void txt_Underline(gl_word_t Underline)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Underline >> 8 ;
+ towrite[1]= F_txt_Underline & 0xFF;
+ towrite[2]= Underline >> 8 ;
+ towrite[3]= Underline ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_Width(gl_word_t Multiplier)
+{
+ unsigned char towrite[4] ;
+
+ towrite[0]= F_txt_Width >> 8 ;
+ towrite[1]= F_txt_Width & 0xFF;
+ towrite[2]= Multiplier >> 8 ;
+ towrite[3]= Multiplier ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_Xgap(gl_word_t Pixels)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Xgap >> 8 ;
+ towrite[1]= F_txt_Xgap & 0xFF;
+ towrite[2]= Pixels >> 8 ;
+ towrite[3]= Pixels ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void txt_Ygap(gl_word_t Pixels)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_txt_Ygap >> 8 ;
+ towrite[1]= F_txt_Ygap & 0xFF;
+ towrite[2]= Pixels >> 8 ;
+ towrite[3]= Pixels ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void BeeP(gl_word_t Note, gl_word_t Duration)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_BeeP >> 8 ;
+ towrite[1]= F_BeeP ;
+ towrite[2]= Note >> 8 ;
+ towrite[3]= Note ;
+ towrite[4]= Duration >> 8 ;
+ towrite[5]= Duration ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+gl_word_t sys_GetModel(unsigned char * ModelStr)
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_sys_GetModel >> 8 ;
+ towrite[1]= F_sys_GetModel ;
+ WriteBytes(towrite, 2) ;
+ return GetAckResStr(ModelStr) ;
+}
+
+gl_word_t sys_GetVersion()
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_sys_GetVersion >> 8 ;
+ towrite[1]= F_sys_GetVersion ;
+ WriteBytes(towrite, 2) ;
+ return GetAckResp() ;
+}
+
+gl_word_t sys_GetPmmC()
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_sys_GetPmmC >> 8 ;
+ towrite[1]= F_sys_GetPmmC ;
+ WriteBytes(towrite, 2) ;
+ return GetAckResp() ;
+}
+
+void blitComtoDisplay(gl_word_t X, gl_word_t Y, gl_word_t Width, gl_word_t Height, gl_byte_array_t Pixels)
+{
+ unsigned char towrite[10] ;
+ towrite[0]= F_blitComtoDisplay >> 8 ;
+ towrite[1]= F_blitComtoDisplay ;
+ towrite[2]= X >> 8 ;
+ towrite[3]= X ;
+ towrite[4]= Y >> 8 ;
+ towrite[5]= Y ;
+ towrite[6]= Width >> 8 ;
+ towrite[7]= Width ;
+ towrite[8]= Height >> 8 ;
+ towrite[9]= Height ;
+ WriteBytes(towrite, 10) ;
+ WriteBytes(Pixels, Width*Height*2) ;
+ GetAck() ;
+}
+
+void setbaudWait(gl_word_t Newrate)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_setbaudWait >> 8 ;
+ towrite[1]= F_setbaudWait ;
+ towrite[2]= Newrate >> 8 ;
+ towrite[3]= Newrate ;
+ WriteBytes(towrite, 4) ;
+ //SetThisBaudrate(Newrate) ; // change this systems baud rate to match new display rate, ACK is 100ms away
+ GetAck() ;
+}
+
+gl_word_t peekW(gl_word_t Address)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_peekW >> 8 ;
+ towrite[1]= F_peekW ;
+ towrite[2]= Address >> 8 ;
+ towrite[3]= Address ;
+ WriteBytes(towrite, 4) ;
+ return GetAckResp() ;
+}
+
+void pokeW(gl_word_t Address, gl_word_t WordValue)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_pokeW >> 8 ;
+ towrite[1]= F_pokeW ;
+ towrite[2]= Address >> 8 ;
+ towrite[3]= Address ;
+ towrite[4]= WordValue >> 8 ;
+ towrite[5]= WordValue ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+gl_word_t peekB(gl_word_t Address)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_peekB >> 8 ;
+ towrite[1]= F_peekB ;
+ towrite[2]= Address >> 8 ;
+ towrite[3]= Address ;
+ WriteBytes(towrite, 4) ;
+ return GetAckResp() ;
+}
+
+void pokeB(gl_word_t Address, gl_word_t ByteValue)
+{
+ unsigned char towrite[6] ;
+ towrite[0]= F_pokeB >> 8 ;
+ towrite[1]= F_pokeB ;
+ towrite[2]= Address >> 8 ;
+ towrite[3]= Address ;
+ towrite[4]= ByteValue >> 8 ;
+ towrite[5]= ByteValue ;
+ WriteBytes(towrite, 6) ;
+ GetAck() ;
+}
+
+gl_word_t joystick()
+{
+ unsigned char towrite[2] ;
+ towrite[0]= F_joystick >> 8 ;
+ towrite[1]= F_joystick ;
+ WriteBytes(towrite, 2) ;
+ return GetAckResp() ;
+}
+
+void SSTimeout(gl_word_t Seconds)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_SSTimeout >> 8 ;
+ towrite[1]= F_SSTimeout ;
+ towrite[2]= Seconds >> 8 ;
+ towrite[3]= Seconds ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void SSSpeed(gl_word_t Speed)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_SSSpeed >> 8 ;
+ towrite[1]= F_SSSpeed ;
+ towrite[2]= Speed >> 8 ;
+ towrite[3]= Speed ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+void SSMode(gl_word_t Parm)
+{
+ unsigned char towrite[4] ;
+ towrite[0]= F_SSMode >> 8 ;
+ towrite[1]= F_SSMode ;
+ towrite[2]= Parm >> 8 ;
+ towrite[3]= Parm ;
+ WriteBytes(towrite, 4) ;
+ GetAck() ;
+}
+
+/*
+void setbaudWait(gl_word_t Newrate)
+{
+ unsigned char towrite[4] ;
+
+ towrite[0]= F_setbaudWait >> 8 ;
+ towrite[1]= F_setbaudWait ;
+ towrite[2]= Newrate >> 8 ;
+ towrite[3]= Newrate ;
+ WriteBytes(towrite, 4) ;
+ //SetThisBaudrate(Newrate) ; // change this systems baud rate to match new display rate, ACK is 100ms away
+ GetAck() ;
+}
+*/
+
+/*
+ * Conpound 4D Routines Ends here
+*/
+
+
+gl_err_t gl_init(gl_display_t *disp, gl_serif_t *serif) {
+ int k, ch, tSave;
+ //gl_word_t nBaud;
+
+ TimeLimit4D = 2000;
+
+ if (!disp || !serif)
+ return GL_ENULL;
+
+ disp->serif = serif;
+
+
+
+ tSave = TimeLimit4D;
+ TimeLimit4D = 500;
+ for (k = 0 ; k < 10 ; k++)
+ {
+ ch = 'X';
+ disp->serif->write_tx((void *)&ch, 1, 500);
+ ReadSerPort(disp->serif, &ch, 1);
+ if (ch == 0x15)
+ break ;
+ }
+ TimeLimit4D = tSave;
+
+ disp->serif->flush_rx();
+ return 0;
+}
+
+int OpenComm(char *sDeviceName, int newrate)
+{
+ struct termios new_port_settings;
+ //gl_word_t nBaud;
+ int k, ch, tSave, baudr;
+
+switch(newrate)
+ {
+ case 50 : baudr = B50; break;
+ case 75 : baudr = B75; break;
+ case 110 : baudr = B110; break;
+ case 134 : baudr = B134; break;
+ case 150 : baudr = B150; break;
+ case 200 : baudr = B200; break;
+ case 300 : baudr = B300; break;
+ case 600 : baudr = B600; break;
+ case 1200 : baudr = B1200; break;
+ case 1800 : baudr = B1800; break;
+ case 2400 : baudr = B2400; break;
+ case 4800 : baudr = B4800; break;
+ case 9600 : baudr = B9600; break;
+ case 19200 : baudr = B19200; break;
+ case 38400 : baudr = B38400; break;
+ case 57600 : baudr = B57600; break;
+ case 115200 : baudr = B115200; break;
+ case 230400 : baudr = B230400; break;
+ case 460800 : baudr = B460800; break;
+ case 500000 : baudr = B500000; break;
+ case 576000 : baudr = B576000; break;
+ case 921600 : baudr = B921600; break;
+ case 1000000 : baudr = B1000000; break;
+ default : printf("invalid baudrate\n");
+ return(1);
+ break;
+}
+ cPort = open(sDeviceName, O_RDWR | O_NOCTTY | O_NDELAY);
+// Current config
+ tcgetattr(cPort, &new_port_settings);
+ // Set the line to RAW
+ cfmakeraw(&new_port_settings);
+ memset(&new_port_settings, 0, sizeof(new_port_settings)); /* clear the new struct */
+ new_port_settings.c_cflag = baudr | CS8 | CLOCAL | CREAD;
+ new_port_settings.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+ new_port_settings.c_iflag = IGNPAR;
+ new_port_settings.c_oflag = 0;
+ new_port_settings.c_lflag = 0;
+ new_port_settings.c_cc[VMIN] = 0; /* block untill n bytes are received */
+ new_port_settings.c_cc[VTIME] = 100; /* block untill a timer expires (n * 100 mSec.) */
+/*
+ cfsetospeed(&new_port_settings, nBaud);
+ cfsetispeed(&new_port_settings, nBaud);
+*/
+ // set new config
+ tcsetattr(cPort, TCSANOW, &new_port_settings);
+ // Set non-blocking
+ fcntl(cPort, F_SETFL, FNDELAY);
+
+ tSave = TimeLimit4D;
+ TimeLimit4D = 500;
+ for (k = 0 ; k < 10 ; k++)
+ {
+ ch = 'X';
+ write(cPort, (unsigned char *)&ch, 1);
+ tcflush(cPort, TCOFLUSH);
+ ReadSerPort((unsigned char *)&ch, 1);
+ if (ch == 0x15)
+ break ;
+ }
+ TimeLimit4D = tSave;
+
+ tcflush(cPort, TCIOFLUSH);
+ return 0;
+}
+
+void CloseComm(void)
+{
+ close(cPort);
+ cPort = -1;
+ Error4D = Err4D_OK;
+
+ return;
+}
+
--- /dev/null
+/*
+ * File: goldeloxSerial.h
+ * Author: User
+ *
+ * Created on October 13, 2014, 10:26 PM
+ */
+
+#ifndef __GL_SERIAL_H__
+#define __GL_SERIAL_H__
+
+#include "Goldelox_Types4D.h"
+#include "gl_error.h"
+
+// SPE Version 1.1 added bus_ and pin_ functions
+
+#define Err4D_OK 0
+#define Err4D_Timeout 1
+#define Err4D_NAK 2 // other than ACK received
+
+char *Error4DText[] = {"OK", "Timeout", "NAK", "Length", "Invalid"} ;
+// 4D Global variables
+extern int cPort ; // comp port handle, used by Intrinsic routines
+extern int Error4D ; // Error indicator, used and set by Intrinsic routines
+extern unsigned char Error4D_Inv ; // Error byte returned from com port, onl set if error = Err_Invalid
+extern int TimeLimit4D ; // time limit in ms for total serial command duration, 2000 (2 seconds) should be adequate for most commands
+ // assuming a reasonable baud rate AND low latency AND 0 for the Serial Delay Parameter
+ // temporary increase might be required for very long (bitmap write, large image file opens)
+ // or indeterminate (eg file_exec, file_run, file_callFunction) commands
+extern int(*Callback4D) (int, unsigned char) ; // Error callback. Set to NULL if no callback is required. i.e. all errors will be handled in your code
+ // Set to callback routine in your program to enable you to diagnose and display errors. You can
+ // simply return from the error routine if you so desire, but really, the correct thing to do is produce
+ // an error message of some kind and terminate your application.
+extern int Error_Abort4D; // Set TRUE to exit immediately from error handler;
+
+
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* new initialization functions */
+
+/**
+ * @brief Initialize a new Goldelox display.
+ * @param disp The display object to use.
+ * @param serif The serif to use w/ display.
+ * @return error code
+ */
+gl_err_t gl_init(gl_display_t *disp, gl_serif_t *serif);
+int OpenComm(char *comport, int newrate) ;
+void blitComtoDisplay(gl_word_t X, gl_word_t Y, gl_word_t Width, gl_word_t Height, gl_byte_array_t Pixels) ;
+void gfx_BGcolour(gl_word_t Color) ;
+void gfx_ChangeColour(gl_word_t OldColor, gl_word_t NewColor) ;
+void gfx_Circle(gl_word_t X, gl_word_t Y, gl_word_t Radius, gl_word_t Color) ;
+void gfx_CircleFilled(gl_word_t X, gl_word_t Y, gl_word_t Radius, gl_word_t Color) ;
+void gfx_Clipping(gl_word_t OnOff) ;
+void gfx_ClipWindow(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2) ;
+void gfx_Cls() ;
+void gfx_Contrast(gl_word_t Contrast) ;
+void gfx_FrameDelay(gl_word_t Msec) ;
+void gfx_Line(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2, gl_word_t Color) ;
+void gfx_LinePattern(gl_word_t Pattern) ;
+void gfx_LineTo(gl_word_t X, gl_word_t Y) ;
+void gfx_MoveTo(gl_word_t X, gl_word_t Y) ;
+void gfx_OutlineColour(gl_word_t Color) ;
+void gfx_Polygon(gl_word_t n, gl_word_array_t Xvalues, gl_word_array_t Yvalues, gl_word_t Color) ;
+void gfx_Polyline(gl_word_t n, gl_word_array_t Xvalues, gl_word_array_t Yvalues, gl_word_t Color) ;
+void gfx_PutPixel(gl_word_t X, gl_word_t Y, gl_word_t Color) ;
+void gfx_Rectangle(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2, gl_word_t Color) ;
+void gfx_RectangleFilled(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2, gl_word_t Color) ;
+void gfx_ScreenMode(gl_word_t ScreenMode) ;
+void gfx_Set(gl_word_t Func, gl_word_t Value) ;
+void gfx_Transparency(gl_word_t OnOff) ;
+void gfx_TransparentColour(gl_word_t Color) ;
+void gfx_Triangle(gl_word_t X1, gl_word_t Y1, gl_word_t X2, gl_word_t Y2, gl_word_t X3, gl_word_t Y3, gl_word_t Color) ;
+void media_Image(gl_word_t X, gl_word_t Y) ;
+void media_SetAdd(gl_word_t HiWord, gl_word_t LoWord) ;
+void media_SetSector(gl_word_t HiWord, gl_word_t LoWord) ;
+void media_Video(gl_word_t X, gl_word_t Y) ;
+void media_VideoFrame(gl_word_t X, gl_word_t Y, gl_word_t Framenumber) ;
+void pokeB(gl_word_t Address, gl_word_t ByteValue) ;
+void pokeW(gl_word_t Address, gl_word_t WordValue) ;
+void putCH(gl_word_t WordChar) ;
+void setbaudWait(gl_word_t Newrate) ;
+void SSMode(gl_word_t Parm) ;
+void SSSpeed(gl_word_t Speed) ;
+void SSTimeout(gl_word_t Seconds) ;
+void txt_Attributes(gl_word_t Attribs) ;
+void txt_BGcolour(gl_word_t Color) ;
+void txt_Bold(gl_word_t Bold) ;
+void txt_FGcolour(gl_word_t Color) ;
+void txt_FontID(gl_word_t FontNumber) ;
+void txt_Height(gl_word_t Multiplier) ;
+void txt_Inverse(gl_word_t Inverse) ;
+void txt_Italic(gl_word_t Italic) ;
+void txt_MoveCursor(gl_word_t Line, gl_word_t Column) ;
+void txt_Opacity(gl_word_t TransparentOpaque) ;
+void txt_Set(gl_word_t Func, gl_word_t Value) ;
+void txt_Underline(gl_word_t Underline) ;
+void txt_Width(gl_word_t Multiplier) ;
+void txt_Xgap(gl_word_t Pixels) ;
+void txt_Ygap(gl_word_t Pixels) ;
+void BeeP(gl_word_t Note, gl_word_t Duration) ;
+gl_word_t charheight(unsigned char TestChar) ;
+gl_word_t charwidth(unsigned char TestChar) ;
+gl_word_t gfx_GetPixel(gl_word_t X, gl_word_t Y) ;
+gl_word_t gfx_Orbit(gl_word_t Angle, gl_word_t Distance, gl_word_t * Xdest, gl_word_t * Ydest) ;
+void gfx_SetClipRegion() ;
+gl_word_t joystick() ;
+gl_word_t media_Flush() ;
+gl_word_t media_Init() ;
+gl_word_t media_ReadByte() ;
+gl_word_t media_ReadWord() ;
+gl_word_t media_WriteByte(gl_word_t Byte) ;
+gl_word_t media_WriteWord(gl_word_t Word) ;
+gl_word_t peekB(gl_word_t Address) ;
+gl_word_t peekW(gl_word_t Address) ;
+void putstr(unsigned char * InString) ;
+gl_word_t sys_GetModel(unsigned char * ModelStr) ;
+gl_word_t sys_GetPmmC() ;
+gl_word_t sys_GetVersion() ;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GOLDELOXSERIAL_H */
+