CONSTSHORTINTEGERARRAY MAIN(1 : 217) =    C
    1,    5,   14,   20,   26,   38,   43,   48,   54,   61,   68,   74,
   79,   82,   84,   89,   96,  102,  108,  115,  122,  126,    0,  129,
  133,  137,  142,  145,  152,  156,  161,  164,  168,    0,  171,    0,
  178,  184,  185,  189,  190,  193,  196,  199,    0,  202,  205,  206,
  208,    0,  211,  213,  215,  216,  219,  222,  225,    0,  228,  231,
  236,  241,  244,  249,    0,  253,  259,  260,  264,  266,  267,  270,
  271,  274,  277,  279,  280,  283,  286,  289,  292,  295,  298,  302,
  305,  308,  311,  314,  317,  320,  324,  328,  332,  336,  340,  344,
  348,  352,  355,  358,    0,  361,  363,  365,  373,    0,  381,    0,
  385,  392,  393,  396,  397,  400,  403,  405,  406,  410,    0,  413,
  418,  425,  432,    0,  435,  437,    0,  440,  445,  446,  450,  453,
  456,    0,  459,  462,  463,    0,  469,  472,  473,  475,    0,  477,
  489,  499,  506,    0,  509,  511,  512,  517,    0,  520,    0,  530,
  534,  535,  538,  539,    0,  543,  546,  547,    0,  558,  565,  566,
  571,  572,  576,  579,    0,  585,  587,  588,  591,    0,  594,  597,
    0,  600,  602,  603,  608,  609,  614,  615,  618,    0,  620,  622,
  623,  627,  628,  631,  634,  637,    0,  640,  646,    0,  651,  656,
  657,  660,  661,  665,    0,  667,    0,  670,  674,  675,  678,  681,
  683
CONSTSHORTINTEGERARRAY SUB(2 : 684) =    C
  4119,  4288, -8192,     0,  4149,  4168,  4197,  4166,  4286,
  4119,  4230, -8192,     0,     1,  8200, 24576,  4230, -8192,
     0,     8,  8221, 24576, 16384, -8192,     0,    15,  8204,
 20480, 16384,  4202,    21,  8244,  4168,  4197,  4166, -8192,
     0,  4154,  4246,-20480, -8192,     0,  4290,  4154,  4295,
-20480,     0,    23,  8223,  4255, -8192,-20480,     0,  4208,
  4271,  4212, -4096,  4261, -8192,     0,    30,  8197, -4096,
  4261, -8192,-20480,     0,    35,  8196, 20480, -8192,-16384,
     0,    41,  8198,  4215, -8192,     0,  4130,  4096,     0,
  4225,     0,    45,  8199, -8192,-20480,     0,  4309,    50,
  8201,  4239, -8192,-20480,     0,    57,-20480,  8202, 12288,
 -8192,     0,    65,  8203,  4232, -8192,-20480,     0,    71,
    77,  8193,  8205, -8192,-20480,     0,    85,    93,  8206,
  8207, -8192,-20480,     0,   101,  8257,-32768,     0,-12288,
 -8192,     0,  4202,  4134,  4141,     0,   103,  8246,  4143,
     0,   106,  8208, 12288,  4141,     0,   116,  8209,     0,
   123,  8210,  4136,  4168,  4197,  4166,     0,   130,  8211,
 20480,     0,    15,  8204, 20480, 16384,     0,   136,  8212,
     0,   141,  8213,  4146,     0,   149,  8214,     0,  8292,
  4220,   154,  8245,  8192,  4132,     0,  8292,  4220,   154,
  8245,  8192,  4132,     0,  4136,  4168,  4197,  4166,     0,
   156,  8247,     0,    21,  8244,     0,   159,  8248,     0,
   103,  8246,     0,   162,  8215,  4119,     0, 12288,     0,
 -4096,  4204,     0, 12288,     0,   136,  8212,     0,   166,
  8216,     0,   169,  8218,     0,   175,  8217,     0,   182,
  8219,     0,   188,  8220,     0,   196,   188,  8194,  8220,
     0,    71,   188,  8193,  8220,     0,   201,  8222,     0,
   206,   201,  8195,  8222,     0,   211,  8224,  4161,     0,
   218,  8249, 12288,   220,  8250,  8271,     0,   222,  8225,
  8226,     0,   232,  8226,     0,  4172,  4197,  4166,     0,
   237,  8251,     0,   239,  8252,     0,   241,  8253,     0,
   237,  8251,     0,   103,  8246,     0,   239,  8252,     0,
   243,  8254,     0,   245,  8255,     0,   248,  8256,     0,
   250,  8257,  8257,     0,   101,  8257,     0,   253,  8258,
     0,   256,  8259,     0,   258,  8260,     0,   260,  8261,
     0,   263,  8262,     0,    21,  8244,  4168,     0,   266,
  8263,  4168,     0,   269,  8264,  4168,     0,   271,  8267,
  4168,     0,   273,  8265,  4168,     0,   276,  8266,  4168,
     0,   278,  8268,  4168,     0,   281,  8272,  4168,     0,
   162,  8215,     0,   283,  8227,     0,   154,  8245,     0,
 12288,     0,  4202,     0,   218,  8249,  4168,  4197,  4166,
   220,  8250,     0,   248,  8256,  4168,  4197,  4166,   248,
  8256,     0, -4096,  4204,  4206,     0,   218,  8249,  4168,
  4197,  4166,   220,  8250,     0,   286,  8270,  4202,     0,
   288,  8231,     0,   297,  8232,     0,   304,  8233,     0,
    30,  8197,-20480,     0, 20480,-16384,     0,   312,  8234,
  8199,-20480,     0,   319,  8234,  8207, 28672, 24576, 20480,
     0,   329,  8234,  8235, 28672, 24576, 20480,     0, 24576,
 28672,     0, 12288,     0, -4096,  4223,     0,   218,  8249,
 12288,   220,  8250,     0,   248, -8191,-28672,     0,   336,
-24576,     0,   248,-28672,     0,   339,-28672,     0,   347,
  8237,  4119,     0, 12288,   103,  8246,  4236,  4234,     0,
   281,  8269,  4232,     0, 12288,     0, -4096,     0,   352,
  8238, -4096,   218,  8249,  4283,  4246,  4279,  4281,   220,
  8250,     0,    30,  8197, -4096,  4253,   218,  8249, -4096,
   220,  8250,     0,  4246,   218,  8249, -4096,   220,  8250,
     0,   232,  8226,     0,   352,  8238,     0,   359,  8225,
  4244,  4249,     0,  4163,  4305,     0,  4305,   218,  8249,
  4168,  4197,  4166,   220,  8250,  4251,     0,   281,  8269,
  4249,  4251,     0,   286,  8270, -4096,     0,  4305,  4259,
  4257,     0,   281,  8269,  4255,     0,   218,  8249,  4168,
 12288,   154,  8245,  4168, 12288,   220,  8250,     0,   218,
  8249,  4265,  4305,  4263,   220,  8250,     0,   281,  8269,
  4265,  4305,  4263,     0,  4271,   232,  8226,     0,  4154,
  4163,     0,    50,  8201,  4269,   232,  8226,     0,   359,
  8225,     0,    77,  8205,     0,  4154,  4274,     0,   365,
  8239,     0,   368,  8240,     0,   281,  8269,     0,   218,
  8249, -4096,   220,  8250,     0,  4277,  4283,  4246,  4279,
  4281,     0,    50,  8201,     0,  4154,     0,   372,  8241,
     0,  4149,  4168,  4197,  4166,     0,   377,  8228,     0,
   381,  8229,     0,   387,  8230,     0,   288,  8231,     0,
   359,  8225, -4096,  4259,  4302,     0,  4305,  4300,  4298,
 -8192,     0,   281,  8269,  4305,  4300,  4298,     0,    21,
  8244, 12288,     0,    21,  8244,-32768,     0, -8192,     0,
 -4096,  4307,     0,   281,  8269, -4096,  4307,     0,   377,
  8228,     0,   288,  8231,     0,   387,  8230,    0
