Driver for 4D Systems LCD screen with Picaso processor. Ported from 4D Systems Picaso Serial Linux Library

Dependencies:   MODSERIAL

Dependents:   uLCD_4D_24PTU Drawing Program RoommateTracker_ScreenAndPhone ece4180_roommate_tracker_final

Revision:
0:e314f3b805ed
Child:
1:1e8da43647e9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uLCD_4D_Picaso.cpp	Fri Mar 06 00:35:58 2015 +0000
@@ -0,0 +1,2210 @@
+/**
+ * This is a class to drive 4D systems screens with Picaso graphics processors
+ * 
+ * This is a port of the 4D systems Picaso Serial Linux Library
+ * Copyright (c) 2014 4D Systems PTY Ltd, Sydney, Australia
+ * From https://github.com/4dsystems/Picaso-Serial-Linux-Library, retrieved March 5, 2015
+ *
+ * All software in this library is provided without warranty; use at your own risk.
+ */
+ 
+#include "mbed.h"
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+
+#include "Picaso_Types4D.h"		// defines data types used by the 4D Routines
+#include "Picaso_const4D.h"		// defines for 4dgl constants, generated by conversion of 4DGL constants to target language
+#include "uLCD_4D_Picaso.h"
+
+//Error types
+#define   Err4D_OK      0
+#define   Err4D_Timeout 1
+#define   Err4D_NAK		2
+
+
+//Default wait time (in ms) for Serial acknowledgement
+#define RX_MAX_WAIT_DEFAULT 2000
+
+#if LCD_USING_MODSERIAL
+//Serial port buffer sizes
+#define TX_BUF_SIZE 256
+#define RX_BUF_SIZE 2048
+#endif
+
+/*
+ * Start of 4D Intrinsic Routines
+*/
+uLCD_4D_Picaso::uLCD_4D_Picaso(PinName tx, PinName rx, PinName reset) :
+		#if LCD_USING_MODSERIAL
+		serial(tx, rx, TX_BUF_SIZE, RX_BUF_SIZE),
+		#else
+		serial(tx, rx),
+		#endif
+		rst(reset) 
+{
+	#if LCD_USING_MODSERIAL
+	printf("Using modserial\r\n");
+	#else
+	printf("Not using modserial\r\n");
+	#endif
+	TimeLimit4D = RX_MAX_WAIT_DEFAULT;
+	serial.baud(9600);
+	LCD_reset();
+	gfx_Cls();
+}
+
+void uLCD_4D_Picaso::LCD_reset() {
+	rst = 0;
+	LCD_wait_ms(1);
+	rst = 1;
+	LCD_wait_ms(3000);
+	rxFlush();
+}
+
+void uLCD_4D_Picaso::LCD_wait_ms(int ms) {
+	timer.reset();
+	timer.start();
+	while (timer.read_ms() < ms);
+	timer.stop();
+	return;
+}
+
+void uLCD_4D_Picaso::rxFlush() {
+	while (serial.readable()) {
+		serial.getc();
+	}
+}
+
+void uLCD_4D_Picaso::WriteBytes(char *psOutput, int nCount) {
+    int i;
+    rxFlush();
+    for (i = 0; i < nCount; ++i) {
+    	while (!serial.writeable());
+		serial.putc(psOutput[i]);
+	}
+}
+
+void uLCD_4D_Picaso::WriteChars(char *psOutput) {
+    // Include NULL in output
+    WriteBytes(psOutput, strlen((char *)psOutput) + 1);
+    return;
+}
+
+void uLCD_4D_Picaso::WriteWords(WORD * Source, int Size) {
+ 	WORD wk ;
+	int i ;
+	for (i = 0; i < Size; i++)
+	{
+		wk = *Source++ ;
+		wk = (wk >> 8) + (wk << 8) ;
+		WriteBytes((char *)&wk, 2);
+	}
+}
+
+// read string from the serial port
+// return code:
+//   >= 0 = number of characters read
+//   -1 = read failed
+int uLCD_4D_Picaso::ReadSerPort(char *psData, int iMax) {
+    int i;
+    Error4D = Err4D_OK;
+    
+    timer.reset();
+    timer.start();
+	
+    for (i = 0; i < iMax; ++i) {
+    	while (!serial.readable()) {  		
+    		if (timer.read_ms() >= TimeLimit4D) {
+    			Error4D = Err4D_Timeout;
+    			timer.stop();
+    			return -1;
+			}
+		}
+		psData[i] = serial.getc();
+	}
+	
+	timer.stop();
+    return iMax;
+}
+
+void uLCD_4D_Picaso::getbytes(char *data, int size) {
+ 	int readc;
+	readc = ReadSerPort(data, size);
+	if (readc != size)	{
+		printf("LCD serial: read timeout\r\n");
+ 	}
+}
+
+void uLCD_4D_Picaso::GetAck(void) {
+	char readx;
+   	getbytes(&readx, 1);
+   	
+	if (readx != 6) {
+	   	Error4D = Err4D_NAK;
+	   	printf("LCD serial: no ACK received\r\n");
+	}
+    return;
+}
+
+
+WORD uLCD_4D_Picaso::GetWord(void) {
+ 	char readx[2];
+    getbytes(readx, 2);
+	return readx[0] << 8 | readx[1];
+}
+
+void uLCD_4D_Picaso::getString(char *outStr, int strLen) {
+	getbytes(outStr, strLen);
+
+    // Append EOS
+	outStr[strLen] = '\0';
+
+	return;
+}
+
+WORD uLCD_4D_Picaso::GetAckResp(void) {
+	GetAck();
+	return GetWord();
+}
+
+WORD uLCD_4D_Picaso::WaitForAck(void) {
+    int saveTimeout = TimeLimit4D;
+
+    // check once per minute
+    TimeLimit4D = 60 * 1000;
+    do {
+        GetAck();
+    } while (Error4D != Err4D_OK);
+
+    // Restore callback/timeout saves
+    TimeLimit4D = saveTimeout;
+
+    return GetWord();
+}
+
+WORD uLCD_4D_Picaso::GetAckRes2Words(WORD * word1, WORD * word2) {
+	int Result;
+	GetAck();
+	Result = GetWord();
+	*word1 = GetWord();
+	*word2 = GetWord();
+	return Result;
+}
+
+void uLCD_4D_Picaso::GetAck2Words(WORD * word1, WORD * word2) {
+	GetAck();
+	*word1 = GetWord();
+	*word2 = GetWord();
+}
+
+WORD uLCD_4D_Picaso::GetAckResSector(t4DSector Sector) {
+	int Result;
+	GetAck();
+	Result = GetWord();
+	getbytes(Sector, 512);
+	return Result;
+}
+
+WORD uLCD_4D_Picaso::GetAckResStr(char * OutStr) {
+	int Result;
+	GetAck();
+	Result = GetWord();
+	getString(OutStr, Result);
+	return Result;
+}
+
+WORD uLCD_4D_Picaso::GetAckResData(t4DByteArray OutData, WORD size) {
+	int Result;
+	GetAck();
+	Result = GetWord();
+	getbytes(OutData, size);
+	return Result;
+}
+
+
+void uLCD_4D_Picaso::SetThisBaudrate(uLCD_4D_Picaso::BaudRate Newrate) {
+    int nBaud;
+
+    switch (Newrate) {
+	    case     BAUD_110:       nBaud =    110; break;
+	    case     BAUD_300:       nBaud =    300; break;
+	    case     BAUD_600:       nBaud =    600; break;
+	    case    BAUD_1200:       nBaud =   1200; break;
+	    case    BAUD_2400:       nBaud =   2400; break;
+	    case    BAUD_4800:       nBaud =   4800; break;
+	    case    BAUD_9600:       nBaud =   9600; break;
+	    case   BAUD_14400:       nBaud =  14400; break;
+	    case   BAUD_19200:       nBaud =  19200; break;
+	    case   BAUD_31250:       nBaud =  31250; break;
+	    case   BAUD_38400:       nBaud =  38400; break;
+	    case   BAUD_56000:       nBaud =  56000; break;
+	    case   BAUD_57600:       nBaud =  57600; break;
+	    case  BAUD_115200:       nBaud = 115200; break;
+	    case  BAUD_128000:       nBaud = 133929; break;
+	    case  BAUD_256000:       nBaud = 281250; break;
+	    case  BAUD_300000:       nBaud = 312500; break;
+	    case  BAUD_375000:       nBaud = 401786; break;
+	    case  BAUD_500000:       nBaud = 562500; break;
+	    case  BAUD_600000:       nBaud = 703125; break;
+
+	    default:
+	    	nBaud = 9600 ;
+	    }
+	
+	//Need to wait for the previous command to get out before setting new baud rate.
+	//10 ms seems to work for 9600, 40 ms for 2400
+	//Even using MODSERIAL's txIsBusy() doesn't seem to replace the need for this
+	LCD_wait_ms(40);
+    serial.baud(nBaud);
+    
+    //Wait 100ms, as specified in serial command manual
+    LCD_wait_ms(100);
+   
+    return;
+}
+
+/*
+ * End Of Intrinsic 4DRoutines here
+*/
+
+/*
+ * Starts of 4D Compound Routines
+*/
+
+WORD uLCD_4D_Picaso::bus_In()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_bus_In >> 8 ;
+  towrite[1]= F_bus_In ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::bus_Out(WORD  Bits)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_bus_Out >> 8 ;
+  towrite[1]= F_bus_Out ;
+  towrite[2]= Bits >> 8 ;
+  towrite[3]= Bits ;
+  WriteBytes(towrite, 4) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::bus_Read()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_bus_Read >> 8 ;
+  towrite[1]= F_bus_Read ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::bus_Set(WORD  IOMap)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_bus_Set >> 8 ;
+  towrite[1]= F_bus_Set ;
+  towrite[2]= IOMap >> 8 ;
+  towrite[3]= IOMap ;
+  WriteBytes(towrite, 4) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::bus_Write(WORD  Bits)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_bus_Write >> 8 ;
+  towrite[1]= F_bus_Write ;
+  towrite[2]= Bits >> 8 ;
+  towrite[3]= Bits ;
+  WriteBytes(towrite, 4) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::charheight(char  TestChar)
+{
+  char  towrite[3] ;
+
+  towrite[0]= F_charheight >> 8 ;
+  towrite[1]= F_charheight ;
+  towrite[2]= TestChar;
+  WriteBytes(towrite, 3) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::charwidth(char  TestChar)
+{
+  char  towrite[3] ;
+
+  towrite[0]= F_charwidth >> 8 ;
+  towrite[1]= F_charwidth ;
+  towrite[2]= TestChar;
+  WriteBytes(towrite, 3) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Close(WORD  Handle)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_file_Close >> 8 ;
+  towrite[1]= F_file_Close & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Count(char*  Filename)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_Count >> 8 ;
+  towrite[1]= F_file_Count ;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Dir(char*  Filename)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_Dir >> 8 ;
+  towrite[1]= F_file_Dir ;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Erase(char*  Filename)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_Erase >> 8 ;
+  towrite[1]= F_file_Erase & 0xFF;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Error()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_Error >> 8 ;
+  towrite[1]= F_file_Error & 0xFF;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Exec(char*  Filename, WORD  ArgCount, t4DWordArray  Args)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_Exec >> 8 ;
+  towrite[1]= F_file_Exec & 0xFF;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  towrite[0]= ArgCount >> 8 ;
+  towrite[1]= ArgCount ;
+  WriteBytes(towrite, 2) ;
+  WriteWords(Args, ArgCount) ;
+  return WaitForAck() ;
+}
+
+WORD uLCD_4D_Picaso::file_Exists(char*  Filename)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_Exists >> 8 ;
+  towrite[1]= F_file_Exists & 0xFF;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_FindFirst(char*  Filename)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_FindFirst >> 8 ;
+  towrite[1]= F_file_FindFirst & 0xFF;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_FindNext()
+{
+  char  towrite[2] ;
+  towrite[0]= F_file_FindNext >> 8 ;
+  towrite[1]= F_file_FindNext & 0xFF;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+char uLCD_4D_Picaso::file_GetC(WORD  Handle)
+{
+  char  towrite[4] ;
+  towrite[0]= F_file_GetC >> 8 ;
+  towrite[1]= F_file_GetC & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_GetS(char*  StringIn, WORD  Size, WORD  Handle)
+{
+  char  towrite[6] ;
+  towrite[0]= F_file_GetS >> 8 ;
+  towrite[1]= F_file_GetS & 0xFF;
+  towrite[2]= Size >> 8 ;
+  towrite[3]= Size ;
+  towrite[4]= Handle >> 8 ;
+  towrite[5]= Handle ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResStr(StringIn) ;
+}
+
+WORD uLCD_4D_Picaso::file_GetW(WORD  Handle)
+{
+  char  towrite[4] ;
+  towrite[0]= F_file_GetW >> 8 ;
+  towrite[1]= F_file_GetW & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Image(WORD  X, WORD  Y, WORD  Handle)
+{
+  char  towrite[8] ;
+  towrite[0]= F_file_Image >> 8 ;
+  towrite[1]= F_file_Image & 0xFF;
+  towrite[2]= X >> 8 ;
+  towrite[3]= X ;
+  towrite[4]= Y >> 8 ;
+  towrite[5]= Y ;
+  towrite[6]= Handle >> 8 ;
+  towrite[7]= Handle ;
+  WriteBytes(towrite, 8) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Index(WORD  Handle, WORD  HiSize, WORD  LoSize, WORD  Recordnum)
+{
+  char  towrite[10] ;
+  towrite[0]= F_file_Index >> 8 ;
+  towrite[1]= F_file_Index & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= HiSize >> 8 ;
+  towrite[5]= HiSize ;
+  towrite[6]= LoSize >> 8 ;
+  towrite[7]= LoSize ;
+  towrite[8]= Recordnum >> 8 ;
+  towrite[9]= Recordnum ;
+  WriteBytes(towrite, 10) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_LoadFunction(char*  Filename)
+{
+  char  towrite[2] ;
+  towrite[0]= F_file_LoadFunction >> 8 ;
+  towrite[1]= F_file_LoadFunction ;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_LoadImageControl(char*  Datname, char*  GCIName, WORD  Mode)
+{
+  char  towrite[2] ;
+  towrite[0]= F_file_LoadImageControl >> 8 ;
+  towrite[1]= F_file_LoadImageControl ;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Datname) ;
+  WriteChars(GCIName) ;
+  towrite[0]= Mode >> 8 ;
+  towrite[1]= Mode ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Mount()
+{
+  char  towrite[2] ;
+  towrite[0]= F_file_Mount >> 8 ;
+  towrite[1]= F_file_Mount & 0xFF;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Open(char*  Filename, char  Mode)
+{
+  char  towrite[2] ;
+  towrite[0]= F_file_Open >> 8 ;
+  towrite[1]= F_file_Open & 0xFF;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  towrite[0]= Mode;
+  WriteBytes(towrite, 1) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_PlayWAV(char*  Filename)
+{
+  char  towrite[2] ;
+  towrite[0]= F_file_PlayWAV >> 8 ;
+  towrite[1]= F_file_PlayWAV & 0xFF;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_PutC(char Character, WORD  Handle)
+{
+  char  towrite[5] ;
+  towrite[0]= F_file_PutC >> 8 ;
+  towrite[1]= F_file_PutC ;
+  towrite[2]= Character;
+  towrite[3]= Handle >> 8 ;
+  towrite[4]= Handle ;
+  WriteBytes(towrite, 5) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_PutS(char *  StringOut, WORD  Handle)
+{
+  char  towrite[2] ;
+  towrite[0]= F_file_PutS >> 8 ;
+  towrite[1]= F_file_PutS & 0xFF;
+  WriteBytes(towrite, 2) ;
+  WriteChars(StringOut) ;
+  towrite[0]= Handle >> 8 ;
+  towrite[1]= Handle ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_PutW(WORD  Word, WORD  Handle)
+{
+  char  towrite[6] ;
+  towrite[0]= F_file_PutW >> 8 ;
+  towrite[1]= F_file_PutW & 0xFF;
+  towrite[2]= Word >> 8 ;
+  towrite[3]= Word ;
+  towrite[4]= Handle >> 8 ;
+  towrite[5]= Handle ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Read(t4DByteArray  Data, WORD  Size, WORD  Handle)
+{
+  char  towrite[6] ;
+  towrite[0]= F_file_Read >> 8 ;
+  towrite[1]= F_file_Read & 0xFF;
+  towrite[2]= Size >> 8 ;
+  towrite[3]= Size ;
+  towrite[4]= Handle >> 8 ;
+  towrite[5]= Handle ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResData(Data,Size) ;
+}
+
+WORD uLCD_4D_Picaso::file_Rewind(WORD  Handle)
+{
+  char  towrite[4] ;
+  towrite[0]= F_file_Rewind >> 8 ;
+  towrite[1]= F_file_Rewind & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Run(char *  Filename, WORD  ArgCount, t4DWordArray  Args)
+{
+  char  towrite[2] ;
+  towrite[0]= F_file_Run >> 8 ;
+  towrite[1]= F_file_Run & 0xFF;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  towrite[0]= ArgCount >> 8 ;
+  towrite[1]= ArgCount ;
+  WriteBytes(towrite, 2) ;
+  WriteWords(Args, ArgCount) ;
+  return WaitForAck() ;
+}
+
+WORD uLCD_4D_Picaso::file_ScreenCapture(WORD  X, WORD  Y, WORD  Width, WORD  Height, WORD  Handle)
+{
+  char  towrite[12] ;
+  towrite[0]= F_file_ScreenCapture >> 8 ;
+  towrite[1]= F_file_ScreenCapture & 0xFF;
+  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 ;
+  towrite[10]= Handle >> 8 ;
+  towrite[11]= Handle ;
+  WriteBytes(towrite, 12) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Seek(WORD  Handle, WORD  HiWord, WORD  LoWord)
+{
+  char  towrite[8] ;
+  towrite[0]= F_file_Seek >> 8 ;
+  towrite[1]= F_file_Seek & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= HiWord >> 8 ;
+  towrite[5]= HiWord ;
+  towrite[6]= LoWord >> 8 ;
+  towrite[7]= LoWord ;
+  WriteBytes(towrite, 8) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_Size(WORD  Handle, WORD *  HiWord, WORD *  LoWord)
+{
+  char  towrite[4] ;
+  towrite[0]= F_file_Size >> 8 ;
+  towrite[1]= F_file_Size ;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  return GetAckRes2Words(HiWord,LoWord) ;
+}
+
+WORD uLCD_4D_Picaso::file_Tell(WORD  Handle, WORD *  HiWord, WORD *  LoWord)
+{
+  char  towrite[4] ;
+  towrite[0]= F_file_Tell >> 8 ;
+  towrite[1]= F_file_Tell ;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  return GetAckRes2Words(HiWord,LoWord) ;
+}
+
+void uLCD_4D_Picaso::file_Unmount()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_Unmount >> 8 ;
+  towrite[1]= F_file_Unmount & 0xFF;
+  WriteBytes(towrite, 2) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::file_Write(WORD  Size, t4DByteArray  Source, WORD  Handle)
+{
+  char  towrite[4] ;
+  towrite[0]= F_file_Write >> 8 ;
+  towrite[1]= F_file_Write ;
+  towrite[2]= Size >> 8 ;
+  towrite[3]= Size ;
+  WriteBytes(towrite, 4) ;
+  WriteBytes(Source, Size) ;
+  towrite[0]= Handle >> 8 ;
+  towrite[1]= Handle ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_BevelShadow(WORD  Value)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_BevelShadow >> 8 ;
+  towrite[1]= F_gfx_BevelShadow ;
+  towrite[2]= Value >> 8 ;
+  towrite[3]= Value ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_BevelWidth(WORD  Value)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_BevelWidth >> 8 ;
+  towrite[1]= F_gfx_BevelWidth ;
+  towrite[2]= Value >> 8 ;
+  towrite[3]= Value ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_BGcolour(WORD  Color)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_BGcolour >> 8 ;
+  towrite[1]= F_gfx_BGcolour ;
+  towrite[2]= Color >> 8 ;
+  towrite[3]= Color ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::gfx_Button(WORD  Up, WORD  x, WORD  y, WORD  buttonColour, WORD  txtColour, WORD  font, WORD  txtWidth, WORD  txtHeight, char *   text)
+{
+  char  towrite[18] ;
+  towrite[0]= F_gfx_Button >> 8 ;
+  towrite[1]= F_gfx_Button ;
+  towrite[2]= Up >> 8 ;
+  towrite[3]= Up ;
+  towrite[4]= x >> 8 ;
+  towrite[5]= x ;
+  towrite[6]= y >> 8 ;
+  towrite[7]= y ;
+  towrite[8]= buttonColour >> 8 ;
+  towrite[9]= buttonColour ;
+  towrite[10]= txtColour >> 8 ;
+  towrite[11]= txtColour ;
+  towrite[12]= font >> 8 ;
+  towrite[13]= font ;
+  towrite[14]= txtWidth >> 8 ;
+  towrite[15]= txtWidth ;
+  towrite[16]= txtHeight >> 8 ;
+  towrite[17]= txtHeight ;
+  WriteBytes(towrite, 18) ;
+  WriteChars( text) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::gfx_ChangeColour(WORD  OldColor, WORD  NewColor)
+{
+  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 uLCD_4D_Picaso::gfx_Circle(WORD  X, WORD  Y, WORD  Radius, WORD  Color)
+{
+  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 uLCD_4D_Picaso::gfx_CircleFilled(WORD  X, WORD  Y, WORD  Radius, WORD  Color)
+{
+  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 uLCD_4D_Picaso::gfx_Clipping(WORD  OnOff)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_gfx_Clipping >> 8 ;
+  towrite[1]= F_gfx_Clipping ;
+  towrite[2]= OnOff >> 8 ;
+  towrite[3]= OnOff ;
+  WriteBytes(towrite, 4) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::gfx_ClipWindow(WORD  X1, WORD  Y1, WORD  X2, WORD  Y2)
+{
+  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 uLCD_4D_Picaso::gfx_Cls()
+{
+  char  towrite[2] ;
+  towrite[0]= F_gfx_Cls >> 8 ;
+  towrite[1]= F_gfx_Cls ;
+  WriteBytes(towrite, 2);
+  GetAck();
+}
+
+WORD uLCD_4D_Picaso::gfx_Contrast(WORD  Contrast)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_Contrast >> 8 ;
+  towrite[1]= F_gfx_Contrast ;
+  towrite[2]= Contrast >> 8 ;
+  towrite[3]= Contrast ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::gfx_Ellipse(WORD  X, WORD  Y, WORD  Xrad, WORD  Yrad, WORD  Color)
+{
+  char  towrite[12] ;
+  towrite[0]= F_gfx_Ellipse >> 8 ;
+  towrite[1]= F_gfx_Ellipse ;
+  towrite[2]= X >> 8 ;
+  towrite[3]= X ;
+  towrite[4]= Y >> 8 ;
+  towrite[5]= Y ;
+  towrite[6]= Xrad >> 8 ;
+  towrite[7]= Xrad ;
+  towrite[8]= Yrad >> 8 ;
+  towrite[9]= Yrad ;
+  towrite[10]= Color >> 8 ;
+  towrite[11]= Color ;
+  WriteBytes(towrite, 12) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::gfx_EllipseFilled(WORD  X, WORD  Y, WORD  Xrad, WORD  Yrad, WORD  Color)
+{
+  char  towrite[12] ;
+  towrite[0]= F_gfx_EllipseFilled >> 8 ;
+  towrite[1]= F_gfx_EllipseFilled ;
+  towrite[2]= X >> 8 ;
+  towrite[3]= X ;
+  towrite[4]= Y >> 8 ;
+  towrite[5]= Y ;
+  towrite[6]= Xrad >> 8 ;
+  towrite[7]= Xrad ;
+  towrite[8]= Yrad >> 8 ;
+  towrite[9]= Yrad ;
+  towrite[10]= Color >> 8 ;
+  towrite[11]= Color ;
+  WriteBytes(towrite, 12) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_FrameDelay(WORD  Msec)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_FrameDelay >> 8 ;
+  towrite[1]= F_gfx_FrameDelay ;
+  towrite[2]= Msec >> 8 ;
+  towrite[3]= Msec ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_Get(WORD  Mode)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_Get >> 8 ;
+  towrite[1]= F_gfx_Get ;
+  towrite[2]= Mode >> 8 ;
+  towrite[3]= Mode ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_GetPixel(WORD  X, WORD  Y)
+{
+  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 uLCD_4D_Picaso::gfx_Line(WORD  X1, WORD  Y1, WORD  X2, WORD  Y2, WORD  Color)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_LinePattern(WORD  Pattern)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_LinePattern >> 8 ;
+  towrite[1]= F_gfx_LinePattern ;
+  towrite[2]= Pattern >> 8 ;
+  towrite[3]= Pattern ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::gfx_LineTo(WORD  X, WORD  Y)
+{
+  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 uLCD_4D_Picaso::gfx_MoveTo(WORD  X, WORD  Y)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_Orbit(WORD  Angle, WORD  Distance, WORD *  Xdest, WORD *  Ydest)
+{
+  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 ;
+}
+
+WORD uLCD_4D_Picaso::gfx_OutlineColour(WORD  Color)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_OutlineColour >> 8 ;
+  towrite[1]= F_gfx_OutlineColour ;
+  towrite[2]= Color >> 8 ;
+  towrite[3]= Color ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::gfx_Panel(WORD  Raised, WORD  X, WORD  Y, WORD  Width, WORD  Height, WORD  Color)
+{
+  char  towrite[14] ;
+  towrite[0]= F_gfx_Panel >> 8 ;
+  towrite[1]= F_gfx_Panel ;
+  towrite[2]= Raised >> 8 ;
+  towrite[3]= Raised ;
+  towrite[4]= X >> 8 ;
+  towrite[5]= X ;
+  towrite[6]= Y >> 8 ;
+  towrite[7]= Y ;
+  towrite[8]= Width >> 8 ;
+  towrite[9]= Width ;
+  towrite[10]= Height >> 8 ;
+  towrite[11]= Height ;
+  towrite[12]= Color >> 8 ;
+  towrite[13]= Color ;
+  WriteBytes(towrite, 14) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::gfx_Polygon(WORD  n, t4DWordArray  Xvalues, t4DWordArray  Yvalues, WORD  Color)
+{
+  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 uLCD_4D_Picaso::gfx_PolygonFilled(WORD  n, t4DWordArray  Xvalues, t4DWordArray  Yvalues, WORD  Color)
+{
+  char  towrite[4] ;
+  towrite[0]= F_gfx_PolygonFilled >> 8 ;
+  towrite[1]= F_gfx_PolygonFilled ;
+  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 uLCD_4D_Picaso::gfx_Polyline(WORD  n, t4DWordArray  Xvalues, t4DWordArray  Yvalues, WORD  Color)
+{
+  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 uLCD_4D_Picaso::gfx_PutPixel(WORD  X, WORD  Y, WORD  Color)
+{
+  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 uLCD_4D_Picaso::gfx_Rectangle(WORD  X1, WORD  Y1, WORD  X2, WORD  Y2, WORD  Color)
+{
+  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 uLCD_4D_Picaso::gfx_RectangleFilled(WORD  X1, WORD  Y1, WORD  X2, WORD  Y2, WORD  Color)
+{
+  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 uLCD_4D_Picaso::gfx_ScreenCopyPaste(WORD  Xs, WORD  Ys, WORD  Xd, WORD  Yd, WORD  Width, WORD  Height)
+{
+  char  towrite[14] ;
+  towrite[0]= F_gfx_ScreenCopyPaste >> 8 ;
+  towrite[1]= F_gfx_ScreenCopyPaste ;
+  towrite[2]= Xs >> 8 ;
+  towrite[3]= Xs ;
+  towrite[4]= Ys >> 8 ;
+  towrite[5]= Ys ;
+  towrite[6]= Xd >> 8 ;
+  towrite[7]= Xd ;
+  towrite[8]= Yd >> 8 ;
+  towrite[9]= Yd ;
+  towrite[10]= Width >> 8 ;
+  towrite[11]= Width ;
+  towrite[12]= Height >> 8 ;
+  towrite[13]= Height ;
+  WriteBytes(towrite, 14) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_ScreenMode(WORD  ScreenMode)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_gfx_ScreenMode >> 8 ;
+  towrite[1]= F_gfx_ScreenMode ;
+  towrite[2]= ScreenMode >> 8 ;
+  towrite[3]= ScreenMode ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::gfx_Set(WORD  Func, WORD  Value)
+{
+  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 uLCD_4D_Picaso::gfx_SetClipRegion()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_gfx_SetClipRegion >> 8 ;
+  towrite[1]= F_gfx_SetClipRegion ;
+  WriteBytes(towrite, 2) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_Slider(WORD  Mode, WORD  X1, WORD  Y1, WORD  X2, WORD  Y2, WORD  Color, WORD  Scale, WORD  Value)
+{
+  char  towrite[18] ;
+
+  towrite[0]= F_gfx_Slider >> 8 ;
+  towrite[1]= F_gfx_Slider ;
+  towrite[2]= Mode >> 8 ;
+  towrite[3]= Mode ;
+  towrite[4]= X1 >> 8 ;
+  towrite[5]= X1 ;
+  towrite[6]= Y1 >> 8 ;
+  towrite[7]= Y1 ;
+  towrite[8]= X2 >> 8 ;
+  towrite[9]= X2 ;
+  towrite[10]= Y2 >> 8 ;
+  towrite[11]= Y2 ;
+  towrite[12]= Color >> 8 ;
+  towrite[13]= Color ;
+  towrite[14]= Scale >> 8 ;
+  towrite[15]= Scale ;
+  towrite[16]= Value >> 8 ;
+  towrite[17]= Value ;
+  WriteBytes(towrite, 18) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_Transparency(WORD  OnOff)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_gfx_Transparency >> 8 ;
+  towrite[1]= F_gfx_Transparency ;
+  towrite[2]= OnOff >> 8 ;
+  towrite[3]= OnOff ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::gfx_TransparentColour(WORD  Color)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_gfx_TransparentColour >> 8 ;
+  towrite[1]= F_gfx_TransparentColour ;
+  towrite[2]= Color >> 8 ;
+  towrite[3]= Color ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::gfx_Triangle(WORD  X1, WORD  Y1, WORD  X2, WORD  Y2, WORD  X3, WORD  Y3, WORD  Color)
+{
+  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() ;
+}
+
+void uLCD_4D_Picaso::gfx_TriangleFilled(WORD  X1, WORD  Y1, WORD  X2, WORD  Y2, WORD  X3, WORD  Y3, WORD  Color)
+{
+  char  towrite[16] ;
+  towrite[0]= F_gfx_TriangleFilled >> 8 ;
+  towrite[1]= F_gfx_TriangleFilled ;
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::img_ClearAttributes(WORD  Handle, WORD  Index, WORD  Value)
+{
+  char  towrite[8] ;
+  towrite[0]= F_img_ClearAttributes >> 8 ;
+  towrite[1]= F_img_ClearAttributes & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  towrite[6]= Value >> 8 ;
+  towrite[7]= Value ;
+  WriteBytes(towrite, 8) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_Darken(WORD  Handle, WORD  Index)
+{
+  char  towrite[6] ;
+  towrite[0]= F_img_Darken >> 8 ;
+  towrite[1]= F_img_Darken & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_Disable(WORD  Handle, WORD  Index)
+{
+  char  towrite[6] ;
+  towrite[0]= F_img_Disable >> 8 ;
+  towrite[1]= F_img_Disable & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_Enable(WORD  Handle, WORD  Index)
+{
+  char  towrite[6] ;
+  towrite[0]= F_img_Enable >> 8 ;
+  towrite[1]= F_img_Enable & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_GetWord(WORD  Handle, WORD  Index, WORD  Offset )
+{
+  char  towrite[8] ;
+  towrite[0]= F_img_GetWord >> 8 ;
+  towrite[1]= F_img_GetWord & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  towrite[6]= Offset  >> 8 ;
+  towrite[7]= Offset  ;
+  WriteBytes(towrite, 8) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_Lighten(WORD  Handle, WORD  Index)
+{
+  char  towrite[6] ;
+  towrite[0]= F_img_Lighten >> 8 ;
+  towrite[1]= F_img_Lighten & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_SetAttributes(WORD  Handle, WORD  Index, WORD  Value)
+{
+  char  towrite[8] ;
+
+  towrite[0]= F_img_SetAttributes >> 8 ;
+  towrite[1]= F_img_SetAttributes & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  towrite[6]= Value >> 8 ;
+  towrite[7]= Value ;
+  WriteBytes(towrite, 8) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_SetPosition(WORD  Handle, WORD  Index, WORD  Xpos, WORD  Ypos)
+{
+  char  towrite[10] ;
+
+  towrite[0]= F_img_SetPosition >> 8 ;
+  towrite[1]= F_img_SetPosition & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  towrite[6]= Xpos >> 8 ;
+  towrite[7]= Xpos ;
+  towrite[8]= Ypos >> 8 ;
+  towrite[9]= Ypos ;
+  WriteBytes(towrite, 10) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_SetWord(WORD  Handle, WORD  Index, WORD  Offset , WORD  Word)
+{
+  char  towrite[10] ;
+
+  towrite[0]= F_img_SetWord >> 8 ;
+  towrite[1]= F_img_SetWord & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  towrite[6]= Offset  >> 8 ;
+  towrite[7]= Offset  ;
+  towrite[8]= Word >> 8 ;
+  towrite[9]= Word ;
+  WriteBytes(towrite, 10) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_Show(WORD  Handle, WORD  Index)
+{
+  char  towrite[6] ;
+  towrite[0]= F_img_Show >> 8 ;
+  towrite[1]= F_img_Show & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::img_Touched(WORD  Handle, WORD  Index)
+{
+  char  towrite[6] ;
+  towrite[0]= F_img_Touched >> 8 ;
+  towrite[1]= F_img_Touched & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= Index >> 8 ;
+  towrite[5]= Index ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::media_Flush()
+{
+  char  towrite[2] ;
+  towrite[0]= F_media_Flush >> 8 ;
+  towrite[1]= F_media_Flush ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::media_Image(WORD  X, WORD  Y)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::media_Init()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_media_Init >> 8 ;
+  towrite[1]= F_media_Init ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::media_RdSector(t4DSector  SectorIn)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_media_RdSector >> 8 ;
+  towrite[1]= F_media_RdSector ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResSector(SectorIn) ;
+}
+
+WORD uLCD_4D_Picaso::media_ReadByte()
+{
+  char  towrite[2] ;
+  towrite[0]= F_media_ReadByte >> 8 ;
+  towrite[1]= F_media_ReadByte ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::media_ReadWord()
+{
+  char  towrite[2] ;
+  towrite[0]= F_media_ReadWord >> 8 ;
+  towrite[1]= F_media_ReadWord ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::media_SetAdd(WORD  HiWord, WORD  LoWord)
+{
+  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 uLCD_4D_Picaso::media_SetSector(WORD  HiWord, WORD  LoWord)
+{
+  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 uLCD_4D_Picaso::media_Video(WORD  X, WORD  Y)
+{
+  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 uLCD_4D_Picaso::media_VideoFrame(WORD  X, WORD  Y, WORD  Framenumber)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::media_WriteByte(WORD  Byte)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::media_WriteWord(WORD  Word)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::media_WrSector(t4DSector  SectorOut)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_media_WrSector >> 8 ;
+  towrite[1]= F_media_WrSector ;
+  WriteBytes(towrite, 2) ;
+  WriteBytes(SectorOut, 512) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::mem_Free(WORD  Handle)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_mem_Free >> 8 ;
+  towrite[1]= F_mem_Free & 0xFF;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::mem_Heap()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_mem_Heap >> 8 ;
+  towrite[1]= F_mem_Heap & 0xFF;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::peekM(WORD  Address)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_peekM >> 8 ;
+  towrite[1]= F_peekM ;
+  towrite[2]= Address >> 8 ;
+  towrite[3]= Address ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::pin_HI(WORD  Pin)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_pin_HI >> 8 ;
+  towrite[1]= F_pin_HI ;
+  towrite[2]= Pin >> 8 ;
+  towrite[3]= Pin ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::pin_LO(WORD  Pin)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_pin_LO >> 8 ;
+  towrite[1]= F_pin_LO ;
+  towrite[2]= Pin >> 8 ;
+  towrite[3]= Pin ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::pin_Read(WORD  Pin)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_pin_Read >> 8 ;
+  towrite[1]= F_pin_Read ;
+  towrite[2]= Pin >> 8 ;
+  towrite[3]= Pin ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::pin_Set(WORD  Mode, WORD  Pin)
+{
+  char  towrite[6] ;
+
+  towrite[0]= F_pin_Set >> 8 ;
+  towrite[1]= F_pin_Set ;
+  towrite[2]= Mode >> 8 ;
+  towrite[3]= Mode ;
+  towrite[4]= Pin >> 8 ;
+  towrite[5]= Pin ;
+  WriteBytes(towrite, 6) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::pokeM(WORD  Address, WORD  WordValue)
+{
+  char  towrite[6] ;
+
+  towrite[0]= F_pokeM >> 8 ;
+  towrite[1]= F_pokeM ;
+  towrite[2]= Address >> 8 ;
+  towrite[3]= Address ;
+  towrite[4]= WordValue >> 8 ;
+  towrite[5]= WordValue ;
+  WriteBytes(towrite, 6) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::putCH(WORD  WordChar)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_putCH >> 8 ;
+  towrite[1]= F_putCH ;
+  towrite[2]= WordChar >> 8 ;
+  towrite[3]= WordChar ;
+  WriteBytes(towrite, 4) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::putStr(char *  InString)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_putstr >> 8 ;
+  towrite[1]= F_putstr ;
+  WriteBytes(towrite, 2) ;
+  WriteChars(InString) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::snd_BufSize(WORD  Bufsize)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_snd_BufSize >> 8 ;
+  towrite[1]= F_snd_BufSize & 0xFF;
+  towrite[2]= Bufsize >> 8 ;
+  towrite[3]= Bufsize ;
+  WriteBytes(towrite, 4) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::snd_Continue()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_snd_Continue >> 8 ;
+  towrite[1]= F_snd_Continue & 0xFF;
+  WriteBytes(towrite, 2) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::snd_Pause()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_snd_Pause >> 8 ;
+  towrite[1]= F_snd_Pause & 0xFF;
+  WriteBytes(towrite, 2) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::snd_Pitch(WORD  Pitch)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_snd_Pitch >> 8 ;
+  towrite[1]= F_snd_Pitch & 0xFF;
+  towrite[2]= Pitch >> 8 ;
+  towrite[3]= Pitch ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::snd_Playing()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_snd_Playing >> 8 ;
+  towrite[1]= F_snd_Playing & 0xFF;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::snd_Stop()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_snd_Stop >> 8 ;
+  towrite[1]= F_snd_Stop & 0xFF;
+  WriteBytes(towrite, 2) ;
+  GetAck() ;
+}
+
+void uLCD_4D_Picaso::snd_Volume(WORD  Volume)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_snd_Volume >> 8 ;
+  towrite[1]= F_snd_Volume & 0xFF;
+  towrite[2]= Volume >> 8 ;
+  towrite[3]= Volume ;
+  WriteBytes(towrite, 4) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::sys_Sleep(WORD  Units)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_sys_Sleep >> 8 ;
+  towrite[1]= F_sys_Sleep & 0xFF;
+  towrite[2]= Units >> 8 ;
+  towrite[3]= Units ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::touch_DetectRegion(WORD  X1, WORD  Y1, WORD  X2, WORD  Y2)
+{
+  char  towrite[10] ;
+
+  towrite[0]= F_touch_DetectRegion >> 8 ;
+  towrite[1]= F_touch_DetectRegion & 0xFF;
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::touch_Get(WORD  Mode)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_touch_Get >> 8 ;
+  towrite[1]= F_touch_Get & 0xFF;
+  towrite[2]= Mode >> 8 ;
+  towrite[3]= Mode ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::touch_Set(WORD  Mode)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_touch_Set >> 8 ;
+  towrite[1]= F_touch_Set & 0xFF;
+  towrite[2]= Mode >> 8 ;
+  towrite[3]= Mode ;
+  WriteBytes(towrite, 4) ;
+  GetAck() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Attributes(WORD  Attribs)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Attributes >> 8 ;
+  towrite[1]= F_txt_Attributes ;
+  towrite[2]= Attribs >> 8 ;
+  towrite[3]= Attribs ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_BGcolour(WORD  Color)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_BGcolour >> 8 ;
+  towrite[1]= F_txt_BGcolour ;
+  towrite[2]= Color >> 8 ;
+  towrite[3]= Color ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Bold(WORD  Bold)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Bold >> 8 ;
+  towrite[1]= F_txt_Bold ;
+  towrite[2]= Bold >> 8 ;
+  towrite[3]= Bold ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_FGcolour(WORD  Color)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_FGcolour >> 8 ;
+  towrite[1]= F_txt_FGcolour ;
+  towrite[2]= Color >> 8 ;
+  towrite[3]= Color ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_FontID(WORD  FontNumber)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_FontID >> 8 ;
+  towrite[1]= F_txt_FontID ;
+  towrite[2]= FontNumber >> 8 ;
+  towrite[3]= FontNumber ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Height(WORD  Multiplier)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Height >> 8 ;
+  towrite[1]= F_txt_Height ;
+  towrite[2]= Multiplier >> 8 ;
+  towrite[3]= Multiplier ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Inverse(WORD  Inverse)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Inverse >> 8 ;
+  towrite[1]= F_txt_Inverse ;
+  towrite[2]= Inverse >> 8 ;
+  towrite[3]= Inverse ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Italic(WORD  Italic)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Italic >> 8 ;
+  towrite[1]= F_txt_Italic ;
+  towrite[2]= Italic >> 8 ;
+  towrite[3]= Italic ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::txt_MoveCursor(WORD  Line, WORD  Column)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Opacity(WORD  TransparentOpaque)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Opacity >> 8 ;
+  towrite[1]= F_txt_Opacity ;
+  towrite[2]= TransparentOpaque >> 8 ;
+  towrite[3]= TransparentOpaque ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+void uLCD_4D_Picaso::txt_Set(WORD  Func, WORD  Value)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Underline(WORD  Underline)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Underline >> 8 ;
+  towrite[1]= F_txt_Underline ;
+  towrite[2]= Underline >> 8 ;
+  towrite[3]= Underline ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Width(WORD  Multiplier)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Width >> 8 ;
+  towrite[1]= F_txt_Width ;
+  towrite[2]= Multiplier >> 8 ;
+  towrite[3]= Multiplier ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Wrap(WORD  Position)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Wrap >> 8 ;
+  towrite[1]= F_txt_Wrap ;
+  towrite[2]= Position >> 8 ;
+  towrite[3]= Position ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Xgap(WORD  Pixels)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Xgap >> 8 ;
+  towrite[1]= F_txt_Xgap ;
+  towrite[2]= Pixels >> 8 ;
+  towrite[3]= Pixels ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::txt_Ygap(WORD  Pixels)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_txt_Ygap >> 8 ;
+  towrite[1]= F_txt_Ygap ;
+  towrite[2]= Pixels >> 8 ;
+  towrite[3]= Pixels ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::file_CallFunction(WORD  Handle, WORD  ArgCount, t4DWordArray  Args)
+{
+  char  towrite[6] ;
+
+  towrite[0]= F_file_CallFunction >> 8 ;
+  towrite[1]= F_file_CallFunction ;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  towrite[4]= ArgCount >> 8 ;
+  towrite[5]= ArgCount ;
+  WriteBytes(towrite, 6) ;
+  WriteWords(Args, ArgCount) ;
+  return WaitForAck() ;
+}
+
+WORD uLCD_4D_Picaso::sys_GetModel(char *  ModelStr)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_sys_GetModel >> 8 ;
+  towrite[1]= F_sys_GetModel ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResStr(ModelStr) ;
+}
+
+WORD uLCD_4D_Picaso::sys_GetVersion()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_sys_GetVersion >> 8 ;
+  towrite[1]= F_sys_GetVersion ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::sys_GetPmmC()
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_sys_GetPmmC >> 8 ;
+  towrite[1]= F_sys_GetPmmC ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::writeString(WORD  Handle, char *  StringOut)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_writeString >> 8 ;
+  towrite[1]= F_writeString ;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  WriteChars(StringOut) ;
+  return GetAckResp() ;
+}
+
+WORD uLCD_4D_Picaso::readString(WORD  Handle, char *  StringIn)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_readString >> 8 ;
+  towrite[1]= F_readString ;
+  towrite[2]= Handle >> 8 ;
+  towrite[3]= Handle ;
+  WriteBytes(towrite, 4) ;
+  return GetAckResStr(StringIn) ;
+}
+
+void uLCD_4D_Picaso::blitComtoDisplay(WORD  X, WORD  Y, WORD  Width, WORD  Height, t4DByteArray  Pixels)
+{
+  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() ;
+}
+
+WORD uLCD_4D_Picaso::file_FindFirstRet(char *  Filename, char *  StringIn)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_FindFirstRet >> 8 ;
+  towrite[1]= F_file_FindFirstRet ;
+  WriteBytes(towrite, 2) ;
+  WriteChars(Filename) ;
+  return GetAckResStr(StringIn) ;
+}
+
+WORD uLCD_4D_Picaso::file_FindNextRet(char *  StringIn)
+{
+  char  towrite[2] ;
+
+  towrite[0]= F_file_FindNextRet >> 8 ;
+  towrite[1]= F_file_FindNextRet ;
+  WriteBytes(towrite, 2) ;
+  return GetAckResStr(StringIn) ;
+}
+
+void uLCD_4D_Picaso::setbaudWait(uLCD_4D_Picaso::BaudRate Newrate)
+{
+  char  towrite[4] ;
+
+  towrite[0]= F_setbaudWait >> 8 ;
+  towrite[1]= F_setbaudWait ;
+  towrite[2]= Newrate >> 8 ;
+  towrite[3]= Newrate ;
+  WriteBytes(towrite, 4) ;
+  //printf("Baud command: %2x%2x%2x%2x\r\n", towrite[0], towrite[1], towrite[2], towrite[3]);
+  SetThisBaudrate(Newrate) ; // change this systems baud rate to match new display rate, ACK is 100ms away
+  GetAck() ;
+}
+
+/*
+ * Conpound 4D Routines Ends here
+*/
+