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 DESCRIPTOR
 AND PLACES IT AT THE LOCATION TO WHICH THE SIRW POINTS.                                        
                                                               
 IN CASE OF MULTI DIMENSIONAL ARRAYS, THE SIZE OF DIMENSIONS HIGHER THAN ONE
 IS 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