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. %
% THIS 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 |