//===========================================================================// // File: L4Serial.hh // // Project: MUNGA Brick: Platform-specific IO // // Contents: PC serial interface class // //---------------------------------------------------------------------------// // Date Who Modification // // -------- --- -----------------------------------------------------------// // 01/04/95 CPB Initial coding. // //---------------------------------------------------------------------------// // Copyright (C) 1994, Virtual World Entertainment, Inc. // // All Rights reserved worldwide // // This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL // //===========================================================================// #if !defined(L4SERIAL_HPP) # define L4SERIAL_HPP # if !defined(STYLE_HPP) # include # endif // WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING // Do NOT change ANY of the following lines without making // corresponding changes in PCSerial.asm! PCSerial.hh exists // ONLY to inform C++ compilers of the data and structures // used by PCSerial.asm! // WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING // These are purposely grouped as two parameters in one equate. // The standard PC COM ports ALWAYS use these combinations. #define PCS_COM1 0x3F8,0x0C // portAddress,interruptNumber #define PCS_COM2 0x2F8,0x0B #define PCS_COM3 0x3E8,0X0C #define PCS_COM4 0x2E8,0x0B // Data rates #define PCS_300 0x0180 // 300 Baud #define PCS_1200 0x0060 // 1200 Baud #define PCS_2400 0x0030 // 2400 Baud #define PCS_9600 0x000C // 9600 Baud #define PCS_19P2 0x0006 // 19200 Baud #define PCS_38P4 0x0003 // 38400 Baud #define PCS_115K 0x0001 // 115,200 Baud (not supported on all PC's) // Data formats #define PCS5D 0x0000 // 5 data bits #define PCS6D 0x0001 // 6 data bits #define PCS7D 0x0002 // 7 data bits #define PCS8D 0x0003 // 8 data bits #define PCS1S 0x0000 // one stop bit #define PCS2S 0x0004 // two stop bits #define PCSNP 0x0000 // no parity #define PCSOP 0x0008 // odd parity #define PCSEP 0x0018 // even parity #define PCSMP 0x0028 // mark parity (untested) #define PCSSP 0x0038 // space parity (untested) // some popular combinations- #define PCS_N81 (PCS8D|PCS1S|PCSNP) // no parity, 8 data, 1 stop #define PCS_E81 (PCS8D|PCS1S|PCSEP) // even parity, 8 data, 1 stop #define PCS_O81 (PCS8D|PCS1S|PCSOP) // odd parity, 8 data, 1 stop // Flow control // #define PCS_NOFLOWCTRL 0x0000 // no flow control // error bits returned by PC_Serial::Errors() #define PCS_ERR_OVERRUN 0x0002 #define PCS_ERR_PARITY 0x0004 #define PCS_ERR_FRAMING 0x0008 #define PCS_ERR_BREAK 0x0010 #define PCS_ERR_ALLOC 0x0100 // failed at slot allocation #define PCS_ERR_INIT 0x0200 // failed DPMI initialization #define PCS_ERR_TXOVER 0x0400 // overran transmit buffer #define PCS_ERR_RXOVER 0x0500 // overran receive buffer // bits returned by PC_Serial::ModemStatus() // (1st four bits not defined yet, but non-zero) #define PCS_MS_CTS 0x0010 #define PCS_MS_DSR 0x0020 #define PCS_MS_RI 0x0040 #define PCS_MS_DCD 0x0080 class PCSerial; extern "C" void PCSerialInit( PCSerial *pc_serial, Word data_rate, Word data_format, Word port, Word irq_num ); extern "C" int PCSerialTerm( PCSerial *pc_serial ); extern "C" int PCSerialReceive( PCSerial *pc_serial, char *destination, int destination_length ); extern "C" void PCSerialSend( PCSerial *pc_serial, char *source, int source_length ); extern "C" int PCSerialErrors( PCSerial *pc_serial ); extern "C" int PCSerialActive( PCSerial *pc_serial ); extern "C" int PCSerialTestInstance( PCSerial *pc_serial ); extern "C" int PCSerialIsSignatureBad( const volatile PCSerial *pc_serial ); extern "C" int PCSerialReceiveCount( PCSerial *pc_serial ); extern "C" int PCSerialTransmitCount( PCSerial *pc_serial ); extern "C" void PCSerialSetRate( PCSerial *pc_serial, Word rate ); extern "C" void PCSerialSetDataFormat( PCSerial *pc_serial, Word format ); extern "C" void PCSerialFlowControl( PCSerial *pc_serial, int enable ); extern "C" int PCSerialModemStatus( PCSerial *pc_serial ); class PCSerial { public: PCSerial(Word rate, Word format, Word port, Word int_num) { PCSerialInit(this, rate, format, port, int_num); } ~PCSerial() { if (this == NULL) { cout << "~PCSerial has been passed a NULL pointer\n"; } else { PCSerialTerm(this); } } Logical TestInstance() { return PCSerialTestInstance(this); } int ReceiveString(char *destPtr, int maxLen) // returns length { return PCSerialReceive(this, destPtr, maxLen); } void FlowControlEnable(Logical onOff) { PCSerialFlowControl(this, (int) onOff); } void SendString(char *srcPtr, int length) { PCSerialSend(this, srcPtr, length); } // error bits returned by PCSerial::Errors() enum ErrorBits { overrunError=0x0002, parityError=0x0004, framingError=0x0008, breakDetect=0x0010, initError=0x0100 }; int ReceiveCharCount() { return PCSerialReceiveCount(this); } int TransmitCharCount() { return PCSerialTransmitCount(this); } int Errors() // returns error value, clears it { return PCSerialErrors(this); } int IsActive() { return PCSerialActive(this); } int ModemStatus() { return PCSerialModemStatus(this); } # if defined(USE_SIGNATURE) friend int Is_Signature_Bad(const volatile PCSerial *ptr) { return PCSerialIsSignatureBad(ptr); } # endif // protected: Word portBase; Word errorValue; Byte enabled; Byte txFlow; Byte flowOverride; LWord intDataPtr; LWord hackCount; // This is for INTERNAL USE only (reflects structure in .ASM file) struct PCSerBuf { Word head, tail, count; Byte data[1024]; } txBuf, rxBuf; }; #endif