.MB +5
.MT -3
.LL 65
.PN 81
.HE MP/M User's Guide
.FT   (All Information Herein is Proprietary to Digital Research.)
.sp
.pp
2.5  Preparation of Page Relocatable Programs
.pp
A page relocatable program is stored on diskette as a file of type
'PRL'.  Appendix K contains a PRL file specification describing
the file format.  A page relocatable program is prepared by
assembling the source program twice, in which the second
assembly has 100H added to each ORG statement.
The two hex files generated by assembling the source file twice are
concatenated with PIP and then provided as input to the GENMOD
program.  The GENMOD program (described in section 1.4) produces a file of type 'PRL'.
.pp
This section describes APPENDIX G:  Sample Page Relocatable
Program. The example program
illustrates the required use of ORG statements to access the
BDOS and the default file control block.  Note that the initial
ORG is 0000H. Its purpose is to establish the equate for the symbol BASE,
the base of the relocatable segment.  Next an ORG 100H statement
establishes the actual beginning of code for the program.
During the second assembly these two ORG statements are changed to
100H and 200H respectively.  Note that the first assembly will
generate a file which can be LOADed to produce an executable 'COM'
file.  In fact, it is desirable to first debug the program as a
'COM' file and then proceed to make the 'PRL' file.
.PP
It is VERY important to use BASE to offset all memory segment base page
references!  Do not make a call to absolute 0005H for BDOS
calls.  In this example BASE is used to offset the BDOS, FCB, and
BUFF equates.  When a user program needs to determine the top of
its memory segment the following equate and code sequence should
be used:
.li

	MEMSIZE EQU     BASE+6

	        ...

	        LHLD    MEMSIZE ;HL = TOP OF MEMORY SEGMENT

.BR
The following steps show how to generate a page relocatable
file for this example using the Digital Research Macro Assembler (MAC):
.LI

	* Prepare the user program, DUMP.ASM in this example, with
	  proper origin statements as described above.

	* Assuming a system disk in drive A: and the DUMP.ASM file
	  is on drive B:, enter the commands-

	  1A>MAC B:DUMP $PP+S
		;assemble and list the DUMP.ASM file
	  1A>ERA B:DUMP.HX0
	  1A>REN B:DUMP.HX0=B:DUMP.HEX
	  1A>MAC B:DUMP $PZSZ+R
		;assemble the DUMP.ASM file again, offset by 100H
		;the offset is generated with the +R MAC option
	  1A>PIP B:DUMP.HEX=B:DUMP.HX0,B:DUMP.HEX
		;concatenate the HEX files
	  1A>GENMOD B:DUMP.HEX B:DUMP.PRL
		;generate the relocatable DUMP.PRL file
.BR
.pp
The following steps show how to generate a page relocatable
file for this example using the Digital Research Assembler (ASM):
.li

	* Prepare the user program, DUMP.ASM in this example, with
	  proper origin statements as described above.

	* Assuming a system disk in drive A: and the DUMP.ASM file
	  is on drive B:, enter the commands-

	  1A>ASM B:DUMP
		;assemble the DUMP.ASM file
	  1A>ERA B:DUMP.HX0
	  1A>REN B:DUMP.HX0=B:DUMP.HEX
	  1A>PIP LST:=B:DUMP.PRN[T8]
	  1A>ERA B:DUMP.PRN

	* Edit the DUMP.ASM file, adding 100H to each ORG statement.
	  This can be done by concatenating a preamble to the
	  program which contains the two initial ORG statements.
	  A submit file to perform this function, named ASMPRL.SUB
	  is provided on the distribution diskette.

	  1A>ASM B:DUMP.BBZ
		;assemble the DUMP.ASM file a second time
	  1A>PIP B:DUMP.HEX=B:DUMP.HX0,B:DUMP.HEX
		;concatenate the HEX files
	  1A>GENMOD B:DUMP.HEX B:DUMP.PRL
		;generate the relocatable DUMP.PRL file
.br
.BP
.pp
2.6  Installation of Resident System Processes
.pp
This section contains a description of APPENDIX H:  Sample Resident
System Process.  The example program
illustrates the required structure of a resident system process as well
as the BDOS/XDOS access mechanism.
.PP
The first two bytes of a resident system process are set to the
address of the BDOS/XDOS entry point.  The address is filled in by the
loader, providing a simple means for a resident system process to
access the BDOS/XDOS by loading HL from the base of the program area and
then executing a PCHL instruction.
.PP
The process descriptor for the resident system process must immediately
follow the first two bytes which contain the address of the BDOS/XDOS
entry point.  Observe the manner in
which the process descriptor is initialized in the example.  The DS's
are used where storage is simply allocated. The DB's and DW's are used
where data in the process descriptor must be initialized.
Note that the stack pointer field of the process descriptor points to
the address immediately following the stack allocation.
This is the return address which is the actual process entry point.
.pp
It is important that the HEX file generated by assembling the RSP
span the entire program and data area.  For this reason the first two
bytes of the resident system process which will contain the address
of the BDOS/XDOS entry point are defined with a DW.  Using a DS
would not generate any HEX file code for those two bytes.
The end of the program and data area must be defined in a likewise
manner.  If your RSP has DS statements preceding the END statement
it will be necessary to place a DB statment after the DS statements
before the END statement.
.PP
The steps to produce a resident system process closely follow
those illustrated in the previous section on page relocatable programs.
The only exception to the procedure is that the GENMOD output file
should have a type of 'RSP' rather than 'PRL' and the code in the
RSP is ORGed at 000H rather than 100H.
.pp
In addition to resident system processes MP/M supports resident system
procedures.  The purpose of a resident system procedure is to
provide a means to use a piece of code as a serially reusable
resource.  A resident system procedure is set up by a resident system
process.  The function of the process is to create a queue which has
the name of the resident system procedure and to send it one 16 bit
message containing the address of the resident system procedure.
Once this is accomplished the resident system process
terminates itself.  Access to the resident system procedure is made by
opening the queue with the resident system procedure name and then
reading the two byte message to obtain the actual memory address of
the procedure itself.
Since there is only one message posted at the queue, only one process
will gain access to the procedure at a time.  When the process
executing the resident system procedure leaves the procedure it
sends the two byte message containing the procedure address back
to the queue.  This action enables the next waiting process to
use the resident system procedure.
.pp
When the MP/M system generation program is executed it searches the
directory for all files with the type 'RSP'.  The user is then
prompted with the file name and asked if it should be included in
the generated system file.
.BR
