From: Advaith Menon Date: Sun, 16 Nov 2025 22:58:44 +0000 (-0500) Subject: Initial uLCD Library Port X-Git-Url: https://git.devinivas.org/?a=commitdiff_plain;h=cdc074faa543ae68851b0a79b373ad59a7ddf356;p=smartwatch.git Initial uLCD Library Port * 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) --- diff --git a/main/Goldelox_Types4D.h b/main/Goldelox_Types4D.h new file mode 100644 index 0000000..46f6b0a --- /dev/null +++ b/main/Goldelox_Types4D.h @@ -0,0 +1,36 @@ +/** + * Goldelox constants. Modified to be more C-like. + */ +#pragma once + +#ifndef __GL_TYPES_H__ +#define __GL_TYPES_H__ + +#include +#include + +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 index 0000000..fa8ce82 --- /dev/null +++ b/main/Goldelox_const4D.h @@ -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 index 0000000..4cbfdcc --- /dev/null +++ b/main/gl_error.h @@ -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 + +typedef uint32_t gl_err_t; + + +#endif diff --git a/main/goldeloxSerial.c b/main/goldeloxSerial.c new file mode 100644 index 0000000..e6a45f5 --- /dev/null +++ b/main/goldeloxSerial.c @@ -0,0 +1,1289 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#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 index 0000000..1b71fe0 --- /dev/null +++ b/main/goldeloxSerial.h @@ -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 */ +