@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            MTL233
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                           ISSUE 11~
~V9 -1
~P
~V9 1
~YMTL233
~S1~M~OMUTL IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 23  Version 3~
~S1~OSection 23.3 Storage Allocation (VAX11)~
~S1~O1. General Description~
~BThis module implements the machine dependent procedures concerned with
store control for a particular computer. These procedures
are invoked by the machine independent part of MUTL that
allocate MUTL segments, allocate variables and layout types.~
~S1~O2. Interfaces~
~
Export procedures.~
   ALLOCATE.SEG(SIZE,COMPILE.ADDR,RUNTIME.ADDR,KIND,STORE.E.PTR)~
   ALLOCATE.STK(SIZE,DIM,BOUNDARY)~
   TYPE.SIZE(TYPE,TYPE.E.PTR,DIM,KIND)~
   ST.UNITS(SIZE)SIZE~
   REAL.CONV(VALUE,SIZE)~
~
Export data structures.~
   C.TYPE.Z~
   C.TYPE.BOUNDARY~
   C.TYPE.OFFSET~
~
Export types.~
   STORE.ADDR.TY~
~
Import types.~
   Section 1   TYPE.E~
   Section 2   STORE.E~
~S1~O2.1 Hardware Interface~
~
   VAX11~
~S1~O2.2 Software Interfaces~
~S11) ALLOCATE.SEG(SIZE,COMPILE.ADDR,RUNTIME.ADDR,KIND,STORE.E.PTR)~
~S12) ALLOCATE.STK(SIZE,DIM,BOUNDARY)~
~S13) TYPE.SIZE(TYPE,TYPE.PTR,DIM,KIND)~
~S14) C.TYPE.Z, C.TYPE.BOUNDARY, C.TYPE.OFFSET
~S15) ST.UNITS(SIZE)SIZE
~S16) REAL.CONV(VALUE,SIZE)
~BThese above exports 1) to 6) are described in Section 23 Version 1.~
~S7) STORE.ADDR.TY
~BThis type specifies a field within type STORE.E (section 2)
which contains machine dependent addressing information.  It contains
the following field:~
~
~T% 10
~
SEG.PTR~Ithis is a byte pointer (ADDR [$LO8]) to the
compile time address of the store area.
~S1~O3. Implementation
~S1~O3.1 Outline of Operation~
~S1~O3.2 Data Structures~
~BData structures relevant to this Section are described in
Section 23 Version 1.~
~Y
~V9 -1
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H               MTL233
~V9 -1
~F
@TITLE MTL23(3,11)
@COL 8S-1R-2R-3R-4R-6R-7F
@FLOW 8-1-2-3-4-6-7
@BOX 8.0
MODULE WHICH EXPORTS
TYPE STORE.ADDR.TY
@BOX 1.0
SECTION 23
STORAGE ALLOCATION
[IMPORTS MTL23/1]
@BOX 2.0
TYPE DECLARATIONS
@BOX 3.0
VARIABLE AND LITERAL
DECLARATIONS
@BOX 4.0
PROCEDURES IN INTERFACE
ALLOCATE.SEG MTL23.1
ALLOCATE.STK MTL23.2
TYPE.SIZE    MTL23.3
ST.UNITS     MTL23.4
REAL.CONV     MTL23.5
STORE.LIT    MTL23.6
@BOX 6.0
INITIALISATION
@BOX 7.0
END
@BOX 8.1
MODULE(STORE.ADDR.TY);
TYPE STORE.ADDR.TY IS ADDR[$LO8] SEG.PTR;
*END
@BOX 1.1
#MTL23/1
MODULE(ALLOCATE.SEG,ALLOCATE.STK,TYPE.SIZE,STORE.LIT,
       C.TYPE.Z,C.TYPE.BOUNDARY,C.TYPE.OFFSET,ST.UNITS,REAL.CONV);
