DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦0a7e86ce3⟧ RcTekst

    Length: 41600 (0xa280)
    Types: RcTekst
    Names: »99110093.WP«

Derivation

└─⟦7fab0c8ae⟧ Bits:30005866/disk3.imd Dokumenter i RcTekst format (RCSL 99-1-*)
    └─⟦this⟧ »99110093.WP« 

RcTekst


╱04002d4e0c0006000000000301473100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱

════════════════════════════════════════════════════════════════════════
↓
┆14┆┆b3┆┆b3┆RC39 Monitor┆05┆Page ┆0b┆↲
┆a1┆↲
↲
┆a1┆1.     INTRODUCTION.↲
↲
↲
The RC39 Monitor is a program for a processor of the Intel iAPX 286 ↓
family intended to run on a system which includes at least the ↓
following com┄ponents:↲
↲
↲
╞	- iAPX 286 microprocessor,↲
╞	- some PROM to hold the Monitor program,↲
╞	- some RAM to hold the Monitor variables,↲
╞	- a disk (winchester and/or floppy) controller and drive(s),↲
╞	- a USART supporting a V.24 serial communications interface.↲
↲
↲
Several versions of the RC39 Monitor will exist for systems which ↓
differ with respect to the specific type of disk controller, USART or ↓
other hardware components.↲
↲
↲
An ┆a1┆operator console┆e1┆ for the RC39 Monitor is a tty-compatible terminal ↓
attached via the V.24 interface.↲
↲
↲
The following facilities are provided by the RC39 Monitor:↲
↲
↲
╞	- ┆84┆a Debug Monitor, running in the Protected Virtual Address Mode ↓
┆19┆┆86┆┄┄only, integrated with both the power-on selftest programs and the ↓
┆19┆┆86┆┄┄XENIX Version 3.2 Operating System. In the latter case the ↓
┆19┆┆86┆┄┄Monitor acts as a KERNEL Debugger which communicates with an ↓
┆19┆┆86┆┄┄operator by means of the operator console,↲
↲
↲
╞	- ┆84┆a disk boot loader which can load a file, in Microsoft x.out ↓
┆19┆┆86┆┄┄SMALL model format, from the bootstrap track of a disk ↓
┆19┆┆86┆┄┄(winchester or floppy) into RAM.↲
↲
↲
┆8c┆┆83┆┆ec┆↓
A unified command interface allows all functions of the Debug Monitor ↓
to be activated from the operator console. In typical applications, the ↓
Debug Monitor is integrated with hardware selftest programs, so that it ↓
will be possible to enter the Debug Monitor from the selftest and to ↓
return also.↲
↲
↲
The primary use of the RC39 Monitor lies in the area of testing and ↓
debugging low-level programs. The Debug Monitor will, however, also be ↓
used in production systems, where only the bootloader will be commonly ↓
used, but where the other features will also be available for special ↓
tests and diagnostics.↲
↲
↲
When the system is powered on or reset the Debug Monitor will test ↓
whether or not an operator console is present by inspecting V.24 status ↓
signals. If the status signal indicate console present the Debug ↓
Monitor will prompt the operator for a command, otherwise it will ↓
execute a load-and-go command using the default disk medium. Thus the ↓
bootloader will work, also when no operator console is present.↲
↲
↲
In the operator console dialogue 7-bit ASCII-code is used. The high ↓
order bit of characters transmitted to the console is 0, and the high ↓
order bit of received characters is ignored.↲

════════════════════════════════════════════════════════════════════════
↓
┆a1┆2.     THE DEBUG MONITOR.↲
↲
↲
The Debug Monitor allows execution and monitoring of a program loaded ↓
into RAM. The program being monitored is called the ┆a1┆target program┆e1┆ to ↓
distinguish it from the RC39 Monitor itself. The only restrictions to ↓
the target program is that it must not overwrite the RAM reserved for ↓
the Debug Monitor.↲
↲
↲
The Debug Monitor has two modes: ┆a1┆command mode┆e1┆ and ┆a1┆target mode┆e1┆. The ↓
Debug Monitor is in command mode when a command is being typed in or ↓
executed (this includes loading). The Debug Monitor is in target mode ↓
when a target program is exe┄cuting. A transition from command mode to ↓
target mode occurs when control of the processor is transferred to the ↓
target program as a result of a go command ( G(C)(sel:offset)(; ↓
sel:offset) ) or load-and-go command ( L(W/F)G ).↲
↲
↲
While in command mode the Debug Monitor keeps external interrupts ↓
disabled in order to exclude the execution of any part of a loaded ↓
target program. Thus the contents of RAM will change only under command ↓
control.↲
↲
↲
When the system is powered on or reset the Debug Monitor will enter ↓
command mode, possibly after execution of a hardware selftest program.↲
↲
↲
A transition from target mode to command mode, i.e. an activation of ↓
the Debug Monitor, takes place in the following situations:↲
↲
↲
1.╞	┆84┆┆84┆A breakpoint trap is encountered during the execution of a target ↓
┆19┆┆84┆┄┄program.↲
↲
↲
┆8c┆┆83┆┆bc┆↓
2.  ┆84┆A single step trap is encountered during the execution of a target ↓
┆19┆┆84┆┄┄program.↲
↲
↲
3.╞	┆84┆An INT3 instruction is executed by a target program.↲
↲
↲
All these traps generates a TASK SWITCH into the Debug Monitor. The ↓
Debug Monitor will be able to change the target program context ↓
(registers and variables) by backtracking to the suspended target Task ↓
State Segment (TSS) and even further.↲
↲
↲
Up to eight breakpoints can be set in the user program by means of the ↓
set breakpoint command ( B(bp_no sel:offset) ). A breakpoint must be ↓
located at the first byte of an instruction. Break┄points work ↓
transparently, i.e. following a break execution of the program may be ↓
resumed simply by giving a go command. Once set, a breakpoint remains ↓
until redefined by a new set breakpoint command or explicitly deleted ↓
by either the clear breakpoint command ( C(bp_no) ) or the go and clear ↓
all breackpoints command ( GC (sel:offset)(; sel:offset) ).↲
↲
↲
The Task State Segment (TSS or Context) of the target program may be ↓
modified by an ( R(reg-spec)) command. When the transition from command ↓
to user mode is made ( G(C) (sel:offset)(; sel:offset) ) the processor ↓
registers are updated from the modified TSS.↲
↲
↲
In addition to breakpoint handling the Debug Monitor can be used to ↓
inspect and modify RAM, Protection Tables, Segment Descriptors, System ↓
Descriptors and to read to or write from specified I/O ports. For ↓
details, see the next chapter.↲

