                  LC Cross-compiler  06/01/81

   1 C0000 D0000 program "ecce_"
   2 C0000 D0000 
   3 C0000 D0000 {Implementation of Edinburgh Compatible Context Editor
                   in LC for Intel 8086 by Rainer Thonnes, December 1980
                   based on that
                   in IMP for DEC PDP9/15 by Hamish Dewar, June 1970}
   7 C0000 D0000 
   8 C0000 D0000 const min=1 mout=1 sin=2 stop=-5000
   9 C0000 D0000 word in=min
  10 C0000 D0002 word mon=0
  11 C0000 D0004 word case=95
  12 C0000 D0006 word print1=0
  13 C0000 D0008 word print2=0
  14 C0000 D000A const sextra=122
  15 C0000 D000A word pp1 sym
  16 C0000 D000E word code text num
  17 C0000 D0014 const cbase=1 tbase=120
  18 C0000 D0014 word ci ti
  19 C0000 D0018 word cmax=0
  20 C0000 D001A word c(cbase:tbase)
  21 C0000 D010A word stored(1:192)=0(192)
  22 C0000 D028A word pos1=0
  23 C0000 D028C word pos2=0
  24 C0000 D028E word pos3=0
  25 C0000 D0290 const bufmax=10000
  26 C0000 D0290 word top=1
  27 C0000 D0292 word bot=bufmax-sextra
  28 C0000 D0294 byte a(0:bufmax)
  29 C0000 D29A5 word lbeg pp
  30 C0000 D29A9 word fp=0
  31 C0000 D29AB word lend=0
  32 C0000 D29AD word fend=0
  33 C0000 D29AF word ms=0
  34 C0000 D29B1 word ml=0
  35 C0000 D29B3 word type chain
  36 C0000 D29B7 word pend=0
  37 C0000 D29B9 word mfp=0
  38 C0000 D29BB word mlend=0
  39 C0000 D29BD word mend=0
  40 C0000 D29BF word sfp=0
  41 C0000 D29C1 word send=0
  42 C0000 D29C3 byte symtype(33:95)=
  43 C0000 D29C3      64   3   3   3   2   3   3  11   9  64   3  12   2   3   3
  44 C0000 D29D2   0   0   0   0   0   0   0   0   0   0   3   1   3   3   3  64
  45 C0000 D29E2   3  18  10  26   5   8  52  10   2   6  10  10 122  56   2   2
  46 C0000 D29F2  10  50  10  22   5 117   6   2  32  32  32   3  10   3   3   3
  47 C0000 D2A02 {     !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /
                    0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?
                    @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
                    P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _
                  Special classes
                  0 Normal
                  1 %A,%C,%S
                  2 %X,%Y,%Z
                  3 %M,%F,%Q
                  4 ! * ?
                  5 unused
                  6 unused
                  7 %L,%U
                  Normal classes
                  0 Digits 0:9
                  1 NL and ;
                  2 Illegals %,-,A,H,N,O,Q,W
                  3 delimiters "#$&'+./<>=@[]^_
                  4 F
                  5 D,T,U
                  6 I,S,V
                  7 unused
                  8 E,M
                  9 )
                  10 B,C,G,J,K,L,P,R,\
                  11 (
                  12 ,
                  13 unused
                  14 unused
                  15 unused}
  77 C0000 D2A02 
  78 C0000 D2A02 spec psym "printsymbol"
  79 C0000 D2A06 spec rsym "readsymbol"
  80 C0000 D2A0A spec selin "selectinput"
  81 C0000 D2A0E spec selout "selectoutput"
  82 C0000 D2A12 spec rout "resetoutput"
  83 C0000 D2A16 spec signal "signal"
  84 C0000 D2A1A spec trap "trap"
  85 C0000 D2A1E spec xprompt "XPrompt"
  86 C0000 D2A22 spec phex "PHex"
  87 C0000 D2A26 const nl=10
  88 C0000 D2A26 
  89 C0000 D2A26 proc main "ecce."
  90 C000C D2A26 spec ecce "ecce"
  91 C000C D2A2A   selout 0; psym 'E'; psym 'C'; psym 'C'; psym 'E'
  92 C0034 D2A2A   psym ' '; psym '0'; psym '6'; psym '/'; psym '0'
  93 C005C D2A2A   psym '1'; psym '/'; psym '8'; psym '1'; psym nl
  94 C0084 D2A2A   ecce
  95 C0088 D2A2A end
  96 C008D D2A2A 
  97 C008D D2A2A proc mainfp
  98 C0094 D2A2A   return fp if in=min
  99 C00A6 D2A2A   return mfp
 100 C00AF D2A2A end
 101 C00AF D2A2A 
 102 C00AF D2A2A proc readsym
 103 C00B6 D2A2A   if pend#0
 104 C00C2 D2A2A     sym=pend; pend=0
 105 C00D1 D2A2A   else
 106 C00D4 D2A2A     cycle
 107 C00D4 D2A2A       if pos3=0
 108 C00E0 D2A2A         sym=rsym; return
 109 C00ED D2A2A       finish
 110 C00ED D2A2A       sym=stored(pos3); pos3=pos3+1
 111 C0108 D2A2A       return if sym#0
 112 C0116 D2A2A       pos3=pos2; pos2=pos1; pos1=0
 113 C012D D2A2A     repeat
 114 C0130 D2A2A   finish
 115 C0130 D2A2A end
 116 C0135 D2A2A 
 117 C0135 D2A2A proc readitem
 118 C013C D2A2A   cycle
 119 C013C D2A2A     type=1
 120 C0143 D2A2A     cycle
 121 C0143 D2A2A       readsym
 122 C0147 D2A2A     repeat if sym=' '
 123 C0153 D2A2A     return if sym<' '
 124 C0161 D2A2A     sym=sym-32 if sym>=96
 125 C0175 D2A2A     type=symtype(sym)
 126 C0185 D2A2A     return if type&15#0
 127 C0196 D2A2A     if type=32
 128 C01A2 D2A2A       pos1=pos2; pos2=pos3; pos3=sym-'X'<<6+1
 129 C01C4 D2A2A     finish
 130 C01C4 D2A2A   repeat if type=32
 131 C01D0 D2A2A   if type=0
 132 C01DC D2A2A     num=sym-'0'
 133 C01E7 D2A2A     cycle
 134 C01E7 D2A2A       readsym; pend=sym
 135 C01F3 D2A2A       return if sym<'0'
 136 C0201 D2A2A       return if sym>'9'
 137 C020F D2A2A       pend=0; num=num*10-'0'+sym
 138 C022A D2A2A     repeat
 139 C022D D2A2A   else
 140 C0230 D2A2A     type=0; num=0; return if sym='*'
 141 C024C D2A2A     num=stop+1;    return if sym='?'
 142 C0261 D2A2A     num=stop                {sym='!'}
 143 C0268 D2A2A   finish
 144 C0268 D2A2A end
 145 C026D D2A2A 
 146 C026D D2A2A proc unchain
 147 C0274 D2A2A   cycle
 148 C0274 D2A2A     text=chain; return if text=0
 149 C028A D2A2A     chain=c(text+1); c(text+1)=ci
 150 C02AE D2A2A   repeat if c(text)#'('
 151 C02C1 D2A2A end
 152 C02C6 D2A2A 
 153 C02C6 D2A2A proc stack v
 154 C02CD D2A2A   c(ci)=v; ci=ci+1
 155 C02E6 D2A2A end
 156 C02ED D2A2A 
 157 C02ED D2A2A proc readline
 158 C02F4 D2A2A word k
 159 C02F4 D2A2A   if fp#fend
 160 C0304 D2A2A     lend=fp
 161 C030C D2A2A     cycle
 162 C030C D2A2A       return if a(lend)=nl
 163 C0322 D2A2A       lend=lend+1
 164 C032D D2A2A     repeat
 165 C0330 D2A2A   finish
 166 C0330 D2A2A   selin in
 167 C0339 D2A2A   if trap 1<<9#0
 168 C0349 D2A2A     fp=bot; lend=fp; fend=lend; a(fp)=nl
 169 C036E D2A2A   else
 170 C0371 D2A2A     fp=bot-121
 171 C037C D2A2A     cycle
 172 C037C D2A2A       k=nl; k=rsym if fp#bot; a(fp)=k; fp=fp+1
 173 C03AB D2A2A     repeat if k#nl
 174 C03B6 D2A2A     fend=fp; lend=fend-1; fp=bot-121
 175 C03D4 D2A2A   finish
 176 C03D4 D2A2A   selin 0
 177 C03DC D2A2A   ms=0; print1=0; print2=0
 178 C03F1 D2A2A end
 179 C03F6 D2A2A 
 180 C03F6 D2A2A proc break
 181 C03FD D2A2A   a(pp)=nl; pp=pp+1; lbeg=pp
 182 C041D D2A2A end
 183 C0422 D2A2A 
 184 C0422 D2A2A proc leftstar
 185 C0429 D2A2A   cycle
 186 C0429 D2A2A     return if pp=lbeg
 187 C0438 D2A2A     fp=fp-1; pp=pp-1; a(fp)=a(pp)
 188 C0464 D2A2A   repeat
 189 C0467 D2A2A end
 190 C046C D2A2A 
 191 C046C D2A2A proc rightstar
 192 C0473 D2A2A   cycle
 193 C0473 D2A2A     return if fp=lend
 194 C0482 D2A2A     a(pp)=a(fp); pp=pp+1; fp=fp+1
 195 C04AE D2A2A   repeat
 196 C04B1 D2A2A end
 197 C04B6 D2A2A 
 198 C04B6 D2A2A proc makespace
 199 C04BD D2A2A word k p1 p2
 200 C04BD D2A2A   return if mainfp-pp>240
 201 C04D2 D2A2A   selout mout
 202 C04DA D2A2A   p1=top; p2=p1+lbeg>>1; p2=lbeg if code='C'
 203 C04FD D2A2A   signal 15 p1 p2 if p2=top
 204 C0516 D2A2A   cycle
 205 C0516 D2A2A     k=a(p1); psym k; p1=p1+1
 206 C0535 D2A2A     k=0 if p1<p2
 207 C0543 D2A2A   repeat if k#nl
 208 C054E D2A2A   selout 0
 209 C0556 D2A2A   lbeg=top+lbeg-p1; p2=pp; pp=top
 210 C0574 D2A2A   cycle
 211 C0574 D2A2A     return if p1=p2
 212 C0581 D2A2A     a(pp)=a(p1); pp=pp+1; p1=p1+1
 213 C05AA D2A2A   repeat
 214 C05AD D2A2A end
 215 C05B2 D2A2A 
 216 C05B2 D2A2A proc refresh
 217 C05B9 D2A2A   fp=fp+1; makespace; readline
 218 C05CC D2A2A end
 219 C05D1 D2A2A 
 220 C05D1 D2A2A proc printline
 221 C05D8 D2A2A word p
 222 C05D8 D2A2A   print1=lend; print2=fp+pp; p=lbeg
 223 C05F6 D2A2A   cycle
 224 C05F6 D2A2A     if p=pp
 225 C0602 D2A2A       if p#lbeg; if num=0; psym '^'; finish; finish
 226 C0622 D2A2A       p=fp
 227 C0629 D2A2A     finish
 228 C0629 D2A2A     if p=lend
 229 C0635 D2A2A       if p=fend
 230 C0641 D2A2A         psym '*'; psym '*'; psym 'E'; psym 'n'; psym 'd'; psym '*'; psym '*'
 231 C0679 D2A2A       finish
 232 C0679 D2A2A       psym nl; return
 233 C0686 D2A2A     finish
 234 C0686 D2A2A     psym a(p); p=p+1
 235 C069F D2A2A   repeat
 236 C06A2 D2A2A end
 237 C06A7 D2A2A 
 238 C06A7 D2A2A proc cased ch
 239 C06AE D2A2A   return ch if ch<'a'
 240 C06C0 D2A2A   return ch if ch>'z'
 241 C06D2 D2A2A   return ch&case
 242 C06E0 D2A2A end
 243 C06E0 D2A2A 
 244 C06E0 D2A2A proc matched  {used for F,U,T,D,V}
 245 C06E7 D2A2A word i j k l t1 fp1 lim
 246 C06E7 D2A2A   lim=c(ci-3)>>7
 247 C06FF D2A2A   t1=cased c(text)
 248 C0712 D2A2A   cycle
 249 C0712 D2A2A     pp1=pp; fp1=fp
 250 C0721 D2A2A     if fp#lend; cycle
 251 C072E D2A2A       k=a(fp)
 252 C073D D2A2A       if cased k=t1
 253 C074D D2A2A         if fp=ms
 254 C075A D2A2A           jump no if code='F'
 255 C0766 D2A2A           jump no if code='U'
 256 C0772 D2A2A         finish
 257 C0772 D2A2A         i=fp; j=text
 258 C0780 D2A2A         cycle
 259 C0780 D2A2A           i=i+1; j=j-1; l=cased c(j)
 260 C07A4 D2A2A           if l=0
 261 C07AF D2A2A             ms=fp; ml=i; return 1
 262 C07C6 D2A2A           finish
 263 C07C6 D2A2A         repeat if cased a(i)=l
 264 C07DE D2A2A       finish
 265 C07DE D2A2A       return 0 if code='V'
 266 C07EF D2A2A no:   a(pp)=k; pp=pp+1; fp=fp+1
 267 C0812 D2A2A     repeat if fp#lend; finish
 268 C081F D2A2A     return 0 if code='V'
 269 C0830 D2A2A     lim=lim-1; lim=0 if fp=fend
 270 C0849 D2A2A     if lim=0
 271 C0854 D2A2A       pp=pp1; fp=fp1; return 0
 272 C086B D2A2A     finish
 273 C086B D2A2A     if code='U'
 274 C0877 D2A2A       pp=pp1
 275 C087F D2A2A     else
 276 C0882 D2A2A       break
 277 C0886 D2A2A     finish
 278 C0886 D2A2A     refresh
 279 C088A D2A2A   repeat
 280 C088D D2A2A end
 281 C0892 D2A2A 
 282 C0892 D2A2A proc switchinputs
 283 C0899 D2A2A   if in=min
 284 C08A5 D2A2A     leftstar; in=sin
 285 C08B0 D2A2A     mfp=fp; mlend=lend; mend=fend
 286 C08C8 D2A2A     bot=bot+sextra; fp=sfp; fend=send
 287 C08E3 D2A2A     readline
 288 C08E7 D2A2A   else
 289 C08EA D2A2A     pp=lbeg; in=min
 290 C08F9 D2A2A     bot=bot-sextra; sfp=fp; send=fend; fp=mfp
 291 C091C D2A2A     lend=mlend; fend=mend
 292 C092C D2A2A   finish
 293 C092C D2A2A end
 294 C0931 D2A2A 
 295 C0931 D2A2A proc showpointers
 296 C0938 D2A2A   phex top; psym ' '; psym ' '
 297 C0951 D2A2A   phex lbeg; psym ' '; phex pp; psym ' '
 298 C0973 D2A2A   phex fp; psym ' '; phex lend; psym ' '
 299 C0995 D2A2A   psym ' '; phex fend; psym ' '
 300 C09AE D2A2A end
 301 C09B3 D2A2A 
 302 C09B3 D2A2A proc ecce "ecce"
 303 C09BF D2A2A word i j k
 304 C09BF D2A2A   jump eof if trap 1<<9#0
 305 C09D2 D2A2A   selout 0
 306 C09DA D2A2A   pp=top-1; break; readline
 307 C09ED D2A2A 
 308 C09ED D2A2A readco: xprompt 0; xprompt '>'; xprompt '>' if in=sin
 309 C0A0E D2A2A   cycle
 310 C0A0E D2A2A     ci=cbase; ti=tbase; chain=0
 311 C0A23 D2A2A     showpointers if mon>0
 312 C0A30 D2A2A     readitem
 313 C0A34 D2A2A   repeat if type=1
 314 C0A40 D2A2A   if type=0; if cmax#0
 315 C0A58 D2A2A     c(cmax+2)=num; readitem
 316 C0A6E D2A2A     jump er2 if type#1
 317 C0A7A D2A2A     jump execute
 318 C0A7D D2A2A   finish; finish
 319 C0A7D D2A2A   if sym='%'
 320 C0A89 D2A2A     readsym; sym=sym-32 if sym>=96; code=sym
 321 C0AA9 D2A2A     jump er5 if code<'A'; readitem
 322 C0AB9 D2A2A     i=symtype(code)>>4
 323 C0ACC D2A2A   else
 324 C0ACF D2A2A nextunit: i=type&15; jump er2 if i<4
 325 C0AE4 D2A2A     code=sym; text=0; num=1; readitem
 326 C0AFE D2A2A   finish
 327 C0AFE D2A2A   jump er5 if i=0
 328 C0B09 D2A2A   if i=1   {%c,s,a}
 329 C0B14 D2A2A     if code='A'
 330 C0B20 D2A2A       selout mout; rout; signal 0 0 0
 331 C0B3C D2A2A     finish
 332 C0B3C D2A2A     if code='S'
 333 C0B48 D2A2A       switchinputs; jump monitor
 334 C0B4F D2A2A     finish
 335 C0B4F D2A2A eof:code='C'
 336 C0B56 D2A2A     switchinputs if in=sin
 337 C0B63 D2A2A     cycle
 338 C0B63 D2A2A       rightstar
 339 C0B67 D2A2A       if fp=fend
 340 C0B74 D2A2A         selout mout
 341 C0B7C D2A2A         cycle
 342 C0B7C D2A2A           signal 0 0 0 if top=pp
 343 C0B96 D2A2A           psym a(top); top=top+1
 344 C0BB2 D2A2A         repeat
 345 C0BB5 D2A2A       finish
 346 C0BB5 D2A2A       break; refresh
 347 C0BBD D2A2A     repeat
 348 C0BC0 D2A2A   finish
 349 C0BC0 D2A2A   if i=2   {%x,y,z}
 350 C0BCB D2A2A     i=code-'X'<<6+1
 351 C0BDC D2A2A     if sym='='
 352 C0BE8 D2A2A       cycle
 353 C0BE8 D2A2A         readsym
 354 C0BEC D2A2A         if sym#nl
 355 C0BF8 D2A2A           stored(i)=sym
 356 C0C07 D2A2A           jump er6 if i&63=0
 357 C0C15 D2A2A           i=i+1
 358 C0C1E D2A2A         finish
 359 C0C1E D2A2A       repeat if sym#nl
 360 C0C2A D2A2A       stored(i)=0
 361 C0C38 D2A2A       jump readco
 362 C0C3B D2A2A     finish
 363 C0C3B D2A2A     cycle
 364 C0C3B D2A2A       sym=stored(i)
 365 C0C4A D2A2A       if sym=0
 366 C0C56 D2A2A         psym nl; jump readco
 367 C0C61 D2A2A       finish
 368 C0C61 D2A2A       psym sym; i=i+1
 369 C0C73 D2A2A     repeat
 370 C0C76 D2A2A   finish
 371 C0C76 D2A2A   if i=3   {%m,f,q}
 372 C0C81 D2A2A     mon='M'-code; jump readco
 373 C0C8F D2A2A   finish
 374 C0C8F D2A2A   if i=4   {f}
 375 C0C9A D2A2A     num=0 if type#0
 376 C0CAA D2A2A   finish
 377 C0CAA D2A2A   if i<=5   {+d,t,u}
 378 C0CB5 D2A2A     code=num<<7+code; num=1; readitem if type=0
 379 C0CD9 D2A2A   finish
 380 C0CD9 D2A2A   if i<=6   {+i,s,v}
 381 C0CE4 D2A2A     jump er4 if type#3; text=ti; i=sym
 382 C0CFF D2A2A     cycle
 383 C0CFF D2A2A       readsym
 384 C0D03 D2A2A       if sym=nl
 385 C0D0F D2A2A         pend=sym; i=sym
 386 C0D1E D2A2A       finish
 387 C0D1E D2A2A       if sym=i
 388 C0D2A D2A2A         if code#'I'; if code#'S'
 389 C0D42 D2A2A           jump er4 if sym=nl
 390 C0D4E D2A2A           jump er4 if ti=text
 391 C0D5B D2A2A         finish; finish
 392 C0D5B D2A2A         c(ti)=0; ti=ti-1; jump ri
 393 C0D77 D2A2A       finish
 394 C0D77 D2A2A       jump er6 if ti<=ci; c(ti)=sym; ti=ti-1
 395 C0D9E D2A2A     repeat
 396 C0DA1 D2A2A   finish
 397 C0DA1 D2A2A   if i=7   {%u,l}
 398 C0DAC D2A2A     case=95; case=127 if code='L'; jump readco
 399 C0DC6 D2A2A   finish
 400 C0DC6 D2A2A   if i=8   {m,e}
 401 C0DD1 D2A2A     jump nq if sym#'-'; code=code+10
 402 C0DE8 D2A2A ri: readitem; jump rn
 403 C0DEF D2A2A   finish
 404 C0DEF D2A2A   if i=9   {)}
 405 C0DFA D2A2A     unchain; jump er3 if text=0
 406 C0E0A D2A2A     c(text+2)=num; text=text+3
 407 C0E27 D2A2A   finish
 408 C0E27 D2A2A   if i<=10   {+g,k,etc}
 409 C0E32 D2A2A nq: jump er1 if type=3
 410 C0E3E D2A2A rn: readitem if type=0
 411 C0E4B D2A2A     jump put
 412 C0E4E D2A2A   finish
 413 C0E4E D2A2A   if i=12  {,}
 414 C0E59 D2A2A     readitem if type=1
 415 C0E66 D2A2A   finish
 416 C0E66 D2A2A   if i<=12  {+(}
 417 C0E71 D2A2A     text=chain; chain=ci; num=0
 418 C0E88 D2A2A   finish
 419 C0E88 D2A2A   signal 14 1 i if i>12
 420 C0EA0 D2A2A put: stack code; stack text; stack num
 421 C0EBB D2A2A   jump er6 if ci+4>=ti
 422 C0ECB D2A2A   jump nextunit if type#1
 423 C0ED7 D2A2A   unchain; jump er3 if text#0
 424 C0EE7 D2A2A   cmax=ci
 425 C0EEF D2A2A   stack ')'; stack cbase; stack 1
 426 C0F07 D2A2A   stack 0; jump execute
 427 C0F12 D2A2A er1: psym ' '; psym code
 428 C0F23 D2A2A er2: code=sym; jump er5
 429 C0F2E D2A2A er3: psym ' '; psym '('; psym ')'; jump er7
 430 C0F49 D2A2A er4: psym ' '; psym 'T'; psym 'e'; psym 'x'; psym 't'
 431 C0F71 D2A2A      psym ' '; psym 'f'; psym 'o'; psym 'r'
 432 C0F91 D2A2A er5: psym ' '; psym code&127; jump er7
 433 C0FA8 D2A2A er6: psym ' '; psym 'S'; psym 'i'; psym 'z'; psym 'e'
 434 C0FD0 D2A2A er7: psym '?'; psym nl
 435 C0FE0 D2A2A   cmax=0 if ci#cbase
 436 C0FF0 D2A2A   cycle
 437 C0FF0 D2A2A     jump readco if sym=nl; readsym
 438 C1000 D2A2A   repeat
 439 C1003 D2A2A 
 440 C1003 D2A2A execute:
 441 C1003 D2A2A   ci=cbase
 442 C100A D2A2A get: code=c(ci)&127; jump monitor if code=0
 443 C1028 D2A2A   text=c(ci+1); num=c(ci+2); ci=ci+3
 444 C1057 D2A2A rep: num=num-1
 445 C1062 D2A2A   jump xm if code='M'
 446 C106E D2A2A   jump xw if code='W'
 447 C107A D2A2A   jump xl if code='L'
 448 C1086 D2A2A   jump xr if code='R'
 449 C1092 D2A2A   jump xc if code='C'
 450 C109E D2A2A   jump xlb if code='('
 451 C10AA D2A2A   jump xcomma if code=','
 452 C10B6 D2A2A   jump xrb if code=')'
 453 C10C2 D2A2A   jump no if code='\'
 454 C10CE D2A2A   jump xj if code='J'
 455 C10DA D2A2A   jump xk if code='K'
 456 C10E6 D2A2A   jump xp if code='P'
 457 C10F2 D2A2A   jump xb if code='B'
 458 C10FE D2A2A   jump xg if code='G'
 459 C110A D2A2A   jump xi if code='I'
 460 C1116 D2A2A   jump xs if code='S'
 461 C1122 D2A2A   jump xt if code='T'
 462 C112E D2A2A   jump xd if code='D'
 463 C113A D2A2A   jump xu if code='U'
 464 C1146 D2A2A   jump xf if code='F'
 465 C1152 D2A2A   jump xv if code='V'
 466 C115E D2A2A   jump xo if code='O'
 467 C116A D2A2A   jump xe if code='E'
 468 C1176 D2A2A   signal 14 2 code
 469 C1187 D2A2A ok: jump get if num=0
 470 C1193 D2A2A     jump get if num=stop
 471 C119F D2A2A     jump rep
 472 C11A2 D2A2A no: jump get if num<0
 473 C11AE D2A2A   if c(ci)='\'
 474 C11C1 D2A2A     ci=ci+3; jump get
 475 C11CF D2A2A   finish
 476 C11CF D2A2A skp: i=c(ci); ci=c(ci+1) if i='('; ci=ci+3
 477 C1202 D2A2A   if i#','; if i#')'
 478 C1218 D2A2A     jump skp if i#0; jump xer
 479 C1226 D2A2A   finish; finish
 480 C1226 D2A2A   num=c(ci-1)-1; jump no
 481 C123E D2A2A xer: psym 'F'; psym 'a'; psym 'i'; psym 'l'; psym 'e'; psym 'd'
 482 C126E D2A2A   psym ' '
 483 C1276 D2A2A   if code='O'
 484 C1282 D2A2A     psym 'E'; code='-'
 485 C1291 D2A2A   else if code='W'
 486 C12A0 D2A2A     psym 'M'; code='-'
 487 C12AF D2A2A   finish
 488 C12AF D2A2A   psym code
 489 C12B8 D2A2A   if text#0
 490 C12C4 D2A2A     psym '"'
 491 C12CC D2A2A     cycle
 492 C12CC D2A2A       i=c(text); psym i if i#0; text=text-1
 493 C12F5 D2A2A     repeat if i#0
 494 C1300 D2A2A     psym '"'
 495 C1308 D2A2A   finish
 496 C1308 D2A2A   psym nl; print1=0
 497 C1317 D2A2A monitor:
 498 C1317 D2A2A   jump readco if sym#nl
 499 C1323 D2A2A   jump readco if mon<0
 500 C132F D2A2A   if print1=lend
 501 C133C D2A2A     jump readco if mon=0
 502 C1348 D2A2A     jump readco if print2=fp+pp
 503 C135F D2A2A   finish
 504 C135F D2A2A   num=0; printline
 505 C136A D2A2A   jump readco
 506 C136D D2A2A 
 507 C136D D2A2A xlb: c(text+2)=num+1; jump get
 508 C1385 D2A2A xrb: jump get if num=0
 509 C1391 D2A2A      jump get if num=stop
 510 C139D D2A2A      c(ci-1)=num
 511 C13AF D2A2A xcomma: ci=text; jump get
 512 C13BA D2A2A xc: jump no if fp=lend; i=a(fp)
 513 C13D6 D2A2A     if i&95>='A'; if i&95<='Z'
 514 C13F2 D2A2A       a(fp)=i\32
 515 C1402 D2A2A     finish; finish
 516 C1402 D2A2A xr: jump no if fp=lend
 517 C140F D2A2A     a(pp)=a(fp); pp=pp+1; fp=fp+1; jump ok
 518 C143E D2A2A xl: jump no if pp=lbeg
 519 C144B D2A2A     jump no if in=sin
 520 C1457 D2A2A     fp=fp-1; pp=pp-1; a(fp)=a(pp)
 521 C1483 D2A2A     ms=0; jump ok
 522 C148D D2A2A xe: jump no if fp=lend; fp=fp+1; jump ok
 523 C14A8 D2A2A xo: jump no if pp=lbeg; pp=pp-1; jump ok
 524 C14C3 D2A2A xv:xu:xd:xf:
 525 C14C3 D2A2A     jump no if matched=0
 526 C14CF D2A2A     if code='U'
 527 C14DB D2A2A       pp=pp1
 528 C14E3 D2A2A     else if code='D'
 529 C14F2 D2A2A       fp=ml
 530 C14FA D2A2A     finish
 531 C14FA D2A2A     jump ok
 532 C14FD D2A2A xt: jump no if matched=0
 533 C1509 D2A2A     cycle
 534 C1509 D2A2A       a(pp)=a(fp); pp=pp+1; fp=fp+1
 535 C1535 D2A2A     repeat if fp#ml
 536 C1542 D2A2A     jump ok
 537 C1545 D2A2A xs: jump no if fp#ms; fp=ml
 538 C155A D2A2A xi: makespace
 539 C155E D2A2A     jump no if pp-lbeg+lend-fp>80
 540 C1576 D2A2A   i=text
 541 C157D D2A2A   cycle
 542 C157D D2A2A     jump ok if c(i)=0
 543 C158F D2A2A     a(pp)=c(i); pp=pp+1; i=i-1
 544 C15B7 D2A2A   repeat
 545 C15BA D2A2A xg: xprompt 0; xprompt ':'
 546 C15CA D2A2A     makespace; i=rsym; jump no if i=':'; leftstar
 547 C15E4 D2A2A   if i#nl; cycle
 548 C15EF D2A2A     a(pp)=i; pp=pp+1; i=rsym
 549 C160E D2A2A   repeat if i#nl; finish
 550 C1619 D2A2A xb: break; jump ok
 551 C1620 D2A2A xp: printline; jump get if num=0
 552 C1630 D2A2A xm: rightstar; jump no if fp=fend; break
 553 C1645 D2A2A m1: refresh; jump ok
 554 C164C D2A2A xk: pp=lbeg; fp=lend
 555 C165C D2A2A k1: jump no if fp=fend; jump m1
 556 C166C D2A2A xj: rightstar; jump no if pp-lbeg>80; jump k1
 557 C1683 D2A2A xw: jump no if in=sin
 558 C168F D2A2A     makespace
 559 C1693 D2A2A   jump no if lbeg=top
 560 C16A0 D2A2A   lend=fp-pp+lbeg-1
 561 C16B3 D2A2A   cycle
 562 C16B3 D2A2A     k=a(pp-1)
 563 C16C5 D2A2A     if k=nl; if pp#lbeg
 564 C16DD D2A2A       lbeg=pp; ms=0; jump ok
 565 C16EF D2A2A     finish; finish
 566 C16EF D2A2A     fp=fp-1; pp=pp-1; a(fp)=k
 567 C1712 D2A2A   repeat
 568 C1715 D2A2A end {ecce}
 569 C171A D2A2A 
 570 C171A D2A2A end {file}

