delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1997/03/23/04:15:48

From: bd733 AT rgfn DOT epcc DOT edu (Jason M. Daniels)
Newsgroups: comp.os.msdos.djgpp
Subject: set vs. chain
Date: 21 Mar 1997 00:27:21 GMT
Organization: The Rio Grande Free-Net, El Paso Community College, El Paso, TX
Lines: 123
Message-ID: <5gskl9$mjj@news.epcc.edu>
NNTP-Posting-Host: rgfn.epcc.edu
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

I'm trying to learn to write interrupt handlers and use them with 
DJGPP. I've followed what directions I can find, but have come across an 
interesting problem. At first, I used _go32_dpmi_chain_protected_mode_
interrupt_vector() to set up my handler, but when I used this method, input
got dumped to the command line after the program exited, because the data was
never destructively read from the original handler. OK. So then I tried to
follow the directions in the FAQ for using [...]_set_[...]. I saved the
previous handler, allocated an iret wrapper, and set the handler. However,
the interrupt will trigger once and then crash the computer. This did not 
happen with [...]_chain_[...]. Here's the source code:

/*
 * Non-chaining version (crashes)
 */

#include <stdio.h>
#include <io.h>
#include <dpmi.h>
#include <crt0.h>
#include <sys/farptr.h>
#include <go32.h>
#include <pc.h>

#define PAUSE 300000001

int _crt0_startup_flags = _CRT0_FLAG_LOCK_MEMORY;
volatile unsigned long int handler_count = 0;
unsigned long int main_track_count = 0;

void int1(int in)
{
        handler_count++;
}

int main(void)
{
        __dpmi_regs regs;       /* Allocate register variables */
        _go32_dpmi_seginfo pmint,old;       /* Allocate a seginfo struct */
        int x = 0;

        pmint.pm_selector = _my_cs();   /* Load selector with your code
                                           segment... */

        pmint.pm_offset = (unsigned)&int1; /* and offset with address of
                                              function to be called. */
	_go32_dpmi_get_protected_mode_interrupt_vector(9, &old);
        _go32_dpmi_allocate_iret_wrapper(&pmint);
        _go32_dpmi_set_protected_mode_interrupt_vector(9, &pmint);
                
        for(;x < PAUSE;x++)
        {
                while(main_track_count != handler_count)
                {
                        main_track_count++;
                        printf("%lu\n",main_track_count);
                }
        }
        
        /* display info about the interrupt */
        printf("Interrupts made: %lu\n",handler_count);

	_go32_dpmi_set_protected_mode_interrupt_vector(9, &old);
	_go32_dpmi_free_iret_wrapper(&pmint);                
        return(0);
}

/*
 * Chaining version
 */

#include <stdio.h>
#include <io.h>
#include <dpmi.h>
#include <crt0.h>
#include <sys/farptr.h>
#include <go32.h>
#include <pc.h>

#define PAUSE 3000001

int _crt0_startup_flags = _CRT0_FLAG_LOCK_MEMORY;
volatile unsigned long int handler_count = 0;
unsigned long int main_track_count = 0;

void int1(int in)
{
        handler_count++;
}

int main(void)
{
        _go32_dpmi_seginfo pmint;       /* Allocate a seginfo struct */
        int x = 0;

        pmint.pm_selector = _my_cs();   /* Load selector with your code
                                           segment... */

        pmint.pm_offset = (unsigned)&int1; /* and offset with address of
                                              function to be called. */
        _go32_dpmi_chain_protected_mode_interrupt_vector(9, &pmint);
                
        for(;x < PAUSE;x++)
        {
                while(main_track_count != handler_count)
                {
                        main_track_count++;
                        printf("%lu\n",main_track_count);
                }
        }
        
        /* display info about the interrupt */
        printf("Interrupts made: %lu\n",handler_count);
                
        return(0);
}

TIA! :-)

--
Jason Daniels -- bd733 AT rgfn DOT epcc DOT edu
http://www.trailerpark.com/phase2/fireside/index.htm
Paradox #218: "Saying 'I'm very modest' isn't."
Commodore 64 forever!

- Raw text -


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