CONSTBYTEINTEGERARRAY LITERAL(1 : 396) =    C
    6,  102,  105,  110,  105,  115,  104,    6,  114,  101,  112,  101,
   97,  116,    5,   99,  121,   99,  108,  101,    1,   61,    6,  115,
  119,  105,  116,   99,  104,    4,  115,  112,  101,   99,    5,   98,
  101,  103,  105,  110,    3,  101,  110,  100,    4,  108,  105,  115,
  116,    6,  114,  101,   99,  111,  114,  100,    7,   99,  111,  110,
  116,  114,  111,  108,    5,  102,   97,  117,  108,  116,    5,  115,
  104,  111,  114,  116,    7,  114,  111,  117,  116,  105,  110,  101,
    7,  116,  114,  117,  115,  116,  101,  100,    7,  112,  114,  111,
  103,  114,   97,  109,    1,   42,    2,   45,   62,    9,  112,  114,
  105,  110,  116,  116,  101,  120,  116,    6,  114,  101,  116,  117,
  114,  110,    6,  114,  101,  115,  117,  108,  116,    5,  115,  116,
   97,  114,  116,    4,  115,  116,  111,  112,    7,  109,  111,  110,
  105,  116,  111,  114,    4,  101,  120,  105,  116,    1,   58,    2,
   61,   61,    2,   60,   45,    3,   97,  110,  100,    2,  105,  102,
    5,  119,  104,  105,  108,  101,    6,  117,  110,  108,  101,  115,
  115,    5,  117,  110,  116,  105,  108,    7,  105,  110,  116,  101,
  103,  101,  114,    4,   98,  121,  116,  101,    4,  114,  101,   97,
  108,    4,  108,  111,  110,  103,    6,  115,  116,  114,  105,  110,
  103,    1,   40,    1,   41,    9,   97,  114,  114,   97,  121,  110,
   97,  109,  101,    4,  110,   97,  109,  101,    1,   43,    1,   45,
    1,   92,    1,   38,    2,   33,   33,    1,   33,    2,   42,   42,
    2,   47,   47,    1,   47,    1,   46,    2,   60,   60,    2,   62,
   62,    2,   60,   61,    1,   60,    1,   35,    2,   62,   61,    1,
   62,    2,   92,   61,    1,   44,    2,  111,  114,    1,   95,    8,
  101,  120,  116,  101,  114,  110,   97,  108,    6,  115,  121,  115,
  116,  101,  109,    7,  100,  121,  110,   97,  109,  105,   99,    6,
  111,  102,  108,  105,  115,  116,    9,  111,  102,  112,  114,  111,
  103,  114,   97,  109,    6,  111,  102,  102,  105,  108,  101,    2,
   33,   42,    7,   99,  111,  109,  109,  101,  110,  116,    4,  101,
  108,  115,  101,    6,  102,  111,  114,  109,   97,  116,    5,   97,
  114,  114,   97,  121,    2,  102,  110,    3,  109,   97,  112,    4,
  116,  104,  101,  110,    3,  111,  119,  110,    5,   99,  111,  110,
  115,  116,    9,  101,  120,  116,  114,  105,  110,  115,  105,   99
CONSTBYTEINTEGERARRAY SFLAGS(1 : 80) =    C
 3, 3, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1,
 1, 1, 1, 4, 0, 4, 0, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0
CONSTBYTEINTEGERARRAY KEYSYMS(1 : 381) =    C
  5, 83, 72, 79, 82, 84,  4, 66, 89, 84, 69,  4, 76, 79, 78, 71,  5, 66,
 69, 71, 73, 78,  4, 83, 80, 69, 67,  3, 69, 78, 68,  4, 76, 73, 83, 84,
  6, 70, 73, 78, 73, 83, 72,  6, 82, 69, 67, 79, 82, 68,  7, 67, 79, 78,
 84, 82, 79, 76,  5, 70, 65, 85, 76, 84,  5, 67, 89, 67, 76, 69,  7, 82,
 79, 85, 84, 73, 78, 69,  7, 84, 82, 85, 83, 84, 69, 68,  7, 80, 82, 79,
 71, 82, 65, 77,  9, 80, 82, 73, 78, 84, 84, 69, 88, 84,  6, 82, 69, 84,
 85, 82, 78,  6, 82, 69, 83, 85, 76, 84,  5, 83, 84, 65, 82, 84,  4, 83,
 84, 79, 80,  7, 77, 79, 78, 73, 84, 79, 82,  4, 69, 88, 73, 84,  3, 65,
 78, 68,  2, 73, 70,  6, 85, 78, 76, 69, 83, 83,  5, 87, 72, 73, 76, 69,
  5, 85, 78, 84, 73, 76,  7, 73, 78, 84, 69, 71, 69, 82,  6, 82, 69, 80,
 69, 65, 84,  4, 82, 69, 65, 76,  6, 83, 87, 73, 84, 67, 72,  6, 83, 84,
 82, 73, 78, 71,  5, 65, 82, 82, 65, 89,  4, 78, 65, 77, 69,  2, 79, 82,
  3, 79, 87, 78,  5, 67, 79, 78, 83, 84,  9, 69, 88, 84, 82, 73, 78, 83,
 73, 67,  8, 69, 88, 84, 69, 82, 78, 65, 76,  6, 83, 89, 83, 84, 69, 77,
  7, 68, 89, 78, 65, 77, 73, 67,  2, 79, 70,  4, 70, 73, 76, 69,  7, 67,
 79, 77, 77, 69, 78, 84,  4, 69, 76, 83, 69,  6, 70, 79, 82, 77, 65, 84,
  2, 70, 78,  3, 77, 65, 80,  4, 84, 72, 69, 78,  5, 82, 69, 65, 76, 83,
  6, 78, 79, 82, 77, 65, 76,  1, 61,  1, 58,  2, 45, 62,  2, 61, 61,  2,
 60, 45,  1, 40,  1, 41,  1, 43,  1, 45,  1, 92,  1, 38,  2, 33, 33,  1,
 33,  1, 42,  2, 47, 47,  1, 47,  1, 46,  2, 60, 60,  2, 62, 62,  2, 60,
 61,  1, 60,  2, 62, 61,  1, 62,  1, 35,  2, 92, 61,  1, 44,  1, 95,  1,
 32,  1, 44
CONSTSHORTINTEGERARRAY KEYWORD(1 : 80) =    C
   0,   6,  11,  16,  22,  27,  31,  36,  43,  50,  58,  64,  70,  78,
  86,  94, 104, 111, 118, 124, 129, 137, 142, 146, 149, 156, 162, 168,
 176, 183, 188, 195, 202, 208, 213, 216, 220, 226, 236, 245, 252, 260,
 263, 268, 276, 281, 288, 291, 295, 300, 306, 313, 315, 317, 320, 323,
 326, 328, 330, 332, 334, 336, 338, 341, 343, 345, 348, 350, 352, 355,
 358, 361, 363, 366, 368, 370, 373, 375, 377, 379
