delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1995/06/06/15:17:44

Xref: news-dnh.mv.net comp.os.msdos.djgpp:155
Path: news-dnh.mv.net!mv!news.sprintlink.net!cs.utexas.edu!bcm!news.msfc.nasa.gov!news.larc.nasa.gov!lerc.nasa.gov!lerc.nasa.gov!babar!gantose
From: gantose AT lerc DOT nasa DOT gov (Dave Gantose)
Newsgroups: comp.os.msdos.djgpp
Subject: [HELP] New int handler messes up fprintf
Date: Tue, 6 Jun 1995 11:26:12
Organization: NASA Lewis Research Center
Lines: 73
Nntp-Posting-Host: babar.lerc.nasa.gov
To: djgpp AT sun DOT soe DOT clarkson DOT edu
Dj-Gateway: from newsgroup comp.os.msdos.djgpp

In my program, I install a new interrupt handler for the system timer (int 8) 
so that I can get 64 ticks per second. After a while, I put the old interrupt 
handler back. Later in the program, when I try to fprintf some values, the 
program crashes with "Unsupported INT 0x0d". The traceback indicates that the 
problem occurred at the fprintf call from my program (_fprintf+103). Is 
there something I need to reset, or clear, or watch out for after I have set 
and reset the timer interrupt handler? The FAQ kind of alludes to this, but I 
didn't understand that part.

Thanks for any info. My general steps are summarized below:

static _go32_dpmi_registers regs;
static _go32_dpmi_seginfo old_rm_isr, old_pm_isr, new_rm_isr, new_pm_isr;
static BOOL bTicked;

int main() {
  cprintf ("\r\nHit a key to start.");
  getkey();
  startInterrupts();
  stopInterrupts();
  for (j=0; j<512; j++)
    fprintf (stdout, "%d\n", j);
  return 0;
}

void tick () {
  bTicked = TRUE;
  outportb (0x20,0x20);
}

void startInterrupts () {
  disable();
  outportb (0x43,0x36); //set up timer control register
  outportb (0x40,CounterLSB);  //load low byte of count
  outportb (0x40,CounterMSB);  //load hi byte of count

  //Install real-mode handler
  new_rm_isr.pm_offset = (ULONG) tick;
  _go32_dpmi_get_real_mode_interrupt_vector(0x08, &old_rm_isr);
  _go32_dpmi_allocate_real_mode_callback_iret(&new_rm_isr, &regs);
  _go32_dpmi_set_real_mode_interrupt_vector(0x08, &new_rm_isr);

  //Install protected-mode handler
  new_pm_isr.pm_offset = (ULONG) tick;
  _go32_dpmi_get_protected_mode_interrupt_vector (0x08, &old_pm_isr);
  _go32_dpmi_allocate_iret_wrapper(&new_pm_isr);
  new_pm_isr.pm_selector = _go32_my_cs();
  _go32_dpmi_set_protected_mode_interrupt_vector(0x08, &new_pm_isr);
  enable();
}

void stopInterrupts () {
  disable();
  outportb (0x43,0x36);
  outportb (0x40,0x00);
  outportb (0x40,0x00);

  // Restore real-mode handler
  _go32_dpmi_set_real_mode_interrupt_vector (0x08, &old_rm_isr);
  _go32_dpmi_free_real_mode_callback (&new_rm_isr);

  // Restore p-mode handler
  _go32_dpmi_set_protected_mode_interrupt_vector (0x08, &old_pm_isr);
  _go32_dpmi_free_iret_wrapper (&new_pm_isr);
  enable();
}


=============================================================================
Dave Gantose
ADF, Inc.
2001 Aerospace Pkwy.           phone: (216)977-1376
Brook Park, OH  44142          email: Gantose AT lerc DOT nasa DOT gov

- Raw text -


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