www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1996/09/15/07:48:03

Xref: news2.mv.net comp.os.msdos.djgpp:8635
From: snarfy AT goodnet DOT com
Newsgroups: comp.os.msdos.djgpp
Subject: Hand chaining interrupts.
Date: 13 Sep 1996 05:29:52 GMT
Organization: GoodNet
Lines: 57
Message-ID: <51argg$16jm@news.goodnet.com>
NNTP-Posting-Host: goodnet.com
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

I had a question on how to chain interrupts.  Is their anything special
that needs to be considered?  I've written all of my interrupt code in
asm, and I'm setting the interrupt with the raw __dpmi set interrupt calls.
It works fine, but it doesn't chain to the old handler, and after a
while it crashes because the old handler needs to be called.
I've tried chaining to the old handler by just jmping to it, but that
blows up with random error messages.

Here's some sample code.

/*  Code to show the syntax for jmp'ing to a function in asm */
__dpmi_paddr handler;
void my_func(void)
{
   printf("Hello\n");
   exit(0);
}
main()
{
  handler.offset32 = (int) my_func;
  handler.segment = _my_cs();
  asm("jmp _handler(,1)");
  /* never gets here. */
}

 
Now I've compiled the code above and it works just as expected.  WHen
I try the same thing in an interrupt though, it doesn't work.

Sample:

/* file int.S */
_my_handler:
        pushal
        movw %cs:___djgpp_our_DS, %ds
        ... do some stuff ..
        cmpl _foo, %eax
        je 1f
        movl $20, %eax
        outb %al, $20
        popal
        sti
        iret
1:
        popal
        jmp _old_handler(,1)


This interupt code works fine until I put the chaining into it.  I've traced
it down to the jmp _old_handler(,1).  I don't know why this doesn't work.
It works fine in the first example.  Is there something special I need to 
do?


Thanks
Josh
snarfy AT goodnet DOT com

- Raw text -


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