════════════════════════════════════════════════════════════════════════
↓
┆a1┆2.1    iAPX 286 Protection Mechanisms.↲
↲
↲
The basic entity in an iAPX 286 system is the ┆a1┆Segment┆e1┆. A segment is ↓
a contigous part of virtual memory used to hold either CODE (TEXT) or ↓
DATA. Segments are of variable size, ranging from as small as a single ↓
byte to as large as 64 K byte. Allthough the iAPX 286 processor ↓
supports a virtual address range of 1 Giga byte and a physical address ↓
range of 16 Mega byte, only 4 segment may be addressed at the same ↓
time. The CS register is used to address the current CODE (TEXT) ↓
segment, and DS, SS and ES may be used to address various types of ↓
DATA. The segment is accessed indirecly through a ┆a1┆Segment Descriptor┆e1┆ ↓
which reside in a specific ┆a1┆Segment Descriptor Table┆e1┆. Two kinds of ↓
segment descriptor tables exists, the Global Descriptor Table (GDT) ↓
used to hold segment descriptors shared by several users and the Local ↓
Descriptor Table (LDT) used to hold user specific segment descriptors. ↓
A segment descriptor is 8 byte long as shown below.↲
↲
↲
╞	╞	--------------------------------↲
╞	       +7╞	!         reserved             ! +6↲
╞	       +5 !P!DPL!1!TYPE!A!  BASE A23-A16 ! +4↲
╞	       +3 !         BASE A15-A0╞	 ! +2↲
╞	       +1 !         LIMIT 15-0╞	 ! 0↲
╞	╞	--------------------------------↲
↲
↲
╞	╞	      ┆a1┆┆e1┆┆a1┆Segment Descriptor.↲
↲
↲
The first word of the descriptor is used to hold the size of the ↓
segment and if the program makes access to CODE or DATA outside the ↓
segment limit a trap is generated into the operating system. Byte 2-4 ↓
is used to hold the physical memory base address of the segment. Byte 5 ↓
is the ┆a1┆Access Right Byte┆e1┆. The P bit indicates whether the segment is ↓
present in physical memory or not. The DPL is a two bit wide field ↓
giving the ┆a1┆Descriptor Privelege Level┆e1┆. Privilege levels are used to ↓
seperate high quality and very thrusted CODE such as the operating ↓
┆8c┆┆83┆┆c8┆↓
system kernel from code generated by stupid (sorry) application ↓
programmers. In XENIX Version 3.2 only two of the four available ↓
privilege levels are used, the operating system executes at privilege ↓
level 0 (SYSTEM) and applications execute a level 3 (USER). The 3 bit ↓
wide TYPE field gives the segment access rights. For CODE segments the ↓
possibily of Execute Only, Execute and Read, Read Only or Conforming ↓
(Execute at caller privilege level) exists. For DATA segments the ↓
expand direction may be either expand up (like CODE segments) or expand ↓
down. A DATA segment may also be either Read Only or both Read and ↓
Write. The A bit is set whenever a segment is referenced. A segment ↓
descriptor is addressed by an index. Bit 2 of the index, the ┆a1┆Table ↓
┆19┆┄┄┆84┆Indicator┆e1┆, tells whether the descriptor is in the GDT or the LDT table. ↓
Bit 0 and bit 1 of the index gives the ┆a1┆Requested Privelege Level┆e1┆ (the ↓
level upon which the caller is executing). Whenever a descriptor is ↓
accessed extensive access checks such as Privilege Level Check, Access ↓
Right Check and Segment Present Check is made by the iAPX 286 ↓
processor. If access is granted the A bit is set and processing ↓
continues otherwise a trap into the operating system is generated.↲
↲
↲
┆a1┆2.2  Alias Descriptors.↲
↲
↲
In order to be able to access the also protected protection tables GDT, ↓
LDT and IDT as data segments the Debug Monitor as well as the XENIX ↓
operating system needs to use an alias descriptor. An alias descriptor ↓
for the GDT table for instance is a Segment Descriptor that addresses ↓
the GDT table as a DATA segment. Several conventions for the layout of ↓
the LDT and GDT tables exists. The first entry of the protection tables ↓
are never used, it is filled with zeroes. The second entry of the GDT ↓
or LDT table is an alias descriptor for the table itself (R/W DATA). ↓
This means that if the Debug Monitor wants to access the GDT or the LDT ↓
table it may use the alias descriptor allready present. The third entry ↓
in the GDT table is an alias to access the IDT table as a R/W DATA ↓
segment.↲
↲
↲
┆8c┆┆83┆┆bc┆↓
HINT! If you want to change the protection tables from the Debug ↓
Monitor (no commands exists for that) then you should use the alias ↓
descriptors allready there.↲
↲
↲
┆a1┆2.3     Monitor Exception Handling.↲
↲
↲
When CPU control switches from target mode to command mode the Debug ↓
Monitor saves the 17 lowest target interrupt vectors, and loads 17 ↓
Debug Monitor vectors. These vectors are used to catch exceptions and ↓
protection violations that might happen in command mode (it is for ↓
instance possible to change the limit or access rights of the Debug ↓
Monitor itself). The protection violations and instruction exceptions ↓
will cause the Debug Monitor to write a message to the console and then ↓
execute a HALT instruction. The only way to get out of these exceptions ↓
is to hardware reset the CPU.↲
↲
↲
┆a1┆Vector type   Error Text                                      ↲
↲
0             Interrupt 0 at 'CS:IP' Divide By Zero↲
╞	╞	HALTED - Hardware RESET required↲
↲
2╞	╞	Interrupt 2 at 'CS:IP' NMI↲
╞	╞	HALTED - Hardware RESET required↲
↲
4╞	╞	Interrupt 4 at 'CS:IP' Overflow↲
╞	╞	HALTED - Hardware RESET required↲
↲
5╞	╞	Interrupt 5 at 'CS:IP' Bounds Check↲
╞	╞	HALTED - Hardware RESET required↲
↲
6╞	╞	Interrupt 6 at 'CS:IP' Undefined Operation↲
╞	╞	HALTED - Hardware RESET required↲
↲
7╞	╞	Interrupt 7 at 'CS:IP' Device Not Available↲
╞	╞	HALTED - Hardware RESET required↲
↲
┆8c┆┆83┆┆d4┆↓
8╞	╞	Interrupt 8 at 'CS:IP' Double Fault↲
╞	╞	HALTED - Hardware RESET required↲
↲
9╞	╞	Interrupt 9 at 'CS:IP' Math Address Error↲
╞	╞	HALTED - Hardware RESET required↲
↲
10╞	╞	Interrupt 10 at 'CS:IP' Invalid Task State Segment↲
              - ECODE = XXXX↲
╞	╞	HALTED - Hardware RESET required↲
↲
11╞	╞	Interrupt 11 at 'CS:IP' Not Present - ECODE = XXXX↲
╞	╞	HALTED - Hardware RESET required↲
↲
12╞	╞	Interrupt 12 at 'CS:IP' Stack Protection↲
╞	╞	 - ECODE = XXXX↲
╞	╞	HALTED - Hardware RESET required↲
↲
13╞	╞	Interrupt 13 at 'CS:IP' General Protection↲
╞	╞	- ECODE = XXXX↲
╞	╞	HALTED - Hardware RESET required↲
↲
14╞	╞	Interrupt 14 at 'CS:IP'↲
╞	╞	HALTED - Hardware RESET required↲
↲
15╞	╞	Interrupt 15 at 'CS:IP'↲
╞	╞	HALTED - Hardware RESET required↲
↲
16╞	╞	Interrupt 16 at 'CS:IP' Math Error↲
╞	╞	HALTED - Hardware RESET required↲
↲
↲
The term 'CS:IP' refers to the logical location in the program, where ↓
the exception came. The errorcode pushed onto the stack by some ↓
exceptions (ECODE) may be hard to decode, and no attempt to document ↓
them in this manual will be done. Consult INTEL manuals for further ↓
description of the exceptions and their errorcodes.↲
↲
↲
┆8c┆┆83┆┆c8┆↓
Prior to the exit to target mode the target vectors are naturally ↓
restored.↲

