@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            MTL217
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
~V2 -16
                                                                       ISSUE 10~
~V2 0
~V9 -1
~P
~V9 1
~YMTL217
~Y
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~H               MTL217
~V9 -1
~F
@TITLE MTL21(7,9)

@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
MACHINE DEPENDENT LIBRARY CODE
@BOX 4.0
PROCEDURES IN MODULE:
   1 TL ENTER
   2 RETURN FROM TRAP
   3 TL DUMP REGISTERS
   4 TL OUT DUMPED REGISTERS
   5 TL STACK PRINT
   7 ADDR PROC
@BOX 6.0
END
@BOX 1.1
#MTL21/1
MODULE (TL.ENTER, RETURN.FROM.TRAP, TL.DUMP.REGISTERS,
   TL.OUT.DUMPED.REGS, TL.STACK.PRINT,ADDRPROC);
@BOX 3.1
PSPEC TL.ENTER (INTEGER);
LSPEC RETURN.FROM.TRAP ();
PSPEC TL.DUMP.REGISTERS ();
PSPEC TL.OUT.DUMPED.REGS ();
PSPEC TL.STACK.PRINT ();
PSPEC DUMMYP();
PSPEC ADDRPROC ($LO32)/ ADDR DUMMYP;
   #MTL21.1
   #MTL21.2
   #MTL21.3
   #MTL21.4
   #MTL21.5
