Notes on the Turbo Modula-2 "Monitor" Function
                           by D. McCord, Echelon


1. Overview

Turbo  Modula-2  possesses,  as per the  Modula-2  language  definition,  the
feature of "coroutines".  Coroutines are an important feature of Modula-2, as
they  incorporate  into  the language itself the concepts  of  concurrency  -
multiple  software processes executing, apparently or actually, at  the  same
time.  This is a quite useful feature for situations where there may be  more
than  one  central processing unit (CPU) available, or when  a  situation  of
needing multiple programs operating simultaneously occurs.

Of course, in the context of Turbo Modula-2, which operates on a single  Z80-
compatible  microprocessor, multiple CPU's are not a consideration.  But  the
capability  of using multiple Modula-2 programs simultaneously can  be  quite
useful.  A good example of this is software which utilizes hardware interrupt
functions.    Turbo  Modula-2  implements  generic  Modula-2  features,   via
coroutine-oriented functions, to provide interrupt handlers which operate  in
a  clearly defined, yet autonomous manner from whatever the  Modula-2  "main"
module  may  be doing.  This is quite unusual among high  level  languages  -
typically,  interrupt  handlers  are done in assembly language  and  must  be
"kludged"  into  an  application written in a high  level  language  such  as
Modula-2.

In  an interrupt environment, it is sometimes necessary to control the  state
of  the host CPU's interrupt handling.  In the case of Turbo  Modula-2,  this
control  is best thought of as simply enabling or disabling  interrupts,  and
the  generic Modula-2 "monitor" function is implemented in order  to  provide
this function.

This  note  is  not  intended  to be  a  tutorial  on  usage  of  interrupts,
coroutines,  and interrupt handlers with Turbo Modula-2.  For  more  detailed
information on those topics, see Steve Hirch's informative notes contained in
the  file TM2NOT10.LBR, available from Echelon on SUS disk or on most  Z-Node
Remote Access Systems.

This  note  is intended to supplement the information given  in  the  product
documentation regarding the operation of Turbo Modula-2 monitors.


2. What is a monitor?

A  monitor  under  Turbo  Modula-2 is a module  which  locks  out  (disables)
hardware interrupts.  Refer to the Turbo Modula-2 User's Guide (TM2UG),  page
192,  for  the  information  contained  on the  topic  of  monitors  (in  the
discussion of the IOTRANSFER procedure from the SYSTEM module).

A  monitor's  capability  of disabling interrupts can  be  useful,  and  even
necessary  in certain situations.  Consider a type-ahead  keyboard  function.
Typically, an interrupt handler for this kind of function will be written  in
a  simple way which presumes interrupts will be disabled while the  interrupt
handler  is  executing; to write it in such a way that interrupts  would  not
have  to  be disabled could be very "expensive" in terms of  code  speed  and
memory usage (it would have to be written to be reentrant).


3. Incomplete information in TM2UG

TM2UG  indicates  on page 192 how the monitor function may be enabled  for  a
module.   An  important  bit of information not included there  is  that  the
monitor  function  is  only active during execution of  procedures  and  sub-
modules;  thus, interrupts are not disabled during the "initialization  code"
section  of  a module, which is cometimes referred to as the  "module  body",
defined as the code between the BEGIN and END statements of the module.

The following code example should clarify this.

MODULE Monitor[1];  (* monitor function invoked here *)

(* This procedure disables interrupts when it executes, also any *)
(* procedures called from this procedure will also have interrupts *)
(* disabled *)
PROCEDURE Pr;
BEGIN
 WRITELN("Interrupts are disabled here");
END Pr;

(* This is the initialization code.  Interrupts are not disabled here *)
BEGIN
 WRITELN("Interrupts are enabled here");
 Pr;
END Monitor.


4. Summary

The  programmer  using the monitor function of Turbo Modula should  be  aware
that, contrary to what is implied in the manual, hardware interrupts are  not
disabled  at  all  places  in  a module declared  as  a  monitor.   Only  the
procedures and sub-modules of a monitor module have interrupts disabled.  The
initialization  code or module body will have interrupts enabled,  unless  it
has been called from a procedure or sub-module of another monitor module.

Echelon, Inc.
885 N. San Antonio Road
Los Altos, CA  94022  USA
415/948-3820 order line/tech support
415/958-6656 Z-Node Central (data)