════════════════════════════════════════════════════════════════════════
↓
┆a1┆3.     MONITOR COMMANDS.↲
↲
↲
When the Monitor enters command mode or completes execution of a ↓
command without entering target mode, i.e. whenever it becomes ready ↓
for a new command, it outputs a '. ' (period and space) as a prompt. A ↓
command can then be typed as a sequence of characters terminated by CR, ↓
',' (comma), or '^' (upward arrow head or circumflex =5E┆82┆Hex┆81┆). It is ↓
possible to edit the command line using backspace or del (rubout) to ↓
erase faulty characters one at a time. No distinction is made between ↓
upper and lower case letters in the command input.↲
↲
↲
Before details of the individual commands are given, the vocabulary of ↓
the command syntax definitions is explained:↲
↲
↲
╞	- Capital letters must be typed as shown (or in lower case).↲
↲
↲
╞	- Parentheses delimit optional parameters and should not be typed.↲
↲
↲
╞	- ┆84┆Slashes separate alternative forms of a parameter and should not ↓
┆19┆┆86┆┄┄be typed.↲
↲
↲
╞	- "bp-no" stands for a breakpoint number in the range 0-7.↲
↲
↲
╞	- ┆84┆"addr type" stands for a memory address specified as either ↓
┆19┆┆86┆┄┄"sel:offset" or as "physadr".↲
↲
↲
    - ┆84┆"sel:offset" stands for a memory address specified as ↓
┆19┆┆86┆┄┄selector:offset or just offset, where segment and offset can each ↓
┆19┆┆86┆┄┄be given as a hexadecimal number with up to 4 digits or as the ↓
┆19┆┆86┆┄┄name of one of the registers in the context. In the latter case ↓
┆8c┆┆83┆┆c8┆↓
┆19┆┆86┆┄┄the value of the indicated register variable is used. When only ↓
┆19┆┆86┆┄┄offset is specified the value of CS is used as default for ↓
┆19┆┆86┆┄┄selector. An address speci┄fication may also be left out ↓
┆19┆┆86┆┄┄completely, in which case CS:IP is used as default. When both ↓
┆19┆┆86┆┄┄selector and offset are specified the separating ':' (colon) must ↓
┆19┆┆86┆┄┄be typed.↲
↲
↲
    - ┆84┆"physadr" is a 6 digit long hexadecimal physical memory address.↲
↲
↲
╞	- ┆84┆"count" stands for an unsigned decimal number to be used as a ↓
┆19┆┆86┆┄┄repetition counter.↲
↲
↲
╞	- ┆84┆"port_adr" stands for the address of an I/O port.↲
↲
↲
    - ┆84┆"value" stands for a byte or word value to be written to a ↓
┆19┆┆86┆┄┄register, memory location, or output port. Both may be given as a ↓
┆19┆┆86┆┄┄hexadecimal number with up to 4 digits (2 if byte). Register ↓
┆19┆┆86┆┄┄names may also be used as for addresses.↲
↲
↲
    - ┆84┆"reg_spec" stands for one of the iAPX 286 internal registers CS, ↓
┆19┆┆86┆┄┄DS, SS, ES, AX, BX, CX, DX, SP, BP, SI, DI, IP or FL (flags).↲
↲
╞	- ┆84┆"string" stands for any string of graphic characters not ↓
┆19┆┆86┆┄┄including ',' or '^'.↲
↲
↲
Command names are typed as single letters, in some cases preceded by an ↓
optional count indicating the command should be repeated the specified ↓
number of times, and usually followed by other parameters. In several ↓
cases a command may be continued or repeated if a ',' or '^' is typed ↓
instead of a command in response to the next prompt.↲
↲
↲
┆8c┆┆83┆┆c8┆↓
In the remainder of this chapter the individual commands are described. ↓
In the command syntax definitions the elements of each command are ↓
separated by blanks for readability. Such blanks are not necessary in ↓
actual command input. In the EXAMPLES shown below all Debug Monitor ↓
output is shown in ┆b0┆bold┆f0┆ and comments is preceded with a % character.↲
↲
┆a1┆↲
┆a1┆3.1  Help Command.↲
↲
↲
Command Syntax: ┆b0┆(H/?).↲
↲
↲
The help command displays a menu of available commands like this.↲
↲
↲
┆b0┆********************************************************************↲
┆b0┆*╞	╞	       RC 39 MONITOR MENU╞	╞	   - PAGE 1  *↲
┆b0┆********************************************************************↲
┆b0┆Command╞	╞	╞	   Action↲
↲
┆b0┆(<delete>/<back space>)╞	╞	   Erase last character↲
┆b0┆(H/?)╞	╞	╞	   Request this menu↲
┆b0┆*╞	╞	╞	╞	   Hardware Reset Command↲
┆b0┆G (C) (sel:offset) (; sel:offset)╞	   GO FROM user addr. TO user addr.↲
┆a1┆┆e1┆┆b0┆(count) N (sel:offset) (; sel:offset) STEP FROM user addr TO user addr.↲
┆b0┆B (bp_no sel:offset)╞	╞	   Set breakpoint in user code↲
┆b0┆C (bp_no)╞	╞	╞	   Reset one or all breakpoints↲
┆b0┆R (reg_spec)╞	╞	╞	   Display all/Change one register↲
┆b0┆RMSW╞	╞	╞	   Dispaly Machine Status Word↲
┆b0┆(count) M (W/X/P)(addr type)(=value) Display/Update/Disassemble Memory↲
┆b0┆(count) M (W/X) P (physadr)(=value)  P means Physical 6 digit hex addr.↲
┆b0┆(count) M (W/X) (sel:offset)(=value) Address given as Selector:Offset↲
┆b0┆I (W) port_adr╞	╞	   Input from byte or Word port↲
┆b0┆O (W) port_adr=value╞	╞	   Output value to byte or Word port↲
┆b0┆L (W/F) (G) (:string)╞	╞	   Load from disc↲
↲
┆b0┆,╞	╞	╞	╞	   Request more menu↲
↲
↲
┆8c┆┆83┆┆e0┆↓
If a comma is entered the rest of the menu is displayed.↲
↲
↲
┆b0┆********************************************************************↲
┆b0┆*╞	╞	       RC 39 MONITOR MENU╞	╞	   - PAGE 2  *↲
┆b0┆********************************************************************↲
┆b0┆Command╞	╞	╞	   Action↲
↲
┆b0┆(count) XLDT (ldt_index) (,)╞	   Examine USER LDT↲
┆b0┆(count) XGDT (gdt_index) (,)╞	   Examine GDT↲
┆b0┆(count) XIDT (idt_index) (,)╞	   Examine IDT↲
┆b0┆(count) XDT (gdt_index) (,)          Examine any LDT↲
┆b0┆XTSS (gdt_index) (,)╞	╞	   Examine TSS↲
┆b0┆,╞	╞	╞	╞	   Request more menu↲
↲
↲
┆a1┆3.2  Programmable Hardware Reset Command.↲
↲
↲
Command Syntax: ┆b0┆*.↲
↲
↲
This command is only available on the RC Manufactured CPU 610, not the ↓
Intel Manufactured CPU 691 iAPX 286 board. This command executes a ↓
hardware reset on the Multibus.↲
↲
↲
┆a1┆3.3  Set Breakpoint Command.↲
↲
↲
Command Syntax: ┆b0┆B (bp-no sel:offset).↲
↲
↲
Without parameters this command causes all currently set breakpoints  ↓
to be displayed. With parameters, a B command sets the breakpoint with ↓
the specified number at the specified address. If this breakpoint was ↓
previously set the old setting is deleted.↲
↲
↲
┆8c┆┆83┆┆d4┆↓
EXAMPLE.↲
↲
↲
┆b0┆. B╞	╞	╞	╞	┆f0┆% display active breakpoints.↲
┆b0┆Breakpoint 0 at 0160:664A substitute B8↲
┆b0┆Breakpoint 4 at 0168:001B substitute EA↲
┆b0┆Breakpoint 7 at 0168:1AAB substitute B8↲
┆b0┆.↲
↲
or↲
↲
↲
┆b0┆. B 6 11AB┆f0┆╞	╞	╞	% set breakpoint no. 6 at CS:11AB↲
↲
↲
If no selector is given CS is used.↲
↲
↲
┆a1┆3.4  Clear Breakpoint Command.↲
↲
↲
Command Syntax:┆b0┆ C (bp-no).↲
↲
↲
┆a1┆┆e1┆If a parameter is present the breakpoint with the specified number is ↓
deleted, otherwise all currently set breakpoints are deleted.↲
↲
↲
┆a1┆3.5  Single Step Through Target Code Command.↲
↲
↲
Command Syntax: ┆b0┆(count) N (sel:offset) (;sel:offset) (,).↲
↲
↲
This command single steps through target code from start address to end ↓
address. It may be wise to use a count if the end address is never ↓
reached. Breakpoint also terminates the single stepping. Before every ↓
step the instruction to be executed is disassembled and after each ↓
single step the registers are displayed.↲
↲
↲
┆8c┆┆83┆┆ec┆↓
EXAMPLE.↲
↲
↲
┆b0┆. 4N┆f0┆╞	╞	╞	% execute 4 Single Steps↲
↲
↲

