Interrupt 28h   (not documented by Microsoft) 

* DOS Idle Interrupt

Int 28h has been provided by DOS since release 2.0. The int 28h process is

similar to the "Timer Tick" process provided by BIOS via Int\1C in that it is

an "outbound" (from DOS) call which an application can "hook onto" to get

service at a particular entry point. DOS normally only issues int 28h when it

recieves a function call Int\21 from a foreground application with an

argument in the range of 0 thru 12 (0Ch) in the AH register, or when it is

idling waiting for keyboard input. In effect, when DOS issues int 28h, it is

saying to the background task "I'm not doing anything hot right now, if you can

use the time, go ahead." This means that a foreground application which doesn't

do many low-number DOS functions can preempt CPU time easily.

It is possible, if you are careful, to enhance the background priority by

providing more int 28h calls than DOS normally would issue.

When int 28h is being issued it is usually safe to do DOS calls. You won't get

int 28hs if a program is running that doesn't do its keyboard input through

DOS. You should rely on the timer interrupt for these.

It is used primarily by the PRINT.COM routines, but any number of other

routines can be chained to it by saving the original vector and calling it with

a FAR call (or just JMPing to it) at the end of the new routine.

Used by many TSR programs. (see Int\21f\31)

Int 28h is not called at all when any non-trivial foreground task is running.

As soon as a foreground program has a file open, int 28h no longer gets called.

Could make a good driver for for a background program that works as long as

there is nothing else going on in the machine.

DOS uses 3 separate internal stacks: one for calls 01h through 0Ch; another

for calls 0Dh and above; and a third for calls 01h through 0Ch when a Critical

Error is in progress. When int 28h is called, any calls above 0Ch can be

executed without destroying the internal stack used by DOS at the time.

The byte which is pushed on the stack before an int 28h just indicates which

stack area is being used by the current Int\21 call. In DOS 3.1, the code

sequence that calls int 28h looks like this:

PUSH SS:[0304]

INT 28

POP SS:[0304]

The low-order byte of the word pushed contains 1 if the Int\21 call currently

in progress is for services 1 through 0Ch, and 0 for service 0 and for 0Dh and

up. Assuming that the last DOS call was not a reentrant one, this tells you

which set of DOS services should be safe to call.

If the InDOS flag is zero on int 28h, then it was called by someone other than

DOS, and the word on the stack should NOT be examined.

entry no parameters availible

return none

note 1) The int 28h handler may invoke any Int\21 function except functions

00h through 0Ch (and 50h/51h under DOS 2.x unless DOS CritErr flag is

set).

2) Apparently int 28h is also called during screen writes

3) Until some program installs its own routine, this interrupt vector

simply points to an IRET opcode.

4) Supported in OS/2 1.0's DOS Compatibility Box