1 / 45

System Programming

NFC-IET-2011 . System Programming. Lecture-10 Hardware Programming Dated: April 18, 2011 By Somia Razzaq Note: Some slides and images of following lecture are taken from VU. Parallel Ports (PPI). Output. D0. D1. D2. CPU. D7. Busy. Strobe. Parallel Communication.

tricia
Download Presentation

System Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. NFC-IET-2011 System Programming Lecture-10 Hardware Programming Dated: April 18, 2011 By SomiaRazzaq Note: Some slides and images of following lecture are taken from VU

  2. Parallel Ports (PPI)

  3. Output D0 D1 D2 CPU D7 Busy Strobe Parallel Communication Parallel Out Put Device

  4. Parallel Communication Input D0 D1 D2 Parallel Input Device CPU D7 DR I/O Controller CPU

  5. Parallel Communication • Faster • Only Economically Feasible For Small Distances

  6. Programmable Peripheral Interface (PPI)

  7. Programmable Peripheral Interface (PPI) • Device Used as Parallel port Interface (I/O controller) is PPI

  8. Programmable Peripheral Interface (PPI) Parallel I/O Device Printer CPU PPI

  9. Accessing the Parallel Port Through BIOS Functions

  10. Accessing the Parallel Port Through BIOS Functions All the function Return in AH the Current Printer Status Time out Printer Busy Receive Mode Selected Out of Paper Transfer Error Printer OffLine

  11. Accessing the Parallel Port Through BIOS Functions

  12. 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

  13. Importance of the Status Byte The status of the printer can be used in the above described manner to check if the printer can perform printing or not

  14. Importance of the Status Byte If((pstate&0x29)!=0)or ((pstate&0x80)==0) or ((pstate&0x10)==0) {printerok=FALSE;} else {printerok=TRUE;}

  15. Importance of the Status Byte In case there is a transfer error , the printer is out of paper or there is a timeout the printer could not be accessed or if the printer is busy or if the printer is offline

  16. Importance of the Status Byte 17H/01H Initialize Printer on entry AH=01 DX=Interface# On exit AH=Status Byte 17H/00H Write a character on entry AH=00 AL=ASCII code DX=Interface# On exit AH=Status Byte 17H/02H Get Printer Status on entry AH=02, DX=Interface# On exit AH=Status Byte

  17. Printing Program

  18. REGS regs; FILE *fptr; void main(void) { fptr=fopen(“c:\\temp\\abc.text”,”rb”); regs.h.ah=1; regs.x.dx=0; int86(0x17,&regs,&regs); while(!feof(fptr)) {regs.h.ah=2; regs.x.dx=0; int86(0x17,&regs,&regs); if ((regs.h.ah & 0x80)==0x80) { regs.h.ah=0; regs.h.al=getc(fptr); int86(0x17,&regs,&regs); }}} Printing Program

  19. 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)(); }

  20. 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)(); }

  21. 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; (*old)(); _AH=0; (*old)(); } else (*old)(); } Printing Program 3

  22. Direct Parallel Port Programming

  23. Direct Parallel Port Programming • BIOS support up to three parallel ports • Address of these LPT ports is Stored in BIOS Data Area

  24. Direct Parallel Port Programming Dump File Text

  25. Direct Parallel Port Programming unsigned int far * lpt = (unsigned int far *) 0x00400008 ; unsigned int temp; temp=*(lpt); *lpt=*(lpt + 1); *(lpt + 1)=temp;

  26. Direct Parallel Port ProgrammingPort 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

  27. Printer Data Port Base +0 = Data Port

  28. Printer Status Register Base + 1 = Printer Status 7 6 5 4 3 2 1 0 Out of Paper Printer Online Printer is ready for Next Character Printer is Busy

  29. Printer Control Register Printer Control Register = Base + 2 initialize IRQ ENABLE Auto Line Field STROB Execute Interrupt When ACK=0; SELECT InLine Turn Computer on line

  30. 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) // printer idle { outport(*base, getc(fptr)); //to activate strobe signal outport((*base)+2, inport((*base+2) & 0xFE); // strobe signal 0 outport((*base)+2, inport((*base+2) | 0x01); //strobe signal 1 } }}

  31. Printer Interface Printer Interface ACK (now printer is free) PIC INT IRQ7 Printer

  32. To enable the interrupt 0x0f three things are required to be done1.The interrupt should be enabled in the printer control register2. Secondly it should also be unmasked in the IMR in PIC3.The program can then intercept or set the vector of interrupt 0x0f by placing the address of its function newint();

  33. Interrupt Driven Printer I/O char buf [1024]; inti = 0; void interrupt (*oldint)( ); void interrupt newint (); void main (void) { outport(( *lpt), inport( *lpt) | 4);//printer is initialized outport(( *lpt), inport( *lpt) | 0x10);//here printer interrupt is initialized oldint =getvect (0x0F); setvect (0x0F, newint); outport(0x21, inport( 0x21) & 0x7F); keep(0,1000); }

  34. void interrupt newint ( ) { outport( *lpt, Buf[ i]); outport(( *lpt)+2, inport(( *lpt)+2) &0xFE); outport(( *lpt)+2, inport(( *lpt)+2) | 1); i++; if( i== 1024) { // in PIC mask register address is 0x21 and 0x80 is used to unmask the IRQ7. It means interrupt through IRQ7 can be generated outport(0x21, inport(0x21)|0x80); setvect(0x0F,oldint); freemem(_psp); //program Segment Prefix macro } }

  35. //Program to take print at background#include <stdio.h>#include <dos.h>#include <bios.h>#include <conio.h>#include <stdlib.h>void interrupt (*oldint)();void interrupt newint();unsigned int far * lpt = (unsigned int far *)0x00400008;char st[80]= "this is a test print string !!!!!!!!!!!";inti ;void main (){oldint = getvect(0x08);setvect(0x08,newint); keep(0,1000);}

  36. void interrupt newint(){ if ((( inport((*lpt) +1)) & 0x80) == 0x80) {outport (*lpt,st[i++]);outport ((*lpt)+2, inport((*lpt)+2) & 0xfe);outport ((*lpt)+2, inport((*lpt)+2) | 1); } if (i==32) {setvect (0x08,oldint);freemem(_psp); } (*oldint) ();}

  37. Printer Cable Connectivity

  38. Computer to Computer Connectivity

  39. P0 2 15 Q3 P1 3 13 Q4 P2 4 12 Q5 P3 5 10 Q6 P4 6 11 Q7 Q3 15 2 P0 Q4 13 3 P1 Q5 12 4 P2 Q6 10 5 P3 Q7 11 6 P4

  40. D4 D3 D2 D1 D0 Sender Sender sends LOW Nibble and D4 = 0 received as BUSY = 1 Receiver BUSY ACK PE SLC ER E7 E6 E5 E4 E3

  41. BUSY ACK PE SLC ER Sender Receiver send back LOW Nibble and D4=0 received as BUSY = 1 by Sender Receiver D4 D3 D2 D1 D0

  42. D4 D3 D2 D1 D0 Sender Sender sends Hi Nibble and turns D4 = 1 received as BUSY = 0 by Receiver Receiver BUSY ACK PE SLC ER

  43. BUSY ACK PE SLC ER Sender Receiver send back Hi Nibble and turns D4 = 1 received as BUSY = 0 by Sender Receiver D4 D3 D2 D1 D0

More Related