Serial library for Diablo4D. Tested with uLCD220RD

Diablo_Serial_4DLib.cpp

Committer:
martin13
Date:
2017-05-09
Revision:
2:7cff98af2c68
Parent:
1:9a2c573adad6

File content as of revision 2:7cff98af2c68:

/*
   Diablo_Serial_4DLib.cpp - Library for 4D Systems Serial Environment.
 */

#include "Diablo_Serial_4DLib.h"

Diablo_Serial_4DLib::Diablo_Serial_4DLib(Serial *virtualPort, int timeout4D) { 
    _virtualPort = virtualPort;
    TimeLimit4D = timeout4D;
}

//*********************************************************************************************//
//**********************************Intrinsic 4D Routines**************************************//
//*********************************************************************************************//

void Diablo_Serial_4DLib::WriteChars(char * charsout)
{
  char wk ;
  do
  {
    wk = *charsout++ ;
    _virtualPort->putc(wk) ;
  } while (wk) ;
}

void Diablo_Serial_4DLib::WriteBytes(char * Source, int Size)
{
    char wk ;
    int i ;
    for (i = 0; i < Size; i++)
    {
        wk = *Source++ ;
        _virtualPort->putc(wk) ;
    }
}

void Diablo_Serial_4DLib::WriteWords(word * Source, int Size)
{
  word wk ;
  int i ;
  for (i = 0; i < Size; i++)
  {
    wk = *Source++ ;
    _virtualPort->putc(wk >> 8) ;
    _virtualPort->putc(wk) ;
  }
}

void Diablo_Serial_4DLib::getbytes(char * data, int size)
{
  //int read ;
  Timer timer;
  int sttime ;
  int readc ;
  readc  = 0 ;
  timer.reset();
  timer.start();
  sttime = timer.read_ms();
  while ((readc != size) && (timer.read_ms() - sttime < TimeLimit4D))
  {
    if(_virtualPort->readable()) 
    {
      data[readc++] = _virtualPort->getc() ;
    }
  }
  if (readc != size)
  {
    Error4D = GFX_Err4D_Timeout ;
    if (Callback4D != NULL)
      Callback4D(Error4D, Error4D_Inv) ;
  }
}

void Diablo_Serial_4DLib::GetAck(void)
{
  Timer timer;
  int read ;
  unsigned char readx ;
  int sttime ;
  Error4D = GFX_Err4D_OK ;
  timer.reset();
  timer.start();
  sttime  = timer.read_ms();
  read    = 0 ;
  while ((read != 1) && (timer.read_ms() - sttime < TimeLimit4D))
  {
    if(_virtualPort->readable() != 0) 
    {
      readx = (unsigned char)_virtualPort->getc() ;
      read = 1 ;
    }
  }
  if (read == 0)
  {
    Error4D = GFX_Err4D_Timeout ;
    if (Callback4D != NULL)
      Callback4D(Error4D, Error4D_Inv) ;
  }
  else if (readx != 6)
  {
    Error4D     = GFX_Err4D_NAK ;
    Error4D_Inv = readx ;
    if (Callback4D != NULL)
      Callback4D(Error4D, Error4D_Inv) ;
  }
}

word Diablo_Serial_4DLib::GetWord(void)
{
  Timer timer;
  unsigned char readx[2] ;
  int readc ;
  int sttime ;
  
  if (Error4D != GFX_Err4D_OK)
    return 0 ;
  timer.reset();
  timer.start();
  sttime  = timer.read_ms();
  readc   = 0 ;
  while ((readc != 2) && (timer.read_ms() - sttime < TimeLimit4D))
  {
    if(_virtualPort->readable()) 
    {
      readx[readc++] = (unsigned char)_virtualPort->getc();
    }
  }
  
  if (readc != 2)
  {
    Error4D  = GFX_Err4D_Timeout ;
    if (Callback4D != NULL)
      Callback4D(Error4D, Error4D_Inv) ;
  return 0 ;
  }
  else
    return readx[0] << 8 | readx[1] ;
}

void Diablo_Serial_4DLib::getString(char * outStr, int strLen)
{
  //unsigned char readx[2] ;
  Timer timer;
  int readc ;
  int sttime ;
  
  if (Error4D != GFX_Err4D_OK)
  {
    outStr[0] = 0 ;
    return ;
  }
  timer.reset();
  timer.start();
  sttime  = timer.read_ms();
  readc   = 0 ;
  while ((readc != strLen) && (timer.read_ms() - sttime < TimeLimit4D))
  {
    if(_virtualPort->readable()) 
    {
      outStr[readc++] = _virtualPort->getc() ;
    }
  }
  
  if (readc != strLen)
  {
    Error4D  = GFX_Err4D_Timeout ;
    if (Callback4D != NULL)
      Callback4D(Error4D, Error4D_Inv) ;
  }
  outStr[readc] = 0 ;
}

word Diablo_Serial_4DLib::GetAckResp(void)
{
    GetAck();
    return GetWord() ;
}

word Diablo_Serial_4DLib::GetAckRes2Words(word * word1, word * word2)
{
    int Result ;
    GetAck() ;
    Result = GetWord() ;
    *word1 = GetWord() ;
    *word2 = GetWord() ;
    return Result ;
}

void Diablo_Serial_4DLib::GetAck2Words(word * word1, word * word2)
{
    GetAck() ;
    *word1 = GetWord() ;
    *word2 = GetWord() ;
}

word Diablo_Serial_4DLib::GetAckResSector(GFX_t4DSector Sector)
{
    int Result ;
    GetAck() ;
    Result = GetWord() ;
    getbytes(Sector, 512) ;
    return Result ;
}

word Diablo_Serial_4DLib::GetAckResStr(char * OutStr)
{
    int Result ;
    GetAck() ;
    Result = GetWord() ;
    getString(OutStr, Result) ;
    return Result ;
}

word Diablo_Serial_4DLib::GetAckResData(GFX_t4DByteArray OutData, word size)
{
    int Result ;
    GetAck() ;
    Result = GetWord() ;
    getbytes(OutData, size) ;
    return Result ;
}

void Diablo_Serial_4DLib::SetThisBaudrate(int Newrate)
{
  int br ;
 // _virtualPort->flush() ;
//  _virtualPort->end() ;
  switch(Newrate)
  {
 /*   case BAUD_110    : br = 110 ;
      break ;
    case BAUD_300    : br = 300 ;
      break ;
    case BAUD_600    : br = 600 ;
      break ;
    case BAUD_1200   : br = 1200 ;
      break ;
    case BAUD_2400   : br = 2400 ;
      break ;
    case BAUD_4800   : br = 4800 ;
      break ;*/
    case GFX_BAUD_9600   : br = 9600 ;
      break ;
//   case BAUD_14400  : br = 14400 ;
//      break ;
    case GFX_BAUD_19200  : br = 19200 ;
      break ;
 /*   case BAUD_31250  : br = 31250 ;
      break ;
    case BAUD_38400  : br = 38400 ;
      break ;
    case BAUD_56000  : br = 56000 ;
      break ;
    case BAUD_57600  : br = 57600 ;
      break ;
    case BAUD_115200 : br = 115200 ;
      break ;
    case BAUD_128000 : br = 133928 ; // actual rate is not 128000 ;
      break ;
    case BAUD_256000 : br = 281250 ; // actual rate is not  256000 ;
      break ;
    case BAUD_300000 : br = 312500 ; // actual rate is not  300000 ;
      break ;
    case BAUD_375000 : br = 401785 ; // actual rate is not  375000 ;
      break ;
    case BAUD_500000 : br = 562500 ; // actual rate is not  500000 ;
      break ;
    case BAUD_600000 : br = 703125 ; // actual rate is not  600000 ;
      break ;*/
  }
//  _virtualPort->begin(br) ;
  wait(0.05) ; // Display sleeps for 100
  _virtualPort->baud(br) ;
}