CONSTBYTEINTEGERARRAY KFLAGS(1 : 80) =    C
 144, 144, 144, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 144,
 128, 128, 128, 128, 128, 128, 144, 128, 160, 130, 130, 130, 130, 128,
 128, 128, 128, 128, 145, 129, 128, 144, 144, 144, 144, 144, 144, 145,
 128, 128, 162, 129, 129, 129, 160, 144, 128,   8,   8,   8,   8,   8,
   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   8,   8,   8,   8,   8,   8,  64,   0,   0,   0
OWNBYTEINTEGER ISOLATE BRACKETS = 0;    !  'IB'
OWNBYTEINTEGER LEAVE BLANKS = 0;        !  'LB'
OWNBYTEINTEGER SEP BLOCKS = 1;          !  'SB'
OWNBYTEINTEGER INDENT BLOCKS = 1;       !  'TB'
OWNBYTEINTEGER SPLIT KEYWORDS = 0;      !  'SK'
OWNBYTEINTEGER PACK NAMES = 0;          !  'PN'
OWNBYTEINTEGER SPLIT STATS = 0;         !  'SS'
OWNBYTEINTEGER COMMENTS NORMAL = 0;     !  'CN'
OWNBYTEINTEGER BREAK COMMENTS = 1;      !  'BC'
OWNBYTEINTEGER LEAVE STARS = 1;         !  'LS'
OWNBYTEINTEGER JUSTIFY ALL = 0;         !  'JA'
OWNBYTEINTEGER LABELS RELATIVE = 0;     !  'LR'
OWNBYTEINTEGER SPLIT CONDS = 1;         !  'SC'
OWNBYTEINTEGER DECS RELATIVE = 1;       !  'DR'
OWNBYTEINTEGER SPACE LISTS = 1;         !  'SL'
OWNBYTEINTEGER SPACE EQUALS = 1;        !  'SE'
OWNBYTEINTEGER ISOLATE LOOPS = 1;       !  'IL'
OWNBYTEINTEGER EXTRA MARGIN = 0;        !  'EM'
OWNBYTEINTEGER LEAVE OWNS = 0;          !  'LO'
OWNBYTEINTEGER COMMENTS RELATIVE = 1;   !  'CR'
OWNBYTEINTEGER EXTEND COMMENTS = 1;     !  'EC'
OWNBYTEINTEGER MI = 3;                  !  MARGIN INCREMENT
OWNBYTEINTEGER LL = 72;                 !  LINE LENGTH
OWNBYTEINTEGER CT = 40;                 !  COMMENT TAB
OWNBYTEINTEGER ML = 40;                 !  MARGIN LIMIT
OWNBYTEINTEGER COMMENT EXTENSION = 5;   !  'CE'
OWNBYTEINTEGER EXT NUM = 2;             !  'XN'
OWNBYTEINTEGER INITIAL MARGIN = 7;      !  'IM'
OWNBYTEINTEGER SECONDARY MARGIN = 3;    !  'SM'
OWNBYTEINTEGER COMMENT LIMIT = 20;      !  'CL'
OWNBYTEINTEGER COMMENT LINE = 120;      !  'LC'
OWNSHORTINTEGER SAFETY FACTOR = 5
OWNINTEGER DELTA MARGIN = 3
OWNINTEGER LINE LENGTH = 70
OWNINTEGER COMMENT TAB = 40
OWNINTEGER LEVEL = 1, MLIMIT = 0, SEC MARGIN = 3
OWNBYTEINTEGER COMMENT FLAG
OWNBYTEINTEGER CMODE, LOOP FLAG
OWNINTEGER LINESIZE, CS, DISP, D, RMARGIN, FIRST DISP
OWNINTEGER SIZE, CSTART, LINE BASE, FULL LINE
EXTERNALROUTINESPEC PROMPT(STRING (63) S)
EXTERNALROUTINESPEC DEFINE(STRING (63) S)
EXTERNALROUTINESPEC SEND(STRING (63) S)
EXTERNALROUTINESPEC LIST(STRING (63) S)
EXTERNALROUTINESPEC DESTROY(STRING (63) S)
EXTERNALROUTINESPEC RENAME(STRING (63) S)
INTEGERFNSPEC PARSE(INTEGER EP)
OWNSTRING (255) INPUT, OUTPUT, OPTION FILE, ST, OPLIST
OWNINTEGER SPT, SAD, S
OWNBYTEINTEGER SPACES, MODE
OWNBYTEINTEGER OK, THIS SEP
CONSTINTEGER LAST TEXT = 51
OWNINTEGER HEADER, SEGS
OWNINTEGERARRAY STRINGS(-100 : -1)
OWNINTEGER COMMENT LENGTH
OWNSHORTINTEGERARRAY REM(1 : 4)
OWNBYTEINTEGERARRAY SYMFILE(0 : 300)
OWNBYTEINTEGERARRAY TLENGTH(-100 : -1)
OWNINTEGERARRAY REC(1 : 100)
OWNBYTEINTEGER STATUS, OPTIONS, LAST SEP, FLAG, PMODE
OWNBYTEINTEGER QUOTES = 0, OWNFLAG = ';'
OWNINTEGER NVAL
REGISTER CURRIN(14)
OWNINTEGER CURROUT, SLENGTH, LIMIT, MARGIN, INBASE, STATSIZE
OWNINTEGER STAT, KEYBASE, TEXTBASE, J, SN, RP, RPLIM, RPINC
OWNINTEGER MAXMARGIN, ENDOFFILE
CONSTINTEGER CCC = X'2025430A'
CONSTINTEGER CONNEKTEP = 1
CONSTINTEGER CREATEEP = 162
CONSTINTEGER READEP = 7
CONSTINTEGER INFOEP = 5
CONSTINTEGER CHANGEEP = 6
ROUTINESPEC SET UP FILES(STRINGNAME S)
ROUTINESPEC CLOSE FILES
ROUTINESPEC SET OPTIONS

DYNAMICROUTINESPEC CHERISH(STRING(63) S)
ROUTINE FDP(INTEGER EP,STRING(17) NAME,INTEGER P1,P2,C
INTEGERNAME FLAG)
SYSTEMROUTINESPEC AGENCY(INTEGER P1,P2)
*OI_4(13),5
AGENCY(1,ADDR(EP))
END
ROUTINE CONTINUE
SHORTROUTINE
ROUTINESPEC ADJUST
INTEGERARRAY HOLD(1 : 4)
INTEGER J, K, L, M, N, Z, LIM, XES
BYTEINTEGERARRAYFORMAT NFM(1 : 4)
BYTEINTEGERARRAYNAME NEST
BYTEINTEGER S, CFLAG
          NEST == ARRAY(ADDR(NVAL),NFM)
          THIS SEP = NL;  LIM = MARGIN+SAFETY FACTOR+SEC MARGIN
          Z = SLENGTH+CURROUT
          RETURN IF Z < LIMIT OR (Z-SAFETY FACTOR-LIMIT < -4 C
             AND REC(RP+1) = 0)
