]> Devi Nivas Git - smartwatch.git/commitdiff
Initial uLCD Library Port
authorAdvaith Menon <noreply-git@bp4k.net>
Sun, 16 Nov 2025 22:58:44 +0000 (17:58 -0500)
committerAdvaith Menon <noreply-git@bp4k.net>
Sun, 16 Nov 2025 22:58:44 +0000 (17:58 -0500)
* Copied over 4D Systems Goldelox-Linux Library
* Not tested yet, but most Linux syscalls replaced with a fn
  pointer (like in the ICM-20948 library)

main/Goldelox_Types4D.h [new file with mode: 0644]
main/Goldelox_const4D.h [new file with mode: 0644]
main/gl_error.h [new file with mode: 0644]
main/goldeloxSerial.c [new file with mode: 0644]
main/goldeloxSerial.h [new file with mode: 0644]

diff --git a/main/Goldelox_Types4D.h b/main/Goldelox_Types4D.h
new file mode 100644 (file)
index 0000000..46f6b0a
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * 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
diff --git a/main/Goldelox_const4D.h b/main/Goldelox_const4D.h
new file mode 100644 (file)
index 0000000..fa8ce82
--- /dev/null
@@ -0,0 +1,676 @@
+/*
+    //----------------------------------
+    //   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
+
+
+
+
+
+
+
+
diff --git a/main/gl_error.h b/main/gl_error.h
new file mode 100644 (file)
index 0000000..4cbfdcc
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * 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
diff --git a/main/goldeloxSerial.c b/main/goldeloxSerial.c
new file mode 100644 (file)
index 0000000..e6a45f5
--- /dev/null
@@ -0,0 +1,1289 @@
+#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;
+}
+
diff --git a/main/goldeloxSerial.h b/main/goldeloxSerial.h
new file mode 100644 (file)
index 0000000..1b71fe0
--- /dev/null
@@ -0,0 +1,131 @@
+/* 
+ * 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 */
+