Lecture # 11
Programmable Peripheral Interface (PPI)
Programmable Peripheral Interface (PPI) Device Used as Parallel port Interface (I/O controller) is PPI
Programmable Peripheral Interface (PPI) CPU Parallel I/O Device Printer PPI
Accessing the Parallel Port Through BIOS Functions
Accessing the Parallel Port Through BIOS Functions INT 17H Services 00 Display Characters 01 Initialize Printer 02 Request Printer DX register Port Interface Number 0=LPT1,1=LPT2,2=LPT3
Accessing the Parallel Port Through BIOS Functions All the function Return in AH the Current Printer Status 7 6 5 4 3 2 1 Time out Printer Busy Receive Mode Selected Out of Paper Transfer Error Printer OffLine
Accessing the Parallel Port Through BIOS Functions Time Out Byte 0040:0078 LPT1 0040:0079 LPT2 0040:007A LPT3
Accessing the Parallel Port Through BIOS Functions Specify the number of Attempts BIOS perform before giving a time out Error This byte Varies Depending upon the speed of the PC Busy =0 Printer is Busy Busy =1 Printer is not Busy
Importance of the Status Byte
Importance of the Status Byte If((pstate&0x29)!=0)or ((pstate&0x80)==0) or ((pstate&0x10)==0) {printerok=FALSE;} else {printerok=TRUE;}
Importance of the Status Byte 17H/00H Write a character on entry AH=00 AL=ASCII code DX=Interface# On exit AH=Status Byte 17H/01H Initialize Printer on entry AH=01 DX=Interface# On exit AH=Status Byte 17H/02H Get Printer Status on entry AH=02, DX=Interface# On exit AH=Status Byte
Printing Program
Printing Program REGS regs; FILE *fptr; void main(void) { fptr=fopen(“c:\\temp\\abc.text”,”rb”); regs.h.ah=1; regs.x.dx=0; int86(0x17,®s,®s); while(!feof(fptr)) {regs.h.ah=2; if ((regs.h.ah & 0x80)==0x80) { regs.h.ah=0; regs.h.al=getc(fptr); }}}
Printing Program 1 #include <dos.h> void interrupt (*old)( ); void interrupt newint ( ); main( ) { old = getvect(0x17); setvect(0x17,newint); keep(0,1000); } void interrupt new () { if (_AH==0) if ((_AL>='A')&&(_AL<='Z')) return; (*old)();
Printing Program 2 #include <dos.h> void interrupt (*old)( ); void interrupt newfunc ( ); main( ) { old=getvect(0x17); setvect(0x17,newfunc); keep(0,1000); } void interrupt newfunc( ) if (_AH==0) if ( _AL != ‘ ‘ ) (*old)();
Printing Program 3 void interrupt (*old)( ); void interrupt newfunc ( ); main() { old=getvect(0x17); setvect(0x17,newfunc); keep(0,1000); } void interrupt newfunc ( ) { if ( _AH == 0 ) { (*old)(); _AH=0; else Printing Program 3
Direct Parallel Port Programming
Direct Parallel Port Programming BIOS support up to three parallel ports Address of these LPT ports is Stored in BIOS Data Area 40:08 word LPT1 40:0A LPT2 40:0C LPT3 40:0E LPT4
Direct Parallel Port Programming Dump File Text
Direct Parallel Port Programming unsigned int far * lpt = (unsigned int far *) 0x00400008 ; unsigned int temp; temp=*(lpt); *lpt=*(lpt + 1); *(lpt + 1)=temp;
Direct Parallel Port Programming Port Registers 40:08 store the base address for lpt1 The parallel port interface has 3 ports internally If the Base address is 0X378 then the three Ports will be 0x378,0x379 0x37A
Printer Data Port Base +0 = Data Port 7 6 5 4 3 2 1
Printer Status Register Base + 1 = Printer Status 7 6 5 4 3 2 1 0 Busy=0 ACK=0 PE=1 SL=1 ERR=0 Out of Paper Printer Online Printer is ready for Next Character Printer is Busy
Printer Control Register Printer Control Register = Base + 2 7 6 5 4 3 2 1 IRQ SI IN ALF ST IRQ ENABLE initialize Auto Line Field Execute Interrupt When ACK=0; STROB SELECT InLine Turn Computer on line
Direct Parallel Port Programming file *fptr; unsigned far *base=(unsigned int far *)0x00400008 void main ( ) { fptr=fopen(“c:\\abc.txt”,”rb”); while( ! feof (fptr) ) { if(( inport (*base + 1 ) & 0x80) == 0x80) outport(*base, getc(fptr)); outport((*base)+2, inport((*base+2) & 0xFE); outport((*base)+2, inport((*base+2) | 0x01); } }}