#MTL21.7
@BOX 6.1
*END
@END
@TITLE MTL21A(7,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
CROSS COMPILE LIBRARY
@BOX 2.0
@BOX 3.0
@BOX 4.0
PROCEDURES IN MODULE
   ADDR.PROC
@BOX 5.0
@BOX 6.0
END
@BOX 1.1
IMPORT LITERAL INTEGER SYS14.SEG.SHIFT;
MODULE(DUMMYP,ADDR.PROC);
@BOX 2.1
@BOX 3.1
@BOX 4.1
PSPEC DUMMYP();
PSPEC ADDR.PROC($LO32)/ADDR DUMMYP;
   #MTL21.7
@BOX 5.1
@BOX 6.1
*END
@END
@TITLE MTL21/1(7,9)

@COL 1S-2R-3R-4R
@FLOW 1-2
@BOX 1.0
EXTERNAL ENVIRONMENT
@BOX 1.1
:: EXTERNAL ENVIRONMENT
@BOX 2.1
PSPEC OUT.HEX (LOGICAL32, INTEGER);
PSPEC SPACES (INTEGER);
PSPEC NEW.LINES (INTEGER);
PSPEC CAPTION (ADDR [LOGICAL8]);
PSPEC OUT.STACK (ADDR, ADDR);
IMPORT LITERAL INTEGER SYS14.SEG.SHIFT, SYS14.SEG.SIZE;
@END

@TITLE MTL21.1(7,9)

@COL 1S-3R-4F
@FLOW 1-3-4
@BOX 1.0
TL ENTER
@BOX 3.0
JUMP TO START OF SPECIFIED SEGMENT
@BOX 4.0
END
@BOX 1.1
PROC TL.ENTER (SEG);
LOGICAL ENTRY.ADDR;
@BOX 3.1
SEG <<- SYS14.SEG.SHIFT => ENTRY.ADDR;
ENTRY.ADDR <<- 3 => ENTRY.ADDR;
*#%C483; :: JMP 3/4
@BOX 4.1
END
@END
@TITLE MTL21.2(7,9)

@COL 1S-2R-3R-4R-5R-6F

@FLOW 1-2-3-4-5

@BOX 1.0
RETURN FROM TRAP
@BOX 2.0
UNWIND 1 STACK FRAME
@BOX 3.0
RESET STACK POINTER, NAMEBASE AND LINK
@BOX 4.0
UNSTACK REGISTERS
@BOX 5.0
RETURN
@BOX 6.0
END
@BOX 1.1
PROC RETURN.FROM.TRAP;
@BOX 2.1
::OLD NB/BA4 => BA4
*#%2480:: BM1 = V32 0/BA4
*#%3D00 %00FF:: BM1 <<-L 1
*#%3D00 %00C9:: BM1 ->>L 9
*#%3D00 %00FA:: BM1 <<-L 6
*#%C651:: BA4 = BM1
@BOX 3.1
*#%24FF:: BM1 = V64 -1/BA4
*#%E6FE:: BA3 =REF V64 -2/BA4
*#%E8EC:: BA4 =REF V64 -20/BA4
*#%20C0:: BM1 => V64 0/BA4
@BOX 4.1
*#%0C7F; :: LDX UNST
*#%047F; :: LDR UNST
*#%2474; :: LDM1 UNST
*#%3001; :: ADD1 #1
*#%3C38; :: SFT1 #-8
*#%0E51; :: LSR BM1
*#%647F; :: LDM3 UNST
*#%4474; :: LDM2 UNST
*#%2474; :: LDM1 UNST
*#%DE7F; :: LD15 UNST
*#%DC7F; :: LD14 UNST
*#%DA7F; :: LD13 UNST
*#%D87F; :: LD12 UNST
*#%D67F; :: LD11 UNST
*#%D47F; :: LD10 UNST
*#%D29F; :: LDA9 UNST
*#%D0F7; :: LDA8 UNST
*#%CE7F; :: LDA7 UNST
*#%CC7F; :: LDA6 UNST
*#%CA7F; :: LDA5 UNST
@BOX 5.1
*#%E0FF; :: RTS @-1/4
@BOX 6.1
END
@END

@TITLE MTL21.3(7,9)
@COL 1S-2R-3R-5R-6F
@FLOW 1-2-3-5-6
@BOX 1.0
DUMP REGISTERS ON STACK
@BOX 2.0
RESET SF
@BOX 3.0
STACK REGISTERS
@BOX 5.0
ADJUST RETURN LINK ETC.
@BOX 5.0
END
@BOX 1.1
PROC TL.DUMP.REGISTERS;
@BOX 2.1
*#%C644 :: BA3 <= BA4
@BOX 3.1
*#%AA7E; :: STA5 STK
*#%AC7E; :: STA6 STK
*#%AE7E; :: STA7 STK
*#%B07E; :: STA8 STK
*#%B27E; :: STA9 STK
*#%B47E; :: ST10 STK
*#%B67E; :: ST11 STK
*#%B87E; :: ST12 STK
*#%BA7E; :: ST13 STK
*#%BC7E; :: ST14 STK
*#%BE7E; :: ST15 STK
*#%207E; :: STM1 STK
*#%407E; :: STM2 STK
*#%607E; :: STM3 STK
*#%2462; :: LDM1 AOD
*#%207E; :: STM1 STK
*#%2475; :: LDM1 BREM
*#%207E; :: STM1 STK
*#%007E; :: ST STK
*#%027E; :: STX STK
@BOX 5.1
*#%A2C0 :: STACK @0/BA4 (LINK)
*#%C843 :: BA4 <= BA3
@BOX 6.1
END
@END

@TITLE MTL21.4(7,9)

@COL 1S-2R-3R-4R-5R-6R-7F
@FLOW 1-2-3-4-5-6-7
@BOX 1.0
OUT DUMPED REGISTERS
@BOX 2.0
INITIALIZE POINTER
@BOX 3.0
INITIALIZE STRING
@BOX 4.0
OUTPUT HARDWARE REGISTERS
@BOX 5.0
OUTPUT PW'S
@BOX 6.0
OUTPUT PWW'S
@BOX 7.0
END
@BOX 1.1
PROC TL.OUT.DUMPED.REGS;
INTEGER DUMPAREA;
INTEGER I, J;
ADDR [LOGICAL64] REG.PTR,LINKPTR;
ADDR [LOGICAL] REG.PTR32;
LOGICAL8 [7] STR;
@BOX 2.1
::OLD NB/BA4 => BA6
*#%2480:: BM1=V32 0/BA4
*#%3D00 %00FF:: BM1 <<-L 1
*#%3D00 %00C9:: BM1 ->>L 9
*#%3D00 %00FA:: BM1 <<-L 6
*#%CC51:: BA6 = BM1
::OLD NB/BA6 => DUMPAREA
*#%2598 %0000:: BM1 = V32 0/BA6
*#%3D00 %00FF:: BM1 <<-L 1
*#%3D00 %00C9:: BM1 ->>L 9
*#%3D00 %00FA:: BM1 <<-L 6
*#%2083:: BM1 => V32 3/BA4 (DUMPAREA)
MAKE (LOGICAL64, 23, DUMPAREA->>3-176) => REG.PTR;
@BOX 3.1
"B" => STR [0];
"A" => STR [1];
"3" => STR [2];
" " => STR [3] => STR [4] => STR [6];
"=" => STR [5];
CAPTION (%"$LREGISTER DUMP:$L$L");
@BOX 4.1
MAKE($LO64,1,22*8+BYTE(REGPTR))=>LINKPTR;
SPACES (4); CAPTION (%"BA2  = (CO) ");
OUTHEX (LINKPTR^ [0], 8);
SPACES (4); CAPTION (^STR); CAPTION (%"(SF) ");
OUTHEX (BYTE(LINKPTR) <<- 3 - 64, 8);
1 +> STR [2];
SPACES (4); CAPTION (^STR); CAPTION(%"(NB)");
OUTHEX (LINKPTR^ [0] ->> 32 & %7FFFFF00 ->> 2, 8);
CAPTION(%"$L    LINK = ");
OUTHEX(LINKPTR^[0]->>32,8); OUTHEX(LINKPTR^[0],8); NEWLINES(1);
1 +> STR [2];
1 => J;
FOR I < 5 DO
   SPACES (4); CAPTION (^STR);
   OUTHEX (REG.PTR^ [I+2], 8);
   1 +> STR [2];
   IF 1 +> J = 4 THEN
      0 => J;
      NEWLINES (1);
   FI
OD
"1" => STR [2]; "0" => STR [3];
FOR I < 6 DO
   SPACES (4); CAPTION(^STR);
   OUTHEX (REG.PTR^ [I + 7], 8);
   1 +> STR [3];
   IF 1 +> J = 4 THEN
      0 => J;
      NEWLINES (1);
   FI
OD
"M" => STR [1]; " " => STR [3];
FOR I < 3 DO
   SPACES (4); CAPTION (^STR);
   OUTHEX (REG.PTR^ [I + 13], 8);
   1 +> STR [2];
OD
SPACES (4); CAPTION (%"BTOP = ");
OUTHEX (REG.PTR^ [15] ->> 32, 8);
NEWLINES (1);
SPACES (4); CAPTION (%"BREM = ");
OUTHEX  (REG.PTR^ [17], 8);
NEWLINES (1);
SPACES (4); CAPTION (%"AOD  = ");
OUTHEX (REG.PTR^ [16], 2);
NEWLINES (1);
SPACES (4); CAPTION (%"AEX  = ");
OUTHEX (REG.PTR^ [19] ->> 32, 8);
OUTHEX (REG.PTR^ [19], 8);
SPACES (4); CAPTION (%"ACC  = ");
OUTHEX (REG.PTR^ [18] ->> 32, 8);
OUTHEX (REG.PTR^ [18], 8);
NEWLINES (1);
@BOX 5.1
"P" => STR [0];
"W" => STR [1];
"0" => STR [2];
MAKE (LOGICAL, 12, 0) => REG.PTR32;
FOR I < 7 DO
   SPACES (4); CAPTION (^STR); OUTHEX (REG.PTR32^ [I], 8);
   1 +> STR [2];
   IF I = 3 THEN
      NEWLINES (1);
   FI
OD
NEWLINES (2);
@BOX 6.1
"W" => STR [2];
"1" => STR [3];
6 => I;
WHILE 2 +> I < 12 DO
   SPACES (4); CAPTION (^STR);
   OUTHEX (REG.PTR32^ [I], 8); OUTHEX (REG.PTR32^ [I+1], 8);
   1 +> STR [3];
OD
NEWLINES (2);
@BOX 7.1
$IN OLDNB,NEWNB;
LINKPTR^[0]->>32&%7F(5)00->>5=>NEWNB;
CAPTION(%"$L$LNB(BYTES) CO(BYTES)       LINK$L");
LINKDUMP:
NEWNB=>OLDNB;
OUTHEX(NEWNB,7);
SPACES(3);
OUTHEX(LINKPTR^[0]->>3,7);
SPACES(3);
OUTHEX(LINKPTR^[0]->>32,8);
OUTHEX(LINKPTR^[0],8);
NEWLINES(1);
MAKE($LO64,1,OLDNB)=>LINKPTR;
LINKPTR^[0]->>32&%7F(5)00->>5=>NEWNB;
IF NEWNB>0<OLDNB<%40000,->LINKDUMP;
END
@END

@TITLE MTL21.5(7,9)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
STACK PRINT
@BOX 2.0
PRINT THE STACK
@BOX 3.0
END
@BOX 1.1
PROC TL.STACK.PRINT;
@BOX 2.1
OUT.STACK (0, SYS14.SEG.SIZE - 1);
@BOX 3.1
END
@END

@TITLE MTL21.7(7,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ADDR.PROC(FIND.N)PROC.ADDRESS
@BOX 2.0
CALCULATE PROC ADDRESS
@BOX 3.0
END
@BOX 1.1
PROC ADDR.PROC(FN);
TYPE T IS ADDR DUMMYP P OR ADDR $IN I;
T V;
@BOX 2.1
MAKE($IN,0,FN&%7FFF00FF<<-2)=>I OF V;
P OF V=>ADDR.PROC;
@BOX 3.1
END
@END