@BOX 2.1
@BOX 3.1
LITERAL A.REGM = %52, B.REG.M = %58, SP.REG.M = %5E;
LITERAL ADDL2 = %C0, BICL2 = %CA, MOVL = %D0, MULL2 = %C4, SUBL2 = %C2;
*GLOBAL 9;
$IN C.TYPE.Z;
$IN C.TYPE.BOUNDARY,C.TYPE.OFFSET;
*GLOBAL 0;
@BOX 4.1
PSPEC ALLOCATE.SEG($IN32,ADDR,$IN32,$IN,ADDR STORE.E);
PSPEC ALLOCATE.STK($IN32,$IN32,$IN);
PSPEC TYPE.SIZE($IN,ADDR TYPE.E,$IN32,$IN);
PSPEC ST.UNITS($IN32)/$IN32;
PSPEC REAL.CONV(ADDR[$LO64],$IN);
PSPEC STORE.LIT(ADDR STORE.E, $IN32)/ $LO32;
*CODE 3;
#MTL23.1
#MTL23.2
#MTL23.3
#MTL23.4
#MTL23.5
#MTL23.6
@BOX 6.1
@BOX 7.1
*END
::END 23
@END
@TITLE MTL23/1(3,11)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
EXTERNAL
ENVIRONMENT
@BOX 2.0
TYPES
@BOX 3.0
VARIABLES &
LITERALS
@BOX 4.0
PROCEDURES
@BOX 5.0
END
@BOX 1.1
::EXTERNAL
::ENVIRONMENT
@BOX 2.1
TYPE FIELD.E;
TYPE TYPE.E IS ADDR FIELD.E TYPE.FIELD.P
               $LO8 TYPE.AL, TYPE.FL
               $LO16 TYPE.Z, TYPE.LIB, TYPE.NAME;
TYPE FIELD.E IS ADDR FIELD.E NEXT.FIELD.P
                $LO16 FIELD.POS
                $LO16 FIELD.TYPE
                ADDR TYPE.E FIELD.TYPE.P
                $IN FIELD.TAG
                ADDR FIELD.DIM;
TYPE STORE.ADDR.TY IS ADDR[$LO8] SEG.PTR;
TYPE STORE.E IS ADDR STORE.I
                ADDR STORE.Z
                ADDR STORE.EQ.Z
                $LO8 STORE.KIND,SEG.NO
                STORE.ADDR.TY STORE.ADDR
                $LO8 STORE.TX
                ADDR STORE.C.ADDR
                $LO32 STORE.R.ADDR
                $LO8 STORE.BASE,STORE.ACCESS;
@BOX 3.1
IMPORT LITERAL SEG.Z,SEG.SHIFT;
$IN TL.MODE.M;
STORE.E [SEG.Z] SEG.T;
$IN PW0,PW1;
@BOX 4.1
LSPEC CREATE.FILE.SEGMENT($IN,ADDR,ADDR [$LO8],$LO64);
LSPEC CHANGE.SIZE( $IN, $IN);
LSPEC FILE( ADDR [$LO8], $LO64, $IN);
LSPEC CAPTION(ADDR[$LO8]);
LSPEC OUTI($IN,$IN);
LSPEC NEWLINES($IN);
PSPEC FAULT.I( $IN, $IN)
PSPEC FAULT($IN,ADDR[$LO8]);
PSPEC PLANT.BY($LO);
PSPEC PLANT.LIT.OPD($IN, $LO64);
@BOX 5.1
::END 27/1
@END
@TITLE MTL23.1(3,11)
@COL 9R
@COL 1S-3T-4T-5R-6R-7R-8F
@COL 10T-11R
@COL 13R
@ROW 4-10
@ROW 9-5-11-13
@FLOW 1-3Y-4-5-6-7-8
@FLOW 3N-10Y-11-7
@FLOW 4N-9-7
@FLOW 10N-13-7
@BOX 1.0
ALLOCATE.SEG
(SIZE,COMP.ADDR,RUN.ADDR,KIND,SEG.P)
@BOX 3.0
SEGMENT REQUIRED
AT COMPILE TIME?
@BOX 4.0
CREATE SEGMENT
CREATED OK?
@BOX 5.0
SET RUNTIME ADDRESS
IF NOT SET
@BOX 6.0
CREATE POINTER TO
COMPILE TIME SEGMENT
@BOX 7.0
FILL IN STORE
ENTRY
@BOX 8.0
END
@BOX 9.0
FAULT
@BOX 10.0
RUN TIME
ADDRESS SET?
@BOX 11.0
SET NIL POINTER
FOR COMPILE TIME
SEGMENT
@BOX 13.0
FAULT
@BOX 1.1
PROC ALLOCATE.SEG
(SIZ,CADDR,RADDR,KIND,SEG.P);
$IN32 I;
ADDR[$LO8] SEG.PTR;
$LI/ADDR[$LO8] NIL=;
@BOX 3.1
IF CADDR = -2 OR CADDR = -3
@BOX 4.1
IF CADDR => I >= 0 THEN
CADDR ->> SEG.SHIFT => I FI
CREATE.FILE.SEGMENT(I,SIZ,NIL,0);
IF PW0 < 0
@BOX 5.1
PW1 => I;
CAPTION(%"SEGMENT");OUTI(I,4);
CAPTION(%" CREATED$L");
I <<- SEG.SHIFT => C.ADDR;
IF RADDR = -1 THEN
C.ADDR => RADDR FI
@BOX 6.1
MAKE($LO8,SIZ,C.ADDR) => SEG.PTR;
@BOX 7.1
RADDR => STORE.R.ADDR OF SEGP^;
SEG.PTR => SEG.PTR OF STORE.ADDR OF SEG.P^;
C.ADDR => STORE.C.ADDR OF SEG.P^;
@BOX 8.1
END
@BOX 9.1
FAULT(0,%"CANT CREATE SEGMENT");
@BOX 10.1
IF RADDR = -1
@BOX 11.1
NIL => SEG.PTR;
@BOX 13.1
FAULT(0,%"RUN TIME ADDRESS UNSET");
@END
@TITLE MTL23.2(3,11)
@COL 1S-2T-3R-4T-5R-6T-7R-8R-9R-10F
@COL 11R-12R
@ROW 5-11
@FLOW 1-2N-3-4N-5-6N-7-8-9-10
@FLOW 2Y-12-8
@FLOW 4Y-11-12
@FLOW 6-8
@BOX 1.0
ALLOCATE.STK(SIZE, DIMENSION, BOUNDARY)
@BOX 2.0
SCALAR?
@BOX 3.0
PLANT CODE TO SET BOUND OF A REGISTER
@BOX 4.0
BOUND A CONSTANT
@BOX 5.0
PLANT CODE TO SCALE B REGISTER
IF NECESSARY
@BOX 6.0
ELEMENT SIZE A 4 BYTE MULTIPLE
@BOX 7.0
PLANT CODE TO ROUND SIZE
TO A 4 BYTE MUTIPLE
@BOX 8.0
PLANT CODE TO ADJUST SP
OVER ALLOCATION
@BOX 9.0
PLANT CODE TO SET ADDRESS
IN A REGISTER
@BOX 10.0
END
@BOX 11.0
SET ALLOCATION SIZE
@BOX 12.0
ROUND TO 4 BYTE MULTIPLE
@BOX 1.1
PROC ALLOCATE.STK(Z, D, B);
@BOX 2.1
IF D = 0
@BOX 3.1
PLANT.BY(MOVL);
IF D > 0 THEN
   PLANT.LIT.OPD(4, D);
