Date: Tue, 30 May 1995 13:44:29 -0500 To: djgpp AT sun DOT soe DOT clarkson DOT edu From: cburke AT mitre DOT org (Carl D. Burke) Subject: Re: Keyboard interrupt handler brokenness > If I uncommend the real mode handler calls in main(), the beeping >doesn't happen, but if you type fast enough, the program will issue >the message 'Unsupported INT 0xd' followed a keypress or two later >by a segmentation fault. > [snip] >static void install_rm_interrupt() >{ > int ret; > > rm_si.pm_offset = (int)key_intr; You must set the pm_selector to go32_my_cs(); otherwise you might not have the correct overall address. I don't know why it's required; it's left out of the docs; but if you don't set both the offset and the selector, performance is unreliable. [I think this is the right call, but I don't have my dual rm/pm keyboard handler code handy right now so you should check the dpmi functions reference.] > ret = _go32_dpmi_allocate_real_mode_callback_iret(&rm_si, &rm_regs); > if (ret != 0) { > printf("cannot allocate real mode callback, error=%04x\n", ret); > exit(1); > } > [snip] Also, if you don't have a real-mode keyboard handler it's quite likely that some keypresses will get caught in real mode and miss your handlers completely. At least that's my experience; typically I lost about 50% of them. -- Carl Burke