merge mappers from FCEU-mm
[fceu.git] / boards / __serial.c
diff --git a/boards/__serial.c b/boards/__serial.c
new file mode 100644 (file)
index 0000000..3b48240
--- /dev/null
@@ -0,0 +1,124 @@
+\r
+#include "__serial.h"\r
+\r
+HANDLE SerialPort = NULL;  // Handle of SerialPort itself.\r
+\r
+BOOL SerialOpen(int port, int baud)\r
+{\r
+  HANDLE Comport;\r
+  DCB myDCB;\r
+  COMMTIMEOUTS CTout;\r
+  char str[100];\r
+\r
+  if (port > 9)\r
+    sprintf(str, "\\\\.\\COM%d", port);\r
+  else\r
+    sprintf(str, "COM%d", port);\r
+\r
+  // Open the serial port\r
+  if ((Comport = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)\r
+    return FALSE;\r
+\r
+  // Configure Serial port (Setup Comm)\r
+\r
+  // Buffer sizes\r
+  if (!SetupComm(Comport, 128, 128))\r
+    return FALSE;\r
+\r
+  // Setup DCB using current values\r
+  if (!GetCommState(Comport, &myDCB))\r
+    return FALSE;\r
+\r
+  myDCB.fInX = FALSE;     // Turn off xon/xoff handler\r
+  myDCB.fOutX = FALSE;\r
+  myDCB.fOutxDsrFlow = FALSE;\r
+  myDCB.fOutxCtsFlow = FALSE;    // no hardware flow control.\r
+  myDCB.BaudRate = baud;\r
+  myDCB.DCBlength = sizeof(DCB);\r
+  myDCB.fBinary = 1;\r
+  myDCB.fParity = 0;\r
+  myDCB.fDtrControl = DTR_CONTROL_DISABLE;\r
+  myDCB.fDsrSensitivity = 0;\r
+  myDCB.fTXContinueOnXoff = 1;\r
+  myDCB.fNull = 0;\r
+  myDCB.fRtsControl = RTS_CONTROL_DISABLE;\r
+  myDCB.fDummy2 = 0;\r
+  myDCB.wReserved = 0;\r
+  myDCB.Parity = NOPARITY;\r
+  myDCB.StopBits = ONESTOPBIT;\r
+  myDCB.wReserved1 = 0;\r
+  myDCB.ByteSize = 8;\r
+\r
+  if (!SetCommState(Comport, &myDCB))\r
+       return FALSE;\r
+\r
+  // Set timeouts\r
+  CTout.ReadIntervalTimeout = 0xffffffff;\r
+  CTout.ReadTotalTimeoutMultiplier = 0;\r
+  CTout.ReadTotalTimeoutConstant = 0;\r
+  CTout.WriteTotalTimeoutMultiplier = 0;\r
+  CTout.WriteTotalTimeoutConstant = 5000;         // don't hang if CTS is locked, for example\r
+\r
+  SetCommTimeouts(Comport, &CTout);\r
+  EscapeCommFunction(Comport, SETDTR);\r
+  PurgeComm(Comport, PURGE_TXCLEAR | PURGE_RXCLEAR);\r
+\r
+  SerialPort = Comport;\r
+\r
+  return TRUE;\r
+}\r
+\r
+void SerialClose(void)\r
+{\r
+  if (SerialPort == NULL) return;\r
+\r
+  PurgeComm(SerialPort, PURGE_TXCLEAR | PURGE_RXCLEAR);\r
+  CloseHandle(SerialPort);\r
+\r
+  SerialPort = NULL;\r
+}\r
+\r
+BOOL SerialSendChar(int c)\r
+{\r
+  DWORD cr;\r
+  if(WriteFile(SerialPort, &c, 1, (LPDWORD)&cr, NULL) && cr)\r
+    return TRUE;\r
+  else\r
+    return FALSE;\r
+}\r
+\r
+int SerialIsOpen(void)\r
+{\r
+  return (SerialPort != NULL);\r
+}\r
+\r
+int SerialGetChar(void)\r
+{\r
+  uint8 ch;\r
+  DWORD cr;\r
+  if (SerialPort != NULL) {\r
+    if (ReadFile(SerialPort, &ch, 1, (LPDWORD)&cr, NULL) && cr)\r
+      return (int)ch;\r
+  }\r
+  return EOF;\r
+}\r
+\r
+void SendCmd(uint8 *cmd, int size)\r
+{\r
+   int i;\r
+   for(i=0; i<size; i++) {\r
+     SerialSendChar(cmd[i]);\r
+   }\r
+}\r
+\r
+int ReadResp(uint8 *resp, int size)\r
+{\r
+   int i = 0, sum = 0, data;\r
+   while(i < size) {\r
+          while ((data = SerialGetChar()) == EOF) {}\r
+       resp[i] = data & 0xff;\r
+       sum += (data & 0xff);\r
+       i++;\r
+   }\r
+   return sum;\r
+}\r