#include #define Uses_EPP #include "utils.h" TEppPort::TEppPort() { statusPort = checkPort(); } TEppPort::~TEppPort() { } int TEppPort::checkPort() { unsigned ports[3] = {0x3BC, 0x378, 0x278}; unsigned temp_port = 0x3FF; unsigned epp_port = 0x3FF; int status; for ( int i = 0; i < 3; i++ ) { if ( portExist(ports[i]) ) { temp_port = ports[i]; initPort(ports[i]); if ( (status = isEPP()) == stsNormal ) return stsNormal; // EPP connected else if ( status == stsNotConnect ) epp_port = ports[i]; // EPP but not connected } } if ( temp_port == 0x3FF ) return stsNotFound; // No port found if ( epp_port == 0x3FF ) { // Not EPP port initPort(temp_port); return stsNotEPP; } initPort(epp_port); // EPP without connection return stsNotConnect; } int TEppPort::portExist(unsigned port) { outp(port, 0x55); if ( inp(port) != 0x55 ) return FALSE; outp(port, 0xAA); if ( inp(port) != 0xAA ) return FALSE; return TRUE; } int TEppPort::isEPP() { outp(SppStatus, 1); if ( (inp(SppStatus) & 1) ) return stsNotEPP; // not a EPP port outp(EppAddress, 0); if ( (inp(SppStatus) & 1) ) return stsNotConnect; // no connection return stsNormal; // found EPP and connection OK } void TEppPort::initPort(unsigned base) { baseAddress = base; EppData8 = base + EPP_DATA; EppData16 = base + EPP_DATA16; EppData32 = base + EPP_DATA32; EppAddress = base + EPP_ADDRESS; SppData = base + SPP_DATA; SppControl = base + SPP_CONTROL; SppStatus = base + SPP_STATUS; EcpEcrReg = base + ECR_REG; unsigned data = inp(EcpEcrReg); outp(EcpEcrReg, ((data & 0x1F) | 0x80)); data = inp(SppControl); outp(SppControl, (data & 0xF4)); } int TEppPort::portStatus() { return statusPort; } unsigned TEppPort::portBase() { return baseAddress; } void TEppPort::writeAddress(uchar addr) { outp(EppAddress, addr); } uchar TEppPort::readAddress() { return inp(EppAddress); } void TEppPort::writeData(uchar addr, uchar data) { outp(EppAddress, addr); outp(EppData8, data); } void TEppPort::writeData(uchar addr, ushort data) { outp(EppAddress, addr); outpw(EppData16, data); } void TEppPort::writeData(uchar data) { outp(EppData8, data); } void TEppPort::writeData(ushort data) { outpw(EppData16, data); } void TEppPort::writeData(uchar addr, uchar far *data, ushort nbytes) { outp(EppAddress, addr); /* unsigned port = EppData8; int nwords = nbytes / 2; asm { mov cx,nwords mov dx,port lds si,data rep outsw } */ ushort *p = (ushort *) data; for ( int i = 0; i < nbytes/2; i++ ) outpw(EppData16, p[i]); } void TEppPort::writeData(uchar far *data, ushort nbytes) { /* unsigned port = EppData8; int nwords = nbytes / 2; asm { mov cx,nwords mov dx,port lds si,data rep outsw } */ ushort *p = (ushort *) data; for ( int i = 0; i < nbytes/2; i++ ) outpw(EppData16, p[i]); } uchar TEppPort::readDataByte() { return inp(EppData8); } uchar TEppPort::readDataByte(uchar addr) { outp(EppAddress, addr); return inp(EppData8); } ushort TEppPort::readDataWord() { return inpw(EppData16); } ushort TEppPort::readDataWord(uchar addr) { outp(EppAddress, addr); return inpw(EppData16); } void TEppPort::readData(uchar addr, uchar far *data, ushort nbytes ) { outp(EppAddress, addr); /* unsigned port = EppData8; int nwords = nbytes / 2; asm { mov cx,nwords mov dx,port les di,data rep insw } */ ushort *p = (ushort *) data; for ( int i = 0; i < nbytes/2; i++ ) p[i] = inpw(EppData16); } int TEppPort::cmpData(uchar addr, uchar far *data, ushort nbytes ) { outp(EppAddress, addr); /* unsigned port = EppData8; int nwords = nbytes / 2; asm { mov cx,nwords mov dx,port les di,data rep insw } */ ushort *p = (ushort *) data; int nerrs=0; for ( int i = 0; i < nbytes/2; i++ ) if (p[i] != inpw(EppData16)) nerrs++; return nerrs; } void TEppPort::readData(uchar far *data, ushort nbytes ) { /* unsigned port = EppData8; int nwords = nbytes / 2; asm { mov cx,nwords mov dx,port les di,data rep insw } */ ushort *p = (ushort *) data; for ( int i = 0; i < nbytes/2; i++ ) p[i] = inpw(EppData16); }