Apple II
Technical Notes
_____________________________________________________________________________
                                                  Developer Technical Support

GS/OS
#9:    Interrupt Handling Anomalies

Revised by:    Matt Deatherage                                       May 1990
Written by:    Dave Lyons                                        January 1990

This Technical Note discusses anomalies in the way GS/OS handles interrupts.
Changes since January 1990:  Added discussions about calling UnbindInt at
inopportune times and changes in GS/OS interrupt handling with respect to the
Apple II High-Speed SCSI Card.
_____________________________________________________________________________

Problems Installing Interrupt Handlers

If your application calls ALLOC_INT to install an interrupt handler for an
external interrupt source, it works fine unless the SCSI Manager (GS/OS file
SCSI.Manager) is installed, in which case the system eventually grinds to a
halt with a message about 65536 unclaimed interrupts.

The Problems

If any interrupt handlers are bound (using BindInt) to reference number $17
(IRQ.OTHER), the unclaimed interrupt count gets incremented if none of the
BindInt routines claims the interrupt, even though any handlers installed
with ALLOC_INT routines still need a chance to claim it.  The 5.0.2
SCSI.Manager triggers this problem because it calls BindInt with vector
reference number $17.

In addition, if one or more interrupt handlers are bound to the IRQ.OTHER
vector (VRN $17), the interrupt is passed to the ALLOC_INT handler even if it
was already claimed by a BindInt routine.  If no ALLOC_INT routine claims the
interrupt, the unclaimed-interrupt count is incremented.  As documented in
Apple IIgs Technical Note #18, Do-It-Yourself SCC Interrupts, you cannot 
successfully call BindInt with vector reference number $0009.

The Solution

An application may install both a BindInt routine and an ALLOC_INT routine. 
If they both claim the external interrupt, the unclaimed count does not get
incremented.  The solution is compatible with future System Software
releases, since it does not depend upon the ALLOC_INT routine ever getting
called.

Your application's BindInt routine sees the interrupt before your ALLOC_INT
routine does, so the BindInt routine should figure out whether the interrupt
was caused by your external device, and claim it if so.  Your ALLOC_INT
routine should claim an interrupt it sees if and only if your BindInt routine
claimed the last interrupt it saw.

GS/OS 3.2, which was released with the Apple II High-Speed SCSI Card, no
longer treats more than 64K unclaimed interrupts as a fatal error.  Note that
GS/OS still displays a dialog box asking the user to restart the system, but
choosing the Restart button returns control to the application with no ill
effects.


Problems Removing Interrupts Handlers

The GS/OS Reference suite says that device drivers may make BindInt and
UnbindInt calls, noting this as an exception to the general rule that drivers
may not make GS/OS system calls.  What the references fail to note is that
these calls may fail for an incredibly annoying reason--the OS may be busy.

GS/OS takes special pains to avoid this while starting and while switching to
ProDOS 8, but it does not avoid this condition during an OSShutDown--a real
shutdown of the OS, not a switch to ProDOS 8.

Driver authors can work around this problem by using a new system service
call provided in GS/OS version 3.2 and later.  The call, named
UNBIND_INT_VECTOR, provides the functionality of UnbindInt to FSTs and
drivers only to avoid the OS reentrancy issue.  The vector is at $01/FCD8 and
takes an interrupt identification number (as returned from BindInt) in the
accumulator.


Further Reference
_____________________________________________________________________________
  o  GS/OS Reference
  o  Apple IIgs Technical Note #18, Do-It-Yourself SCC Interrupts