╱04002d4e0c00060000000003014e3100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱

╱04002d4e0c0006000000000301473100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱
↓
┆b0┆0168:664A  C746FC0000╞	MOV   WORD PTRÆBP+FCÅ,0000H↲
┆b0┆ IP   FL   AX   CX   DX   BX   SP   BP   SI   DI   ES   CS   SS   DS  ABELGSI↲
┆b0┆6647 0312 0000 0120 00DC 0010 03C8 03D4 0004 097A 0008 0168 0188 0158 +---+-+↲
↲
┆b0┆0168:664F  8B46FC╞	MOV   AX,WORD PTRÆBP+FCÅ↲
┆b0┆ IP   FL   AX   CX   DX   BX   SP   BP   SI   DI   ES   CS   SS   DS  ABELGSI↲
┆b0┆6652 0312 0000 0120 00DC 0010 03C8 03D4 0004 097A 0008 0168 0188 0158 +---+-+↲
↲
┆b0┆0168:6652  6BC016╞	IMUL  AX,AX,0016H↲
┆b0┆ IP   FL   AX   CX   DX   BX   SP   BP   SI   DI   ES   CS   SS   DS  ABELGSI↲
┆b0┆6655 0356 0000 0120 00DC 0010 03C8 03D4 0004 097A 0008 0168 0188 0158 --+---+↲
↲
┆b0┆0168:6655  8BF8╞	MOV   DI,AX↲
┆b0┆ IP   FL   AX   CX   DX   BX   SP   BP   SI   DI   ES   CS   SS   DS  ABELGSI↲
┆b0┆6657 0356 0000 0120 00DC 0010 03C8 03D4 0004 0000 0008 0168 0188 0158 --+---+↲

╱04002d4e0c0006000000000301463100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱

╱04002d4e0c00060000000003014e3100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱
↓
↲
┆b0┆┆b0┆.↲
The command may be repeated with comma.↲
↲
↲
┆a1┆3.6  Go to (Exit to) Target Code Command.↲
↲
↲
Command Syntax = ┆b0┆G (C) (sel:offset) (;sel:offset).↲
↲
↲
This command exits to target code. If C is specified all breakpoints ↓
are deleted. If no start address is given the current CS:IP is used. ↓
If an end address is given a breakpoint (no. 0) is set at that ↓
address. NOTE that you should always reserve breakpoint 0 for the G ↓
command.↲
↲
↲
┆8c┆┆83┆┆d4┆↓
EXAMPLE.↲
↲
↲
┆b0┆. G ;665E┆f0┆╞	╞	╞	% CS is default↲
↲
↲
┆b0┆Breakpoint no. 0 at 0168:665E┆f0┆↲
┆b0┆. ↲
↲
↲
┆a1┆3.7  Display Target Registers.↲
↲
↲
Command Syntax: ┆b0┆R (reg-spec).↲
┆a1┆↲
↲
┆a1┆┆e1┆The R command is used to display and modify the values of the register ↓
variables in the target context. If the register specification is left ↓
out the values of all the registers are displayed. If a register is ↓
specified the value of that register is displayed followed by '-'. A ↓
new value for that register may now be entered, followed by CR. If no ↓
value is specified the old value (the one displayed) is kept.↲
↲
↲
EXAMPLE.↲
↲
↲
┆b0┆. R┆f0┆╞	╞	╞	╞	% display all registers↲

╱04002d4e0c00060000000003014e3100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱

╱04002d4e0c0006000000000301463100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱
↓
↲
 IP   FL   AX   CX   DX   BX   SP   BP   SI   DI   ES   CS   SS   DS  ABELGSI↲
┆b0┆665E 0286 0000 0120 00DC 0010 03C8 03D4 0004 8D18 0008 0168 0188 0158 +--+-++↲

╱04002d4e0c0006000000000301463100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱

╱04002d4e0c00060000000003014e3100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱
↓
↲
↲
┆b0┆. RAX┆f0┆╞	╞	╞	% change register AX↲
┆b0┆AX=0000-┆f0┆┆b0┆1234┆f0┆╞	╞	╞	% user types 1234↲
┆b0┆. RAX↲
┆b0┆AX=1234-┆f0┆╞	╞	╞	% user types <cr>↲
┆b0┆.↲