ELSE
   PLANT.BY(B.REGM);
FI
PLANT.BY(A.REGM + 1);
@BOX 4.1
IF D > 0
@BOX 5.1
IF Z > 1 THEN
   PLANT.BY(MULL2);
   PLANT.LIT.OPD(4, Z);
   PLANT.BY(B.REGM);
FI
@BOX 6.1
IF Z & 3 = 0
@BOX 7.1
PLANT.BY(ADDL2);
PLANT.BY(3);
PLANT.BY(B.REGM);
PLANT.BY(BICL2);
PLANT.BY(3);
PLANT.BY(B.REGM);
@BOX 8.1
PLANT.BY(SUBL2);
IF D >= 0 THEN
   PLANT.LIT.OPD(4, Z);
ELSE
   PLANT.BY(B.REGM);
FI
PLANT.BY(SP.REGM);
@BOX 9.1
PLANT.BY(MOVL);
PLANT.BY(SP.REGM);
PLANT.BY(A.REGM);
@BOX 10.1
END
@BOX 11.1
D *> Z;
@BOX 12.1
Z + 3 & %F(7)C => Z;
@END

@TITLE MTL23.3(3,9)
@COL 11R-12R
@COL 1S-2T-3T-4T-5R-6R-8R-9R-10F
@COL 13R-14R
@ROW 11-3
@ROW 4-13
@ROW 12-5
@FLOW 1-2N-3Y-4N-5-6-8-9-10
@FLOW 2Y-11-6
@FLOW 3N-13-14-8
@FLOW 4Y-12-6
@BOX 1.0
TYPE.SIZE
(TYPE,TYPE.P,DIM,KIND)
@BOX 2.0
ARE POINTER BITS
SET IN TYPE?
@BOX 3.0
IS IT A
BASIC TYPE?
@BOX 4.0
IS IT A SPECIAL
ENCODING
@BOX 5.0
SET SIZE
@BOX 6.0
ADJUST SIZE IF
VECTOR
@BOX 8.0
SET OFFSET
AND OFFSET
@BOX 9.0
SET GLOBALS
@BOX 10.0
END
@BOX 11.0
SET SIZE
@BOX 12.0
SET SIZE
@BOX 13.0
GET SIZE AND
BOUNDARY FROM
TYPE ENTRY
@BOX 14.0
ADJUST SIZE IF VECTOR
USING DIM AND BOUNDARY
@BOX 1.1
PROC TYPE.SIZE
(TYP,TYP.P,DIM,KIND);
$IN32 INC,SIZ,BNDY,OFF;
$LI/ADDR TYPE.E NIL=;
@BOX 2.1
IF TYP & %3 /= 0
@BOX 3.1
IF TYP.P /= NIL
@BOX 4.1
TYP ->> 2 & %F + 1 => INC;
IF TYP < %40
AND 1 <<-INC & %114 = 0
@BOX 5.1
IF INC = 3 THEN
4 => INC FI
@BOX 6.1
IF KIND = 0 AND TL.MODE.M & %4 /= 0 THEN
    1 => BNDY;
