COMFDS1 
COMMON
  
  
#     COMFDS1 - FIRST SECTION OF DATA SEGMENT # 
                                               CONTROL NOLIST;
                                               CONTROL IFEQ LISTCON,1;
                                               CONTROL LIST;
                                               CONTROL FI;
  
COMMON COMFDAT; 
  BEGIN 
# 
***       COMFDS1 - DATASEGMENT COMMON BLOCK FOR FULL SCREEN EDITOR.
* 
*         COPYRIGHT CONTROL DATA SYSTEMS INC.  1992.
* 
*         COMFDAT IS THE PRINCIPAL DATA SEGMENT FOR ALL EDITOR
*         MODULES.  IT IS USED IN COMMON BLOCK FORMAT TO ASSURE A 
*         SPECIFIC MEMORY MAPPING BY THE COMPILER.  THE COMMON BLOCK
*         MAY BE THOUGHT OF AS CONSISTING OF SEVERAL REGIONS
*         DELIMITED BY CERTAIN ITEMS WHICH ARE USED AS LABELS FOR 
*         ADDRESS COMPARES. 
* 
*         ARRAYSTART THRU ARRAYEND -- THIS SECTION IS EDITOR ARRAYS 
*         WHICH ARE TOO BULKY FOR MULTI-USER CONTEXT SWITCHING.  THEY 
*         ARE ALSO SAVED IN THE WORKFILE AS THE "ARRAY SEGMENT".  IN
*         THE SINGLE-USER EDITOR WE COMPILE THESE ARRAYS RIGHT UP 
*         FRONT WHILE THE MULTI-USER VERSION COMPILES THEM AS BASED 
*         ARRAYS AND ALLOCATES PER-TASK STORAGE FOR THEM.  SINCE
*         POINTER WORDS FOR PER-TASK BASED ARRAYS MUST THEMSELVES BE
*         IN A SPECIFIC REGION, THE ARRAY REGION APPEARS TWICE IN THE 
*         SOURCE CODE, SO MAINTENANCE PROGRAMMERS MUST BE CAREFUL TO
*         UPDATE BOTH.  ALSO BE CAREFUL TO UPDATE CODE IN *BUILDTASK* 
*         ROUTINE OF MULTI-USER EXECUTIVE, *SMFEX*.  THIS CODE
*         AUTOMATICALLY WILL ADAPT TO CHANGES IN COMPILE-TIME 
*         SYMBOLIC CONSTANTS, BUT IS HARD-CODED TO MATCH CONSTANT 
*         PORTIONS OF ARRAY STRUCTURE.
* 
*         DATASTART THRU DATAEND -- THIS SECTION IS THE "DATA 
*         SEGMENT" SAVED IN THE WORKFILE.  THIS SECTION IS CONTEXT
*         SWITCHED IN THE MULTI-USER VERSION SO ITS SIZE MUST BE KEPT 
*         MODERATE.  THE DATA SEGMENT CONSISTS OF SCALARS AND SMALL 
*         ARRAYS WHICH HAVE A HIGH FREQUENCY OF REFERENCE IN THE
*         SOURCE CODE.  THAT IS WHY WE DO NOT USE BASED ARRAYS. 
*         WHILE BASED ARRAYS WOULD CONSERVE SPACE AND THE BRUTE FORCE 
*         MOVEMENT IN CONTEXT SWITCH WE WOULD LOOSE OUT IN POOR 
*         COMPILER CODE GENERATION. 
* 
*         AFTER DATAEND THRU SWAPEND -- THIS SECTION IS DATA WHICH
*         DOES NOT REQUIRE WORKFILE PRESERVATION BETWEEN SESSIONS OR
*         BETWEEN SINGLE AND MULTI-USER VERSIONS.  THIS DATA DOES 
*         NEED TO BE SWAPPED BETWEEN MULTI-USER TRANSACTIONS AND IS 
*         MOVED FOR CONTEXT SWITCHING.
* 
*         AFTER SWAPEND THRU DISPATEND -- THIS SECTION IS DATA WHICH
*         NEEDS TO EXIST FOR THE DURATION OF A TRANSACTION OR PART OF 
*         A TRANSACTION.  IT IS MOVED FOR CONTEXT SWITCHING (DISK IO) 
*         BUT IS NEITHER SWAPPED IN MULTI NOT SAVED IN THE WORKFILE.
*         SINCE IT IS RECYCLED ANYTIME A MULTI-USER TASK IS RECYCLED, 
*         THIS SECTION IS WELL SUITED FOR THE POINTER WORDS OF BASED
*         ARRAYS WHOSE ACTUAL STORAGE IS ALLOCATED ON A PER-TASK
*         BASIS BY THE MULTI-USER EXECUTIVE.
  
  
**        ARRAY MAPPING - SINGLE VERSUS MULTI.
* 
*         THE FIRST SEGMENT OF COMMON IS SEVERAL ARRAYS.  THESE ARE 
*         WRITTEN INTO THE WORKFILE AS THE FIRST OF TWO DATA
*         SEGMENTS.  FOR THE SINGLE USER VERSION, THE REAL ARRAYS 
*         APPEAR HERE.  FOR THE MULTI-USER VERSION, FAKE ARRAYS 
*         APPEAR HERE TO SHOW HOW MEMORY IS RELATIVELY MAPPED, AND
*         BASED ARRAYS WHOSE POINTER WORDS APPEAR LATER WILL BE 
*         ALLOCATED STORAGE ON A PER-TASK BASIS.  DUE TO DUPLICATE
*         DECLARATIONS, BE CAREFUL. 
# 
CONTROL IFEQ SINGLE,1;
  ITEM ARRAYSTART;
  
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  
ARRAY TABLEHEADR [0:0] P(6);         # *TDU* TABLE HEADER INFORMATION # 
  BEGIN 
  ITEM TABHEADONE U(00,00,60);       # WORD ONE # 
  ITEM TABMODNAME C(00,00,07);       # MODEL NAME # 
  ITEM TABVERSION U(00,42,18);       # VERSION NUMBER # 
  ITEM TABHEADTWO U(01,00,60);       # WORD TWO # 
  ITEM TABSTRINPT U(01,00,12);       # OFFSET TO START OF INPUT TABLE # 
  ITEM TABSTRNMES U(01,12,12);       # OFFSET TO START OF KEY LABELS #
  ITEM TABSTRINIT U(01,24,12);       # OFFSET FOR INITIALIZATION DATA # 
  ITEM TABSTRAPPS U(01,36,12);       # OFFSET FOR APPLICATION STRINGS # 
  ITEM TABSTRENDT U(01,48,12);       # OFFSET TO END OF TABLE # 
  ITEM TABHEADTHR U(02,00,60);       # WORD THREE # 
  ITEM TABPTRHGTC U(02,00,04);       # PROTECTED RIGHT BEHAVIOR       # 
  ITEM TABPTLEFTC U(02,04,04);       # PROTECTED LEFT BEHAVIOR        # 
  ITEM TABPTUPCUR U(02,08,04);       # PROTECTED UP BEHAVIOR          # 
  ITEM TABPTDNCUR U(02,12,04);       # PROTECTED DOWN BEHAVIOR        # 
  ITEM TABUNRHGTC U(02,16,04);       # UNPROTECTED RIGHT BEHAVIOR     # 
  ITEM TABUNLEFTC U(02,20,04);       # UNPROTECTED LEFT BEHAVIOR      # 
  ITEM TABUNUPCUR U(02,24,04);       # UNPROTECTED UP BEHAVIOR        # 
  ITEM TABUNDNCUR U(02,28,04);       # UNPROTECTED DOWN BEHAVIOR      # 
  ITEM TABRESERV2 U(02,32,28);       # RESERVED                       # 
  ITEM TABHEADFOU U(03,00,60);       # WORD FOUR #
  ITEM TABCURADDT U(03,00,06);       # CURSOR ADDRESSING TYPE # 
  ITEM TABCURBIAS I(03,06,08);       # CURSOR BIAS FOR POSTIONING # 
  ITEM TABLEFTCUR U(03,14,04);       # CURSOR LEFT BEHAVIOR # 
  ITEM TABRGHTCUR U(03,18,04);       # CURSOR RIGHT BEHAVIOR #
  ITEM TABUPCURSR U(03,22,04);       # CURSOR UP BEHAVIOR # 
  ITEM TABDWNCRSR U(03,26,04);       # CURSOR DOWN BEHAVIOR # 
  ITEM TABLEFTCHR U(03,30,04);       # CHARACTER LEFT BEHAVIOR #
  ITEM TABRGHTCHR U(03,34,04);       # CHARACTER RIGHT BEHAVIOR # 
  ITEM TABLASTPOS U(03,38,04);       # LAST POSITION BEHAVIOR (CHAR) #
  ITEM TABXFIRSTY B(03,42,01);       # X BEFORE Y IN CURSOR OUTPUT #
  ITEM TABXDECIML U(03,43,03);       # X COORDINATE COUNT IF DECIMAL #
  ITEM TABYDECIML U(03,46,03);       # Y COORDINATE COUNT IF DECIMAL #
  ITEM TABRESERV3 U(03,49,11);       # RESERVED # 
  ITEM TABHEADFIV U(04,00,60);       # WORD FIVE #
  ITEM TABVTFLAGS U(04,00,60);       # VIRTUAL TERMINAL FLAGS # 
  ITEM TABVTHOMEU B(04,00,01);       # HOME UP FLAG # 
  ITEM TABVTPROTM B(04,01,01);       # TERMINAL HAS PROTECT # 
  ITEM TABVTDIFSS B(04,02,01);       # DIFFERENT SCREEN SIZES # 
  ITEM TABVTUNUSD B(04,03,01);       # UNUSED # 
  ITEM TABVTGUARD B(04,04,01);       # TERMINAL HAS GUARD # 
  ITEM TABVTABHME B(04,05,01);       # PROTECTED TAB GOES TO HOME # 
  ITEM TABVTABUPF B(04,06,01);       # TABS TO UNPROTECTED FIELDS # 
  ITEM TABVTABSTP B(04,07,01);       # TABS TO TAB STOP # 
  ITEM TABVTSCLRS B(04,08,01);       # SIZE CHANGE CLEARS SCREEN #
  ITEM TABAUTOTAB B(04,09,01);       # TERMINAL HAS AUTOMATIC TABBING # 
  ITEM TABTYPHEAD B(04,10,01);       # TYPE AHEAD ENABLED # 
  ITEM TABLOCKMDE B(04,11,01);       # BLOCK MODE TERMINAL #
  ITEM TABPTDWFLN B(04,12,01);       # PROT TABS DO NOT WRAP FWD LINE # 
  ITEM TABPTDWFPG B(04,13,01);       # PROT TABS DO NOT WRAP FWD PAGE # 
  ITEM TABPTDWBLN B(04,14,01);       # PROT TABS DO NOT WRAP BKW LINE # 
  ITEM TABPTDWBPG B(04,15,01);       # PROT TABS DO NOT WRAP BKW PAGE # 
  ITEM TABUNDWFLN B(04,16,01);       # UNPROT TABS DO NOT WRAP FWD LN # 
  ITEM TABUNDWFPG B(04,17,01);       # UNPROT TABS DO NOT WRAP FWD PG # 
  ITEM TABUNDWBLN B(04,18,01);       # UNPROT TABS DO NOT WRAP BKW LN # 
  ITEM TABUNDWBPG B(04,19,01);       # UNPROT TABS DO NOT WRAP BKW PG # 
  ITEM TABATTRCHR B(04,20,01);       # ATTRIBUTE CHARACTER NEEDS BYTE # 
  ITEM TABATTRSET B(04,21,01);       # RESET ATTRIBUTES BEFORE VDTPOS # 
  ITEM TABSNDSPLR B(04,22,01);       # SEND DISPLAY REWRITE FOR SFORM # 
  ITEM TABSNDSPLH B(04,23,01);       # SEND DISPLAY ON HELP FOR SFORM # 
  ITEM TABNOTMASK B(04,24,01);       # ATTRIBUTES ARE NOT MASKABLE    # 
  ITEM TABNOTCHAR B(04,25,01);       # ATTRIBUTES ARE LINE/PAGE BASED # 
  ITEM TABNOVDTEO B(04,26,01);       # DISABLE OUTPUT END (ERR. EXIT) # 
  ITEM TABPROCLRS B(04,27,01);       # PROTECT ALL CLEARS THE SCREEN  # 
  ITEM TABCLEARSM B(04,28,01);       # CLEARS ACROSS PROTECTED FIELDS # 
  ITEM TABRSBIT29 B(04,29,01);       # RESERVED FOR CDC (FUTURE CODE) # 
  ITEM TABRSBIT30 B(04,30,01);       # RESERVED FOR CDC (FUTURE CODE) # 
  ITEM TABRSBIT31 B(04,31,01);       # RESERVED FOR CDC (FUTURE CODE) # 
  ITEM TABRSBIT32 B(04,32,01);       # RESERVED FOR CDC (FUTURE CODE) # 
  ITEM TABRSBIT33 B(04,33,01);       # RESERVED FOR CDC (FUTURE CODE) # 
  ITEM TABRSBIT34 B(04,34,01);       # RESERVED FOR CDC (FUTURE CODE) # 
  ITEM TABRSBIT35 B(04,35,01);       # RESERVED FOR CDC (FUTURE CODE) # 
  ITEM TABRSBIT36 B(04,36,01);       # RESERVED FOR CDC (FUTURE CODE) # 
  ITEM TABINSTL01 B(04,37,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL02 B(04,38,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL03 B(04,39,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL04 B(04,40,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL05 B(04,41,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL06 B(04,42,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL07 B(04,43,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL08 B(04,44,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL09 B(04,45,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL10 B(04,46,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL11 B(04,47,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL12 B(04,48,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL13 B(04,49,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL14 B(04,50,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL15 B(04,51,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL16 B(04,52,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL17 B(04,53,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL18 B(04,54,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL19 B(04,55,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABINSTL20 B(04,56,01);       # RESERVED FOR INSTALLATION CODE # 
  ITEM TABVTFKLSM U(04,57,03);       # FUNCTION KEY MARK COUNT #
  ITEM TABHEADSIX U(05,00,60);       # WORD SIX # 
  ITEM TABXMAXONE U(05,00,08);       # X MAX, SCREEN SIZE ONE # 
  ITEM TABYMAXONE U(05,08,07);       # Y MAX, SCREEN SIZE ONE # 
  ITEM TABXMAXTWO U(05,15,08);       # X MAX, SCREEN SIZE TWO # 
  ITEM TABYMAXTWO U(05,23,07);       # Y MAX, SCREEN SIZE TWO # 
  ITEM TABXMAXTHR U(05,30,08);       # X MAX, SCREEN SIZE THREE # 
  ITEM TABYMAXTHR U(05,38,07);       # Y MAX, SCREEN SIZE THREE # 
  ITEM TABXMAXFOR U(05,45,08);       # X MAX, SCREEN SIZE FOUR #
  ITEM TABYMAXFOR U(05,53,07);       # Y MAX, SCREEN SIZE FOUR #
  END 
  
ARRAY TABLEWORDS [0:O"271"] P(1);    # *TDU* TABLE I/O INFORMATION #
  BEGIN 
  ITEM TABFULLWRD U(00,00,60);       # TABLE WORD # 
  END 
  
  
  ARRAY SPLITCONTROL [1:2] P(SPLTCTLSIZ);  # SPLIT CONTROL (1 OR 2) # 
    BEGIN # ARRAY SPLITCONTROL #
    ITEM TITLEROW   I(00,00,60)=[1,1];  # WHERE TITLES ARE #
    ITEM NUMROWS    I(01,00,60)=[20,0];  # NUMBER OF ROWS IN SPLIT #
    ITEM SPLITFILE  I(02,00,60)=[1,0];  # FILE DISPLAYED IN SPLIT # 
    ITEM XSHIFT     I(03,00,60)=[0,0];  # DISPLAY COLUMN OFFSET # 
    ITEM LASTNAME   C(04,00,07)=[" ", " "];  # LAST DISPLAYED FILE #
    END # ARRAY SPLITCONTROL #
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  ARRAY ROWCONTROL [0:MAXROWS] P(2);
    BEGIN 
    ITEM ROWWORD0 (0) = [0,MAXROWS(0)]; 
    ITEM ROWWORD1 (1) = [0,MAXROWS(0)]; 
    ITEM ROWPAINT B(0);            # WHETHER TO REDISPLAY THIS ROW     #
    ITEM ROWBITS  U(1,0,6);        # INCLUDES ALL FLAGS                #
      ITEM ROWCOLUM B(1,1,1);      # LIST COLUMN NUMBERS HERE          #
      ITEM ROWPMARK B(1,2,1);      # WHETHER WITHIN ACTIVE MARKS #
    # END OF BITS INCLUDED UNDER ROWBITS #
    ITEM ROWSPLIT U(1,6,3);        # SPLIT THIS ROW IS IN              #
    ITEM ROWTYPE  U(1,9,6);        # TYPES ARE ROWST VALUES         # 
                                   # DEFINED IFF TEXT, EMPTY OR TITLE  #
    ITEM ROWORIG  I(1,18,12);      # ORIGINAL ROW BEFORE SHUFFLES      #
    ITEM ROWLNPTR U(1,30,30);      # LINE POINTER FOR GLOBAL SEARCH    #
    END 
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  ARRAY BACKSTACK [0:BACKMAX];      # STACK OF PREVIOUS SCREENS # 
    BEGIN 
    ITEM BACKFIL1   U (00,00,18);   # FDLF(1) # 
    ITEM BACKFIL2   U (00,18,18);   # FDLF(2) # 
    ITEM BACKSPL1   U (00,36,06);   # SPLIT FILE 1 #
    ITEM BACKSPL2   U (00,42,06);   # SPLIT FILE 2 #
    ITEM BACKSPLN   U (00,48,12);   # SPLIT SIZE #
    END 
  
  ARRAY BACKSTORE [0:TEMPIND] P(2);  # SAVED POSITION STORAGE # 
    BEGIN 
    ITEM BKFDLFF1   U (00,00,18);    # FDLF(1) #
    ITEM BKFDLFF2   U (00,18,18);    # FDLF(2) #
    ITEM BKSPLIT2   U (00,36,06);    # SPLIT FILE 2 # 
    ITEM BKNROWS1   U (00,42,12);    # SPLIT SIZE 1 # 
    ITEM BKWHCHSP   U (00,54,06);    # WHICH SPLIT (0 = TOP) #
    ITEM BKNROWS2   U (01,00,12);    # SPLIT SIZE 2 # 
    ITEM BKCURSOR   U (01,12,12);    # CURSOR POSITION #
    END 
  
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  ARRAY FKEYDEFS [-POSFKEYS:POSFKEYS];
    BEGIN 
    ITEM FKEYNAME C(0,0,10)=[NUMFKEYS(" ")];
    END 
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  ARRAY AUDITSTAGE[0:AUDITSIZE]; ITEM AUDITWORD;
  
  
  # LOCATE AND CHANGE STRING BUFFERS HOLD 80 CHARS PLUS EOL # 
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  ARRAY LOCSTRING1 [0:STRWIDM1]; ITEM LOCSTR1=[STRWID(-1)]; 
  ARRAY LOCSTRING2 [0:STRWIDM1]; ITEM LOCSTR2=[STRWID(-1)]; 
  ARRAY CHGSTRING1 [0:STRWIDM1]; ITEM CHGSTR1=[STRWID(-1)]; 
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  ARRAY FKEYSTRINGS[-POSFKEYS:POSFKEYS] S(2); 
    BEGIN 
    ITEM FKEYSTRING U(0)=[NUMFKEYS(NULLIN)];
    END 
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  ARRAY FKEYNUMB[1:POSFKEYS]; 
    BEGIN 
    ITEM FKEYNUMS U = [POSFKEYS(0)];
    END 
  
  # MUST MATCH CORRESPONDING MULTI-USER ARRAY # 
  
  ARRAY TITLE1LIN [0:TTLLNLEN];      # TITLE LINE ONE ARRAY # 
    BEGIN # ARRAY TITLE1LIN # 
    ITEM TITLE1LINE I=[STRWID(-1)];  # TITLE LINE ONE # 
    END # ARRAY TITLE1LIN # 
  
  ARRAY TITLE2LIN [0:TTLLNLEN];      # TITLE LINE TWO ARRAY # 
    BEGIN # ARRAY TITLE2LIN # 
    ITEM TITLE2LINE I=[STRWID(-1)];  # TITLE LINE TWO # 
    END # ARRAY TITLE2LIN # 
  
  
  ITEM ARRAYEND;
CONTROL FI; 
  
  
  
  
  
  # THE NEXT SEGMENT OF COMMON IS WRITTEN INTO A BINARY FILE   #
  # RECORD FOR COMMUNICATION BETWEEN FSE AND SMFEX, SO IT      #
  # CANNOT CONTAIN *CONTROL IF* DEPENDENT ON MODULE.           #
  
  # DATASTART, SEGMENTVER, SEGMENTLEN1, AND SEGMENTLEN2 ARE    #
  # REQUIRED TO BE THE FIRST FOUR WORDS OF THE SCALAR SEGMENT, #
  # SO THAT WORKFILE RESUMPTION CAN VERIFY THEM AT FIXED ADDR. #
  
  ITEM DATASTART; 
  
  ITEM SEGMENTVER=0;         # DATA SEGMENT VERSION        #
  ITEM SEGMENTLEN1=0;        # DATA SEGMENT LENGTH         #
  ITEM SEGMENTLEN2=0;        # ARRAY SEGMENT LENGTH        #
  
                                               CONTROL LIST;