!         LEAVE TWO SPACES FOR ' %' IF NESC.
          XES = Z-LIMIT;                ! EXCESS LINE LENGTH

          CYCLE J = 1,1,4;  HOLD(J) = NEST(J)+CURROUT-LINE BASE
          REPEAT

          IF LAST SEP = ';' THEN START
             N = CURROUT;  QUOTES = 0

             UNTIL S = ';' AND QUOTES = 0 CYCLE
                N = N-1;  S = BYTEINTEGER(N)
                QUOTES = QUOTES!!1 IF S = ''''
             REPEAT

             BYTEINTEGER(N) = NL;  LIMIT = N+LINELENGTH
             LINE BASE = N
             K = CURROUT+80;  M = K

             CYCLE L = N+3,1,CURROUT
                K = K+1;  BYTEINTEGER(K) = BYTEINTEGER(L)
             REPEAT

             CYCLE L = 1,1,MARGIN
                N = N+1;  BYTEINTEGER(N) = ' '
             REPEAT

             CYCLE L = M+1,1,K
                N = N+1;  BYTEINTEGER(N) = BYTEINTEGER(L)
             REPEAT

             CURROUT = N
             LAST SEP = NL
             ADJUST
             RETURN IF CURROUT+SLENGTH < LIMIT
          FINISH
          NEST(3) = 0 IF NEST(4) # 0 AND REC(REM(4)-1) >= 4
          CFLAG = 0

          CYCLE J = 1,1,4
             N = NEST(J)
             IF N > LIM START
                N = N+LINE BASE
                CFLAG = 1 AND EXIT IF N < CURROUT
             FINISH
          REPEAT

          IF CFLAG # 0 START
             IF NEST(J)-MARGIN-SEC MARGIN-SAFETY FACTOR < XES START
                K = J

                WHILE K < 4 CYCLE
                   K = K+1
                   CFLAG = 0 AND EXIT IF NEST(K) # 0
                REPEAT

                IF CFLAG = 0 START
                   L = NEST(K)+LINE BASE
                   J = K AND N = L C
                      IF NEST(K) > LIM AND L < CURROUT
                FINISH
             FINISH
             J = 3 AND N = NEST(3)+LINE BASE C
                IF J = 4 AND REM(3) = REM(4)-1
             LIM = NEST(J)+SAFETY FACTOR+SEC MARGIN
             K = CURROUT+80;  M = K

             CYCLE L = N+1,1,CURROUT
                K = K+1;  BYTEINTEGER(K) = BYTEINTEGER(L)
             REPEAT

             *L_1,N
             *MVC_1(4,1),CCC
             *LA_1,4(1)
             *ST_1,CURROUT
             *ST_1,LINEBASE

             CYCLE J = 1,1,MARGIN+SEC MARGIN
                CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = ' '
             REPEAT

             M = M+1 IF BYTEINTEGER(M+1) = ' '
             IF BYTEINTEGER(M+1) # '%' START
                CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = '%'
             FINISH

             CYCLE L = M+1,1,K
                CURROUT = CURROUT+1
                BYTEINTEGER(CURROUT) = BYTEINTEGER(L)
             REPEAT

!??          ADJUST
          FINISH ELSE START
             LIM = CURROUT-LINEBASE+SAFETY FACTOR
             *L_1,CURROUT
             *MVC_1(4,1),CCC
             *LA_1,4(1)
             *ST_1,CURROUT
             *ST_1,LINE BASE

             CYCLE J = 1,1,MARGIN+SEC MARGIN
                CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = ' '
             REPEAT

             PMODE = 128;               ! NO LONGER IN RANGE OF '%'
          FINISH
          LIMIT = LINEBASE+LINE LENGTH
          STATSIZE = STATSIZE-LINELENGTH+MARGIN
          RPLIM = RPLIM+RPINC IF STATSIZE+MARGIN >= LINE LENGTH
          NVAL = 0

ROUTINE ADJUST

             CYCLE J = 1,1,4
                IF NEST(J) <= LIM THEN NEST(J) = 0 C
                   ELSE NEST(J) = HOLD(J)-CURROUT+LINE BASE
             REPEAT

END
END

ROUTINE BREAK
SHORTROUTINE
          CURROUT = CURROUT-2 UNLESS BYTEINTEGER(CURROUT) = ';'
          BYTEINTEGER(CURROUT) = NL
          SIZE = 0;  LINE BASE = CURROUT
          LIMIT = LINE BASE+LINE SIZE
          NVAL = 0
END

EXTERNALROUTINE SOAP(STRING (128) FILES)
SHORTROUTINE
OWNINTEGER MOVEX = X'D2002001', MOVEY = X'10010000'
ROUTINESPEC PERCENT
ROUTINESPEC SPACE
INTEGERNAME MID MARGIN
INTEGER N, P, K, M, Z
BYTEINTEGERARRAYFORMAT NFM(1 : 4)
BYTEINTEGERARRAYNAME NEST
          PRINTTEXT 'SOAP';  PRINTCH(7);  NEWLINE
          NEST == ARRAY(ADDR(NVAL),NFM)
          SET UP FILES(FILES);  RETURN IF OK = 0
          SET OPTIONS;  RETURN IF OK = 0
          MID MARGIN == MARGIN
          MID MARGIN == RMARGIN IF COMMENTS RELATIVE = 0
!*                32             16      8     4     2      1
!* STATUS:  SPECIAL COMMENT : COMMENT : OWN : END : DOWN : UP
TOP:                                    !    HEAD OF MAIN LOOP

          CYCLE
             NVAL = 0
             LOOP FLAG = 0
             RP = 0;  SPT = 0;  MODE = 0;  STATUS = 0
             SAD = TEXTBASE
             LIMIT = CURROUT+LINELENGTH IF LAST SEP # ';'
             INBASE = CURRIN
             IF PARSE(0) # 0 THEN START
                                        !    SYNTAX ??
OWNS:           J = CURRIN;  QUOTES = 0;  K = 0

                UNTIL (S = NL OR S = ';') AND (QUOTES = 0 C
                   OR K > 300) CYCLE
                   K = K+1
                   J = J+1;  S = BYTEINTEGER(J)
                   QUOTES = QUOTES!!1 IF S = ''''
                REPEAT

                SLENGTH = J-CURRIN
                IF CURROUT+SLENGTH > LIMIT AND LAST SEP = ';' C
                   THEN START
                   BREAK
                   STAT = CURROUT+MARGIN

                   CYCLE J = 1,1,MARGIN
                      CURROUT = CURROUT+1
                      BYTEINTEGER(CURROUT) = ' '
                   REPEAT

                FINISH
                IF OWNFLAG = 0 THEN START
                   OWNFLAG = ';'
                   IF CURROUT+SLENGTH+SAFETY FACTOR > LIMIT C
                      THEN START
                      *L_1,CURROUT
                      *MVC_1(4,1),CCC;  ! PUSH IN CONTINUATION
                      *LA_1,4(1)
                      *ST_1,CURROUT
                      *ST_1,LINE BASE
                   FINISH
                FINISH

                CYCLE J = 1,1,SLENGTH
                   CURRIN = CURRIN+1;  CURROUT = CURROUT+1
                   BYTEINTEGER(CURROUT) = BYTEINTEGER(CURRIN)
                REPEAT

                LAST SEP = BYTEINTEGER(CURRIN)
                IF LAST SEP = ';' THEN START
                   BYTEINTEGER(CURROUT+1) = ' '
                   BYTEINTEGER(CURROUT+2) = ' '
                   CURROUT = CURROUT+2
                FINISH ELSE LINE BASE = CURROUT
             FINISH ELSE START
                PMODE = 128
                STATSIZE = CURRIN-INBASE
                IF STATSIZE+MARGIN > LINE LENGTH START
                   RPINC = RP//(STATSIZE//(LINE LENGTH-MARGIN))
                   RPLIM = RPINC
                FINISH ELSE RPLIM = RP
                IF STATUS&11 # 0 AND LAST SEP = ';' THEN START
                   LAST SEP = NL
                   BREAK
                FINISH
                IF STATUS&136 # 0 THEN START
                                        !    BLANK LINE OR BLOCK
                   IF (LEAVE BLANKS # 0 AND THIS SEP # ';') C
                      OR (STATUS&128 # 0 AND SEP BLOCKS # 0) C
                      THEN START
NULL:
                      CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = NL
                      LINE BASE = CURROUT
                   FINISH
                   -> TOP IF STATUS&8 # 0 AND RP <= 1
                                        !    IN CASE OF LONELY LABELS
                FINISH
                RP = 0
                IF LOOP FLAG # 0 AND STATUS&1 # 0 C
                   AND BYTEINTEGER(CURROUT-1) # NL START
                   CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = NL
                   LINE BASE = CURROUT
                   LIMIT = LIMIT+1
                FINISH
                IF STATUS&2 # 0 THEN START
                                        !    DOWN
                   STATUS = STATUS!64 C
                      IF EXTRA MARGIN # 0 AND STATUS&4 # 0
                   LEVEL = LEVEL>>1
                   LEVEL = 1 IF LEVEL = 0
                   MARGIN = MARGIN-DELTA MARGIN IF MLIMIT&1 = 0
                   MLIMIT = MLIMIT>>1
                   MARGIN = 0 IF MARGIN < 0
                FINISH
                STAT = CURROUT+MARGIN IF LAST SEP # ';'

                WHILE REC(RP+1) = 100 CYCLE
                                        !    DEAL WITH LABELS
                   RP = RP+1
                   IF LAST SEP = ';' OR LAST SEP = ':' THEN START
                      N = -2;  N = 1 IF LAST SEP = ':'
                      CURROUT = CURROUT+N;  BYTEINTEGER(CURROUT) = NL
                      LINE BASE = CURROUT
                      LIMIT = CURROUT+LINELENGTH
                      STAT = CURROUT+MARGIN
                      LAST SEP = NL
                   FINISH
                   IF LABELS RELATIVE # 0 AND LAST SEP # ':' C
                      THEN START
                      N = LEVEL;  M = MARGIN
                      M = M+FIRST DISP C
                         IF EXTRA MARGIN # 0 AND LEVEL = 1

                      CYCLE
                         M = M-DELTA MARGIN
                         EXIT IF N&1 # 0
                         N = N>>1
                      REPEAT

                      WHILE M > 0 CYCLE
                         M = M-1
                         CURROUT = CURROUT+1
                         BYTEINTEGER(CURROUT) = ' '
                      REPEAT

                   FINISH

                   CYCLE
                      RP = RP+1;  N = REC(RP);  EXIT IF N = 0
                      IF N < 0 THEN SN = STRINGS(N) C
                         ELSE SN = KEYWORD(N)+KEYBASE

                      CYCLE J = SN+1,1,SN+BYTEINTEGER(SN)
                         CURROUT = CURROUT+1
                         BYTEINTEGER(CURROUT) = BYTEINTEGER(J)
                      REPEAT

                   REPEAT

                   IF CURROUT > STAT AND STATUS&16 = 0 THEN START
                      CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = NL
                      LINE BASE = CURROUT
                      LIMIT = CURROUT+LINELENGTH
                      STAT = CURROUT+MARGIN
                   FINISH
                   LAST SEP = ':'
                REPEAT

                RP = 0 AND -> NULL IF STATUS&8 # 0
                                        !    NOW DEAL WITH COMMENTS
                IF STATUS&16 # 0 THEN START
                   RP = RP+1;  DISP = REC(RP)
                                        !   STARTING DISP OF INPUT
                                        !  COMMENT
                   D = 0;  CMODE = 0
                   J = CURRIN;          !   FIND THE END OF THE COMMENT
                   J = J+1 WHILE BYTEINTEGER(J) # NL C
                      AND BYTEINTEGER(J) # ';'
                   CS = J-CURRIN;       !   COMMENT SIZE
                   IF COMMENT FLAG = 0 C
                      THEN CSTART = COMMENT TAB ELSE START
                      IF COMMENTS NORMAL # 0 START
                         CMODE = 1;  CSTART = MARGIN
                      FINISH ELSE START
                         IF LAST SEP = ';' C
                            THEN CSTART = COMMENT TAB ELSE START
                            IF DISP = 0 THEN CSTART = 0 ELSE START
                               IF DISP <= MID MARGIN C
                                  AND STATUS&32 = 0 C
                                  THEN CSTART = MARGIN C
                                  ELSE CSTART = COMMENT TAB
                            FINISH
                         FINISH
                      FINISH
                   FINISH
                   CSTART = 0 IF STATUS&32 # 0 AND LEAVE STARS # 0
                   SIZE = CURROUT-LINE BASE
                   IF LAST SEP = ';' START
                      IF BYTEINTEGER(CURROUT) = NL START
                                        ! COMMENT AFTER REPEAT+NL
                         LOOP FLAG = 1
                         LINE BASE = LINE BASE-1 C
                            UNTIL BYTEINTEGER(LINE BASE) = NL
                         SIZE = CURROUT-LINE BASE
                      FINISH
                      CURROUT = CURROUT-2;  SIZE = SIZE-2
                                        ! TO REMOVE SPACES AFTER SEMI'S
                      IF EXTEND COMMENTS # 0 AND CSTART < SIZE START
                         P = CSTART;    ! REMEMBER IT JUST IN CASE
                         N = EXT NUM;   ! NUMBER OF EXTENSION TRIES

                         CYCLE
                            EXIT IF N <= 0
                            CSTART = CSTART+COMMENT EXTENSION
                            EXIT IF CSTART >= SIZE
                            N = N-1
                         REPEAT

                         CSTART = P IF N <= 0 C
                            OR CS+CSTART > COMMENT LINE
! RESTORE IT IF TOO LONG
                      FINISH
                      IF CSTART < SIZE START
                         IF CMODE # 0 THEN CSTART = 0 ELSE BREAK
                      FINISH ELSE START
                         D = COMMENT LINE-CSTART-CS
                         IF D < 0 AND BREAK COMMENTS = 0 START
                            CSTART = LINE SIZE-CS
                            BREAK
                            D = 0
                         FINISH
                      FINISH
                   FINISH ELSE START
                      D = COMMENT LINE-CSTART-CS
                      IF D < 0 AND BREAKCOMMENTS = 0 THEN START
                         CSTART = COMMENT LINE-CS
                         D = 0
                      FINISH
                   FINISH

                   CYCLE
                      N = CSTART-SIZE

                      WHILE N > 0 CYCLE
                         N = N-1;  CURROUT = CURROUT+1
                         BYTEINTEGER(CURROUT) = ' '
                      REPEAT

                      CURROUT = CURROUT+1
                      BYTEINTEGER(CURROUT) = '!'
                      CURROUT = CURROUT+1 C
                         AND BYTEINTEGER(CURROUT) = '*' C
                         IF STATUS&32 # 0
                      P = J
                      IF D < 0 START
                         P = J+D
                         P = P-1 WHILE BYTEINTEGER(P) # ' ' C
                            AND BYTEINTEGER(P) # ',' C
                            AND BYTEINTEGER(P) # '.' AND P > CURRIN
                         P = P-1
                         P = J+D IF P = CURRIN
                      FINISH

                      CYCLE K = CURRIN+1,1,P
                         CURROUT = CURROUT+1
                         BYTEINTEGER(CURROUT) = BYTEINTEGER(K)
                      REPEAT

                      CURRIN = P
                      EXIT IF D >= 0
                      CURROUT = CURROUT+1
                      BYTEINTEGER(CURROUT) = NL
                      SIZE = 0;  D = LINE LENGTH-MARGIN+D
                   REPEAT

                   BYTEINTEGER(CURROUT) = NL
                   IF LOOP FLAG # 0 START
                      LOOP FLAG = 0
                      CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = NL
                   FINISH
                   SIZE = 0;  LINE BASE = CURROUT;  LAST SEP = NL
                                        !   END OF COMMENT HANDLING
                FINISH ELSE START
                   N = 0
                   IF STATUS&64 # 0 START
                      N = DELTA MARGIN
                      N = MARGIN IF EXTRA MARGIN # 0
                   FINISH
                   STAT = STAT-N
                   CURROUT = CURROUT+1 C
                      AND BYTEINTEGER(CURROUT) = ' ' C
                      WHILE CURROUT < STAT
                   LIMIT = CURROUT+LINELENGTH-MARGIN+N C
                      IF LAST SEP # ';'

                   CYCLE
                      RP = RP+1;  N = REC(RP);  EXIT IF N = 0
                      IF N > 0 THEN START
                         SN = KEYWORD(N)+KEYBASE
                         FLAG = KFLAGS(N)
                         Z = SFLAGS(N)
                         SLENGTH = BYTEINTEGER(SN)
                      FINISH ELSE START
                         SN = STRINGS(N)
                         FLAG = 0;  Z = 0
                         SLENGTH = TLENGTH(N)
                      FINISH
                      IF RP >= RPLIM C
                         OR (SLENGTH+CURROUT > LIMIT C
                         AND N <= LAST TEXT) THEN CONTINUE
                      IF Z # 0 START
                         NEST(Z) = CURROUT-LINE BASE
                         REM(Z) = RP
                      FINISH
                      SPACE IF FLAG&OPTIONS&15 # 0 C
                         OR (PMODE!!FLAG)&128 = 0
                      PERCENT IF FLAG&PMODE # 0
!*                   %CYCLE J=SN+1, 1, SN+BYTEINTEGER(SN)
!*                      CURROUT=CURROUT+1
!*                           BYTEINTEGER(CURROUT)=BYTEINTEGER(J)
!*                   %REPEAT
                      *L_1,SN
                      *L_2,CURROUT
                      *SLR_3,3
                      *IC_3,0(1)
                      *EX_3,MOVEX
                      *AR_2,3
                      *ST_2,CURROUT
                      SPACE IF FLAG&OPTIONS&120 # 0
                      PMODE = 128 UNLESS 0 < N <= LAST TEXT
                   REPEAT

                   -> OWNS IF OWNFLAG = 0
                   CURROUT = CURROUT+1
                   BYTEINTEGER(CURROUT) = THIS SEP
                   LAST SEP = THIS SEP
                   IF LOOP FLAG # 0 AND STATUS&2 # 0 START
                      CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = NL
                   FINISH
                   IF STATUS&1 # 0 THEN START
                                        !    UP
                      LEVEL = LEVEL<<1
                      LEVEL = LEVEL!1 IF STATUS&128 # 0
                      MLIMIT = MLIMIT<<1
                      MLIMIT = MLIMIT!1 C
                         IF MARGIN >= MAX MARGIN OR ( C
                         INDENT BLOCKS = 0 AND STATUS&128 # 0)
                      IF MARGIN = 0 AND EXTRA MARGIN # 0 C
                         THEN MARGIN = INITIAL MARGIN ELSE START
                         MARGIN = MARGIN+DELTA MARGIN IF MLIMIT&1 = 0
                      FINISH
                   FINISH
                   IF LAST SEP = ';' THEN START
                      BYTEINTEGER(CURROUT+1) = ' '
                      CURROUT = CURROUT+2
                      BYTEINTEGER(CURROUT) = ' '
                   FINISH ELSE LINE BASE = CURROUT
                   EXIT IF CURRIN >= ENDOFFILE OR STATUS&7 = 7
                FINISH
             FINISH
          REPEAT

          CLOSE FILES
          RETURN

ROUTINE SPACE
             IF ' ' # BYTEINTEGER(CURROUT) # NL C
                AND BYTEINTEGER(CURROUT) # '(' THEN START
                CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = ' '
                PMODE = 128
             FINISH
END

ROUTINE PERCENT
             IF PMODE # 0 THEN START
                IF ' ' # BYTEINTEGER(CURROUT) # NL C
                   AND BYTEINTEGER(CURROUT) # '(' THEN START
                   CURROUT = CURROUT+1;  BYTEINTEGER(CURROUT) = ' '
                FINISH
                CURROUT = CURROUT+1
                BYTEINTEGER(CURROUT) = '%'
                PMODE = 0
             FINISH
END
END

ROUTINE CONNEKT(STRING (17) FILE, INTEGERNAME MODE, FLAG)
INTEGER J
          J = 0
          FDP(CONNEKTEP,FILE,MODE,ADDR(J),FLAG)
          MODE = J
          FLAG = 0 IF FLAG = 5
END

INTEGERFN PARSE(INTEGER ENTRY)
SHORTROUTINE
INTEGER SS, SP, TRP, TPT, L
BYTEINTEGER MODES

INTEGERFN PUT
             SPT = SPT-1
             RP = RP+1
             REC(RP) = SPT
             TLENGTH(SPT) = SLENGTH
             STRINGS(SPT) = SAD
             STRING(SAD) = ST
             SAD = SAD+1+BYTEINTEGER(ADDR(ST))
             RESULT = SPT
END

ROUTINE SYM

             CYCLE
                CURRIN = CURRIN+1;  S = BYTEINTEGER(CURRIN)
                MODE = 0 UNLESS 'A' <= S <= 'Z'
                IF S = '%' THEN MODE = 32 ELSE START
                   IF S # ' ' THEN START
                      S = S+MODE
                      RETURN IF S # 'C'+32 C
                         OR BYTEINTEGER(CURRIN+1) # NL
                      CURRIN = CURRIN+1
                      MODE = 0
                   FINISH
                   SPACES = PACK NAMES
                FINISH
             REPEAT

END

INTEGERFN CONSTANT
INTEGER T, LIM
INTEGER CS
             SLENGTH = 0
             ST = ''
             SYM
             CS = CURRIN AND ST = ST.TOSTRING(S) AND SYM C
                WHILE '0' <= S <= '9' OR S = '.' OR S = '@'
             CURRIN = CS AND RESULT = PUT IF ST # ''
             IF S = 'M' OR S = 'X' OR S = 'B' THEN START
                ST = TOSTRING(S)
                T = CURRIN
                SYM
                CURRIN = T AND RESULT = 0 IF S # ''''
             FINISH
             LIM = CURRIN+255

             WHILE S = '''' CYCLE

                UNTIL S = '''' OR CURRIN > LIM CYCLE
                   SLENGTH = BYTEINTEGER(ADDR(ST)) C
                      IF S = NL AND SLENGTH = 0
                   ST = ST.TOSTRING(S)
                   CURRIN = CURRIN+1
                   S = BYTEINTEGER(CURRIN)
                REPEAT

                ST = ST.''''
                CS = CURRIN
                SYM
             REPEAT

             SLENGTH = BYTEINTEGER(ADDR(ST)) IF SLENGTH = 0
             CURRIN = CS AND RESULT = PUT IF ST # ''
             RESULT = 0
END

INTEGERFN NAME
INTEGER Z
             SYM
             RESULT = 0 UNLESS 'A' <= S <= 'Z'
             ST = ''

             CYCLE
                SPACES = 1
                ST = ST.TOSTRING(S)
                Z = CURRIN
                SYM
                SLENGTH = BYTEINTEGER(ADDR(ST)) AND CURRIN = Z C
                   AND RESULT = PUT C
                   UNLESS 'A' <= S <= 'Z' OR '0' <= S <= '9'
                ST = ST.' ' IF SPACES = 0
             REPEAT

END
SWITCH BIP(0 : 15)
                                        !
          TRP = RP
          TPT = CURRIN
          MODES = MODE
FAILURE:
          RP = TRP
          CURRIN = TPT
          MODE = MODES
          ENTRY = ENTRY+1
          SP = MAIN(ENTRY)
          RESULT = 1 IF SP = 0
SUCCESS:
          SP = SP+1
          SS = SUB(SP)
          RESULT = 0 IF S S = 0
          -> BIP(SS>>12&15)
BIP(1):                                 !    SUB-PHRASE
          -> SUCCESS IF PARSE(SS&X'FFF') = 0
          -> FAILURE
BIP(0):                                 !    LITERAL
          SS = SS&X'FFF'
          L = LITERAL(SS);              ! LENGTH

          CYCLE SS = SS+1,1,SS+L
             SYM
             -> FAILURE UNLESS S = LITERAL(SS)
          REPEAT

          -> SUCCESS
BIP(15):                                !    (NAME)
          -> SUCCESS IF NAME # 0
          -> FAILURE
BIP(3):                                 !    CONSTANT
          -> SUCCESS IF CONSTANT # 0
          -> FAILURE
BIP(4):                                 ! (*LOOP)
          LOOP FLAG = 1 IF ISOLATE LOOPS # 0
          -> SUCCESS
BIP(5):                                 !    (UP)
          STATUS = STATUS!1;  -> SUCCESS
BIP(6):                                 !    (DOWN)
          STATUS = STATUS!2;  -> SUCCESS
BIP(7):                                 !    (END)
          STATUS = STATUS!4;  -> SUCCESS
BIP(8):                                 !    (OWN)
          -> FAILURE IF LEAVE OWNS # 0 C
             AND BYTEINTEGER(CURRIN) # '*'
! MACHINE CODE
          OWN FLAG = 0
          RP = RP+1;  REC(RP) = 0
                                        !    TO FIDDLE THE END OF STAT.
          THIS SEP = NL
          -> SUCCESS
BIP(10):                                !    (SPECIAL COMMENT)
          INBASE = INBASE+1;            ! TO SET DISP PROPERLY
          STATUS = STATUS!32
BIP(9):                                 !     (COMMENT)
          STATUS = STATUS!16
          RP = RP+1;  REC(RP) = CURRIN-INBASE-1
          -> SUCCESS
BIP(11):                                !    (*DEC)
          STATUS = STATUS!64 IF DECS RELATIVE # 0;  -> SUCCESS
BIP(12):                                !     (*BLOCK)
          STATUS = STATUS!64 IF EXTRA MARGIN # 0
          STATUS = STATUS!128;  -> SUCCESS
BIP(13):                                !     (*NULL)
          STATUS = STATUS!8;  -> SUCCESS
BIP(14):                                !    (S)
          SYM
          -> FAILURE UNLESS S = NL OR S = ';'
          THIS SEP = S
          THISSEP = NL IF SPLIT STATS # 0
          RP = RP+1
          REC(RP) = 0
          -> SUCCESS
BIP(2):                                 !    <>
          RP = RP+1
          REC(RP) = SS&X'FFF'
          -> SUCCESS
END

ROUTINE CREATE(STRING (8) FILE, INTEGERNAME SIZE, FLAG)
          FDP(CREATEEP,FILE,SIZE,0,FLAG)
          SIZE = 3
          IF FLAG = 0 OR FLAG = 3 THEN CONNEKT(FILE,SIZE,FLAG)
END

ROUTINE COMPRESS(STRING (8) FILE)
INTEGER P, F, S, W, X, Y, Z
          FDP(READEP,FILE,0,ADDR(P),F)
          IF F # 0 THEN RETURN
          FDP(INFOEP,FILE,ADDR(W),0,F)
          S = INTEGER(P);               !    SIZE OF FILE
          S = (S+4095)>>12
          FDP(CHANGEEP,FILE,S-X,ADDR(S),F)
END

ROUTINE SET UP FILES(STRINGNAME S)
SHORTROUTINE
INTEGER FLAG, SIZE
          OK = 0
          INPUT = ''
          OUTPUT = ''
          OPTION FILE = ''
          INPUT = S UNLESS S -> INPUT.('/').OUTPUT
          OPTION FILE = '' UNLESS INPUT -> INPUT.(',').OPTION FILE
          OUTPUT = INPUT IF OUTPUT = ''
          SIZE = 0
           FDP(7, INPUT, 0, ADDR(SIZE), FLAG)
          CURRIN = SIZE
          IF FLAG # 0 THEN START
             PRINTSTRING('CANNOT CONNECT '.INPUT);  WRITE(FLAG,1)
             NEWLINE
             RETURN
          FINISH
          IF INTEGER(CURRIN+12) # 0 THEN START
             PRINTSTRING(INPUT.' IS NOT A SOURCE FILE
')
             RETURN
          FINISH
          SIZE = INTEGER(CURRIN)
          IF SIZE < 10 THEN START
             PRINTSTRING(INPUT.' IS A NULL FILE
')
             RETURN
          FINISH
          ENDOFFILE = CURRIN+SIZE
          ENDOFFILE = ENDOFFILE-1 WHILE BYTEINTEGER(ENDOFFILE) # NL
          CURROUT = ((SIZE*6)+4095)>>12;!    I HOPE IT'S BIG ENOUGH
          SEGS = (CURROUT+15)>>4
          CREATE('SP#WORK',CURROUT,FLAG)
          IF FLAG # 0 THEN START
             PRINTTEXT 'CANNOT CREATE WORK FILE';  WRITE(FLAG,1)
             NEWLINE
             RETURN
          FINISH
          HEADER = CURROUT
          CURROUT = CURROUT+16
          BYTEINTEGER(CURROUT) = NL
          CURRIN = CURRIN+15
          INTEGER(HEADER) = 1<<16;      !    JUST FOR TESTING
          INTEGER(HEADER+4) = 16
          INTEGER(HEADER+8) = SEGS
          INTEGER(HEADER+12) = 0
          OK = 1
END

ROUTINE CLOSE FILES
   ROUTINE NEWGENS
   RECORDFORMAT RFM(INTEGER X, Y, Z, REPLY)
   RECORDFORMAT NFM( C
         SHORTINTEGER DSNO, DACT, SSNO, SACT, X1, X2, FLAG,  C
         STRING (8) OLD FILE, NEW FILE, LONGREAL DUMMY)
RECORD P(NFM)
   RECORDNAME R(RFM)
   INTEGER FLAG
      FDP(2,'SP#WORK',0,0,FLAG);       ! DISCON. WORK FILE
      R == P;                           ! FOR REPLIES

      CYCLE
         P = 0;                         ! CLEAR THE RECORD
         P_DSNO = 164
         P_OLD FILE = 'SP#WORK';       ! OLF FILE NAME
         P_NEW FILE = OUTPUT;              ! NEW FILE NAME
!        SVC(P);                        ! CALL THE SERVICE
          **1,@P;!  ADDRESS OF P TO R1
          *LD_0,0(1)
          *LD_2,8(1)
          *LD_4,16(1)
          *LD_6,24(1)
          *SVC_254
          **1,@P
          *STD_0,0(1)
          *STD_2,8(1)
          *STD_4,16(1)
          *STD_6,24(1)
!
         EXIT UNLESS R_REPLY = 6 AND FLAG = 0;    ! FILE2 STILL CONNECTED
         FDP(2,OUTPUT,0,0,FLAG)
         FLAG = 1
      REPEAT

      IF R_REPLY = 5 START;             ! FILE2 DOES NOT EXIST
         R_REPLY = 0
         RENAME('SP#WORK,'.OUTPUT)
      FINISH
      IF R_REPLY # 0 START
         PRINTSTRING('RENAME SP#WORK FAILS ')
         WRITE(R_REPLY,1)
         NEWLINE
      FINISH ELSE CHERISH(OUTPUT);         ! CHERISH OUTPUT FILE
      FDP(2,INPUT,0,0,FLAG);               ! DISCONNECT INPUT FILE
   END
          BYTEINTEGER(CURROUT) = NL
          INTEGER(HEADER) = CURROUT-HEADER+1
          INTEGER(HEADER+4) = 16
          INTEGER(HEADER+8) = SEGS
          INTEGER(HEADER+12) = 0
          IF CHARNO(OUTPUT,1) = '.' THEN START
             IF OUTPUT = '.TT' THEN START
                LIST('SP#WORK,.TT')
                DESTROY('SP#WORK')
             FINISH ELSE SEND('SP#WORK,'.OUTPUT)
          FINISH ELSE START
             COMPRESS('SP#WORK')
NEWGENS
          FINISH
          PRINTCH(7);  NEWLINE
END

ROUTINE SET OPTIONS
SHORTROUTINE
STRING (255) S, T
INTEGER J
BYTEINTEGER OPT FLAG
BYTEINTEGERARRAYFORMAT FM(1 : 31)
BYTEINTEGERARRAYNAME WORD

ROUTINE LINE(STRINGNAME S)
INTEGER J
             RETURN IF OPT FLAG = 0
             S = ''

             UNTIL S # '' CYCLE

                CYCLE
                   READSYMBOL(J) UNTIL J # ' '
                   EXIT IF J = NL
                   S = S.TOSTRING(J)
                REPEAT

             REPEAT

END

ROUTINE SET(STRINGNAME S)
STRING (255) N, OPT
INTEGER V, K, C, NUM
BYTEINTEGER NOT
CONSTSTRING (2) ARRAY PARAM(1 : 31) =          C
'IB', 'LB', 'SB', 'TB', 'SK', 'PN', 'SS', 'CN', 'BC',
'LS','JA', 'LR', 'SC',
'DR', 'SL', 'SE', 'IL', 'EM',
'LO', 'CR', 'EC',
  'MI', 'LL', 'CT', 'ML',
'CE',  'XN',  'IM', 'SM',
'CL', 'LC'
OWNINTEGER PARAMS = 31, BOOLS = 21
             OPT = S
             NOT = 1;  NUM = 0
             IF S -> S.('=').N THEN START
                NUM = -1;  V = 0;  J = ADDR(N)

                CYCLE J = J+1,1,J+LENGTH(N)
                   C = BYTEINTEGER(J)-'0'
                   UNLESS 0 <= C <= 9 THEN START
                      PRINTSTRING(N.' ?
')
                      RETURN
                   FINISH
                   V = V*10+C
                REPEAT

                IF V > 255 THEN START
                   PRINTSTRING(N.' ?
')
                   RETURN
                FINISH
             FINISH
             NOT = 0 IF NUM = 0 AND S -> ('¬').S

             CYCLE J = 1,1,PARAMS
                IF PARAM(J) = S THEN START
                   IF (BOOLS-J)!!NUM < 0 THEN START
                      PRINTSTRING(S.'= ?
')
                      RETURN
                   FINISH
                   K = NOT;  K = V IF NUM < 0
                   WORD(J) = K
                   OPLIST = OPLIST.' '.OPT
                   RETURN
                FINISH
             REPEAT

             PRINTSTRING(S.' ?
')
END
          OPLIST = '
!! OPTIONS:'
          WORD == ARRAY(ADDR(ISOLATE BRACKETS),FM)
          OK = 1
          IF OPTIONFILE # '' THEN START
             OK = 0
             OPT FLAG = 0
             IF OPTIONFILE -> ('[').S THEN START
                OPT FLAG = 0 IF S -> S.(']')
                S = S.',*'
             FINISH ELSE START
                OPT FLAG = 1
                PROMPT('OPTIONS:')
                DEFINE('ST76,'.OPTION FILE)
                SELECTINPUT(76)
             FINISH

             CYCLE
                LINE(S)
                SET(T) WHILE S -> T.(',').S
                EXIT IF S = '*'
                SET(S)
             REPEAT

             IF CHARNO(OUTPUT,1) = '.' START
                                        ! SHOW OPTIONS
                STRING(CURROUT) = OPLIST.'

'
                BYTEINTEGER(CURROUT) = NL
                CURROUT = CURROUT+LENGTH(OPLIST)+2
             FINISH
          FINISH
          DELTA MARGIN = MI
          LINE LENGTH = LL
          COMMENT TAB = CT
          MAXMARGIN = ML
          SEC MARGIN = SECONDARY MARGIN
          UNLESS 40 < LINELENGTH < 133 THEN START
             PRINTTEXT 'INVALID LINE LENGTH
'
             RETURN
          FINISH
          UNLESS 0 < COMMENT TAB < LINE LENGTH-20 THEN START
             PRINTTEXT 'INVALID COMMENT MARGIN
'
             RETURN
          FINISH
          UNLESS MAX MARGIN < LINE LENGTH-20 THEN START
             PRINTTEXT 'INVALID MAX MARGIN
'
             RETURN
          FINISH
          UNLESS DELTA MARGIN <= MAX MARGIN<<1 START
             PRINTTEXT 'INVALID MARGIN INCREMENT
'
             RETURN
          FINISH
          IF SEC MARGIN > DELTA MARGIN<<1+SAFETY FACTOR START
             PRINTTEXT 'INVALID SECONDARY MARGIN
'
             RETURN
          FINISH
          IF INITIAL MARGIN > 30 THEN START
             PRINTTEXT 'INVALID INITIAL MARGIN
'
             RETURN
          FINISH
          MARGIN = 1 IF DELTA MARGIN = 0 AND SEC MARGIN = 0 C
             AND INITIAL MARGIN = 0
          MARGIN = INITIAL MARGIN IF EXTRA MARGIN # 0
          SPLIT CONDS = 1 IF SPLIT KEYWORDS # 0
          COMMENT LENGTH = LINE LENGTH-COMMENT TAB
          TEXTBASE = ADDR(SYMFILE(0))
          KEYBASE = ADDR(KEYSYMS(1))
          RMARGIN = COMMENT LIMIT
          FULL LINE = LINE LENGTH
          LINE LENGTH = LINE LENGTH-SAFETY FACTOR
          OPTIONS = 17*SPLIT KEYWORDS+34*SPLIT CONDS+SPACE LISTS<<6 C
             +ISOLATE BRACKETS<<2+SPACE EQUALS<<3+128
          LINE BASE = CURROUT;  SIZE = 0
          COMMENT FLAG = JUSTIFY ALL<<1!COMMENTSNORMAL
          COMMENT FLAG = COMMENT FLAG!!B'010'
          FIRST DISP = DELTA MARGIN-INITIAL MARGIN
          COMMENT LINE = FULL LINE IF COMMENT LINE = 0
          OK = 1
END
ENDOFFILE