@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            MTL243
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                           ISSUE 11~
~V9 -1
~P
~V9 1
~YMTL243
~S~M~OMUTL IMPLEMENTATION DESCRIPTION
~S1~M~OSection 24 Version 3
~S1~OSection 24.3 Runtime Diagnostics (Machine-Dependent)
~S1~O1. General Description
~BThis module provides a set of machine-dependent procedures for use
by the runtime diagnostic primitives.
~S1~O2. Interfaces~
~
Other modules used:~
   Section 10:   (Runtime Diagnostic Primitives)~
~
MUTL Procedures:~
~
Interface Procedures:~
   GET.FAULT.LINK()/FAULT.LINK~
   SETNB()~
   TSIZE(TYPE)/NOOFBYTES~
   ACCESS(ADDRESS,NOOFBYTES)/VALUE~
   WRITE(ADDRESS,VALUE,NOOFBYTES)~
   SETSTACK(INCPC)~
   REALADDR(CODED.ADDRESS)/ADDRESS~
   TYPECONV(CODED.TYPE)/TYPE~
   GET.NEXT.LINK(OLDFP,TYP)/NEXTLINK~
   PROCTYPE()/TYPE~
~
Interface Types:~
   PVENTRY~
   FENTRY~
~
Configuration Parameters:~
   PW0~
   PW1~
   NAMESHIFT~
   SEGM1~
~S1~O2.1 Hardware Interface
~S1~O2.2 Software Interface
~S11) GET.FAULT.LINK()/FAULT.LINK
~BThis procedure returns the link at which the program failed.
~S12) SETNB()
~BThis procedure sets NB with the value in PW1.
~S13) GET.NEXT.LINK(OLDFP,TYP)NEXTLINK
~BThis procedure is used to get the next namebase if TYP is zero or
 link address if TYP is one.
~S14) TSIZE(TYPE) NOOFBYTES
~BThe size of encoded type, TYPE, in bytes is returned.
~S15) TYPECONV(CODED.TYPE)/TYPE
~BThis procedure decodes the input type and returns TYPE, which
is positive for a MUTL basic type or the negative value of a
pointer into the property vector of an aggregate type.
~S16) ACCESS(ADDRESS,NOOFBYTES)/VALUE
~BThis procedure returns the logical VALUE of whatever is stored at
ADDRESS, with length NOOFBYTES.
~S17) WRITE(ADDRESS,VALUE,NOOFBYTES)
~BThis procedure sets VALUE into the location indicated by ADDRESS
and NOOFBYTES.
~S18) REALADDR(CODED.ADDRESS)/ADDRESS
~BThis procedure decodes the input address (procedure stack frame,
vector stack or MUTL segment) and returns the virtual address.
~S19) SETSTACK(INCPC)
~BThis procedure is called to reset the stack just before an exit from
the trap procedure. The PC is incremented by INCPC ad control is
returned to the user program.
~S110) PROCTYPE()/TYPE
~BThe type of the procedure indicated by CUR.LT.PROC is returned as
follows.~
~T% 6
~
~(MU5)~I  0 - procedure not using vector stack~
~I< 0 - procedure using vector stack~
~I  1 - subroutine~
~I  2 - block~
~(MU6)   ~I0 - procedure~
~I  1 - block containing exports of all modules~
~I  2 - block~
~S111) PVENTRY~
12) FENTRY~
~BThese are the types of entries in PV, the length of the elements
are different for each machine.
~BAn entry for a variable has type PVENTRY with the following fields:-~
~T# 11
~
  :RNAME~Ipointer into SV.~
  :PVADDR~Icoded address.~
  :PVTYPE~Icoded type information.~
  :PVDIM~Ioptional field, dimension of variable.~
~
An entry for a field has type FENTRY with the following fields:-~
~
  :FFLAG~Iflag for end of type/alternative.~
  :FDISP~Idisplacement of field within type.~
~X}|
  :FTYPE~I} as above.~
  :FDIM~I}~
~X}}
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~S1~O3.2 Data Structures
~S11) BPT
~BThis vector holds information on the breakpoint inserted into a
user program. It contains the following fields:-~
~T# 9
~
  :CA~Iaddress of the code where the BREAKPOINT call/BPT instruction
