mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-27 02:14:19 +00:00
272 lines
11 KiB
TeX
272 lines
11 KiB
TeX
.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
|
||
|