www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1999/04/18/16:50:31.1

From: ams AT ludd DOT luth DOT se (Martin Str|mberg)
Newsgroups: comp.os.msdos.djgpp
Subject: My interrupt handler
Date: 18 Apr 1999 13:18:12 GMT
Organization: University of Lulea, Sweden
Lines: 113
Message-ID: <7fcm2k$31g$2@news.luth.se>
NNTP-Posting-Host: queeg.ludd.luth.se
X-Newsreader: TIN [UNIX 1.3 950824BETA PL0]
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Now I'm back to the basics. Here follows a minimal interrupt handler
that only chains to the previous one. After that one is installed I
issue an interrupt just to make sure it's working. Alas it isn't; the
program stops after inserting the interrupt handler. The last thing it
prints is "Now.".

Could somebody please tell me what I'm doing wrong?


Rota, Symphony No. 1,

							MartinS

----- simple4.c starts. -----
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dpmi.h>
#include <go32.h>
#include <pc.h>
#include <keys.h>
#include <conio.h>
#include <crt0.h>

#define MAX_BUF (16)

extern void handler(void);
extern void handler_end(void);

char str[] = "A string.\n\r";
int _ctr0_startup_flags = _CRT0_FLAG_LOCK_MEMORY;

static __dpmi_paddr old_isr, new_isr;
unsigned long address_of_old_isr;
unsigned short selector_of_old_isr;
unsigned short the_ds;

asm("
.text
.align 2,0x90

.globl _handler
_handler:

pushl %ds
movw %cs:_the_ds, %ds

movw _selector_of_old_isr, %fs
popl %ds
ljmp %fs:_old_isr

_handler_end:
nop

");


int main(int argc, char *argv[])
{
  __dpmi_regs r;

  printf("About to insert me...\n");
  getkey();

  the_ds = _my_ds();

  __dpmi_get_protected_mode_interrupt_vector(0x31, &old_isr);

  new_isr.offset32 = (unsigned long)&handler;
  asm("movw %%cs, %0": "=g" (new_isr.selector) );
  address_of_old_isr = old_isr.offset32;
  selector_of_old_isr = old_isr.selector;

  printf("New: selector:offset = %d:%ld.\n", new_isr.selector, new_isr.offset32);
  printf("Old: selector:offset = %d:%ld.\n", old_isr.selector, old_isr.offset32);

  printf("Now.\n");
  fflush(stdout);

  if( __dpmi_set_protected_mode_interrupt_vector(0x31, &new_isr) )
  {
    perror("set_protected_mode_int failed.");
  }

  printf("Installed I am.\n");
  fflush(stdout);

  /*  system("bash"); */
  sleep(5);

  printf("Generating an int.\n");
  fflush(stdout);
  memset(&r, 0, sizeof(r));
  r.x.ax = 0x0;
  __dpmi_int(0x31, &r);
  sleep(5);

  printf("Generated an int.\n");
  fflush(stdout);
  sleep(5);

  printf("About to remove...\n");

  if( __dpmi_set_protected_mode_interrupt_vector(0x31, &old_isr) )
  {
    perror("set_protected_mode_int (restoring) failed.");
  }


  return 0;

}
----- simple4.c ends. -----

- Raw text -


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