ArrayDec

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

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