Annotation of uae/src/od-win32/parser.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * UAE - The Un*x Amiga Emulator
                      3:  *
                      4:  * Not a parser, but parallel and serial emulation for Win32
                      5:  *
                      6:  * Copyright 1997 Mathias Ortmann
                      7:  */
                      8: 
                      9: #ifdef __GNUC__
                     10: #define __int64 long long
                     11: #include "machdep/winstuff.h"
                     12: #else
                     13: #include <windows.h>
                     14: #include <ddraw.h>
                     15: #include <stdlib.h>
                     16: #include <stdarg.h>
                     17: #include <commctrl.h>
                     18: #include <commdlg.h>
                     19: #include <stdio.h>
                     20: #include <fcntl.h>
                     21: #include <sys/stat.h>
                     22: #include <io.h>
                     23: #endif
                     24: 
                     25: #include "config.h"
                     26: #include "sysconfig.h"
                     27: #include "sysdeps.h"
                     28: 
                     29: #include "options.h"
                     30: #include "gensound.h"
                     31: #include "sounddep/sound.h"
                     32: #include "events.h"
                     33: #include "uae.h"
                     34: #include "include/memory.h"
                     35: #include "custom.h"
                     36: #include "osdep/win32gui.h"
                     37: #include "osdep/win32.h"
                     38: 
                     39: #define PRTBUFSIZE 1024
                     40: UINT prttimer;
                     41: char prtbuf[PRTBUFSIZE];
                     42: int prtbufbytes;
                     43: HANDLE hPrt = INVALID_HANDLE_VALUE;
                     44: extern HWND hAmigaWnd;
                     45: 
                     46: void flushprtbuf (void)
                     47: {
                     48:     DWORD written;
                     49: 
                     50:     if (hPrt == INVALID_HANDLE_VALUE)
                     51:        hPrt = CreateFile (prtname, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, NULL);
                     52:     if (hPrt == INVALID_HANDLE_VALUE)
                     53:        hPrt = CreateFile (prtname, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
                     54: 
                     55:     if (hPrt != INVALID_HANDLE_VALUE)
                     56:        WriteFile (hPrt, prtbuf, prtbufbytes, &written, 0);
                     57: 
                     58:     prtbufbytes = 0;
                     59: }
                     60: 
                     61: void finishjob (void)
                     62: {
                     63:     flushprtbuf ();
                     64:     if (hPrt != INVALID_HANDLE_VALUE) {
                     65:        CloseHandle (hPrt);
                     66:        hPrt = INVALID_HANDLE_VALUE;
                     67:     }
                     68:     KillTimer (hAmigaWnd, prttimer);
                     69:     prttimer = 0;
                     70: }
                     71: 
                     72: void putprinter (char val)
                     73: {
                     74:     PostMessage (hAmigaWnd, WM_USER + 0x200, val, 0);
                     75: }
                     76: 
                     77: void DoSomeWeirdPrintingStuff (WPARAM wParam)
                     78: {
                     79:     if (prttimer)
                     80:        KillTimer (hAmigaWnd, prttimer);
                     81:     if (prtbufbytes < PRTBUFSIZE) {
                     82:        prtbuf[prtbufbytes++] = wParam;
                     83:        prttimer = SetTimer (hAmigaWnd, 1, 2000, NULL);
                     84:     } else {
                     85:        flushprtbuf ();
                     86:        *prtbuf = wParam;
                     87:        prtbufbytes = 1;
                     88:        prttimer = 0;
                     89:     }
                     90: }
                     91: 
                     92: static HANDLE hCom = INVALID_HANDLE_VALUE;
                     93: static HANDLE writeevent;
                     94: static DCB dcb;
                     95: 
                     96: char inbuf[1024], outbuf[1024];
                     97: int inptr, inlast, outlast;
                     98: 
                     99: int openser (char *sername)
                    100: {
                    101:     char buf[32];
                    102:     COMMTIMEOUTS CommTimeOuts;
                    103: 
                    104:     sprintf (buf, "\\.\\\\%s", sername);
                    105: 
                    106:     if (!(writeevent = CreateEvent (NULL, TRUE, FALSE, NULL))) {
                    107:        write_log ("Failed to create serial event!\n");
                    108:        return 0;
                    109:     }
                    110:     if ((hCom = CreateFile (buf, GENERIC_READ | GENERIC_WRITE,
                    111:                            0,
                    112:                            NULL,
                    113:                            OPEN_EXISTING,
                    114:                            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
                    115:                            NULL)) != INVALID_HANDLE_VALUE) {
                    116:        SetCommMask (hCom, EV_RXFLAG);
                    117:        SetupComm (hCom, 4096, 4096);
                    118:        PurgeComm (hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
                    119:        CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
                    120:        CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
                    121:        CommTimeOuts.ReadTotalTimeoutConstant = 0;
                    122:        CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
                    123:        CommTimeOuts.WriteTotalTimeoutConstant = 0;
                    124:        SetCommTimeouts (hCom, &CommTimeOuts);
                    125: 
                    126:        GetCommState (hCom, &dcb);
                    127: 
                    128:        dcb.BaudRate = 9600;
                    129:        dcb.ByteSize = 8;
                    130:        dcb.Parity = 0;
                    131:        dcb.StopBits = NOPARITY;
                    132: 
                    133:        dcb.fOutxCtsFlow = TRUE;
                    134:        dcb.fOutxDsrFlow = FALSE;
                    135:        dcb.fDtrControl = DTR_CONTROL_ENABLE;
                    136:        dcb.fTXContinueOnXoff = FALSE;
                    137:        dcb.fOutX = FALSE;
                    138:        dcb.fInX = FALSE;
                    139:        dcb.fNull = FALSE;
                    140:        dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
                    141:        dcb.fAbortOnError = FALSE;
                    142: 
                    143:        if (SetCommState (hCom, &dcb)) {
                    144:            MyOutputDebugString ("Using %s\n", sername);
                    145:            return 1;
                    146:        }
                    147:        CloseHandle (hCom);
                    148:        hCom = INVALID_HANDLE_VALUE;
                    149:     }
                    150:     return 0;
                    151: }
                    152: 
                    153: void closeser (void)
                    154: {
                    155:     if (hCom != INVALID_HANDLE_VALUE) {
                    156:        CloseHandle (hCom);
                    157:        hCom = INVALID_HANDLE_VALUE;
                    158:     }
                    159: }
                    160: 
                    161: void doserout (void)
                    162: {
                    163:     DWORD dwErrorFlags;
                    164:     unsigned long actual;
                    165:     OVERLAPPED ol =
                    166:     {0};
                    167: 
                    168:     if (hCom != INVALID_HANDLE_VALUE) {
                    169:        if (outlast) {
                    170:            ResetEvent (ol.hEvent = writeevent);
                    171: 
                    172:            actual = 0;
                    173:            if (!WriteFile (hCom, outbuf, outlast, &actual, &ol)) {
                    174:                while (outlast -= actual) {
                    175:                    if ((dwErrorFlags = GetLastError ()) == ERROR_IO_INCOMPLETE || dwErrorFlags == ERROR_IO_PENDING) {
                    176:                        actual = 0;
                    177:                        GetOverlappedResult (hCom, &ol, &actual, FALSE);
                    178: 
                    179:                        if ((dwErrorFlags = GetLastError ()) != ERROR_IO_INCOMPLETE && dwErrorFlags != ERROR_IO_PENDING) {
                    180:                            MyOutputDebugString ("writeser: error %d, lost %d chars!\n", GetLastError (), outlast - actual);
                    181:                            outlast = 0;
                    182:                            break;
                    183:                        }
                    184:                        if (WaitForSingleObject (writeevent, 1000) == WAIT_TIMEOUT) {
                    185:                            MyOutputDebugString ("writeser: timeout, lost %d chars!\n", outlast - actual);
                    186:                            outlast = 0;
                    187:                            break;
                    188:                        }
                    189:                    } else {
                    190:                        if (dwErrorFlags) {
                    191:                            MyOutputDebugString ("writeser: error %d while writing, lost %d chars!\n", dwErrorFlags, outlast - actual);
                    192:                            ClearCommError (hCom, &dwErrorFlags, NULL);
                    193:                        }
                    194:                        outlast = 0;
                    195:                        break;
                    196:                    }
                    197:                }
                    198:            }
                    199:        }
                    200:     } else {
                    201:        outlast = 0;
                    202:        inptr = inlast = 0;
                    203:     }
                    204: }
                    205: 
                    206: void writeser (char c)
                    207: {
                    208:     outbuf[outlast++] = c;
                    209:     if (outlast == sizeof outbuf)
                    210:        doserout ();
                    211: }
                    212: 
                    213: int readser (char *buffer)
                    214: {
                    215:     COMSTAT ComStat;
                    216:     DWORD dwErrorFlags;
                    217:     DWORD result;
                    218:     unsigned long actual;
                    219:     OVERLAPPED ol =
                    220:     {0};
                    221: 
                    222:     if (inptr < inlast) {
                    223:        *buffer = inbuf[inptr++];
                    224:        return 1;
                    225:     }
                    226:     if (hCom != INVALID_HANDLE_VALUE) {
                    227:        inptr = inlast = 0;
                    228: 
                    229:        /* only try to read number of bytes in queue */
                    230:        ClearCommError (hCom, &dwErrorFlags, &ComStat);
                    231:        if (ComStat.cbInQue) {
                    232:            if (!ReadFile (hCom, inbuf, min (ComStat.cbInQue, sizeof inbuf), &inlast, &ol)) {
                    233:                if (GetLastError () == ERROR_IO_PENDING) {
                    234:                    write_log ("readser: INTERNAL ERROR - intermittent loss of serial data!\n");
                    235:                    for (;;) {
                    236:                        actual = 0;
                    237:                        result = GetOverlappedResult (hCom, &ol, &actual, TRUE);
                    238:                        inlast += actual;
                    239: 
                    240:                        if (result)
                    241:                            break;
                    242: 
                    243:                        if (GetLastError () != ERROR_IO_INCOMPLETE) {
                    244:                            ClearCommError (hCom, &dwErrorFlags, &ComStat);
                    245:                            break;
                    246:                        }
                    247:                    }
                    248:                } else
                    249:                    ClearCommError (hCom, &dwErrorFlags, &ComStat);
                    250:            }
                    251:        }
                    252:        if (inptr < inlast) {
                    253:            *buffer = inbuf[inptr++];
                    254:            return 1;
                    255:        }
                    256:     }
                    257:     return 0;
                    258: }
                    259: 
                    260: void getserstat (int *status)
                    261: {
                    262:     DWORD stat;
                    263: 
                    264:     *status = 0;
                    265: 
                    266:     if (hCom != INVALID_HANDLE_VALUE) {
                    267:        GetCommModemStatus (hCom, &stat);
                    268: #if 0
                    269:        /* ouch */
                    270:        if (stat & MS_RLSD_ON)
                    271:            *status |= TIOCM_CAR;
                    272:        if (stat & MS_DSR_ON)
                    273:            *status |= TIOCM_DSR;
                    274: #endif
                    275:     }
                    276: }
                    277: 
                    278: int setbaud (long baud)
                    279: {
                    280:     if (hCom != INVALID_HANDLE_VALUE) {
                    281:        if (GetCommState (hCom, &dcb)) {
                    282:            dcb.BaudRate = baud;
                    283:            if (!SetCommState (hCom, &dcb))
                    284:                MyOutputDebugString ("Error setting baud rate %d!\n", baud);
                    285:        } else
                    286:            write_log ("setbaud: internal error!\n");
                    287:     }
                    288:     return 0;
                    289: }
                    290: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.