From: Erik Berglund Newsgroups: comp.os.msdos.djgpp Subject: Re: Interrupts on EPP-port Lines: 134 Message-ID: Date: Wed, 01 Mar 2000 17:14:11 GMT NNTP-Posting-Host: 194.237.157.157 X-Complaints-To: abuse AT telia DOT com X-Trace: newsb.telia.net 951930851 194.237.157.157 (Wed, 01 Mar 2000 18:14:11 CET) NNTP-Posting-Date: Wed, 01 Mar 2000 18:14:11 CET Organization: Telia Internet To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com David Hallberg write: > I'm having problem with getting my program to trigger on interrupts > from the parallel port (EPP-mode) > it works just fine when triggering from the timer, keyboard, and even > the networkcard (I have tried to switch IRQ between the networkcard and > the parallel port, but it still only trigger in the network card and not > the parallel port) > I have read the discussion from 1998 initialized by "Michel Gallant" > > about this, but could not find any final, working example. > > Code: > > #include > #include > #include > #include > #include > > //#define VECTOR 8 // Timer > #define VECTOR 9 // keyboard > //#define VECTOR 13 // LPT2 IRQ 5 > //#define VECTOR 15 // LPT1 IRQ 7 > > > #define SET_BIT(x, b) ((x) |= (1 << (b))) > #define CLEAR_BIT(x, b) ((x) &= ~(1 << (b))) > #define EPPADRESS 0x278 > > volatile int tics = 0; > unsigned int i, ii, inter = 0; > unsigned char regbyte, adr21; > unsigned long time1, time2; > > tic_handler() // Interrupthandler > { > tics++; > } > > int main() > { > _go32_dpmi_seginfo old_handler, new_handler; // Structs for > handler > > new_handler.pm_offset = (int)tic_handler; // give the > struct the new handler > new_handler.pm_selector = _go32_my_cs(); // and a pointer > to this code > > printf("\nGrabbing interrupts"); > // Reading old > handler > _go32_dpmi_get_protected_mode_interrupt_vector(VECTOR, > &old_handler); > > _go32_dpmi_allocate_iret_wrapper(&new_handler); // makes the > overhead for interrupthandeler > // Struct is the > new handler > _go32_dpmi_set_protected_mode_interrupt_vector(VECTOR, > &new_handler); > //_go32_dpmi_chain_protected_mode_interrupt_vector(VECTOR, > &new_handler); > > printf("\nStatusreg %#x", inportb(EPPADRESS + 1)); > printf("\nControlreg %#x", inportb(EPPADRESS + 2)); > > regbyte = inportb(EPPADRESS + 2); // > reading printerports old controll reg > SET_BIT(regbyte , 4); // enable intr. from port > > outportb(EPPADRESS + 2 , regbyte); // writing the modified > reg. > > printf("\nStatusreg %#x", inportb(EPPADRESS + 1)); > printf("\nControlreg %#x", inportb(EPPADRESS + 2)); > inter = enable(); // enabeling interrupts > > > time1 = rawclock(); // get the current time > tics = 0; > while( tics < 1){} // wating for one > interrupt > time2 = rawclock(); > printf("\nNumber of Interrupts during the execution: %d ", tics); > printf("\nTime1: %D",time1); > printf("\nTime2: %D",time2); > printf("\nDIFF : %D",time2 - time1); > // puting back the old > handeler > _go32_dpmi_set_protected_mode_interrupt_vector(VECTOR, > &old_handler); > _go32_dpmi_free_iret_wrapper(&new_handler); > getkey(); > return 0; > > } I once wrote a 16-bit Turbo Pascal program for Voyetra VP-11 MIDI interface, which was connected to the printer port, and using IRQ7. To get it working, I had to set the IRQ enable bit (bit 4) in the printer control register, and also send a special initial string of bytes to the VP-11. After writing a byte to the VP-11, I sent 0xf5 and 0xf4 to the printer control register, in order to toggle bit 0 (Write Acknowledge), but this is probable not needed in your case. Before writing next byte, I inserted a 0.4 ms delay (MIDI byte transmission time). Upon receiving a MIDI byte, the VP-11 sent an IRQ7 to the PC. After reading the MIDI byte from the VP-11, I sent 0xf6 and 0xf4 to the printer control register, in order to toggle bit 1 (Read Acknowledge), which is probably not needed in your case either. Just a thought: Did you unmask IRQ7 and IRQ5 in the interrupt controller? (outportb(0x21,inportb(0x21) & 0x5f)) Maybe you should send End Of Interrupt (outportb(0x20,0x20)) before interrupt return, but I think the iret wrapper will do that for you. Hope this helps, -- Erik Berglund erik2 DOT berglund AT telia DOT com