════════════════════════════════════════════════════════════════════════
↓
┆a1┆3.8  Display Machine Status Word.↲
↲
↲
Command Syntax: ┆b0┆RMSW.↲
↲
↲
This command displays the Machine Status Word.↲
↲
↲
EXAMPLE.↲
↲
↲
┆b0┆RMSW↲
┆b0┆MSW = FFFD↲
┆b0┆. ↲
↲
↲
┆a1┆3.9  Display/Change/Disassemble Memory.↲
↲
↲
Command Syntax: ┆b0┆(count) M(W/X/P) (addr type)(=value) (,) (^).↲
↲
↲
The M command is used to inspect and/or modify the contents of ↓
specified memory locations. It operates in three different ways, ↓
depending on the presence of the count and value specifications. In all ↓
cases the oper┄ation is performed on consecutive locations, beginning at ↓
the specified address. If X is specified memory is inspected in units ↓
of (variable length) processor instructions, i.e. a disassembler is ↓
invoked. If W is specified the unit to be inspected/modified is a word, ↓
otherwise a byte. If P is specified a maximum 6 digit long hexadecimal ↓
address must be given, otherwise a logical selector:offset address is ↓
expected.↲
↲
↲
If a value is specified, in which case the '=' (equal sign) must be ↓
typed, it is assigned to as many consecutive units (bytes or words) of ↓
memory as specified by the count, 1 if the count is omitted.↲
↲
↲
┆8c┆┆83┆┆e0┆↓
If no value is specified, but a count is, or if X is specified, the ↓
command is a pure display command. 16 bytes/8 words/1 instruction are ↓
displayed per line in hexadecimal/mnemonic. The number of units to be ↓
displayed is specified by the count. If, in this case, a ',' is entered ↓
in response to the following command prompt the same number of ↓
bytes/words/instructions is again displayed from subsequent memory ↓
locations. This exercise may be repeated indefinitely.↲
↲
↲
If no value, no count, and no X is specified, the command works as ↓
follows: The specified address and the current contents of the memory ↓
unit (byte or word) at that location are displayed, followed by '-'. A ↓
new value to be entered into that location may now be entered, followed ↓
by ',', '^', or CR. If no value is specified the old value (the one ↓
displayed) is kept. If CR is entered the command terminates; if ',' or ↓
'^' is input the address is incremented/decremented by 1 (byte) or 2 ↓
(word) and the operation repeated.↲
↲
↲
If a logical address is given (selector:offset), and an attempt to ↓
display/substitute/disassemble memory outside the descriptor limit is ↓
made then a message is written to the console.↲
↲
↲
┆b0┆Selector limit exceeded↲
↲
↲
NOTE that if a physical address is supplied then there is no ↓
restrictions to the address except it must be in the 16 M byte memory ↓
space.↲
↲
↲
NOTE also that the Debug Monitor always writes bytes to memory, even ↓
if word is specified. Word commands is divided into two successive ↓
byte operations.↲
↲
↲
EXAMPLE.↲
↲
↲
┆8c┆┆83┆┆e0┆↓
┆b0┆. 4MX┆f0┆ ╞	╞	╞	% CS:IP is default↲
↲
┆b0┆0168:665E  6BC00A ╞	IMUL   AX,AX,000AH╞	; I=+10↲
┆b0┆0168:6661  8BF0╞	MOV    SI,AX↲
┆b0┆0168:6663  81C66E25╞	ADD    SI,256E╞	; I=+9582↲
┆b0┆0168:6667  688200╞	PUSH   130↲
↲
┆b0┆. 20 M DS:0┆f0┆╞	╞	╞	% display bytewise, (.) means non↲

╱04002d4e0c00060000000003014e3100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱

╱04002d4e0c0006000000000301463100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱
↓
╞	╞	╞	╞	% ascii character↲
┆b0┆0158:06F0  1E 61 60 01 E6 21 60 01 7C 4D 68 01 21 41 68 01   .a'..!'.øMh.!Ah.↲
┆b0┆0158:0700  7C 6D 68 01╞	╞	╞	╞	       ømh.↲

╱04002d4e0c0006000000000301463100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱

╱04002d4e0c00060000000003014e3100000000000000000000000000000000000000000000000000050f19232d3741464b555f69737d87ff04╱
↓
↲
┆b0┆.┆f0┆↲
↲
┆b0┆. 10 MW DS:6F0┆f0┆╞	╞	% display wordwise↲
↲
┆b0┆0158:06F0  611E 0160 21E6 0160 4D7C 0168 4121 0168↲
┆b0┆0158:0700  6D7C 0168↲
↲
┆b0┆. 10 MWP FFF5┆f0┆╞	╞	╞	% display physical memory↲
↲
┆b0┆00FFF5  0000 0000 0000 0000 0000 0000 0000 0000↲
┆b0┆010005  0000 0000↲
↲
┆b0┆. MWP FFF5┆f0┆╞	╞	╞	% substitute physical memory↲
↲
┆b0┆00FFF5  0000-1234,┆f0┆╞	╞	% user types 1234 and (,)↲
┆b0┆00FFF7  0000-5678,┆f0┆╞	╞	% user types 5678 and (,)↲
┆b0┆00FFF9  0000-^┆f0┆╞	╞	% user types ^↲
┆b0┆00FFF7  5678-^┆f0┆╞	╞	% user types ^↲
┆b0┆00FFF5  1234-╞	┆f0┆╞	╞	% user types <cr>↲
↲
┆b0┆. ↲
↲
↲
┆b0┆100 MW DS:1000 = 1234┆f0┆╞	╞	% block assignment↲
↲
↲
┆8c┆┆83┆┆c8┆↓
┆a1┆3.10 Input from Port.↲
↲
↲
Command Syntax: ┆e1┆┆b0┆(count) I (W) port (,).↲
↲
↲
A number of bytes or, if W is specified, words, are read from the ↓
specified input port and displayed. The number of input operations is ↓
specified by count. Default is 1. Repetition can be requested (',').↲
↲
↲
EXAMPLE.↲
↲
↲
┆b0┆. IDE┆f0┆╞	╞	╞	% input from byte port↲
┆b0┆68↲
┆b0┆┆b0┆. IWDE┆f0┆╞	╞	╞	% input from word port↲
┆b0┆E868↲
┆b0┆. ,┆f0┆╞	╞	╞	╞	% repeat↲
┆b0┆E868↲
↲
↲
┆a1┆3.11 Output to Port.↲
↲
↲
Command┆e1┆ Syntax: ┆b0┆O (W) port = value.↲
↲
↲
The specified value is written to the specified output port as a byte ↓
or, if W is specified, as a word.↲
↲
↲
EXAMPLE.↲
↲
↲
┆b0┆. ODE=12┆f0┆╞	╞	╞	% output to byte port↲
↲
┆b0┆. OWDE=1234┆f0┆╞	╞	╞	% output to word port↲
↲
↲
┆8c┆┆83┆┆e0┆↓
┆a1┆3.12 Load (boot) from disc.↲
↲
↲
Command Syntax:┆e1┆ ┆b0┆L (W/F) (G) (: string).↲
↲
↲
The L command starts the disk bootloader. If G is speci┄fied and if the ↓
loading is succesfull then the Debug Monitor makes a Task State Segment ↓
for the target code and starts execution.↲
↲
↲
If the G is omitted, or if an exception occur the Debug Monitor remains ↓
in command mode.↲
↲
↲
The first parameter specifies the type of disk:↲
    W    Winchester disk↲
    F    Floppy disk↲