ELSE
   INC => BNDY;
FI
IF DIM /= 0 THEN
INC * DIM => SIZ;
ELSE
INC => SIZ;
FI
@BOX 8.1
IF KIND < 2 THEN
0 => OFF
ELSE
SIZ + 3 / 4 * 4 => SIZ => OFF;
4 => BNDY FI
@BOX 9.1
SIZ => C.TYPE.Z;
BNDY => C.TYPE.BOUNDARY;
OFF => C.TYPE.OFFSET;
@BOX 10.1
END
@BOX 11.1
(IF TYP & %3 = 3 THEN
8 ELSE 4) => INC;
@BOX 12.1
IF INC /= 9 THEN
INC & %1 * 4 + 4 => INC ELSE 1 => INC FI
@BOX 13.1
TYPE.Z OF TYP.P^ => INC;
TYPE.AL OF TYP.P^ => BNDY;
@BOX 14.1
IF DIM /= 0 THEN
INC + BNDY -1 / BNDY * BNDY * DIM => SIZ
ELSE INC => SIZ FI
@END
@TITLE MTL23.4(3,8)
@COL  1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ST.UNITS(BYTES) STORE.UNITS
@BOX 2.0
CONVERT BYTES TO STORE UNITS
@BOX 3.0
END
@BOX 1.1
PROC ST.UNITS(BYTES);
@BOX.2.1
BYTES => ST.UNITS;
@BOX 3.1
END;
@END
@TITLE MTL23.5(3,11)
@COL 6R
@COL 1S-2T-3T-4R-5F
@COL 7R
@ROW 6-4-7
@FLOW 1-2N-3N-4-5
@FLOW 2Y-6-5
@FLOW 3Y-7-5
@BOX 1.0
REAL.CONV(^VAL,SIZE)
@BOX 2.0
128 BIT?
@BOX 3.0
64 BIT?
@BOX 4.0
CONVERT LITERAL TO
32 BIT FORMAT
@BOX 5.0
END
@BOX 6.0
CONVERT LITERAL
TO 128 BIT FORMAT
@BOX 7.0
CONVERT LITERAL
TO 64 BIT FORMAT
@BOX 1.1
PROC REAL.CONV(VAL,SIZ);
::HOST VAX $LO32 TT;
::HOST MU6 $LO64 T, M, R;
::HOST MU6 $IN E2;
@BOX 2.1
::HOST PTV IF SIZ = 16
@BOX 3.1
::HOST MU6 -> B7;
::HOST PTV IF SIZ = 8
@BOX 4.1
::HOST PTV IF VAL^[0] => TT /= 0 THEN
::HOST PTV   TT & %FFFF0000 ->> 16 + %80 ! (TT <<- 16) => TT => VAL^[0];
::HOST PTV FI
@BOX 5.1
END;
@BOX 6.1
::TBC
@BOX 7.1
::HOST MU6 B7:;
::HOST MU6 IF VAL^[0] => T /= 0 THEN
::HOST MU6    T ->> 56 & %7F => E2 - 64 * 4 => E2;
::HOST MU6    %F(14) & T => M;
::HOST MU6    WHILE M & %80(13) = 0 DO
::HOST MU6       M <<- 1 => M;
::HOST MU6       1 -> E2;
::HOST MU6    OD
::HOST MU6    T ->> 48 & %8000
::HOST MU6      ! (E2 + 128 & %FF <<- 7)
::HOST MU6      ! (M  ->> 48 & %7F)
::HOST MU6      ! (M  ->> 16 & %FFFF0000)
::HOST MU6      ! (M  <<- 16 & %F(4)0(8))
::HOST MU6      ! (M  <<- 48 & %F(4)0(12))
::HOST MU6      => VAL^[0];
::HOST MU6 FI
::HOST PTV IF VAL^[0] => TT /= 0 THEN
::HOST PTV   TT & %FFFF0000 ->> 16 + %80 ! (TT <<- 16) => TT => VAL^[0];
::HOST PTV FI
@END

@TITLE MTL23.6(3,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
STORE.LIT(STORE.E PTR, OFF)
@BOX 2.0
CALCULATE ADDRESS
@BOX 3.0
END
@BOX 1.1
PROC STORE.LIT(P,OFF);
@BOX 2.1
STORE.R.ADDR OF P^ + OFF => STORE.LIT;
@BOX 3.1
END
@END
