www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1998/08/21/10:15:51

From: "Michel Gallant" <mgallant AT NOSPAM DOT grassroots DOT ns DOT ca>
Newsgroups: comp.os.msdos.djgpp
Subject: Re: Detecting interrupt on printer port
Lines: 109
Message-ID: <_yLB1.90$Na1.583337@sapphire.mtt.net>
Date: Mon, 17 Aug 1998 01:19:54 GMT
NNTP-Posting-Host: 142.177.19.54
NNTP-Posting-Date: Sun, 16 Aug 1998 22:19:54 ADT
Organization: MTT
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

Hi!  I'm back, and with more problems than ever.  Below is the progam
I'm using....  Incorporating all the suggestions (I think) made to me
thus far regarding this program.  It still doesn't work.  I used a
logic probe, and verified that Interrupt Request Line 07 (Pin B21 on
any ISA slot) is indeed triggering with the input in the -ACK line
(pin #10 on the printer port).  I'm absolutely sure of this
correlation.  The program refuses to increment its counter, though,
spitting up a steady stream of zeros.  If I change the inteerrupt to
intecept from 15 (which corresponds to IRQ 15) to 8 (system timer) the
program picks up on the interrupt and counts the timer tics perfectly.
In fact, I ran an FC (file compare) on the two compiled .EXE files,
and the only difference was the fact that in three places the 0x0f was
replaced with an 0x08!- the number of the interrupts I'm intercepting.
Here's the output from the fc program:

Comparing files 60HZ003.EXE and timer003.exe
00000E36: 0F 08
00000E62: 0F 08
00000EB2: 0F 08

That's it!

And here's my source code:


//Interrupt Handler test for 0x0F, printer ACK
//line interrupt, adapted from interrupt code by
//Matthew Mastracci
#include <stdio.h>
#include <pc.h>
#include <dpmi.h>
#include <go32.h>

//macros by Shawn Hargreaves from the Allegro library for locking
//functions and variables.

#define END_OF_FUNCTION(x) void x##_end() { }

#define LOCK_VARIABLE(x) _go32_dpmi_lock_data((void*)&x, sizeof(x))

#define LOCK_FUNCTION(x) _go32_dpmi_lock_code(x, (long)x##_end -
(long)x)
//timer interrupt F is generated when ACK goes LOW (I think)
#define LPINT 15

//global counter
volatile int counter = 0;

//the new ISR, will be called automatically on low ACK once installed

void TickHandler(void)
 {
 counter++;
 }

END_OF_FUNCTION(TickHandler)

int main(void)
 {
 //structures to hold selector:offset info for the ISRs
 _go32_dpmi_seginfo OldISR, NewISR;

 //set printer control register bit 4
 //controls whether ACK generates interrupt
 outportb(890, inportb(890)|16);
printf("About to set the vector to the new ISR..\n");
 getkey();

 //lock the functions and variables
 LOCK_FUNCTION(TickHandler);
 LOCK_VARIABLE(counter);

 //load the address of the old printer ISR into the OldISR structure
 _go32_dpmi_get_protected_mode_interrupt_vector(LPINT, &OldISR);

 //point NewISR to the proper selector:offset for handler function
 NewISR.pm_offset = (int)TickHandler;
 NewISR.pm_selector = _go32_my_cs();

 //allocate wrapper
 _go32_dpmi_allocate_iret_wrapper(&NewISR);

 //set up new ISR to be called on low ACK
 _go32_dpmi_set_protected_mode_interrupt_vector(LPINT,&NewISR);

 //notice no changes to counter in this loop- the interrupt
 //changes it
 while (!kbhit()){
   printf("%d\n",counter);
   outportb (888,255);
   }

 printf("Replacing the new ISR with the old one...\n");

 //load the old timer ISR back
 _go32_dpmi_set_protected_mode_interrupt_vector(LPINT, &OldISR);

 //free wrapper
 _go32_dpmi_free_iret_wrapper(&NewISR);
 return 0;
}

Thanks for any help!

Michel Gallant




- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019