Serial library for Diablo4D. Tested with uLCD220RD
Diff: Diablo_Serial_4DLib.cpp
- Revision:
- 0:81cd913c5e43
- Child:
- 1:9a2c573adad6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Diablo_Serial_4DLib.cpp Tue May 09 14:16:16 2017 +0000 @@ -0,0 +1,2037 @@ +/* + Diablo_Serial_4DLib.cpp - Library for 4D Systems Serial Environment. + */ + +#include "Diablo_Serial_4DLib.h" + +/* +volatile unsigned long _millis; + +void init_clock(void) { + SysTick_Config(SystemCoreClock / 1000); +} + +extern "C" void SysTick_Handler(void) { + _millis++; +} + +unsigned long get_millis(void) { + return _millis; +} +*/ + +Diablo_Serial_4DLib::Diablo_Serial_4DLib(Serial *virtualPort, int timeout4D) { + _virtualPort = virtualPort; + TimeLimit4D = timeout4D; + //_timer.reset(); + //_timer.start(); +} +/* +unsigned long Diablo_Serial_4DLib::GetMillis(void){ + return (unsigned long)_timer.read_ms(); +} +*/ +//*********************************************************************************************// +//**********************************Intrinsic 4D Routines**************************************// +//*********************************************************************************************// + +void Diablo_Serial_4DLib::WriteGFX(word req){ + _virtualPort->putc(req >> 8); + _virtualPort->putc(req); +} + +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() ; +}