is inserted.~
~
  :CODE~I(MU5) address of the displaced code.~
~I(VAX) instruction removed.~
~
  :NUM~I(MU5) number of instructions displaced.~
~
  :CUR~Icurrent number of times that the breakpoint has been executed.~
~
  :MAX~Inumber of times after which the breakpoint has been executed
and TL.TRAP called.~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H               MTL243
~V9 -1
~F
@TITLE MTL24(3,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
M/C DEPENDENT MURD PROCS
@BOX 2.0
@BOX 3.0
EXPORTED LSPECS
@BOX 4.0
SUB-CHART DECLARATIONS
@BOX 5.0
END
@BOX 1.1
#MTL24/1
@BOX 2.1
MODULE(INIT.24,GET.FAULT.LINK,SETNB,ACCESS,TSIZE,WRITE,
GET.NEXT.LINK,REALADDR,PROCTYPE,TYPECONV,SETSTACK,BPT,BPT.ENTRY,
SEGM1,NAMESHIFT,PVSIZ,PVENTRY,FENTRY,FLAGSHIFT,LAST.USER.SEG,TYPEPOS,
FLDSIZE,VARPOS,TYPEMASK1,TYPEMASK2,SEGSHIFT,PW0,PW1,PW2,PWW1,PWW2,
FILED.PROP.SEG,PROG.PROP.SEG,MURD.WORK.SEG,SHIFT.MCADDR.TO.BYTE);
@BOX 3.1
TYPE PVENTRY IS $LO32 PVADDR $LO16 PVTYPE,PVDIM;
TYPE FENTRY IS $LO16 FFLAG,FDISP,FTYPE,FDIM;
LITERAL SEGM1=15,SEGSHIFT=16,NAMESHIFT=0,PVSIZ=2,FLAGSHIFT=0,LAST.USER.SEG=64,
TYPEPOS=3,FLDSIZE=4,VARPOS=1,TYPEMASK1=%3F(3),TYPEMASK2=%F(3)C,
FILED.PROP.SEG = 44, PROG.PROP.SEG = 45, MURD.WORK.SEG = 46,
SHIFT.MCADDR.TO.BYTE = 0;
PSPEC PROCTYPE()/$IN;
PSPEC GET.NEXT.LINK(ADDR,$IN)/ADDR;
PSPEC REALADDR(ADDR)/ADDR;
PSPEC TYPECONV($IN)/$IN;
PSPEC GET.FAULT.LINK()/ADDR;
PSPEC SETNB(ADDR);
PSPEC ACCESS(ADDR,$IN)/$LO64;
PSPEC TSIZE($IN32)/$IN;
PSPEC WRITE(ADDR,$LO64,$IN);
PSPEC SETSTACK($IN);
PSPEC INIT.24();
*GLOBAL 10;
ADDR PW0,PW1,PW2,PW3,PW4,PW5,PW6;
$LO64 PWW1,PWW2;
*GLOBAL 9;
TYPE BPT.ENTRY IS $LO32 CA $LO8 CODE $IN CUR,MAX;
BPT.ENTRY [10] BPT;
*GLOBAL 0;
@BOX 4.1
#MTL24.1
#MTL24.2
#MTL24.3
#MTL24.4
#MTL24.5
#MTL24.6
#MTL24.7
#MTL24.8
#MTL24.9
#MTL24.10
#MTL24.11
@BOX 5.1
*END
**IN -1
@END

@TITLE MTL24/1(3,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
MODULE 24 IMPORTS
@BOX 2.0
LSPECS
@BOX 3.0
@BOX 4.0
@BOX 1.1
::MODULE 24 IMPORTS
@BOX 2.1
LSPEC OUTSTACK(ADDR,ADDR);
LSPEC OUTHEX($LO32,$IN);
LSPEC CHANGE.ACCESS($IN,$LO);
LSPEC NEXTCH()/$IN;
LSPEC INI()/ADDR;
LSPEC OUTI($IN32,$IN);
LSPEC SPACES($IN);
LSPEC CAPTION(ADDR[$LO8]);
LSPEC INCH()/$IN;
LSPEC OUTCH($IN);
@BOX 3.1
PSPEC TL.TRAP($IN,$IN);
@BOX 4.1
ADDR [$LO16] PV;
ADDR [$LO16] LT;
ADDR [$LO8] SV;
$IN32 CUR.PCS,NB,CUR.LT.PROC;
$IN32 MODE,SCREEN;
@END
@TITLE MTL24.1(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC INIT.24
@BOX 2.0
INITIALIZE DATA STRUCTURES
@BOX 3.0
END
@BOX 1.1
PROC INIT.24;
@BOX 2.1
$IN I;
FOR I<10 DO
SELECT BPT[I];
-1 =>CA =>CUR OD;
@BOX 3.1
END;
@END

@TITLE MTL24.2(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC GET.FAULT.LINK
@BOX 2.0
RETURN FAULT LINK
@BOX 3.0
END
@BOX 1.1
PROC GET.FAULT.LINK;
@BOX 2.1
*#%D0 %AD %0C %AD %FC;:: STACKED FP => LINK
@BOX 3.1
END;
@END

@TITLE MTL24.3(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC SETNB
@BOX 2.0
RESET NB
@BOX 3.0
END
@BOX 1.1
;PROC SETNB(NB);
@BOX 2.1
*#%D0 %AD %1C %5D; :: MOVL 28(R13) R13
@BOX 3.1
END;
@END

@TITLE MTL24.4(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC ACCESS
@BOX 2.0
RETURN VALUE FROM ADDRESS P1, LENGTH P2 BYTES
@BOX 3.0
END
@BOX 1.1
PROC ACCESS(P1,P2);
@BOX 2.1
$LO64 TEMP;
ADDR $LO64 LO64;
%FF => TEMP;
FOR P2-1 DO TEMP<<-8 !> TEMP OD;
MAKE($LO64,0,P1) => LO64;
LO64^& TEMP =>ACCESS;
@BOX 3.1
END;
@END

@TITLE MTL24.5(3,6)
@COL 9R
@COL 1S-2T-8T-4T-5R-7R-10F
@COL 3R-6R
@ROW 9-4
@ROW 4-3
@ROW 5-6
@FLOW 1-2N-8N-4N-5-7-10
@FLOW 2Y-3-7
@FLOW 4Y-6-7
@FLOW 8Y-9-7
@BOX 1.0
PROC TSIZE
@BOX 2.0
POINTER?
@BOX 3.0
SET SIZE
@BOX 4.0
SPECIAL ENCODING?
@BOX 5.0
SET SIZE
@BOX 6.0
SET SIZE
@BOX 7.0
ADJUST SIZE IF VECTOR
@BOX 8.0
AGG TYPE?
@BOX 9.0
SET SIZE
@BOX 10.0
END
@BOX 1.1
PROC TSIZE(P1);
$IN INC;
@BOX 2.1
IF P1 &3 /=0,
@BOX 3.1
(IF P1&3 =3 THEN 8 ELSE 4) =>INC;
@BOX 4.1
P1 ->>2 &%F +1 =>INC;
IF P1 &%3F(3) <%40 AND
1 <<-INC &%10114 =0,
@BOX 5.1
IF INC=3 THEN 4 =>INC FI;
@BOX 6.1
IF INC /=9 THEN
INC&%1*4+4 =>INC ELSE 1 =>INC FI;
@BOX 7.1
@BOX 8.1
IF P1 &%4000 /=0,
@BOX 9.1
PV^[P1&%3F(3) ->>2+1] =>INC;
@BOX 10.1
INC => TSIZE;
END;
@END

@TITLE MTL24.6(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC WRITE(ADDRESS,VALUE,NO.BYTES)
@BOX 2.0
WRITE
@BOX 3.0
END
@BOX 1.1
PROC WRITE(P1,P2,P3);
ADDR $LO1 LO1;
ADDR $LO8 LO8;
ADDR $LO16 LO16;
ADDR $LO32 LO32;
ADDR $LO64 LO64;
@BOX 2.1
ALTERNATIVE P3 FROM
BEGIN MAKE($LO1,0,P1) =>LO1;
P2 =>LO1^ END;
BEGIN MAKE($LO8,0,P1) =>LO8;
P2 =>LO8^ END;
BEGIN MAKE($LO16,0,P1) =>LO16;
P2 =>LO16^ END;
BEGIN END;
BEGIN MAKE($LO32,0,P1) =>LO32;
P2 =>LO32^ END;
BEGIN END;
BEGIN END;
BEGIN END;
BEGIN MAKE($LO64,0,P1) =>LO64;
P2 =>LO64^ END;
END;
@BOX 3.1
END
@END
@TITLE MTL24.7(3,6)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
PROC REALADDR(CADDR)
@BOX 2.0
@BOX 3.0
DECODE VAX ADDRESS
@BOX 4.0
END
@BOX 1.1
PROC REALADDR(CADDR);
$IN P;
IF CADDR <0 THEN
@BOX 2.1
@BOX 3.1
(IF CADDR ->>SEGSHIFT =%FFFE THEN CADDR &%FFFF +NB ELSE CADDR &%FFFF -:NB) =>REA
LADDR;
@BOX 4.1
ELSE CADDR =>REALADDR FI;
END;
@END

@TITLE MTL24.8(3,6)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
PROC TYPECONV(TYPE)
@BOX 2.0
@BOX 3.0
DECODE MU6 PV TYPE
@BOX 4.0
END
@BOX 1.1
PROC TYPECONV(TYP);
$IN T;
@BOX 2.1
@BOX 3.1
TYP &%3F(3)->>2 =>T;
IF TYP &%4000 =0 THEN T =>TYPECONV
ELSE 0-T =>TYPECONV FI;
@BOX 4.1
END;
@END

@TITLE MTL24.9(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC PROCTYPE
@BOX 2.0
GET TYPE OF CUR.LT.PROC FROM PV
@BOX 3.0
END
@BOX 1.1
PROC PROCTYPE;
@BOX 2.1
$IN T;
IF BYTE(LT)>0 THEN
IF PV^[LT^[CUR.LT.PROC+1]] =>T >1 THEN
0 =>PROCTYPE ELSE
2-T =>PROCTYPE FI;
FI;
@BOX 3.1
END;
@END

@TITLE MTL24.10(3,6)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
PROC GET.NEXT.LINK(FP,TYPE)
@BOX 2.0
DECLARATIONS
@BOX 3.0
RETURN FP FOR TYP 0
OR PC FOR TYP 1
@BOX 4.0
END
@BOX 1.1
PROC GET.NEXT.LINK(CUR.FP,TYP);
@BOX 2.1
IF TYP=0 THEN
*#%D0 %AD %20 %52;
*#%D0 %A2 %0C %AD %FC;
ELSE
*#%D0 %AD %20 %52;
*#%D0 %A2 %10 %AD %FC;
FI;
@BOX 3.1
@BOX 4.1
END;
@END
@TITLE MTL24.11(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC SETSTACK(PC.INC)
@BOX 2.0
ADD PCINC TO STACKED PC
REARRANGE REGISTERS
@BOX 3.0
END
@BOX 1.1
PROC SETSTACK(PC.INC);
$LO32 REG.BASE,TEMP.REG;
$IN I;
ADDR [$LO32] REG.PTR;
@BOX 2.1
*#%D0 %AD %0C %52; :: MOVL 12(R13),R2
*#%C0 %AD %1C %A2 %10; :: ADDL2 28(R13),16(R2) STACKED PC
*#%B0 %8F %FF %2F %A2 %06; :: MOVW %2FFF,6(R2)
*#%C1 %52 %14 %AD %FC; :: ADDL3 R2,20,-4(R13)
MAKE($LO32,15,REG.BASE) =>REG.PTR;
REG.PTR^[0] => TEMP.REG;
FOR I < 11 DO REG.PTR^[I+4] => REG.PTR^[I] OD;
TEMP.REG => REG.PTR^[11];
2 => REG.PTR^[12];
@BOX 3.1
END;
@END


