.MB +5
.MT -3
.LL 65
.PN 102
.HE MP/M User's Guide
.FT   (All Information Herein is Proprietary to Digital Research.)
.sp
.pp
3.3 Extended I/O System Entry Points
.PP
The extended I/O facilities include the hardware environment dependent
code to poll devices, handle interrupts and perform memory
management functions.
.pp
A jump vector containing the extended I/O system entry points
is located immediately following the BIOS jump vector as shown
below:
.li

   BIOS+33H    JMP SELMEMORY    ; SELECT MEMORY
   BIOS+36H    JMP POLLDEVICE   ; POLL DEVICE
   BIOS+39H    JMP STARTCLOCK   ; START CLOCK
   BIOS+3CH    JMP STOPCLOCK    ; STOP CLOCK
   BIOS+3FH    JMP EXITREGION   ; EXIT CRITICAL REGION
   BIOS+42H    JMP MAXCONSOLE   ; MAXIMUM CONSOLE NUMBER
   BIOS+45H    JMP SYSTEMINIT   ; SYSTEM INITIALIZATION
   BIOS+48H    JMP IDLE         ; IDLE PROCEDURE (Optional)

.AD
.pp
Each jump address corresponds to a particular subroutine which performs
the specific function.  The exact responsibilities
of each entry point subroutine are given below:
.SP
.in 16
.ti 4
SELMEMORY   Each time a process is dispatched to run a call is made to
the XIOS memory protection procedure.  If the hardware environment has
memory bank selection/protection it can use the passed
parameter to select/protect
areas of memory.  The passed parameter (in registers BC) is a pointer
to a memory descriptor from which the memory base, size,
attributes and bank
of the executing process can be determined.
Thus, all other regions of memory can to be write protected.
.SP
.ti 4
POLLDEVICE  In hardware environments where there are no interrupts a
polled environment can be created by coding an XIOS device poll handler.
The device poll handler (POLLDEVICE) is called by the XDOS with the
device to be polled in the C register as a single parameter.
The user written POLLDEVICE procedure can be coded to access the device
polling routines via a table which contains the addresses
of the device polling procedures.  An association is made between
a device number to be polled and the polling procedure itself.
The polling procedures must return a value of 0FFH in the accumulator
if the device is ready, or 00H if the device is not ready.
.SP
.ti 4
STARTCLOCK  When a process delays for a specified number of ticks of
the system time unit, the start clock procedure is called.
.PP
The purpose of the STARTCLOCK procedure is to eliminate unneccessary
system clock interrupt overhead when there are not any delayed
processes.
.PP
In some hardware environments it is not acutally possible to shut off
the system time unit clock while still maintaining the one second flag
used for the purposes of keeping time of day.  In this situation
the STARTCLOCK procedure simply sets a boolean variable to true,
indicating that there is a delayed process.  The clock interrupt
handler can then determine if system time unit flag is to be set
by testing the boolean.
.SP
.ti 4
STOPCLOCK   When the system delay list is emptied the stop clock
procedure is called.
.PP
The purpose of the STOPCLOCK procedure is to eliminate unneccessary
system clock interrupt overhead when there are no delayed
processes.
.PP
In some hardware environments it is not acutally possible to shut off
the system time unit clock while still maintaining the one second flag
used for the purposes of keeping time of day.  (i.e. a single
clock/timer interrupt source is used.)  In this situation
the STOPCLOCK procedure simply sets a boolean variable to false,
indicating that there are no delayed processes.  The clock interrupt
handler can then determine if the system time unit flag is to be set
by testing the boolean.
.SP
.ti 4
EXITREGION  The purpose of the exit region procedure is to test a
preempted flag,
set by the interrupt handler, enabling interrupts if preempted is
false.  This procedure allows interrupt service routines to make
MP/M system calls, leaving interrupts disabled until completion of
the interrupt handling.
.SP
.ti 4
MAXCONSOLE  The purpose of the maximum console procedure is to enable
the calling
program to determine the number of physical consoles which the BIOS
is capable of supporting.  The number of physical consoles is returned
in the A register.
.SP
.ti 4
SYSTEMINIT  The purpose of the system initialization procedure is to
perform
required MP/M cold start initialization.  Typical initialization
includes setting up interrupt jump vectors, interrupt masks, and
setting up the base page in each bank of a banked memory system.
.pp
The  SYSTEMINIT  entry point is called prior to  any  other
XIOS call.  The MPMLDR disables interrupts, thus it can be
assumed  that  interrupts are still disabled upon entry  to
SYSTEMINIT.  Interrupts  are enabled by  MP/M  immediately
upon return from SYSTEMINIT.
.pp
In  systems  with bank switched memory it is  necessary  to
setup  the  base page (0000H - 00FFH) within each  bank  of
memory.  Both  the MPMLDR and MP/M itself assume that  the
base  bank  (bank  #0) is switched in when  the  MPMLDR  is
executed.  The  base bank is properly initialized by  MP/M
prior to entering SYSTEMINIT.  The information required for
the  initialization is provided on entry to  SYSTEMINIT  in
the following registers:
.li

	           C  = MP/M Debugger restart #
	           DE = MP/M entry point address for the debugger
	                  Place a jump at the proper debugger
	                restart location to the address contained
	                in DE.
	           HL = BIOS direct jump table address
	                  Place a jump instruction at location
	                0000H in each banks base page to the
	                address contained in HL.
.ad
.sp
.ti +4
IDLE      The  idle  entry  point  is  included  to  permit
optimization of system performance when the  user
has an XIOS that is all interrupt driven.  If you
have  polled  devices  in  your  XIOS, the  IDLE
procedure   may  be  omitted  by  placing  a  NOP
instruction at the BIOS+48H location where  there
would otherwise be a jump to an idle procedure.
.pp
The  idle  entry point is called repeatedly  when
MP/M is idling.  That is, when there are no other
processes  ready  to run.  In systems  that  are
entirely  interrupt  driven  the  idle  procedure
should be as follows:
.li

	            IDLE:
	                    HLT
	                    RET

.ad
.sp
.in 0
.CE
INTERRPUT SERVICE ROUTINES
.SP
.PP
The MP/M operating system is designed to work with virtually any
interrupt architecture, be it flat or vectored.  The function of the
code operating at the interrupt level is to save the
required registers,
determine the cause of the interrupt,
remove the interrupting condition, and to set an appropriate flag.
Operation of the flags are described in section 2.4.
Briefly, flags are used to synchronize asynchronous processes.  One
process, such as an interrupt service routine, sets a particular flag
while another process waits for the flag to be set.
.PP
At a logical level above the physical interrupts the flags can be
regarded as providing 256 levels of virtual interrupts
(32 flags are supported under release 1 of MP/M).
Thus, logical interrupt handlers wait
on flags to be set by the physical interrupt handlers.
This mechanism allows a common XDOS to operate on all microcomputers,
regardless of the hardware environment.
.PP
As an example consider a hardware environment with
a flat interrupt structure.  That is, a single interrupt level is
provided and devices must be polled to determine the cause of the
interrupt.  Once the interrupt cause is determined a specific flag
is set indicating that that particular interrupt has occurred.
.PP
At the conclusion of the interrupt processing a jump should be made
to the MP/M dispatcher.  This is done by jumping to the PDISP entry
point.  The effect of this jump is to give the processor to the highest
priority ready process, usually the process readied by setting the
flag in the interrupt handler, and then to enable interrupts before
jumping to resume execution of the process.
.PP
The  only  XDOS or BDOS call which should be made  from  an
interrupt  handler  is FUNCTION 133: FLAG SET.  Any  other
XDOS  or  BDOS call will result in a dispatch  which  would
then enable interrupts prior to completing execution of the
interrupt handler.
.pp
It  is  recommended  that  interrupts  only  be  used   for
operations which are asynchronous, such as console input or
disk  operation complete.  In general, operations such as
console output should not be interrupt driven.  The reason
that  interrupts  are not desirable for console  output  is
that  the system is afforded some elasticity by  performing
polled console outputs while idling, rather than incurring
the dispatch overhead for each character transmitted.  This
is particularily true at higher baud rates.
.pp
On  systems requiring the Z80 return from interrupt  (RETI)
instruction, the jump to PDISP at the end of the interrupt
servicing  can  be done by placing the address of PDISP  on
the stack and then executing an RETI instruction.
.SP 2
.ce
TIME BASE MANAGEMENT
.sp
.PP
The time base management provided by the BIOS performs the operations
of setting the system tick and one second flags.  As described
earlier the start and stop clock procedures control
the system tick operation.  The one second flag operation is logically
separate from the system tick operation even though it may physically
share the same clock/timer interrupt source.
.PP
The purpose of the system time unit tick procedure is to set flag #1
at system time unit intervals.  The system time unit is used
by MP/M to manage the delay list.
.pp
The   recommended   time  unit   is   16.67   milliseconds,
corresponding  to  60 Hz.  When operating with 50  Hz  the
recommended time unit is 20 milliseconds.
.pp
The  tick  frequency is critical in that it determines  the
dispatch  frequency for compute bound  processes.  If  the
frequency  is  too  high, a significant amount  of  system
overhead  is  incurred by  excessive  dispatches.  If  the
frequency is too low, compute bound processes will keep the
CPU resource for accordingly longer periods.
.PP
The purpose of the one second flag procedure is to set flag #2
at each second of real time.  Flag #2 is used by MP/M to maintain
a time of day clock.
.SP 2
.ce
XIOS EXTERNAL JUMP VECTOR
.sp
.PP
In order for the XIOS to access the BDOS/XDOS a jump vector is
dynamically
built by the MP/M loader and placed directly below the base address
of the XIOS.  The jump vector contains two entry points
which provide access to the MP/M dispatcher, XDOS and BDOS.
.PP
The following code illustrates the equates used to access the jump
table:
.LI

	BASE	EQU	0000H	; BASE OF THE BIOS
	PDISP	EQU	BASE-3	; MP/M DISPATCHER
	XDOS	EQU	PDISP-3	; MP/M BDOS/XDOS
	...
	CALL	XDOS		; CALL TO XDOS THRU JUMP VECTOR
.AD
.br