↲
↲
If a string parameter is present it is forced to lower case letters and ↓
stored in the bootname string area terminated with CR.↲
↲
↲
┆a1┆EXAMPLE.↲
↲
↲
┆b0┆. LG┆f0┆╞	╞	╞	% load and Go command↲
┆b0┆Stage 1 Boot OK↲
↲
┆b0┆ ╞	╞	Microsoft XENIX  3.2  ┆f0┆(and so on)↲
↲
↲
See chapter 4 for further boot information.↲
↲
┆a1┆↲
┆a1┆3.13 Examine Global Descriptor Table (GDT).↲
↲
↲
┆8c┆┆83┆┆d4┆↓
Command Syntax: ┆b0┆(count) XGDT (gdt_index) (,).↲
↲
↲
This command is used to display the content of the Global Descriptor ↓
Table (GDT). The content of the GDT table is ┆a1┆Segment Descriptors┆e1┆ and ↓
┆a1┆System Descriptors┆e1┆.↓
↲
↲
Also if the GDT index is outside the GDT limit another error message is ↓
written.↲
↲
↲
┆b0┆exception - table limit exceeded↲
↲
↲
EXAMPLE.↲
↲
↲
┆b0┆. 4 XGDT┆f0┆╞	╞	╞	% display first 4 GDT entries↲
↲
┆b0┆0000 : NULL DESCRIPTOR↲
╞	╞	╞	╞	% Note that entry 0008 is the GDT↲
╞	╞	╞	╞	% alias descriptor↲
┆b0┆0008 : LIMIT = 027F -  BASE = 00297A -  ACCESS = 93↲
┆b0┆╞	   DSEG, Present, DPL=0, Expand Up, Read/Write, Accessed↲
↲
┆b0┆╞	╞	╞	╞	┆b0┆┆f0┆% Note that entry 10 is the IDT↲
╞	╞	╞	╞	% alias descriptor↲
┆b0┆0010 : LIMIT = 07FF -  BASE = 0030D8 -  ACCESS = 93↲
┆b0┆╞	   DSEG, Present, DPL=0, Expand Up, Read/Write, Accessed↲
↲
┆b0┆0018 : LIMIT = 0200 -  BASE = 000000 -  ACCESS = 93↲
┆b0┆╞	   DSEG, Present, DPL=0, Expand Up, Read/Write, Ignored↲
↲
↲
┆b0┆. XGDT 28╞	╞	╞	┆f0┆% example TASK GATE↲
↲
┆b0┆0028 : SSEL = 0040↲
┆8c┆┆83┆┆c8┆↓
┆b0┆       TASK GATE, Present, DPL=0↲
↲
↲
┆b0┆. XGDT 30┆f0┆╞	╞	╞	% example Task State Segment↲
↲
┆b0┆0030 : LIMIT = 002C -  BASE = 001008 -  ACCESS = 81↲
┆b0┆       AVAILABLE TSS, Present, DPL=0↲
↲
↲
┆b0┆. XGDT 108┆f0┆╞	╞	╞	% example LDT descriptor↲
↲
┆b0┆0108 : LIMIT = 0838 -  BASE = 001008 -  ACCESS = 82↲
┆b0┆       LDT DESCRIPTOR, Present, DPL=0↲
↲
↲
┆b0┆. XGDT 138┆f0┆╞	╞	╞	% example CODE (TEXT) segment desc.↲
↲
┆b0┆0138 : LIMIT = 7FFF -  BASE = FF8000 -  ACCESS = 9B↲
┆b0┆       ESEG, Present, DPL=0, Execute/Read, Not Conforming↲
↲
↲
┆b0┆. XGDT 1D0┆f0┆╞	╞	╞	% example CALL GATE↲
↲
┆b0┆01D0 : WCNT = 1 -  SSEL = 0160 -  SOFF = 4559↲
┆b0┆       CALL GATE, Present, DPL=3↲
↲
↲
┆a1┆3.14 Examine Target Local Descriptor Table (LDT).↲
↲
↲
Command Syntax: ┆b0┆(count) XLDT (ldt_index) (,).↲
↲
↲
This command is used to display the content of the presently active LDT ↓
descriptor table. The content of the LDT table is ┆a1┆Segment Descriptors┆e1┆ ↓
and ┆a1┆System Descriptors┆e1┆. If neither CS, DS, SS or ES references a LDT ↓
table a message is written to the console.↲
↲
↲
┆8c┆┆83┆┆d4┆↓
┆b0┆exception - USER has no LDT↲
↲
↲
Also if the LDT index is outside the LDT limit another error message is ↓
written.↲
↲
↲
┆b0┆exception - table limit exceeded↲
↲
↲
EXAMPLE.↓
↲
↲
┆b0┆. 4XLDT┆f0┆╞	╞	╞	% display 4 LDT entries↲
↲
┆b0┆0004 : NULL DESCRIPTOR↲
↲
┆b0┆000C : LIMIT = 0838 -  BASE = 000350 -  ACCESS = 92↲
┆b0┆       DSEG, Present, DPL=0, Expand Up, Read Write, Ignored↲
↲
┆b0┆0014 : LIMIT = 7FFF -  BASE = FF8000 -  ACCESS = 9B↲
┆b0┆       ESEG, Present, DPL=0, Execute/Read, Not Conforming↲
↲
┆b0┆001C : LIMIT = FFFF -  BASE = 000000 -  ACCESS = 93↲
┆b0┆       DSEG, Present, DPL=0, Expand Up, Read/Write, Accessed↲
↲
↲
┆a1┆3.15 Examine Interrupt Descriptor Table (IDT).↲
↲
┆82┆↲
Command Syntax: ┆b0┆(count) XIDT (idt_index) (,).↲
↲
↲
This command is used to display the content of the Interrupt Descriptor ↓
Table. The content of the IDT table may be either ┆a1┆TASK Gates┆e1┆, ┆a1┆Interrupt ↓
┆19┆┄┄┆84┆Gates┆e1┆, ┆a1┆Interrupt Traps┆e1┆ or ┆a1┆NULL Descriptors.↲
↲
↲
┆8c┆┆83┆┆c8┆↓
If IDT index is outside the IDT limit another error message is written.↲
↲
↲
┆b0┆exception - table limit exceeded↲
↲
↲
EXAMPLE.↲
↲
↲
┆b0┆. 4 XIDT┆f0┆╞	╞	╞	% display 4 IDT entries↲
↲
┆b0┆0000 : SSEL = 0160 -  SOFF = 44AE↲
┆b0┆       TRAP GATE, Present, DPL=0↲
↲
┆b0┆0008 : SSEL = 0160 -  SOFF = 44B2↲
┆b0┆       TRAP GATE, Present, DPL=0↲
↲
┆b0┆0010 : SSEL = 0160 -  SOFF = 44BF↲
┆b0┆       TRAP GATE, Present, DPL=0↲
↲
┆b0┆0018 : SSEL = 0160 -  SOFF = 44C8↲
┆b0┆       TRAP GATE, Present, DPL=0↲
↲
↲
┆b0┆. XIDT 200┆f0┆╞	╞	╞	% example Interrupt Gate↲
↲
┆b0┆0200 : SSEL = 0160 -  SOFF = 4576↲
┆b0┆       INTERRUPT GATE, Present, DPL=0↲
↲
↲
┆a1┆3.16 Examine any LDT Table.↲
↲
↲
Command Syntax: ┆b0┆(count) XDT (gdt_index) (,).↲
↲
↲
This command is used to display the content of any memory resident LDT ↓
table. This command is typically used to display the content of ↓
┆8c┆┆83┆┆c8┆↓
inactive LDT tables whereas the XLDT command displays the content of ↓
the currently active LDT table. The gdt_index must be an LDT descriptor ↓
in the GDT.↲
↲
↲
If the LDT descriptor indicates segment not present in physical memory ↓
a message is written to the console.↲
↲
↲
┆b0┆exception - LDT segment NOT present↲
↲
↲
Also if the GDT index does'nt point to a LDT descriptor another  ↓
message is generated.↲
↲
↲
┆b0┆exception - entry is NOT an LDT descriptor↲
↲
↲
Also if the GDT index is outside the GDT limit another error message is ↓
written.↲
↲
↲
┆b0┆exception - table limit exceeded↲
↲
↲
EXAMPLE.↲
↲
↲
This command will produce a listing similar to the XLDT command. There ↓
is a known bug in this command in release 3.2 of the Debug Monitor. ↓
This bug will be corrected in further releases.↲
↲
↲
┆a1┆3.17 Examine TASK State Segment (TSS).↲
↲
↲
Command Syntax: ┆b0┆XTSS (gdt_index) (,).↲
↲
↲
┆8c┆┆83┆┆e0┆↓
This command is used to display the content of a Task State Segment ↓
(TSS). A TSS is a special segment (44 bytes long) used to hold all the ↓
iAPX 286 variables that changes during a TASK SWITCH. The gdt_index ↓
must be TSS descriptor (TSS descriptors must always be available and ↓
for that reason they must be in the GDT table). If a (,) is entered ↓
the command is repeated with the next GDT selector.↲
↲
↲
If the GDT index does'nt point to a TSS descriptor an error message is ↓
written.↲
↲
↲
┆b0┆exception - entry is NOT a TSS descriptor↲
↲
↲
Also if the GDT index is outside the GDT limit another error message is ↓
written.↲
↲
↲
┆b0┆exception - table limit exceeded↲
↲
↲
EXAMPLE.↲
↲
↲
┆b0┆. XTSS 190┆f0┆╞	╞	╞	% examine XENIX 3.2 TSS (Only One)↲
↲
┆b0┆       Link SP-0 SS-0 SP-1 SS-1 SP-2 SS-2 IP-r FL-r AX-r CX-r↲
┆b0┆0190 : 0000 0400 0188 0000 0000 0000 0000 0000 0000 0000 0000↲
┆b0┆       DX-r BX-r SP-r BP-r SI-r DI-r ES-s CS-s SS-s DS-s LDT-s↲
┆b0┆╞	   0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 01C8↲
↲
↲
The snapshot above was taken before the XENIX TASK was running, just ↓
after bootload was finished.↲