//*********************************************************************************************//
//**********************************Compound 4D Routines***************************************//
//*********************************************************************************************//

word Diablo_Serial_4DLib::bus_Read8()
{
  _virtualPort->putc(GFX_F_bus_Read8 >> 8) ;
  _virtualPort->putc(GFX_F_bus_Read8) ;
  return GetAckResp() ;
}

void Diablo_Serial_4DLib::bus_Write8(word Bits)
{
  _virtualPort->putc(GFX_F_bus_Write8 >> 8) ;
  _virtualPort->putc(GFX_F_bus_Write8) ;
  _virtualPort->putc(Bits >> 8);
  _virtualPort->putc(Bits) ;
  GetAck() ;
}

word Diablo_Serial_4DLib::charheight(char  TestChar)
{
  _virtualPort->putc(GFX_F_charheight >> 8);
  _virtualPort->putc(GFX_F_charheight);
  _virtualPort->putc(TestChar);
  return GetAckResp();
}

word Diablo_Serial_4DLib::charwidth(char  TestChar)
{
  _virtualPort->putc(GFX_F_charwidth >> 8);
  _virtualPort->putc(GFX_F_charwidth);
  _virtualPort->putc(TestChar);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Close(word  Handle)
{
  _virtualPort->putc(GFX_F_file_Close >> 8);
  _virtualPort->putc(GFX_F_file_Close);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Count(char *  Filename)
{
  _virtualPort->putc(GFX_F_file_Count >> 8);
  _virtualPort->putc(GFX_F_file_Count);
  WriteChars(Filename);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Dir(char *  Filename)
{
  _virtualPort->putc(GFX_F_file_Dir >> 8);
  _virtualPort->putc(GFX_F_file_Dir);
  WriteChars(Filename);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Erase(char *  Filename)
{
  _virtualPort->putc(GFX_F_file_Erase >> 8);
  _virtualPort->putc(GFX_F_file_Erase);
  WriteChars(Filename);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Error()
{
  _virtualPort->putc(GFX_F_file_Error >> 8);
  _virtualPort->putc(GFX_F_file_Error);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Exec(char *  Filename, word  ArgCount, GFX_t4DWordArray  Args)
{
  _virtualPort->putc(GFX_F_file_Exec >> 8);
  _virtualPort->putc(GFX_F_file_Exec);
  WriteChars(Filename);
  _virtualPort->putc(ArgCount >> 8);
  _virtualPort->putc(ArgCount);
  WriteWords(Args, ArgCount);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Exists(char *  Filename)
{
  _virtualPort->putc(GFX_F_file_Exists >> 8);
  _virtualPort->putc(GFX_F_file_Exists);
  WriteChars(Filename);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_FindFirst(char *  Filename)
{
  _virtualPort->putc(GFX_F_file_FindFirst >> 8);
  _virtualPort->putc(GFX_F_file_FindFirst);
  WriteChars(Filename);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_FindNext()
{
  _virtualPort->putc(GFX_F_file_FindNext >> 8);
  _virtualPort->putc(GFX_F_file_FindNext);
  return GetAckResp();
}

char Diablo_Serial_4DLib::file_GetC(word  Handle)
{
  _virtualPort->putc(GFX_F_file_GetC >> 8);
  _virtualPort->putc(GFX_F_file_GetC);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_GetS(char *  StringIn, word  Size, word  Handle)
{
  _virtualPort->putc(GFX_F_file_GetS >> 8);
  _virtualPort->putc(GFX_F_file_GetS);
  _virtualPort->putc(Size >> 8);
  _virtualPort->putc(Size);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResStr(StringIn);
}

word Diablo_Serial_4DLib::file_GetW(word  Handle)
{
  _virtualPort->putc(GFX_F_file_GetW >> 8);
  _virtualPort->putc(GFX_F_file_GetW);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Image(word  X, word  Y, word  Handle)
{
  _virtualPort->putc(GFX_F_file_Image >> 8);
  _virtualPort->putc(GFX_F_file_Image);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Index(word  Handle, word  HiSize, word  LoSize, word  Recordnum)
{
  _virtualPort->putc(GFX_F_file_Index >> 8);
  _virtualPort->putc(GFX_F_file_Index);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(HiSize >> 8);
  _virtualPort->putc(HiSize);
  _virtualPort->putc(LoSize >> 8);
  _virtualPort->putc(LoSize);
  _virtualPort->putc(Recordnum >> 8);
  _virtualPort->putc(Recordnum);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_LoadFunction(char *  Filename)
{
  _virtualPort->putc(GFX_F_file_LoadFunction >> 8);
  _virtualPort->putc(GFX_F_file_LoadFunction);
  WriteChars(Filename);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_LoadImageControl(char *  Datname, char *  GCIName, word  Mode)
{
  _virtualPort->putc(GFX_F_file_LoadImageControl >> 8);
  _virtualPort->putc(GFX_F_file_LoadImageControl);
  WriteChars(Datname);
  WriteChars(GCIName);
  _virtualPort->putc(Mode >> 8);
  _virtualPort->putc(Mode);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Mount()
{
  _virtualPort->putc(GFX_F_file_Mount >> 8);
  _virtualPort->putc(GFX_F_file_Mount);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Open(char *  Filename, char  Mode)
{
  _virtualPort->putc(GFX_F_file_Open >> 8);
  _virtualPort->putc(GFX_F_file_Open);
  WriteChars(Filename);
  _virtualPort->putc(Mode);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_PlayWAV(char *  Filename)
{
  _virtualPort->putc(GFX_F_file_PlayWAV >> 8);
  _virtualPort->putc(GFX_F_file_PlayWAV);
  WriteChars(Filename);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_PutC(char  Character, word  Handle)
{
  _virtualPort->putc(GFX_F_file_PutC >> 8);
  _virtualPort->putc(GFX_F_file_PutC);
  _virtualPort->putc(Character);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_PutS(char *  StringOut, word  Handle)
{
  _virtualPort->putc(GFX_F_file_PutS >> 8);
  _virtualPort->putc(GFX_F_file_PutS);
  WriteChars(StringOut);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_PutW(word  Word, word  Handle)
{
  _virtualPort->putc(GFX_F_file_PutW >> 8);
  _virtualPort->putc(GFX_F_file_PutW);
  _virtualPort->putc(Word >> 8);
  _virtualPort->putc(Word);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Read(GFX_t4DByteArray  Data, word  Size, word  Handle)
{
  _virtualPort->putc(GFX_F_file_Read >> 8);
  _virtualPort->putc(GFX_F_file_Read);
  _virtualPort->putc(Size >> 8);
  _virtualPort->putc(Size);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResData(Data,Size);
}

word Diablo_Serial_4DLib::file_Rewind(word  Handle)
{
  _virtualPort->putc(GFX_F_file_Rewind >> 8);
  _virtualPort->putc(GFX_F_file_Rewind);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Run(char *  Filename, word  ArgCount, GFX_t4DWordArray  Args)
{
  _virtualPort->putc(GFX_F_file_Run >> 8);
  _virtualPort->putc(GFX_F_file_Run);
  WriteChars(Filename);
  _virtualPort->putc(ArgCount >> 8);
  _virtualPort->putc(ArgCount);
  WriteWords(Args, ArgCount);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_ScreenCapture(word  X, word  Y, word  Width, word  Height, word  Handle)
{
  _virtualPort->putc(GFX_F_file_ScreenCapture >> 8);
  _virtualPort->putc(GFX_F_file_ScreenCapture);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Width >> 8);
  _virtualPort->putc(Width);
  _virtualPort->putc(Height >> 8);
  _virtualPort->putc(Height);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Seek(word  Handle, word  HiWord, word  LoWord)
{
  _virtualPort->putc(GFX_F_file_Seek >> 8);
  _virtualPort->putc(GFX_F_file_Seek);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(HiWord >> 8);
  _virtualPort->putc(HiWord);
  _virtualPort->putc(LoWord >> 8);
  _virtualPort->putc(LoWord);
  return GetAckResp();
}

word Diablo_Serial_4DLib::file_Size(word  Handle, word *  HiWord, word *  LoWord)
{
  _virtualPort->putc(GFX_F_file_Size >> 8);
  _virtualPort->putc(GFX_F_file_Size);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckRes2Words(HiWord,LoWord);
}

word Diablo_Serial_4DLib::file_Tell(word  Handle, word *  HiWord, word *  LoWord)
{
  _virtualPort->putc(GFX_F_file_Tell >> 8);
  _virtualPort->putc(GFX_F_file_Tell);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckRes2Words(HiWord,LoWord);
}

void Diablo_Serial_4DLib::file_Unmount()
{
  _virtualPort->putc(GFX_F_file_Unmount >> 8);
  _virtualPort->putc(GFX_F_file_Unmount);
  GetAck();
}

word Diablo_Serial_4DLib::file_Write(word  Size, GFX_t4DByteArray  Source, word  Handle)
{
  _virtualPort->putc(GFX_F_file_Write >> 8);
  _virtualPort->putc(GFX_F_file_Write);
  _virtualPort->putc(Size >> 8);
  _virtualPort->putc(Size);
  WriteBytes(Source, Size);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::gfx_BevelShadow(word  Value)
{
  _virtualPort->putc(GFX_F_gfx_BevelShadow >> 8);
  _virtualPort->putc(GFX_F_gfx_BevelShadow);
  _virtualPort->putc(Value >> 8);
  _virtualPort->putc(Value);
  return GetAckResp();
}

word Diablo_Serial_4DLib::gfx_BevelWidth(word  Value)
{
  _virtualPort->putc(GFX_F_gfx_BevelWidth >> 8);
  _virtualPort->putc(GFX_F_gfx_BevelWidth);
  _virtualPort->putc(Value >> 8);
  _virtualPort->putc(Value);
  return GetAckResp();
}

word Diablo_Serial_4DLib::gfx_BGcolour(word  Color)
{
  _virtualPort->putc(GFX_F_gfx_BGcolour >> 8);
  _virtualPort->putc(GFX_F_gfx_BGcolour);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  return GetAckResp();
}

void Diablo_Serial_4DLib::gfx_Button(word  Up, word  x, word  y, word  buttonColour, word  txtColour, word  font, word  txtWidth, word  txtHeight, char *   text)
{
  _virtualPort->putc(GFX_F_gfx_Button >> 8);
  _virtualPort->putc(GFX_F_gfx_Button);
  _virtualPort->putc(Up >> 8);
  _virtualPort->putc(Up);
  _virtualPort->putc(x >> 8);
  _virtualPort->putc(x);
  _virtualPort->putc(y >> 8);
  _virtualPort->putc(y);
  _virtualPort->putc(buttonColour >> 8);
  _virtualPort->putc(buttonColour);
  _virtualPort->putc(txtColour >> 8);
  _virtualPort->putc(txtColour);
  _virtualPort->putc(font >> 8);
  _virtualPort->putc(font);
  _virtualPort->putc(txtWidth >> 8);
  _virtualPort->putc(txtWidth);
  _virtualPort->putc(txtHeight >> 8);
  _virtualPort->putc(txtHeight);
  WriteChars(text);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_ChangeColour(word  OldColor, word  NewColor)
{
  _virtualPort->putc(GFX_F_gfx_ChangeColour >> 8);
  _virtualPort->putc(GFX_F_gfx_ChangeColour);
  _virtualPort->putc(OldColor >> 8);
  _virtualPort->putc(OldColor);
  _virtualPort->putc(NewColor >> 8);
  _virtualPort->putc(NewColor);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_Circle(word  X, word  Y, word  Radius, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_Circle >> 8);
  _virtualPort->putc(GFX_F_gfx_Circle);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Radius >> 8);
  _virtualPort->putc(Radius);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_CircleFilled(word  X, word  Y, word  Radius, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_CircleFilled >> 8);
  _virtualPort->putc(GFX_F_gfx_CircleFilled);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Radius >> 8);
  _virtualPort->putc(Radius);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_Clipping(word  OnOff)
{
  _virtualPort->putc(GFX_F_gfx_Clipping >> 8);
  _virtualPort->putc(GFX_F_gfx_Clipping);
  _virtualPort->putc(OnOff >> 8);
  _virtualPort->putc(OnOff);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_ClipWindow(word  X1, word  Y1, word  X2, word  Y2)
{
  _virtualPort->putc(GFX_F_gfx_ClipWindow >> 8);
  _virtualPort->putc(GFX_F_gfx_ClipWindow);
  _virtualPort->putc(X1 >> 8);
  _virtualPort->putc(X1);
  _virtualPort->putc(Y1 >> 8);
  _virtualPort->putc(Y1);
  _virtualPort->putc(X2 >> 8);
  _virtualPort->putc(X2);
  _virtualPort->putc(Y2 >> 8);
  _virtualPort->putc(Y2);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_Cls()
{
  _virtualPort->putc(GFX_F_gfx_Cls >> 8);
  _virtualPort->putc(GFX_F_gfx_Cls);
  GetAck();
}

word Diablo_Serial_4DLib::gfx_Contrast(word  Contrast)
{
  _virtualPort->putc(GFX_F_gfx_Contrast >> 8);
  _virtualPort->putc(GFX_F_gfx_Contrast);
  _virtualPort->putc(Contrast >> 8);
  _virtualPort->putc(Contrast);
  return GetAckResp();
}

void Diablo_Serial_4DLib::gfx_Ellipse(word  X, word  Y, word  Xrad, word  Yrad, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_Ellipse >> 8);
  _virtualPort->putc(GFX_F_gfx_Ellipse);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Xrad >> 8);
  _virtualPort->putc(Xrad);
  _virtualPort->putc(Yrad >> 8);
  _virtualPort->putc(Yrad);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_EllipseFilled(word  X, word  Y, word  Xrad, word  Yrad, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_EllipseFilled >> 8);
  _virtualPort->putc(GFX_F_gfx_EllipseFilled);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Xrad >> 8);
  _virtualPort->putc(Xrad);
  _virtualPort->putc(Yrad >> 8);
  _virtualPort->putc(Yrad);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

word Diablo_Serial_4DLib::gfx_FrameDelay(word  Msec)
{
  _virtualPort->putc(GFX_F_gfx_FrameDelay >> 8);
  _virtualPort->putc(GFX_F_gfx_FrameDelay);
  _virtualPort->putc(Msec >> 8);
  _virtualPort->putc(Msec);
  return GetAckResp();
}

word Diablo_Serial_4DLib::gfx_Get(word  Mode)
{
  _virtualPort->putc(GFX_F_gfx_Get >> 8);
  _virtualPort->putc(GFX_F_gfx_Get);
  _virtualPort->putc(Mode >> 8);
  _virtualPort->putc(Mode);
  return GetAckResp();
}

word Diablo_Serial_4DLib::gfx_GetPixel(word  X, word  Y)
{
  _virtualPort->putc(GFX_F_gfx_GetPixel >> 8);
  _virtualPort->putc(GFX_F_gfx_GetPixel);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  return GetAckResp();
}

void Diablo_Serial_4DLib::gfx_Line(word  X1, word  Y1, word  X2, word  Y2, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_Line >> 8);
  _virtualPort->putc(GFX_F_gfx_Line);
  _virtualPort->putc(X1 >> 8);
  _virtualPort->putc(X1);
  _virtualPort->putc(Y1 >> 8);
  _virtualPort->putc(Y1);
  _virtualPort->putc(X2 >> 8);
  _virtualPort->putc(X2);
  _virtualPort->putc(Y2 >> 8);
  _virtualPort->putc(Y2);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

word Diablo_Serial_4DLib::gfx_LinePattern(word  Pattern)
{
  _virtualPort->putc(GFX_F_gfx_LinePattern >> 8);
  _virtualPort->putc(GFX_F_gfx_LinePattern);
  _virtualPort->putc(Pattern >> 8);
  _virtualPort->putc(Pattern);
  return GetAckResp();
}

void Diablo_Serial_4DLib::gfx_LineTo(word  X, word  Y)
{
  _virtualPort->putc(GFX_F_gfx_LineTo >> 8);
  _virtualPort->putc(GFX_F_gfx_LineTo);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_MoveTo(word  X, word  Y)
{
  _virtualPort->putc(GFX_F_gfx_MoveTo >> 8);
  _virtualPort->putc(GFX_F_gfx_MoveTo);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  GetAck();
}

word Diablo_Serial_4DLib::gfx_Orbit(word  Angle, word  Distance, word *  Xdest, word *  Ydest)
{
  _virtualPort->putc(GFX_F_gfx_Orbit >> 8);
  _virtualPort->putc(GFX_F_gfx_Orbit);
  _virtualPort->putc(Angle >> 8);
  _virtualPort->putc(Angle);
  _virtualPort->putc(Distance >> 8);
  _virtualPort->putc(Distance);
  GetAck2Words(Xdest,Ydest);
  return 0 ;
}

word Diablo_Serial_4DLib::gfx_OutlineColour(word  Color)
{
  _virtualPort->putc(GFX_F_gfx_OutlineColour >> 8);
  _virtualPort->putc(GFX_F_gfx_OutlineColour);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  return GetAckResp();
}

void Diablo_Serial_4DLib::gfx_Panel(word  Raised, word  X, word  Y, word  Width, word  Height, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_Panel >> 8);
  _virtualPort->putc(GFX_F_gfx_Panel);
  _virtualPort->putc(Raised >> 8);
  _virtualPort->putc(Raised);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Width >> 8);
  _virtualPort->putc(Width);
  _virtualPort->putc(Height >> 8);
  _virtualPort->putc(Height);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_Polygon(word  n, GFX_t4DWordArray  Xvalues, GFX_t4DWordArray  Yvalues, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_Polygon >> 8);
  _virtualPort->putc(GFX_F_gfx_Polygon);
  _virtualPort->putc(n >> 8);
  _virtualPort->putc(n);
  WriteWords(Xvalues, n);
  WriteWords(Yvalues, n);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_PolygonFilled(word  n, GFX_t4DWordArray  Xvalues, GFX_t4DWordArray  Yvalues, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_PolygonFilled >> 8);
  _virtualPort->putc(GFX_F_gfx_PolygonFilled);
  _virtualPort->putc(n >> 8);
  _virtualPort->putc(n);
  WriteWords(Xvalues, n);
  WriteWords(Yvalues, n);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_Polyline(word  n, GFX_t4DWordArray  Xvalues, GFX_t4DWordArray  Yvalues, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_Polyline >> 8);
  _virtualPort->putc(GFX_F_gfx_Polyline);
  _virtualPort->putc(n >> 8);
  _virtualPort->putc(n);
  WriteWords(Xvalues, n);
  WriteWords(Yvalues, n);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_PutPixel(word  X, word  Y, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_PutPixel >> 8);
  _virtualPort->putc(GFX_F_gfx_PutPixel);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_Rectangle(word  X1, word  Y1, word  X2, word  Y2, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_Rectangle >> 8);
  _virtualPort->putc(GFX_F_gfx_Rectangle);
  _virtualPort->putc(X1 >> 8);
  _virtualPort->putc(X1);
  _virtualPort->putc(Y1 >> 8);
  _virtualPort->putc(Y1);
  _virtualPort->putc(X2 >> 8);
  _virtualPort->putc(X2);
  _virtualPort->putc(Y2 >> 8);
  _virtualPort->putc(Y2);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_RectangleFilled(word  X1, word  Y1, word  X2, word  Y2, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_RectangleFilled >> 8);
  _virtualPort->putc(GFX_F_gfx_RectangleFilled);
  _virtualPort->putc(X1 >> 8);
  _virtualPort->putc(X1);
  _virtualPort->putc(Y1 >> 8);
  _virtualPort->putc(Y1);
  _virtualPort->putc(X2 >> 8);
  _virtualPort->putc(X2);
  _virtualPort->putc(Y2 >> 8);
  _virtualPort->putc(Y2);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_ScreenCopyPaste(word  Xs, word  Ys, word  Xd, word  Yd, word  Width, word  Height)
{
  _virtualPort->putc(GFX_F_gfx_ScreenCopyPaste >> 8);
  _virtualPort->putc(GFX_F_gfx_ScreenCopyPaste);
  _virtualPort->putc(Xs >> 8);
  _virtualPort->putc(Xs);
  _virtualPort->putc(Ys >> 8);
  _virtualPort->putc(Ys);
  _virtualPort->putc(Xd >> 8);
  _virtualPort->putc(Xd);
  _virtualPort->putc(Yd >> 8);
  _virtualPort->putc(Yd);
  _virtualPort->putc(Width >> 8);
  _virtualPort->putc(Width);
  _virtualPort->putc(Height >> 8);
  _virtualPort->putc(Height);
  GetAck();
}

word Diablo_Serial_4DLib::gfx_ScreenMode(word  ScreenMode)
{
  _virtualPort->putc(GFX_F_gfx_ScreenMode >> 8);
  _virtualPort->putc(GFX_F_gfx_ScreenMode);
  _virtualPort->putc(ScreenMode >> 8);
  _virtualPort->putc(ScreenMode);
  return GetAckResp();
}

void Diablo_Serial_4DLib::gfx_Set(word  Func, word  Value)
{
  _virtualPort->putc(GFX_F_gfx_Set >> 8);
  _virtualPort->putc(GFX_F_gfx_Set);
  _virtualPort->putc(Func >> 8);
  _virtualPort->putc(Func);
  _virtualPort->putc(Value >> 8);
  _virtualPort->putc(Value);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_SetClipRegion()
{
  _virtualPort->putc(GFX_F_gfx_SetClipRegion >> 8);
  _virtualPort->putc(GFX_F_gfx_SetClipRegion);
  GetAck();
}

word Diablo_Serial_4DLib::gfx_Slider(word  Mode, word  X1, word  Y1, word  X2, word  Y2, word  Color, word  Scale, word  Value)
{
  _virtualPort->putc(GFX_F_gfx_Slider >> 8);
  _virtualPort->putc(GFX_F_gfx_Slider);
  _virtualPort->putc(Mode >> 8);
  _virtualPort->putc(Mode);
  _virtualPort->putc(X1 >> 8);
  _virtualPort->putc(X1);
  _virtualPort->putc(Y1 >> 8);
  _virtualPort->putc(Y1);
  _virtualPort->putc(X2 >> 8);
  _virtualPort->putc(X2);
  _virtualPort->putc(Y2 >> 8);
  _virtualPort->putc(Y2);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  _virtualPort->putc(Scale >> 8);
  _virtualPort->putc(Scale);
  _virtualPort->putc(Value >> 8);
  _virtualPort->putc(Value);
  return GetAckResp();
}

word Diablo_Serial_4DLib::gfx_Transparency(word  OnOff)
{
  _virtualPort->putc(GFX_F_gfx_Transparency >> 8);
  _virtualPort->putc(GFX_F_gfx_Transparency);
  _virtualPort->putc(OnOff >> 8);
  _virtualPort->putc(OnOff);
  return GetAckResp();
}

word Diablo_Serial_4DLib::gfx_TransparentColour(word  Color)
{
  _virtualPort->putc(GFX_F_gfx_TransparentColour >> 8);
  _virtualPort->putc(GFX_F_gfx_TransparentColour);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  return GetAckResp();
}

void Diablo_Serial_4DLib::gfx_Triangle(word  X1, word  Y1, word  X2, word  Y2, word  X3, word  Y3, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_Triangle >> 8);
  _virtualPort->putc(GFX_F_gfx_Triangle);
  _virtualPort->putc(X1 >> 8);
  _virtualPort->putc(X1);
  _virtualPort->putc(Y1 >> 8);
  _virtualPort->putc(Y1);
  _virtualPort->putc(X2 >> 8);
  _virtualPort->putc(X2);
  _virtualPort->putc(Y2 >> 8);
  _virtualPort->putc(Y2);
  _virtualPort->putc(X3 >> 8);
  _virtualPort->putc(X3);
  _virtualPort->putc(Y3 >> 8);
  _virtualPort->putc(Y3);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

void Diablo_Serial_4DLib::gfx_TriangleFilled(word  X1, word  Y1, word  X2, word  Y2, word  X3, word  Y3, word  Color)
{
  _virtualPort->putc(GFX_F_gfx_TriangleFilled >> 8);
  _virtualPort->putc(GFX_F_gfx_TriangleFilled);
  _virtualPort->putc(X1 >> 8);
  _virtualPort->putc(X1);
  _virtualPort->putc(Y1 >> 8);
  _virtualPort->putc(Y1);
  _virtualPort->putc(X2 >> 8);
  _virtualPort->putc(X2);
  _virtualPort->putc(Y2 >> 8);
  _virtualPort->putc(Y2);
  _virtualPort->putc(X3 >> 8);
  _virtualPort->putc(X3);
  _virtualPort->putc(Y3 >> 8);
  _virtualPort->putc(Y3);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  GetAck();
}

word Diablo_Serial_4DLib::img_ClearAttributes(word  Handle, word  Index, word  Value)
{
  _virtualPort->putc(GFX_F_img_ClearAttributes >> 8);
  _virtualPort->putc(GFX_F_img_ClearAttributes);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  _virtualPort->putc(Value >> 8);
  _virtualPort->putc(Value);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_Darken(word  Handle, word  Index)
{
  _virtualPort->putc(GFX_F_img_Darken >> 8);
  _virtualPort->putc(GFX_F_img_Darken);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_Disable(word  Handle, word  Index)
{
  _virtualPort->putc(GFX_F_img_Disable >> 8);
  _virtualPort->putc(GFX_F_img_Disable);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_Enable(word  Handle, word  Index)
{
  _virtualPort->putc(GFX_F_img_Enable >> 8);
  _virtualPort->putc(GFX_F_img_Enable);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_GetWord(word  Handle, word  Index, word  Offset )
{
  _virtualPort->putc(GFX_F_img_GetWord >> 8);
  _virtualPort->putc(GFX_F_img_GetWord);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  _virtualPort->putc(Offset  >> 8);
  _virtualPort->putc(Offset );
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_Lighten(word  Handle, word  Index)
{
  _virtualPort->putc(GFX_F_img_Lighten >> 8);
  _virtualPort->putc(GFX_F_img_Lighten);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_SetAttributes(word  Handle, word  Index, word  Value)
{
  _virtualPort->putc(GFX_F_img_SetAttributes >> 8);
  _virtualPort->putc(GFX_F_img_SetAttributes);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  _virtualPort->putc(Value >> 8);
  _virtualPort->putc(Value);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_SetPosition(word  Handle, word  Index, word  Xpos, word  Ypos)
{
  _virtualPort->putc(GFX_F_img_SetPosition >> 8);
  _virtualPort->putc(GFX_F_img_SetPosition);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  _virtualPort->putc(Xpos >> 8);
  _virtualPort->putc(Xpos);
  _virtualPort->putc(Ypos >> 8);
  _virtualPort->putc(Ypos);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_SetWord(word  Handle, word  Index, word  Offset , word  Word)
{
  _virtualPort->putc(GFX_F_img_SetWord >> 8);
  _virtualPort->putc(GFX_F_img_SetWord);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  _virtualPort->putc(Offset  >> 8);
  _virtualPort->putc(Offset );
  _virtualPort->putc(Word >> 8);
  _virtualPort->putc(Word);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_Show(word  Handle, word  Index)
{
  _virtualPort->putc(GFX_F_img_Show >> 8);
  _virtualPort->putc(GFX_F_img_Show);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  return GetAckResp();
}

word Diablo_Serial_4DLib::img_Touched(word  Handle, word  Index)
{
  _virtualPort->putc(GFX_F_img_Touched >> 8);
  _virtualPort->putc(GFX_F_img_Touched);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(Index >> 8);
  _virtualPort->putc(Index);
  return GetAckResp();
}

word Diablo_Serial_4DLib::media_Flush()
{
  _virtualPort->putc(GFX_F_media_Flush >> 8);
  _virtualPort->putc(GFX_F_media_Flush);
  return GetAckResp();
}

void Diablo_Serial_4DLib::media_Image(word  X, word  Y)
{
  _virtualPort->putc(GFX_F_media_Image >> 8);
  _virtualPort->putc(GFX_F_media_Image);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  GetAck();
}

word Diablo_Serial_4DLib::media_Init()
{
  _virtualPort->putc(GFX_F_media_Init >> 8);
  _virtualPort->putc(GFX_F_media_Init);
  return GetAckResp();
}

word Diablo_Serial_4DLib::media_RdSector(GFX_t4DSector  SectorIn)
{
  _virtualPort->putc(GFX_F_media_RdSector >> 8);
  _virtualPort->putc(GFX_F_media_RdSector);
  return GetAckResSector(SectorIn);
}

word Diablo_Serial_4DLib::media_ReadByte()
{
  _virtualPort->putc(GFX_F_media_ReadByte >> 8);
  _virtualPort->putc(GFX_F_media_ReadByte);
  return GetAckResp();
}

word Diablo_Serial_4DLib::media_ReadWord()
{
  _virtualPort->putc(GFX_F_media_ReadWord >> 8);
  _virtualPort->putc(GFX_F_media_ReadWord);
  return GetAckResp();
}

void Diablo_Serial_4DLib::media_SetAdd(word  HiWord, word  LoWord)
{
  _virtualPort->putc(GFX_F_media_SetAdd >> 8);
  _virtualPort->putc(GFX_F_media_SetAdd);
  _virtualPort->putc(HiWord >> 8);
  _virtualPort->putc(HiWord);
  _virtualPort->putc(LoWord >> 8);
  _virtualPort->putc(LoWord);
  GetAck();
}

void Diablo_Serial_4DLib::media_SetSector(word  HiWord, word  LoWord)
{
  _virtualPort->putc(GFX_F_media_SetSector >> 8);
  _virtualPort->putc(GFX_F_media_SetSector);
  _virtualPort->putc(HiWord >> 8);
  _virtualPort->putc(HiWord);
  _virtualPort->putc(LoWord >> 8);
  _virtualPort->putc(LoWord);
  GetAck();
}

void Diablo_Serial_4DLib::media_Video(word  X, word  Y)
{
  _virtualPort->putc(GFX_F_media_Video >> 8);
  _virtualPort->putc(GFX_F_media_Video);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  GetAck();
}

void Diablo_Serial_4DLib::media_VideoFrame(word  X, word  Y, word  Framenumber)
{
  _virtualPort->putc(GFX_F_media_VideoFrame >> 8);
  _virtualPort->putc(GFX_F_media_VideoFrame);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Framenumber >> 8);
  _virtualPort->putc(Framenumber);
  GetAck();
}

word Diablo_Serial_4DLib::media_WriteByte(word  Byte)
{
  _virtualPort->putc(GFX_F_media_WriteByte >> 8);
  _virtualPort->putc(GFX_F_media_WriteByte);
  _virtualPort->putc(Byte >> 8);
  _virtualPort->putc(Byte);
  return GetAckResp();
}

word Diablo_Serial_4DLib::media_WriteWord(word  Word)
{
  _virtualPort->putc(GFX_F_media_WriteWord >> 8);
  _virtualPort->putc(GFX_F_media_WriteWord);
  _virtualPort->putc(Word >> 8);
  _virtualPort->putc(Word);
  return GetAckResp();
}

word Diablo_Serial_4DLib::media_WrSector(GFX_t4DSector  SectorOut)
{
  _virtualPort->putc(GFX_F_media_WrSector >> 8);
  _virtualPort->putc(GFX_F_media_WrSector);
  WriteBytes(SectorOut, 512);
  return GetAckResp();
}

word Diablo_Serial_4DLib::mem_Free(word  Handle)
{
  _virtualPort->putc(GFX_F_mem_Free >> 8);
  _virtualPort->putc(GFX_F_mem_Free);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResp();
}

word Diablo_Serial_4DLib::mem_Heap()
{
  _virtualPort->putc(GFX_F_mem_Heap >> 8);
  _virtualPort->putc(GFX_F_mem_Heap);
  return GetAckResp();
}

word Diablo_Serial_4DLib::peekM(word  Address)
{
  _virtualPort->putc(GFX_F_peekM >> 8);
  _virtualPort->putc(GFX_F_peekM);
  _virtualPort->putc(Address >> 8);
  _virtualPort->putc(Address);
  return GetAckResp() ;
}

word Diablo_Serial_4DLib::pin_HI(word Pin)
{
  _virtualPort->putc(GFX_F_pin_HI >> 8);
  _virtualPort->putc(GFX_F_pin_HI);
  _virtualPort->putc(Pin >> 8);
  _virtualPort->putc(Pin);
  return GetAckResp() ;
}

word Diablo_Serial_4DLib::pin_LO(word Pin)
{
  _virtualPort->putc(GFX_F_pin_LO >> 8);
  _virtualPort->putc(GFX_F_pin_LO);
  _virtualPort->putc(Pin >> 8);
  _virtualPort->putc(Pin);
  return GetAckResp() ;
}

word Diablo_Serial_4DLib::pin_Read(word Pin)
{
  _virtualPort->putc(GFX_F_pin_Read >> 8);
  _virtualPort->putc(GFX_F_pin_Read);
  _virtualPort->putc(Pin >> 8);
  _virtualPort->putc(Pin);
  return GetAckResp() ;
}

word Diablo_Serial_4DLib::pin_Set(word Mode, word Pin)
{
  _virtualPort->putc(GFX_F_pin_Set >> 8);
  _virtualPort->putc(GFX_F_pin_Set);
  _virtualPort->putc(Mode >> 8);
  _virtualPort->putc(Mode);
  _virtualPort->putc(Pin >> 8);
  _virtualPort->putc(Pin);
  return GetAckResp() ;
}

void Diablo_Serial_4DLib::pokeM(word  Address, word  WordValue)
{
  _virtualPort->putc(GFX_F_pokeM >> 8);
  _virtualPort->putc(GFX_F_pokeM);
  _virtualPort->putc(Address >> 8);
  _virtualPort->putc(Address);
  _virtualPort->putc(WordValue >> 8);
  _virtualPort->putc(WordValue);
  GetAck() ;
}

void Diablo_Serial_4DLib::putCH(word  WordChar)
{
  _virtualPort->putc(GFX_F_putCH >> 8);
  _virtualPort->putc(GFX_F_putCH);
  _virtualPort->putc(WordChar >> 8);
  _virtualPort->putc(WordChar);
  GetAck() ;
}

word Diablo_Serial_4DLib::putstr(char *  InString)
{
  _virtualPort->putc(GFX_F_putstr >> 8);
  _virtualPort->putc(GFX_F_putstr);
  WriteChars(InString);
  return GetAckResp();
}

//-----------------print----------------------------------

void Diablo_Serial_4DLib::print(const string &s)
{
    int len = s.length();
    //char arr[len + 1];
    //s.toCharArray(arr,len + 1);
    //putstr(arr);
    for(int x=0; x<len; x++)
    {
        putCH(s[x]);
    }
}

void Diablo_Serial_4DLib::print(const char str[])
{
  int len = strlen(str);
  for(int x = 0; x<len; x++)
  {
    putCH(str[x]);
  }
}

void Diablo_Serial_4DLib::print(char c)
{
  putCH(c);
}

void Diablo_Serial_4DLib::print(unsigned char b, int base)
{
  print((unsigned long) b, base);
}

void Diablo_Serial_4DLib::print(int n, int base)
{
  print((long) n, base);
}

void Diablo_Serial_4DLib::print(unsigned int n, int base)
{
  print((unsigned long) n, base);
}

void Diablo_Serial_4DLib::print(long n, int base)
{

  if (base == 10) 
  {
    if (n < 0) 
    {
      //int t = print('-');
      putCH('-');
      n = -n;
      printNumber(n, 10);
    }
    else
    {
    printNumber(n, 10);
    }
  } 
  else 
  {
    printNumber(n, base);
  }

}

void Diablo_Serial_4DLib::print(unsigned long n, int base)
{
  printNumber(n, base);
}

void Diablo_Serial_4DLib::print(double n, int digits)
{
  printFloat(n, digits);
}


//println
/*
void Diablo_Serial_4DLib::println(const __FlashStringHelper *ifsh)
{
  print(ifsh);
  putCH('\n');
  putCH('\r');
}
*/
void Diablo_Serial_4DLib::println(const string &s)
{
  print(s);
  putCH('\n');
  putCH('\r');
}

void Diablo_Serial_4DLib::println(const char c[])
{
  print(c);
  putCH('\n');
  putCH('\r');
}

void Diablo_Serial_4DLib::println(char c)
{
 // print(string(c);
  putCH('\n');
  putCH('\r');
}

void Diablo_Serial_4DLib::println(unsigned char b, int base)
{
  print((unsigned char)b, base);
  putCH('\n');
  putCH('\r');
}

void Diablo_Serial_4DLib::println(int num, int base)
{
  print((int)num, base);
  putCH('\n');
  putCH('\r');
}

void Diablo_Serial_4DLib::println(unsigned int num, int base)
{
  print((unsigned int)num, base);
  putCH('\n');
  putCH('\r');
}

void Diablo_Serial_4DLib::println(long num, int base)
{
  print((long)num, base);
  putCH('\n');
  putCH('\r');
}

void Diablo_Serial_4DLib::println(unsigned long num, int base)
{
  print((unsigned long)num, base);
  putCH('\n');
  putCH('\r');
}

void Diablo_Serial_4DLib::println(double num, int digits)
{
  print((double)num, digits);
  putCH('\n');
  putCH('\r');
}


//-Private:

void Diablo_Serial_4DLib::printNumber(unsigned long n, uint8_t base) {
  char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
  int count = 0;
  do {
    unsigned long m = n;
    n /= base;
    char c = m - base * n;
    buf[count] = c < 10 ? c + '0' : c + 'A' - 10;
    count++;
  } while(n);
  
  for(int x = count - 1; x>=0; x--)
  {
    putCH(buf[x]);
  }
}

void Diablo_Serial_4DLib::printFloat(double number, uint8_t digits) 
{ 
  //size_t n = 0;
  if (isnan(number)) print("nan"); 
  else if (isinf(number)) print("inf"); 
  else if (number > 4294967040.0) print ("ovf");  // constant determined empirically
  else if (number <-4294967040.0) print ("ovf");  // constant determined empirically
  else{
  // Handle negative numbers
  if (number < 0.0)
  {
     putCH('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  //print((unsigned long)int_part);
  printNumber(int_part, 10);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0) {
    putCH('.'); 
  }

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    printNumber((unsigned long)toPrint, 10);
    remainder -= toPrint; 
  } 
  }
}


//--------------------------------------------------------

void Diablo_Serial_4DLib::snd_BufSize(word  Bufsize)
{
  _virtualPort->putc(GFX_F_snd_BufSize >> 8);
  _virtualPort->putc(GFX_F_snd_BufSize);
  _virtualPort->putc(Bufsize >> 8);
  _virtualPort->putc(Bufsize);
  GetAck();
}

void Diablo_Serial_4DLib::snd_Continue()
{
  _virtualPort->putc(GFX_F_snd_Continue >> 8);
  _virtualPort->putc(GFX_F_snd_Continue);
  GetAck();
}

void Diablo_Serial_4DLib::snd_Pause()
{
  _virtualPort->putc(GFX_F_snd_Pause >> 8);
  _virtualPort->putc(GFX_F_snd_Pause);
  GetAck();
}

word Diablo_Serial_4DLib::snd_Pitch(word  Pitch)
{
  _virtualPort->putc(GFX_F_snd_Pitch >> 8);
  _virtualPort->putc(GFX_F_snd_Pitch);
  _virtualPort->putc(Pitch >> 8);
  _virtualPort->putc(Pitch);
  return GetAckResp();
}

word Diablo_Serial_4DLib::snd_Playing()
{
  _virtualPort->putc(GFX_F_snd_Playing >> 8);
  _virtualPort->putc(GFX_F_snd_Playing);
  return GetAckResp();
}

void Diablo_Serial_4DLib::snd_Stop()
{
  _virtualPort->putc(GFX_F_snd_Stop >> 8);
  _virtualPort->putc(GFX_F_snd_Stop);
  GetAck();
}

void Diablo_Serial_4DLib::snd_Volume(word  Volume)
{
  _virtualPort->putc(GFX_F_snd_Volume >> 8);
  _virtualPort->putc(GFX_F_snd_Volume);
  _virtualPort->putc(Volume >> 8);
  _virtualPort->putc(Volume);
  GetAck();
}

word Diablo_Serial_4DLib::sys_Sleep(word  Units)
{
  _virtualPort->putc(GFX_F_sys_Sleep >> 8);
  _virtualPort->putc(GFX_F_sys_Sleep);
  _virtualPort->putc(Units >> 8);
  _virtualPort->putc(Units);
  return GetAckResp();
}

void Diablo_Serial_4DLib::touch_DetectRegion(word  X1, word  Y1, word  X2, word  Y2)
{
  _virtualPort->putc(GFX_F_touch_DetectRegion >> 8);
  _virtualPort->putc(GFX_F_touch_DetectRegion);
  _virtualPort->putc(X1 >> 8);
  _virtualPort->putc(X1);
  _virtualPort->putc(Y1 >> 8);
  _virtualPort->putc(Y1);
  _virtualPort->putc(X2 >> 8);
  _virtualPort->putc(X2);
  _virtualPort->putc(Y2 >> 8);
  _virtualPort->putc(Y2);
  GetAck();
}

word Diablo_Serial_4DLib::touch_Get(word  Mode)
{
  _virtualPort->putc(GFX_F_touch_Get >> 8);
  _virtualPort->putc(GFX_F_touch_Get);
  _virtualPort->putc(Mode >> 8);
  _virtualPort->putc(Mode);
  return GetAckResp();
}

void Diablo_Serial_4DLib::touch_Set(word  Mode)
{
  _virtualPort->putc(GFX_F_touch_Set >> 8);
  _virtualPort->putc(GFX_F_touch_Set);
  _virtualPort->putc(Mode >> 8);
  _virtualPort->putc(Mode);
  GetAck();
}

word Diablo_Serial_4DLib::txt_Attributes(word  Attribs)
{
  _virtualPort->putc(GFX_F_txt_Attributes >> 8);
  _virtualPort->putc(GFX_F_txt_Attributes);
  _virtualPort->putc(Attribs >> 8);
  _virtualPort->putc(Attribs);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_BGcolour(word  Color)
{
  _virtualPort->putc(GFX_F_txt_BGcolour >> 8);
  _virtualPort->putc(GFX_F_txt_BGcolour);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_Bold(word  Bold)
{
  _virtualPort->putc(GFX_F_txt_Bold >> 8);
  _virtualPort->putc(GFX_F_txt_Bold);
  _virtualPort->putc(Bold >> 8);
  _virtualPort->putc(Bold);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_FGcolour(word  Color)
{
  _virtualPort->putc(GFX_F_txt_FGcolour >> 8);
  _virtualPort->putc(GFX_F_txt_FGcolour);
  _virtualPort->putc(Color >> 8);
  _virtualPort->putc(Color);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_FontID(word  FontNumber)
{
  _virtualPort->putc(GFX_F_txt_FontID >> 8);
  _virtualPort->putc(GFX_F_txt_FontID);
  _virtualPort->putc(FontNumber >> 8);
  _virtualPort->putc(FontNumber);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_Height(word  Multiplier)
{
  _virtualPort->putc(GFX_F_txt_Height >> 8);
  _virtualPort->putc(GFX_F_txt_Height);
  _virtualPort->putc(Multiplier >> 8);
  _virtualPort->putc(Multiplier);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_Inverse(word  Inverse)
{
  _virtualPort->putc(GFX_F_txt_Inverse >> 8);
  _virtualPort->putc(GFX_F_txt_Inverse);
  _virtualPort->putc(Inverse >> 8);
  _virtualPort->putc(Inverse);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_Italic(word  Italic)
{
  _virtualPort->putc(GFX_F_txt_Italic >> 8);
  _virtualPort->putc(GFX_F_txt_Italic);
  _virtualPort->putc(Italic >> 8);
  _virtualPort->putc(Italic);
  return GetAckResp();
}

void Diablo_Serial_4DLib::txt_MoveCursor(word  Line, word  Column)
{
  _virtualPort->putc(GFX_F_txt_MoveCursor >> 8);
  _virtualPort->putc(GFX_F_txt_MoveCursor);
  _virtualPort->putc(Line >> 8);
  _virtualPort->putc(Line);
  _virtualPort->putc(Column >> 8);
  _virtualPort->putc(Column);
  GetAck();
}

word Diablo_Serial_4DLib::txt_Opacity(word  TransparentOpaque)
{
  _virtualPort->putc(GFX_F_txt_Opacity >> 8);
  _virtualPort->putc(GFX_F_txt_Opacity);
  _virtualPort->putc(TransparentOpaque >> 8);
  _virtualPort->putc(TransparentOpaque);
  return GetAckResp();
}

void Diablo_Serial_4DLib::txt_Set(word  Func, word  Value)
{
  _virtualPort->putc(GFX_F_txt_Set >> 8);
  _virtualPort->putc(GFX_F_txt_Set);
  _virtualPort->putc(Func >> 8);
  _virtualPort->putc(Func);
  _virtualPort->putc(Value >> 8);
  _virtualPort->putc(Value);
  GetAck();
}

word Diablo_Serial_4DLib::txt_Underline(word  Underline)
{
  _virtualPort->putc(GFX_F_txt_Underline >> 8);
  _virtualPort->putc(GFX_F_txt_Underline);
  _virtualPort->putc(Underline >> 8);
  _virtualPort->putc(Underline);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_Width(word  Multiplier)
{
  _virtualPort->putc(GFX_F_txt_Width >> 8);
  _virtualPort->putc(GFX_F_txt_Width);
  _virtualPort->putc(Multiplier >> 8);
  _virtualPort->putc(Multiplier);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_Wrap(word  Position)
{
  _virtualPort->putc(GFX_F_txt_Wrap >> 8);
  _virtualPort->putc(GFX_F_txt_Wrap);
  _virtualPort->putc(Position >> 8);
  _virtualPort->putc(Position);
  return GetAckResp();
}

word Diablo_Serial_4DLib::txt_Xgap(word  Pixels)
{
  _virtualPort->putc(GFX_F_txt_Xgap >> 8);
  _virtualPort->putc(GFX_F_txt_Xgap);
  _virtualPort->putc(Pixels >> 8);
  _virtualPort->putc(Pixels);
  return GetAckResp() ;
}

word Diablo_Serial_4DLib::txt_Ygap(word  Pixels)
{
  _virtualPort->putc(GFX_F_txt_Ygap >> 8);
  _virtualPort->putc(GFX_F_txt_Ygap);
  _virtualPort->putc(Pixels >> 8);
  _virtualPort->putc(Pixels);
  return GetAckResp() ;
}

word Diablo_Serial_4DLib::file_CallFunction(word  Handle, word  ArgCount, GFX_t4DWordArray  Args)
{
  _virtualPort->putc(GFX_F_file_CallFunction >> 8);
  _virtualPort->putc(GFX_F_file_CallFunction);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  _virtualPort->putc(ArgCount >> 8);
  _virtualPort->putc(ArgCount);
  WriteWords(Args, ArgCount);
  return GetAckResp();
}

word Diablo_Serial_4DLib::sys_GetModel(char *  ModelStr)
{
  _virtualPort->putc(GFX_F_sys_GetModel >> 8);
  _virtualPort->putc(GFX_F_sys_GetModel);
  return GetAckResStr(ModelStr);
}

word Diablo_Serial_4DLib::sys_GetVersion()
{
  _virtualPort->putc(GFX_F_sys_GetVersion >> 8);
  _virtualPort->putc(GFX_F_sys_GetVersion);
  return GetAckResp();
}

word Diablo_Serial_4DLib::sys_GetPmmC()
{
  _virtualPort->putc(GFX_F_sys_GetPmmC >> 8);
  _virtualPort->putc(GFX_F_sys_GetPmmC);
  return GetAckResp();
}

word Diablo_Serial_4DLib::writeString(word  Handle, char *  StringOut)
{
  _virtualPort->putc(GFX_F_writeString >> 8);
  _virtualPort->putc(GFX_F_writeString);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  WriteChars(StringOut) ;
  return GetAckResp() ;
}

word Diablo_Serial_4DLib::readString(word  Handle, char *  StringIn)
{
  _virtualPort->putc(GFX_F_readString >> 8);
  _virtualPort->putc(GFX_F_readString);
  _virtualPort->putc(Handle >> 8);
  _virtualPort->putc(Handle);
  return GetAckResStr(StringIn);
}

void Diablo_Serial_4DLib::blitComtoDisplay(word  X, word  Y, word  Width, word  Height, GFX_t4DByteArray  Pixels)
{
  _virtualPort->putc(GFX_F_blitComtoDisplay >> 8);
  _virtualPort->putc(GFX_F_blitComtoDisplay);
  _virtualPort->putc(X >> 8);
  _virtualPort->putc(X);
  _virtualPort->putc(Y >> 8);
  _virtualPort->putc(Y);
  _virtualPort->putc(Width >> 8);
  _virtualPort->putc(Width);
  _virtualPort->putc(Height >> 8);
  _virtualPort->putc(Height);
  WriteBytes(Pixels, Width*Height*2);
  GetAck() ;
}

word Diablo_Serial_4DLib::file_FindFirstRet(char *  Filename, char *  StringIn)
{
  _virtualPort->putc(GFX_F_file_FindFirstRet >> 8) ;
  _virtualPort->putc(GFX_F_file_FindFirstRet) ;
  WriteChars(Filename) ;
  return GetAckResStr(StringIn) ;
}

word Diablo_Serial_4DLib::file_FindNextRet(char *  StringIn)
{
  _virtualPort->putc(GFX_F_file_FindNextRet >> 8) ;
  _virtualPort->putc(GFX_F_file_FindNextRet) ;
  return GetAckResStr(StringIn) ;
}

void Diablo_Serial_4DLib::setbaudWait(word  Newrate)
{
  _virtualPort->putc(GFX_F_setbaudWait >> 8);
  _virtualPort->putc(GFX_F_setbaudWait);
  _virtualPort->putc(Newrate >> 8);
  _virtualPort->putc(Newrate);
  SetThisBaudrate(Newrate); // change this systems baud rate to match new display rate, ACK is 100ms away
  GetAck() ;
}