Date: Tue, 25 Apr 1995 01:46:15 -0300 (ADT) From: Bill Davidson Subject: Re: Chaining real-mode interrupts To: Eli Zaretskii Cc: djgpp AT sun DOT soe DOT clarkson DOT edu On Mon, 24 Apr 1995, Eli Zaretskii wrote: > 1) Did you call _go32_dpmi_allocate_real_mode_callback_iret() > before _go32_dpmi_set_real_mode_interrupt_vector(), as the FAQ tells you? Yes. > 2) Do you set SS and SP to zero before calling > _go32_dpmi_simulate_fcall_iret() in your RM handler to chain to the previous Yes. > handler in the chain? I think you might have to also zero-out FLAGS, but I'm > not sure. I wasn't sure either, so I tried it both ways. > 3) If your handlers do not always chain to the previous ISRs, you > should send EOI (end-of-interrupt) to the interrupt controller when they > don't chain. They always chain, but I even tried sending EOI anyway! > 4) Is your program sufficiently large (larger than the available free > PHYSICAL RAM) so that it pages to the disk? If so, then under current version I don't think so. > page locking. But if your program doesn't page (you can check it by putting > ``topline'' into your GO32 environment variable and watching memory usage), then I'll try that. > If all of the above doesn't help, download PCTIME12.ZIP from SimTel/msdos/c. It > has a working example of hooking the timer interrupt, which you can use as > starting point. (E.g., it includes a blurb about a bug in gcc 2.6.0 and gives a > solution for it.) Thanks, I'll get it and have a look. > In non-DPMI mode, if you only hook the PM interrupt, you will lose interrupts > when your machine is in real mode. What would the symptoms of that be? I haven't noticed any dropped keystrokes or anything. > Thanks for the compliment. If you find any subtle points which need to be added > to that chapter of the FAQ, please let me know. A new revision of the FAQ is in > the works and should be available in a week or so. The only comment I have is that your description of _go32_dpmi_chain_protedted_mode_interrupt() is a little vague. Specifically, you don't mention that that function allocates the necessary wrapper, so you don't need to call blahblah_allocate_iret() or whatever it is called; you make it sound like you use *_chain_*() in place of (but in the same way as) *_set_*(). Luckily, the libc.a info pages are clear on this. Thanks for your help. Bill Davidson bdavidson AT ra DOT isisnet DOT com