════════════════════════════════════════════════════════════════════════
↓
┆a1┆┆a1┆4.     LOAD (BOOT) FROM DISC.↲
↲
↲
The Debug Monitor is carefully integrated with the built in selftest ↓
in the products where it is used. The selftest is for instance ↓
responsible for the initialization of all peripheral devices and also ↓
for switching the iAPX 286 CPU and the SBC board itself into the ↓
Protected Virtuel Address Mode (PVAM) of operation┆b0┆. ┆f0┆Before the ↓
┆19┆┄┆81┆┄termination of the selftest a Multibus configuration is made and all ↓
┆19┆┄┆81┆┄"test-slaves" are sent to their bootload phase. Allthough it is ↓
┆19┆┄┆81┆┄possible to stop the selftest prior to its natural termination and ↓
┆19┆┄┆81┆┄then execute a boot (load from disc) command, it is not wise to do so ↓
┆19┆┄┆81┆┄because the XENIX operating system uses the Multibus Configuration ↓
┆19┆┄┆81┆┄schedule to determine which boards need bootloading and the "test-↓
┆19┆┄┆81┆┄slaves" will be waiting for their go to boot command as well.↲
┆81┆↲
↲
If no console is present on the iAPX 286 CPU board then the bootload ↓
from winchester disc is started by default, otherwise the result of ↓
the configuration is written to the screen and the Debug Monitor is ↓
entered. The console output might look like this.↲
↲
↲
┆b0┆Multibus Configuration:↲
┆b0┆======================================================================↲
┆b0┆┆b0┆MB entry - MB address - Card State - Card ID - MB RAM size - error no.↲
┆b0┆======================================================================↲
┆b0┆00000       000000╞	  master╞	   CPU 610   02048          00000↲
┆b0┆┆b0┆00001       9E0000╞	  ready╞	   ITC 602   00064          00000↲
┆b0┆00002       8E0000        ready╞	   COM 601   00064          00000↲
┆b0┆00003       800000        ready      ETC 611   00512          00000↲
↲
┆b0┆<00001> Sent to bootload↲
┆b0┆<00002> Sent to bootload↲
┆b0┆<00003> Sent to bootload↲
↲
┆b0┆RC 39 Monitor release 2.0↲
┆b0┆.↲
↲
↲
┆8c┆┆83┆┆e0┆↓
It is now necessary to enter a boot command to get XENIX up and ↓
running. If the bootload is made from floppy it is normally necessary ↓
to enter the file name "xenix.fd" (LFG:xenix.fd). If the booload goes ↓
from winchester it is enough to enter (LG) and the default kernel ↓
"/xenix" is loaded.↲
↲
↲
The bootload is seperated into two stages. The first stage loads the ↓
bootstrap track from either winchester or floppy into memory, builds a ↓
Task State Segment from the loaded image, and starts execution. The ↓
format of both the floppy and the winchester disc is 1024 ↓
bytes/sector. The floppy disc has 8 sectors/track and the winchester ↓
has 9 sectors/track.↲
↲
↲
If the first stage is unable to read from floppy or winchester disc an ↓
error message is written to the console.↲
↲
↲
┆b0┆SCSI disc read error↲
↲
↲
If the reading went succesfull but the format was not as expected ↓
another message is written. The loaded code must be in MICROSOFT x.out ↓
SMALL model format. ↲
↲
↲
┆b0┆x.out Format error↲
↲
↲
If neither SCSI error nor format error is detected an OK message is ↓
written to the console.↲
↲
↲
┆b0┆Stage 1 Boot OK.↲
↲
↲
┆8c┆┆83┆┆bc┆↓
The loaded program is not XENIX, but the second stage boot which ↓
"knows" about the XENIX file structure, and is able to load and ↓
start the execution of the XENIX Kernel, which must be in MICROSOFT ↓
x.out MIDDLE model format. When the Kernel is loaded succesfully and ↓
started a message is written to the console.↲
↲
↲
╞	╞	┆f0┆┆b0┆Microsoft XENIX 3.2 ┆f0┆(and so on)↲
↲
↲
A number of exceptions may arise during the second stage boot. The ↓
exceptions are listed below. After an exception the loader returns to ↓
the Debug Monitor if possible. Experience has shown that not all ↓
exceptions are restartable, but a hardware reset must be supplied.↲
↲
↲
All exceptions are numbered and they will all produce the same type of ↓
output.↲
↲
↲
┆b0┆Stage 2 Boot EXCEPTION no: nn↲
↲
↲
nn↲
↲
↲
2. header error (x.out format error)↲
↲
3. bad magic number (x.out format error)↲
↲
4. bad word ordering (x.out format error) ↓
↲
5. bad target cpu (x.out format error)↲
↲
6. bad runtime environment (x.out format error)↲
↲
7. extended header read error (x.out format error)↲
↲
┆8c┆┆83┆┆c8┆↓
8. can't boot unsegmented x.out files (x.out format error)↲
↲
9. zero segments (x.out format error)↲
↲
32. means file not found↲
↲
100. 5 retries was made by the disc driver, but still no data.↲

════════════════════════════════════════════════════════════════════════
↓
┆a1┆5.     RAM RESERVATION.↲
↲
↲
┆a1┆┆e1┆This version of the Debug Monitor is currently running on two iAPX 286 ↓
CPU's, the CPU 610 and the CPU 691. On both CPU's the lowest 8 K byte ↓
of RAM is reserved for the Debug Monitor.↲

