#include"..\..\..\lib\8000e.h" #include void SetBaseAddress(WORD SlotNumber); #define PRNDELAY 100 #define NoError 0 #define SlotIdError 1 #define ReadIdError 2 #define NoInit8072 3 #define U1U2Error 4 extern int SlotAddr[]; int BaseAddress,PS_Data,PS_Status,PS_Control; int PS_A9A12,PS_LedH,PS_LedL,PS_S1S2; int V_A9A12[8], V_Control[8], V_LED[8]; int Is8072[8]={0,0,0,0,0,0,0,0}; //------------------------------------------------------------------- // SlotNumber : 0 ~ 7 // PrinterSocket : 0 --> select printer, others --> select Socket WORD Init8072(WORD SlotNumber) { int i,RetValue; BaseAddress=0; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); SetTi1Dir(0); // set Ti1 output SetTi1High(); // select Printer i=SlotAddr[SlotNumber]; RetValue=inportb(i); if (RetValue==0x30) { //8072_ID Match Is8072[SlotNumber]=1; V_Control[SlotNumber]=0x0c; V_A9A12[SlotNumber]=0x0c; V_LED[SlotNumber]=0; SetBaseAddress(SlotNumber); outportb(PS_A9A12,V_A9A12[SlotNumber]); outportb(PS_Control,V_Control[SlotNumber]); return(NoError); } else return(ReadIdError); } void SetBaseAddress(WORD SlotNumber) { PS_Data=SlotAddr[SlotNumber]+4; PS_Status=PS_Data+1; PS_Control=PS_Data+2; PS_A9A12=PS_Data+3; PS_LedH=PS_Control; PS_LedL=PS_A9A12; PS_S1S2=PS_A9A12; } //------------------------------------------------------------------- WORD ShowLed8072(WORD SlotNumber, WORD LedValue) { int h,l; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); if (!Is8072[SlotNumber]) return(NoInit8072); SetTi1High(); // select Printer V_LED[SlotNumber]=LedValue; h=LedValue&0xf0; l=LedValue&0x0f; l=l<<4; SetBaseAddress(SlotNumber); outportb(PS_A9A12,V_A9A12[SlotNumber]+l); outportb(PS_Control,V_Control[SlotNumber]+h); return(NoError); } //------------------------------------------------------------------- WORD ResetPrinter8072(WORD SlotNumber) { int h,l,k; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); if (!Is8072[SlotNumber]) return(NoInit8072); SetTi1High(); // select Printer h=(V_LED[SlotNumber])&0xf0; SetBaseAddress(SlotNumber); //outportb(PS_Control,h&0x0B); // reset printer //outportb(PS_Control,h); outportb(PS_Control,h|0x03); // select printer, init printer for ( l = 0 ; l < PRNDELAY*10 ; l++ ) k += l; outportb(PS_Control,h|0x07); // select printer for ( l = 0 ; l < PRNDELAY*10 ; l++ ) k += l; k=inportb(PS_Status); k=inportb(PS_Status); return(NoError); } //------------------------------------------------------------------- WORD ReadPrinterStatus8072(WORD SlotNumber, WORD *Status) { int h,l,k; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); if (!Is8072[SlotNumber]) return(NoInit8072); SetTi1High(); // select Printer h=(V_LED[SlotNumber])&0xf0; SetBaseAddress(SlotNumber); *Status=inportb(PS_Status); return(NoError); } WORD PrintChar8072(WORD SlotNumber, char ch) { int h; int j; int k, l; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); if (!Is8072[SlotNumber]) return(NoInit8072); SetTi1High(); // select Printer h=(V_LED[SlotNumber])&0xf0; SetBaseAddress(SlotNumber); outportb(PS_Data,ch); for ( j = 0 ; j < 30000 ; j++ ) if ( (inportb(PS_Status) & 0x80) == 0 ) break; for ( l = 0 ; l < PRNDELAY ; l++ ) k += l; //outportb(PS_Control,h+1); //outportb(PS_Control,h); /* outportb(PS_Control,h|0x05); for ( l = 0 ; l < PRNDELAY*2 ; l++ ) k += l; //delay(2); */ outportb(PS_Control,h|0x06); for ( l = 0 ; l < PRNDELAY*2 ; l++ ) k += l; outportb(PS_Control,h|0x07); return(NoError); } WORD PrintStr8072(WORD SlotNumber, char szBuf[]) { int h,i; int j; int k, l; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); if (!Is8072[SlotNumber]) return(NoInit8072); SetTi1High(); // select Printer h=(V_LED[SlotNumber])&0xf0; SetBaseAddress(SlotNumber); i=0; while(szBuf[i]) { outportb(PS_Data,szBuf[i]); for ( j = 0 ; j < 30000 ; j++ ) if ( (inportb(PS_Status) & 0x80) == 0 ) break; // outportb(PS_Control,h+1); // outportb(PS_Control,h); for ( l = 0 ; l < PRNDELAY ; l++ ) k += l; /* outportb(PS_Control,h|0x05); for ( l = 0 ; l < PRNDELAY*2 ; l++ ) k += l; //delay(2); */ outportb(PS_Control,h|0x06); for ( l = 0 ; l < PRNDELAY*2 ; l++ ) k += l; outportb(PS_Control,h|0x07); i++; } return(NoError); } //------------------------------------------------------------------- WORD ReadSramByte8072(WORD SlotNumber, WORD U1U2, DWORD dwAddress, char *ch) { int h,k,addr,AH,AM,AL,SA; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); if (!Is8072[SlotNumber]) return(NoInit8072); if ((U1U2!=1) && (U1U2 !=2)) return(U1U2Error); AL=dwAddress&0x7f; dwAddress=dwAddress>>7; AM=dwAddress&0xff; dwAddress=dwAddress>>8; AH=dwAddress&0x7f; // MSB=reset battery SetTi1High(); // select A9A12 h=(V_LED[SlotNumber])&0xf0; SetBaseAddress(SlotNumber); SA=SlotAddr[SlotNumber]; if (U1U2==1) k=9; else k=5; outportb(PS_A9A12,k+h); // S1=0, A9 = 1 SetTi1Low(); // select S256/S512 outportb(SA,AM); // set AM outportb(SA+1,AH); // set AH SetTi1High(); // select A9A12 outportb(PS_A9A12,k+h-1); // S1=0, A9 = 0 SetTi1Low(); // select S256/S512 addr=(AL&0x1f)+SA; disable(); if (AL&0x20) SetB1A5(1); else SetB1A5(0); if (AL&0x40) SetB1A6(1); else SetB1A6(0); (*ch)=inportb(addr); enable(); return(NoError); } WORD WriteSramByte8072(WORD SlotNumber, WORD U1U2, DWORD dwAddress, char ch) { int h,k,addr,AH,AM,AL,SA; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); if (!Is8072[SlotNumber]) return(NoInit8072); if ((U1U2!=1) && (U1U2 !=2)) return(U1U2Error); AL=dwAddress&0x7f; dwAddress=dwAddress>>7; AM=dwAddress&0xff; dwAddress=dwAddress>>8; AH=dwAddress&0x7f; // MSB=reset low_battery SetTi1High(); // select A9A12 h=(V_LED[SlotNumber])&0xf0; SetBaseAddress(SlotNumber); SA=SlotAddr[SlotNumber]; if (U1U2==1) k=9; else k=5; outportb(PS_A9A12,k+h); // S1=0, A9 = 1 SetTi1Low(); // select S256/S512 outportb(SA,AM); // set AM outportb(SA+1,AH); // set AH SetTi1High(); // select A9A12 outportb(PS_A9A12,k+h-1); // S1=0, A9 = 0 SetTi1Low(); // select S256/S512 addr=(AL&0x1f)+SA; disable(); if (AL&0x20) SetB1A5(1); else SetB1A5(0); if (AL&0x40) SetB1A6(1); else SetB1A6(0); outportb(addr,ch); enable(); return(NoError); } WORD ReadSramStatus8072(WORD SlotNumber, WORD U1U2, char *ch) { int h,k,addr,AH,AM,AL,SA; if ((SlotNumber <0) || (SlotNumber>7)) return(SlotIdError); if (!Is8072[SlotNumber]) return(NoInit8072); if ((U1U2!=1) && (U1U2 !=2)) return(U1U2Error); SetTi1High(); // select A9A12 h=(V_LED[SlotNumber])&0xf0; SetBaseAddress(SlotNumber); SA=SlotAddr[SlotNumber]; if (U1U2==1) k=9; else k=5; outportb(PS_A9A12,k+h); // S1=0, A9 = 1 SetTi1Low(); // select S256/S512 outportb(SA+1,0x80); // set MSB=1 to read low_battery (*ch)=(inportb(SA+2))&0x03; // 0=low battery, 1=battery ok SetTi1High(); // select A9A12 return(NoError); }