This is the declaration and comments associated with ArrayDec in the MCP 5.0 at 4709950. The layout of TYPE_INFO is below.
PROCEDURE ARRAYDEC (SIRW_TO_MOM,NO_OF_DIMS,TYPE_INFO);
VALUE SIRW_TO_MOM, NO_OF_DIMS, TYPE_INFO;
REAL NO_OF_DIMS;
WORD SIRW_TO_MOM, TYPE_INFO;
DESCRIPTION:
THE PROCEDURE ARRAYDEC IS THE INTERFACE BETWEEN THE COMPILERS
AND THE MCP FOR THE HANDLING OF ARRAY DECLARATIONS WITHIN A
PROCEDURE BLOCK. THERE ARE A FEW INTERESTING THINGS ABOUT THIS
PROCEDURE WHICH ARE EXPLAINED IN SOMEWHAT OF A DETAIL .
ANYONE WANTING TO UNDERSTAND THIS PROCEDURE MUST LEAVE THE
GASTRIC LINING OF THEIR STOMACHS HOME,FOR THIS PROCEDURE IS
KNOWN TO HAVE CAUSED ULCERS AMONGST LESSER MORTALS.
FIRSTLY, THE COMPILER GENERATES A CALL TO ARRAYDEC WHENEVER IT
COMES ACROSS AN ARRAY DECLARATION THAT IS NOT A SIMPLE, SMALL,
ONE-DIMENSIONAL ARRAY. A FEW EXAMPLES ARE LONG ARRAYS, EITHER
DECLARED LONG OR ASSUMED TO BE PAGED EVENT ARRAYS,
MULTI-DIMENSIONED ARRAYS, OWN ARRAYS ETC.
THERE ARE THREE PARAMETERS THAT ARE PASSED TO ARRAYDEC. THEY ARE
1. SIRW TO MOM,
2. NUMBER OF DIMENSIONS AND
3. INFORMATION ABOUT THE TYPE OF ARRAY BEING DECLARED.
OTHER THAN THESE PARAMETERS, FOR MULTI-DIMENSIONAL ARRAYS AND
EVEN SINGLE DIMENSIONAL OWN ARRAYS SOME ADDITIONAL PARAMETERS
ARE PASSED BELOW THE MSCW OF ARRAYDEC. THESE ARE THE SIZES OF
EACH DIMENSION AND IN CASE OF OWN ARRAYS ALSO THE LOWER BOUNDS.
WHEREAS IT IS NOT QUITE CLEAR WHY WE NEED TO PASS THE LOWER
BOUNDS FOR EACH DIMENSION OF THE OWN ARRAY DECLARED, LITTLE
THOUGHT WILL SHOW THAT THE SIZE FOR EACH DIMENSION MUST BE
PASSED AND THAT THERE IS NO OTHER WAY OF PASSING THIS
INFORMATION TO ARRAYDEC. AT THIS POINT, JUST BEAR IN MIND THAT WE
NEED TO CUT THE STACK BACK WHEN WE EXIT FROM ARRAYDEC SO THAT
THESE FUNNY PARAMETERS ARE WIPED OUT FROM THE STACK.
FOR THE (SUB/SUPRA/AB)NORMAL SINGLE DIMENSIONAL ARRAYS,
E.G.LONG, EVENT, EBCDIC ETC., ARRAYDEC MERELY CREATES A CORRECT
ABSENT, UNTOUCHED DESCRIPTORnAND PLACES IT AT THE LOCATION TO
WHICH THE SIRW POINTS.
IN CASE OF MULTI DIMENSIONAL ARRAYS, THE SIZE OF DIMENSIONS
HIGHER THAN ONEnIS PLACED IN A STRUCTURE CALLED THE AIT -THE
ARRAY INFORMATION TABLE.
AFTER EXIT FROM ARRAYDEC, THE LOCATION IN STACK TO WHICH THE
SIRW POINTS, WILL CONTAIN AN ABSENT, UNTOUCHED MOM. THE
ASDINDEX OF THIS DESCRIPTOR WILL HAVE THE INDEX INTO THE AIT
WHERE THE DESCRIPTOR TO THE NEXT DIMENSION WILL HAVE BEEN
CREATED, ALBEIT WITH A ZERO TAG. HIS DESCRIPTOR WILL HAVE ANOTHER
INDEX INTO THE AIT FOR THE DESCRIPTOR TO THE NEXT DIMENSION, IF
ANY.FOR FURTHER DETAIL ON AIT/OAT STRUCTURES LOOK AT THE
DESCRIPTION IN THE PROCEDURE AITINSERT. A POINT OF INTEREST HERE
IS THAT THE TOUCH INTERRUPT MUST TAKE THE AITINDEX FROM THE
UNTOUCHED MOM AND PLACE IT IN ASD_ADDRESS SO THAT PRESENCEBIT
CAN GET THIS INFORMATION.
IN CASE OF OWN ARRAYS, THE COMPILER GENERATES CODE TO PLACE THE
MOM IN THE MOST GLOBAL ENVIRONMENT OF THE DECLARING BLOCK.
THE DATA STRUCTURE CREATED TO DEAL WITH OWN ARRAYS IS CALLED
THE OAT - THE OWN ARRAY TABLE. IT IS IDENTICAL IN STRUCTURE TO THE
AIT. THE OAT IS ALSO CREATED IN THE SAME MANNER AS THE THE AIT
EXCEPT FOR THE FACT THAT ALL OWN ARRAYS, SINGLE AND MULTI
DIMENSIONAL HAVE ENTRIES IN THE OAT. WE ALSO SAVE THE LOWER
BOUNDS OF EACH DIMENSION IN THE OAT. THE REASONS FOR DOING THIS
ARE NOT CLEAR AND AS SUCH THEY CONSTITUTE IN PART THE MORE
NEBULOUS ASPECTS OF THIS PROCEDURE. ANOTHER UNKNOWN QUANTITY
IS THE REASON WHY THERE IS CODE IN ARRAYDEC THAT LOOKS IF THE
MOM HAS BEEN ENTERED IN THE OAT. IF ARRAYDEC IS BYPASSED ON
THE COMPILER FINDING AN ODD TAG WORD THEN ARRAYDEC IS NEVER
GOING TO BE CALLED TWICE FOR THE SAME ARRAY. OR IS IT?
IN CASE OF STRING ARRAYS, ARRAYDEC USES THREE STACK CELLS ON THE
DECLARING STACK. THE FIRST CELL CARRIES A TAG 4 WORD, THE SECOND
IS THE DESCRIPTOR TO THE DOPEVECTOR, EACH ELEMENT OF WHICH IS A
STRING, AND THE THIRD CELL IS A DESCRIPTOR TO AN ARRAY EACH
ELEMENT OF WHICH CONTAINS THE ACTUAL LENGTH OF THE
CORRESPONDING STRING ELEMENT. THE MULTI DIMENSIONAL STRING
ARRAYS ARE MERELY EXTENSION OF THIS CONCEPT IN MORE DIMENSIONS.
THIS PARAGRAPH DESCRIBES HOW WE EXIT FROM ARRAYDEC. AFTER
ARRAYDEC IS FINISHED WITH CREATING THE VIRGIN MOM, IT MUST
REMOVE THE FUNNY PARAMETERS UNDER IT'S MSCW. THIS CAN BE DONE
EITHER BY THE COMPILER (WHICH IT IS NOT) OR BY THE MCP
(THE WAY IT IS). ARRAYDEC KNOWS WHERE IN THE STACK THE FUNNY
STUFF BEGINS. ALL IT NEEDS TO DO IS,TO MOVE IT'S MSCW (D1MSCW)
AND THE RCW (D1RCW) TO THIS PLACE IN STACK AND CHANGE D[1]
REGISTER TO POINT TO THIS STACK CELL. ALL THE FUNNY STUFF IS
ATOMIZED IN AN INSTANT, WHEN ARRAYDEC EXITS.
For structure type variables, entries are added at the end of
the block to describe descending dimensions of multi-dimension
arrays, and the length of extended arrays. A word is also
added for DCALGOL queues to mark the fact that the queue may
need disposal. This word contains two fields, STV_Q_COUNTF,
which is the number of queues (or queue arrays) declared in
one declaration, and STV_Q_LINKF which is the offset in the
block of the last one declared.
Words added at the end of the structure are managed by STV_TOP
which contains two pointers: STV_NEXTF and STV_Q_LINKF.STV_NEXTF
manages allocation of additional words. It always points to the
next usable word.STV_Q_LINKF points to the end of the chain
of DCALGOL queue items with zero as the end of list value.
PARAMETERS:
1. SIRW_TO_MOM :
THE COMPILER GENERATES A SIRW TO THE STACKCELL WHERE THE
MOM WILL RESIDE WHEN ARRAYDEC GETS DONE.
2. NO_OF_DIMS :
THIS IS THE NUMBER OF DIMENSIONS OF THE ARRAY THAT IS
BEING DECLARED. IT IS USED TO REACH UNDER THE STACK.
3. TYPE_INFO :
INFORMATION ABOUT THE ARRAY BEING DECLARED. THE FIELDS
ARE DECLARED IN THE DEFINE BELOW.
RESULTS:
AN UNTOUCHED, ABSENT MOM WILL BE PLACED IN THE STACK CELL
POINTED TO BY THE SIRW. THIS MAY OR MAY NOT HAVE AN INDEX INTO
THE AIT/OAT.
ASSUMPTIONS:
IT IS VERY IMPORTANT TO RECOGNIZE THAT THIS PROCEDURE WORKS
VERY CLOSELY WITH THE COMPILERS. IF THE COMPILERS DO NOT GENERATE
CODE TO PASS THE PARAMETERS TO ARRAYDEC CORRECTLY, SATISFACTION
MAY NOT BE GUARANTEED.
SIDE EFFECTS:
LOCKS:
OATLOCK
| ArrayDec Type_Info | ||
|---|---|---|
| Field | Name | Description |
| [47:12] | ControlBitsF | Composite Field |
| [47:1] | DCQueueF | If NO_OF_DIMS = 0, then DCAlgol Queue otherwise a DCAlgol Queue Array with NO_OF_DIMS Dimensions and the Dimension Words under the ArrayDec MSCW. |
| [46:1] | LongF | Long Unsegmented Array. ArrayDec resets this bit for certain Array types. |
| [45:1] | OwnF | Own Array |
| [44:1] | DCMessageF | DCAlgol Message |
| [43:1] | DirectF | Direct Array |
| [42:1] | FIBArrayF | FIB Array |
| [41:1] | StrF | String |
| [40:1] | ||
| [39:1] | EventArrayF | Event Array . ArrayDec sets the LongF to 0, as they may be segmented, and sets the ChrSzF to DOUBLE (1). |
| [38:1] | HeapVectF | Fortran HeapVector. A special structure which is made present from the CodeFile using a Read with Tags. |
| [37:1] | IL_ArrayF | An InterLock Array may be marked as SaveF. ArrayDec sets the LongF to 0, as they may be segmented. The ChrSzF is set to 0. |
| [23:20] | No_Of_ItemsF | Number of Items being declared. This is usually 1, however, the Compiler may create 'Gang' declarations in which a number of consecutive cells have the same type of declaration. They all share the same AIT entry. |
| [3:1] | SaveF | An Array allocated from Save Memory. |
| [2:3] | ChrSzF | The size of the elements of the Array: SINGLE = 0 DOUBLE = 1 HEX = 2 EBCDIC = 4 |