════════════════════════════════════════════════════════════════════════
↓
┆a1┆6.     RELATED DOCUMENTS.↲
↲
↲
RC 39 Selftest Concept, User's Manual              RCSL. 99110092↲
↲
ITC 602 hardware selftest, User's Manual           RCSL. 99110095↲
↲
F641 COM 601 hardware selftest, User's Manual      RCSL. 99110097↲
↲
RC 3902 (CPU 691) hardware selftest, User's Manual RCSL. 99110094↲
↲
RC 3902 (CPU 610) hardware selftest, User's Manual RCSL. 99119134 ↲
↲
↲
RC 39 Monitor 8086 version, Reference Manual       RCSL. 99110134↲

════════════════════════════════════════════════════════════════════════
↓
┆a1┆Appendix A.↲
↲
↲
In order to integrate the Debug Monitor with XENIX 3.2 a number of GDT ↓
selectors (40) is reserved for the Debug Monitor. This gives the ↓
following GDT table layout.↲
↲
↲
╞	╞	╞	-----------------↲
╞	╞	    0000╞	!                ! NULL DESCRIPTOR↲
 ╞	╞	╞	!----------------!↲
╞	  ╞	    0008╞	!   GDT ALIAS    !↲
╞	╞	╞	!----------------!↲
╞	              0010╞	!   IDT ALIAS    !↲
╞	╞	╞	!----------------!-----------------------↲
╞	╞	╞	!╞	       ! 40 Debug Monitor GDT↲
╞	╞	╞	!╞	       ! entries↲
╞	╞	╞	!╞	       !↲
╞	╞	╞	 ╞	       ↲
╞	╞	╞	╞	       ↲
╞	╞	╞	!                !↲
╞	╞	╞	!----------------!↲
╞	╞	    0110  !  CONFIG DESC.  ! Descriptor for the Mul-↲
╞	╞	╞	!----------------! tibus Configuration Table↲
╞	╞	    0118  ! INT 1 TASK GATE! Task Gate to simulate↲
                        !----------------! Single Step interrupt↲
╞	╞	    0120  ! INT 3 TASK GATE! Task Gate to simulate↲
╞	╞	╞	!----------------! Breakpoint OR INT 3 int.↲
╞	╞	╞	! not used       !↲
╞	╞	╞	!                !↲
                        !----------------!------------------------↲
↲
↲
╞	╞	╞	┆b0┆┆f0┆┆a1┆┆f0┆┆e2┆┆e1┆   ┆a1┆GDT Layout.↲

════════════════════════════════════════════════════════════════════════
↓
╞	╞	    0158  ! KERNEL DATA    ! XENIX 3.2 selectors↲
╞	╞	╞	!----------------!↲
╞	╞	    0160╞	! KERNEL CODE 1  !↲
╞	╞	          !----------------!↲
╞	              0168╞	! KERNEL CODE 2  !↲
╞	╞	╞	!----------------!↲
╞	╞	    0170 ╞	! KERNEL CODE 3  ! not used in XENIX 3.2↲
╞	╞	╞	!----------------!↲
╞	              0178╞	! KERNEL CODE 4  ! not used in XENIX 3.2↲
╞	╞	╞	!----------------!↲
╞	              0180╞	! KERNEL CODE 5  ! not used in XENIX 3.2↲
╞	╞	╞	!----------------!↲
╞	              0188╞	! KERNEL STACK   !↲
╞	╞	╞	!----------------!↲
╞	              0190╞	!   XENIX TSS    ! XENIX 3.2 is only one iAPX↲
╞	╞	╞	!----------------! 286 Task.↲
╞	              0198╞	!   TSS ALIAS    !↲
╞	╞	╞	!----------------!↲
╞	╞	    01A0╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    01A8╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    01B0╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    01B8╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    01C0╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    01C8╞	!  USER LDT      ! XENIX 3.2 USER LDT↲
╞	╞	╞	!----------------!↲
╞	╞	    01D0╞	!  SYS CALL GATE !↲
╞	╞	╞	!----------------!↲
↲
↲
╞	╞	         ┆a1┆GDT Layout Continued.↲

════════════════════════════════════════════════════════════════════════
↓
╞	╞	    01D8╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	  ╞	    01E0╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    01E8╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    01F0╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    01F8╞	!  KERNEL WORK   !↲
╞	╞	╞	!----------------!↲
╞	╞	    0200╞	!  MAP WORK      !↲
╞	╞	╞	!----------------!↲
╞	╞	╞	! 10 Dynamically !↲
╞	╞	╞	!  Allocated     !↲
╞	╞	╞	!  entries       !↲
╞	╞	╞	!╞	       !↲
╞	╞	    027F╞	!----------------!↲
↲
↲
╞	╞	 ┆a1┆┆e1┆        ┆a1┆GDT Layout Continued.↲
↲
↲
The Debug Monitor is integrated with XENIX 3.2 in a way so that it ↓
works as a KERNEL Debugger. This means that all interrupt 1 or ↓
interrupt 3 that occur in SYSTEM-mode (privilege level 0) are directed ↓
to the Debug Monitor and all USER-mode interrupt of the same type are ↓
handled by the XENIX Kernel itself. This strategy preserves the ↓
functionality of the XENIX USER-mode debugger, ADB.↲

════════════════════════════════════════════════════════════════════════
↓
         !↲
╞	     !↲
   INT 1 or INT 3  -----------------------> mch.s↲
         !                                    !↲
         !----!  ╞	                   oemsup.s↲
 ╞	     !    !╞	╞	╞	  !↲
         !╞	!       SYSTEM-mode  -------- USER-mode↲
╞	     !╞	!╞	  !╞	╞	  !↲
╞	     !╞	!     DEBUG MONITOR╞	╞	mch.s↲
╞	     !╞	!╞	  !╞	╞	  !↲
╞	     !╞	!-----------!╞	╞	  !↲
╞	     !╞	╞	╞	╞	  ! XENIX Handles TRAP↲
         !↲
↲
↲
             ┆a1┆XENIX 3.2 Interrupt 1 or 3 Handling.↲
↲
↲
The figure above explains what happens in the XENIX 3.2 Kernel when an ↓
interrupt 1 or 3 occur. The interrupt gate in the IDT points to a TRAP ↓
handler in a file called mch.s . This TRAP handler passes control to a ↓
program in a file called oemsup.s . This program finds out whether the ↓
interrupt occured in SYSTEM-mode or not. If true a call to the Debug ↓
Monitor through one of the GDT gates index 118 or 120 hex. is made. ↓
The Debug Monitor compensates for the additional processing since the ↓
TRAP occured and returns direct to the point where the exception came ↓
from. In USER-mode the program in oemsup.s returns transparently to ↓
mch.s and the operating system handles the TRAP.↲
↲
↲
To get into the monitor from the Kernel a routine called "rcmonitor" ↓
is included in the module called "oemsup.s". This routine simply ↓
executes an INT 3 instruction into the Debug Monitor. After one single ↓
step (N command) your back into the suspended program.↲
↓
↓
↓
↓
┆b0┆↓
┆1a┆┆1a┆╞	╞	!----------------!↲
╞	              0180╞	! KERNEL CODE 5  ! not used in XE

Full view