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