/*=========================================================================== 说明: wanjun@2004.9 编程环境:DOS Borland C++3.0 适用于WIN1000,WIN3000,win6000机型 相关咨询: 青岛中科英泰科技有限公司 Any Question Please Mail to Weiwanjun@wintec.com.cn ===========================================================================*/ /*=========================================================================== 顾客显示器,钱箱函数库 ===========================================================================*/ #include #include #include #include #include #include #include #include #include #define WAITIME 3000 #define DBUF 0 //发送器保持寄存器 #define LSB 0 //波特率因子(LSB) #define MSB 0x1 //波特率因子(MSB) #define IER 0x1 //中断允许寄存器 #define IIR 0x2 //中断标识寄存器 #define LCR 0x3 //线路控制寄存器 #define MCR 0x4 //MODEM控制寄存器 #define LSR 0x5 //线路状态寄存器 #define MSR 0x6 //MODEM状态寄存器 #define PCI_Config_Address 0x0cf8 #define PCI_Config_Data 0x0cfc #define BYTE unsigned char #define WORD unsigned int #define DWORD unsigned long #define TRUE 1 #define FALSE 0 BYTE Number0; //by wanjun struct config_header /* This is PCI configuration space data, detail in file OXPCI954ds.pdf page 15 */ { WORD DeviceID; /* 0x00 */ WORD VendorID; WORD Command; /* 0x04 */ WORD Status; DWORD ClassCode_RevisionID; /* 0x08 */ WORD Reserved1; /* 0x0C */ BYTE HeaderType; BYTE BIST; DWORD BADR[4]; /* 0x10 .. 0x1C */ DWORD Reserved2[3]; /* 0x20 .. 0x28 */ WORD SubsystemID; /* 0x2C */ WORD SubsystemVendorID; DWORD Reserved3; DWORD Cap_Ptr; /* 0x34 */ DWORD Resered4; BYTE InterruptLine; BYTE InterruptPin; WORD Reserved5; BYTE Cap_ID; BYTE Next_Ptr; WORD PMC; WORD PMCSR; WORD Reserved6; }; unsigned portaddress[8]={0x3f8,0x2f8,0x3e8,0x2e8,0xdc00,0xdc08,0x9010,0x9018}; //COM1 COM2 COM3 COM4 COM5(A)COM6(B)COM7(C)COM8(D); unsigned draweraddress[2]={0xe005,0xe01d}; void _outpd(WORD port, DWORD value) /* 32 bit ouput function */ { _DX=port; _EAX= value; __emit__ (0x66, 0xef); }; DWORD _inpd(WORD port) /* 32 bit input function */ { _DX=port; __emit__ (0x66, 0xed); return(_EAX); }; struct config_header *PCIConfigHeader; /* define a pointer for PCI configuration */ int FindCardAddress(WORD *addr, BYTE *irq, WORD *a_cfg) { DWORD buffer[18]; WORD DeviceNumber, FunctionNumber; WORD BusNumber, RegisterNumber; DWORD temp; WORD h; for(BusNumber=0; BusNumber<256; BusNumber++) { for(DeviceNumber=0; DeviceNumber<32; DeviceNumber++) { for(FunctionNumber=0; FunctionNumber<8; FunctionNumber++) { temp=0x80000000L; temp=temp+((DWORD)FunctionNumber<<8) + ((DWORD)DeviceNumber<<11) + ((DWORD)BusNumber<<16); _outpd(PCI_Config_Address, temp); temp=_inpd(PCI_Config_Data); if(temp!=0x0ffffffff) { h = 0; for(RegisterNumber=0; RegisterNumber<=0x44; RegisterNumber+=4) { temp=0x80000000L + (DWORD)RegisterNumber + ((DWORD)FunctionNumber<<8) + ((DWORD)DeviceNumber<<11) + ((DWORD)BusNumber<<16); _outpd(PCI_Config_Address, temp); buffer[h]=_inpd(PCI_Config_Data); h++; } if (buffer[0]==0x95011415) { (DWORD *)PCIConfigHeader = buffer; *addr = (WORD)(PCIConfigHeader->BADR[0] - 1); /* Serial port base address */ *irq = (BYTE)PCIConfigHeader->InterruptLine; /* Serial port interrupt */ *a_cfg = (WORD)(PCIConfigHeader->BADR[2] - 1); /* PCI configuratuin base address */ return TRUE; } } } } } return FALSE; } //函数:GetSerPortAddress //功能:读取串口卡的地址 void GetSerPortAddress(void) { WORD a,a_c; BYTE i; int cc;//by wanjun cc=FindCardAddress(&a, &i, &a_c); if (cc == 1) { if (i < 8) { Number0 = 0x08 + i; /* Interrupt vector */ } else { // Number0 = 0x070 + (i - 0x08); /* Interrupt vector */ }; portaddress[4]=a; portaddress[5]=a+0x08; portaddress[6]=a+0x10; portaddress[7]=a+0x18; draweraddress[0]=a_c+0x05; draweraddress[1]=a_c+0x1d; } } //函数: SendChToCustdis //功能: 向客显端口输出字符 //参数: iPt:客显端口,1:COM1,2:COM2,3:COM3,4:COM4 // c:要输出的字符 //返回: 1:正常输出;-1:超时 int SendChToCustdis(int iPt,char c) { int i=0; do { i++; if(i==WAITIME) break; } while (!(inportb(portaddress[iPt-1]+LSR) & 0x20)); if(i8) || (iTransType<1) || (iTransType>4) || //by wanjun (iCurrencyType<1) || (iCurrencyType>3) ) return -1; CD109_CLS(iPt); //"多谢惠顾" if(iTransType==4) strcpy(buffer,"\x1f\x50\x02"); else strcpy(buffer,"\x1f\x50\x01"); iRes=SendStrToCustdis(iPt,buffer,3); // 显示交易类型(单价/合计/收款/找零) sprintf(buffer,"\x1b\x73%c",iTransType); iRes=SendStrToCustdis(iPt,buffer,3); // 显示币种 sprintf(buffer,"\x1f\x73%c",iCurrencyType); iRes=SendStrToCustdis(iPt,buffer,3); //显示金额 iRes=CD109_DisStr(iPt,strAmount); return iRes; } //函数: OPENDRAWER //功能: 打开钱箱 WIN1000主板 //参数: 无 //返回: 无 void OpenDrawer(void) { outportb(0x220,0); delay(200); outportb(0x220,1); } //函数: CheckDrawerStatus //功能: 检查钱箱状态 WIN1000主板 //参数: 无 //返回: 1:关闭 0:打开 int CheckDrawerStatus(void) { int iRes; if(inp(0x220)&0x01) iRes=1; else iRes=0; return iRes; } //函数: OpenMBDrawer //功能: 打开由主板控制的钱箱 WIN3000主板和WIN6000主板 //参数: 无 void OPENDRAWER(void) { GetSerPortAddress(); outport(draweraddress[0],0x08); //outport(0x9405,0x28); BY WANJUN OLD IS 9405 delay(200); //outport(0x9405,0x34); outport(draweraddress[0],0x34); } //函数:CheckMBDrawerStatus //功能:检查由主板控制的钱箱状态 WIN3000和WIN6000 //参数:无 //返回:1:钱箱关闭;0:钱箱打开. int CheckMBDrawerStatus(void) { int iRes; GetSerPortAddress(); if(inp(draweraddress[1])&(0x08)) iRes=0; else iRes=1; return iRes; } main() { OPENDRAWER(); CD109_Init(5); CD109_Trans(5,1,1,"123.12"); }