summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc5.txt
blob: c51cd402581ac553e1a9ac95a37cdc998b35c844 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
Network Working Group                                           4691
RFC-5                                                           Jeff Rulifson
                                                                June 2, l969



                                DEL



:DEL, 02/06/69 1010:58   JFR   ;   .DSN=1; .LSP=0; ['=] AND NOT SP ; ['?];
dual transmission?

ABSTRACT

   The Decode-Encode Language (DEL) is a machine independent language
   tailored to two specific computer network tasks:

      accepting input codes from interactive consoles, giving immediate
      feedback, and packing the resulting information into message 
      packets for network transmissin.

      and accepting message packets from another computer, unpacking
      them, building trees of display information, and sending other
      information to the user at his interactive station.

   This is a working document for the evolution of the DEL language.
   Comments should be made through Jeff Rulifson at SRI.

FORWARD

   The initial ARPA network working group met at SRI on October 25-26,
   1968.

      It was generally agreed beforehand that the runmning of interactive
      programs across the network was the first problem that would be
      faced.

      This group, already in agreement about the underlaying notions of
      a DEL-like approach, set down some terminology, expectations for
      DEL programs, and lists of proposed semantic capability.

      At the meeting were Andrews, Baray, Carr, Crocker, Rulifson, and
      Stoughton.

   A second round of meetings was then held in a piecemeal way.

      Crocker meet with Rulifson at SRI on November 18, 1968.  This
      resulted in the incorporation of formal co-routines.

      and Stoughton meet with Rulifson at SRI on Decembeer 12, 1968.  It
      was decided to meet again, as a group, probably at UTAH, in late
      January 1969.

   The first public release of this paper was at the BBN NET meeting in
   Cambridge on February 13, 1969.

NET STANDARD TRANSLATORS        

   NST   The NST library is the set of programs necessary to mesh
   efficiently with the code compiled at the user sites from the DEL
   programs it receives.  The NST-DEL approach to NET interactive system
   communication is intended to operate over a broad spectrum.

   The lowest level of NST-DEL usage is direct transmission to the
   server-host, information in the same format that user programs
   would receive at the user-host.

      In this mode, the NST defaults to inaction.  The DEL program
      does not receive universal hardware representation input but 
      input in the normal fashion for the user-host.

      And the DEL 1 program becomes merely a message builder and
      sender.

   A more intermediate use of NST-DEL is to have echo tables for a
   TTY at the user-host.

      In this mode, the DEL program would run a full duplex TTY for
      the user.

      It would echo characters, translate them to the character set 
      of the server-host, pack the translated characters in messages,
      and on appropriate break characters send the messages.

      When messages come from the server-host, the DEL program would
      translate them to the user-host character set and print them on
      his TTY.

   A more ambitious task for DEL is the operation of large,
   display-oriented systems from remote consoles over the NET.

      Large interactive systems usually offer a lot of feedback to
      the user.  The unusual nature of the feedback make it
      impossible to model with echo table, and thus a user program
      must be activated in a TSS each time a button state is changed.

         This puts an unnecessarily large load on a TSS, and if the
         system is being run through the NET it could easily load two
         systems.

         To avoid this double overloading of TSS, a DEL program will
         run on the user-host.  It will handle all the immediate
         feedback, much like a complicated echo table.  At appropriate
         button pushes, message will be sent to the server-host and
         display updates received in return.

      One of the more difficult, and often neglected, problems is the
      effective simulation of one nonstandard console on another non-
      standard console.

         We attempt to offer a means of solving this problem through
         the co-routine structure of DEL programs.  For the
         complicated interactive systems, part of the DEL programs
         will be constructed by the server-host programmers.
         Interfaces between this program and the input stream may
         easily be inserted by programmers at the user-host site.


UNIVERSAL HARDWARE REPRESENTATION

   To minimize the number of translators needed to map any facility's
   user codes to any other facility, there is a universal hardware
   representation.

   This is simply a way of talking, in general terms, about all the
   hardware devices at all the interactive display stations in the initial
   network.

   For example, a display is thought of as being a square, the
   mid-point has coordinates (0.0), the range is -1 to 1 on both
   axes.  A point may now be specified to any accuracy, regardless of
   the particular number of density of rastor points on a display.

   The representation is discussed in the semantic explanations
   accompanying the formal description of DEL.

INTRODUCTION TO THE NETWORK STANDARD TRANSLATOR (NST)

   Suppose that a user at a remote site, say Utah, is entered in the
   AHI system and wants to run NLS.

   The first step is to enter NLS in the normal way.  At that time
   the Utah system will request a symbolic program from NLS.

      REP   This program is written in DEL.  It is called the NLS
      Remote Encode Program (REP).

      The program accepts input in the Universal Hardware
      Representation and translates it to a form usable by NLS.

      It may pack characters in a buffer, also do some local
      feedback.

   When the program is first received at Utah it is compiled and
   loaded to be run in conjunction with a standard library.

   All input from the Utah console first goes to the NLS NEP.  It is
   processed, parsed, blocked, translated, etc.  When NEP receives a
   character appropriate to its state it may finally initiate
   transfers to the 940.  The bits transferred are in a form
   acceptable to the 940, and maybe in a standard form so that the
   NLSW need not differentiate between Utah and other NET users.


ADVANTAGES OF NST

   After each node has implemented the library part of the NST, it
   need only write one program for each subsystem, namely the
   symbolic file it sends to each user that maps the NET hardware
   representation into its own special bit formats.

      This is the minimum programming that can be expected if 
      console is used to its fullest extent.

      Since the NST which runs the encode translation is coded at the
      user site, it can take advantage of hardware at its consoles to
      the fullest extent.  It can also add or remove hardware 
      features without requiring new or different translation tables
      from the host.

      Local users are also kept up to date on any changes in the system
      offered at the host site.  As new features are added,
      the host programmers change the symbolic encode program.  When
      this new program is compiled and used at the user site, the new
      features are automatically included.

   The advantages of having the encode translation programs
   transferred symbolically should be obvious.

      Each site can translate any way it sees fit.  Thus machine code
      for each site can be produced to fit that site; faster run
      times and greater code density will be the result.

      Moreover, extra symbolic programs, coded at the user site, may
      be easily interfaced between the user's monitor system and the
      DEL program from the host machine.  This should ease the
      problem of console extension (e.g. accommodating unusual keys and
      buttons) without loss of the flexibility needed for man-machine
      interaction.


   It is expected that when there is matching hardware, the symbolic
   programs will take this into account and avoid any unnecessary
   computing.  This is immediately possible through the code
   translation constructs of DEL.  It may someday be possible through
   program composition (when Crocker tells us how??)


AHI NLS - USER CONSOLE COMMUNICATION - AN EXAMPLE

   BLOCK DIAGRAM

      The right side of the picture represents functions done at the
      user's main computer; the left side represents those done at the
      host computer.

         Each label in the picture corresponds to a statement with the
         same name.

         There are four trails associated with this picture.  The first
         links (in a forward direction) the labels which are concerned
         only with network information.  The second links the total
         information flow (again in a forward direction).  The last two
         are equivalent to the first two but in a backward direction.
         They may be set with pointers t1 through t4 respectively.

         [">tif:] OR I" >nif"]; ["<tif:] OR ["<nif"];

USER-TO-HOST TRANSMISSION

   Keyboard is the set of input devices at the user's console.
   Input bits from stations, after drifting through levels of monitor
   and interrupt handlers, eventually come to the encode translator.
   [>nif(encode)]

   Encode maps the semi-raw input bits into an input stream in a
   form suited to the serving-host subsystem which will process the
   input.  [>nif(hrt)<nif(keyboard)]

      The Encode program was supplied by the server-host subsystem
      when the subsystem was first requested.  It is sent to the user
      machine in symbolic form and is compiled at the user machine
      into code particularly suited to that machine.

      It may pack to break characters, map multiple characters to
      single characters and vice versa, do character translation, and
      give immediate feedback to the user.

   1 dm    Immediate feedback from the encode translator first goes to
   local display management, where it is mapped from the NET standard
   to the local display hardware.

      A wide range of echo output may come from the encode
      translator.  Simple character echoes would be a minimum, while
      command and machine-state feedback will be common.

      It is reasonable to expect control and feedback functions not
      even done at the server-host user stations to be done in local
      display control.  For example, people with high-speed displays
      may want to selectively clear curves on a Culler display, a
      function which is impossible on a storage tube.

   Output from the encode translator for the server-host goes to the
   invisible IMP, is broken into appropriate sizes and labeled by the
   encode translator, and then goes to the NET-to-host translator.

      Output from the user may be more than on-line input.  It may be
      larger items such as computer-generated data, or files
      generated and used exclusively at the server-host site but
      stored at the user-host site.

      Information of this kind may avoid translation, if it is already in
      server-host format, or it may undergo yet another kind of translation
      if it is a block of data.

   hrp  It finally gets to the host, and must then go through the
   host reception program.  This maps and reorders the standard
   transmission-style packets of bits sent by the encode programs
   into messages acceptable to the host.  This program may well be
   part of the monitor of the host machine. [>tif(net mode)<nif(code)]


HOST-TO-USER TRANSMISSION

   decode   Output from the server-host initially goes through decode,
   a translation map similar to, and perhaps more complicated than,
   the encode map.  [>nif(urt)>tif(imp ctrl)<tif(net mode)]

      This map at least formats display output into a simplified
      logical-entity output stream, of which meaningful pieces may be
      dealt with in various ways at the user site.

         The Decode program was sent to the host machine at the same
         time that the Encode program was sent to the user machine.
         The program is initially in symbolic form and is compiled
         for efficient running at the host machine.
         
         Lines of charaters should be logically identified so that
         different line widths can be handled at the user site.

         Some form of logical line identification must also be made.
         For example, if a straight line is to be drawn across the
         display this fact should be transmitted, rather than a
         series of 500 short vectors.

         As things firm up, more and more complicated structural
         display information (in the manner of LEAP) should be sent
         and accommodated at user sites so that the responsibility for
         real-time display manipulation may shift closer to the user.

      imp ctrl   The server-host may also want to send control
      information to IMPs.  Formatting of this information is done by
      the host decoder.  [>tif(urt) <tif(decode)]

      The other control information supplied by the host decoder is
      message break up and identification so that proper assembly and
      sorting can be done at the user site.

   From the host decoder, information does to the invisible IMP, and
   directly to the NET-to-user translator.  The only operation done
   on the messages is that they may be shuffled.

   urt   The user reception translator accepts messages from the
   user-site IMP 1 and fixes them up for user-site display.  
   [>nif(d ctrl)>tif(prgm ctrl)<tif(imp ctrl)<nif(decode)]

      The minimal action is a reordering of the message pieces.
      
      dctrl   For display output, however, more needs to be done.  The
      NET logical display information must be put in the format of
      the user site.  Display control does this job.  Since it
      coordinates between (encode) and (decode) it is able to offer
      features of display management local to the user site.
      [>nif(display)<nif(urt)]

      prgmctrl   Another action may be the selective translation and
      routing of information to particular user-site subsystems.
      [>tif(dctrl)<tif(urt)]

         For example, blocks of floating-point information may be
         converted to user-style words and sent, in block form, to a
         subsystem for processing or storage.

         The styles and translation of this information may well be a 
         compact binary format suitable for quick translation, rather
         than a print-image-oriented format.

      (display)   is the output to the user.  [<nif(d ctrl)]

   
   USER-TO-HOST INDIRECT TRANSMISSION

      (net mode)   This is the mode where a remote user can link to a node
      indirectly through another node.   [<nif(decode)<tif(hrt)]


DEL SYNTAX

   NOTES FOR NLS USERS
  
      All statements in this branch which are not part of the compiler
      must end with a period.

      To compile the DEL compiler:

         Set this pattern for the content analyzer ( (symbol for up arrow)P1
         SE(P1) <-"-;). The pointer "del" is on the first character of pattern.

         Jump to the first statement of the compiler.  The pointer "c"
         is on this statement.

         And output the compiler to file  ( '/A-DEL' ).  The pointer "f"
         is on the name of the file for the compiler output -

   PROGRAMS

      SYNTAX

         -meta file (k=100.m=300,n=20,s=900)

         file = mesdecl $declaration $procedure "FINISH";

         procedure =

           procname (

              (

                 type "FUNCTION" /

                 "PROCEDURE" ) .id (type .id / -empty)) /

              "CO-ROUTINE") ' /

           $declaration labeledst $(labeledst ';) "endp.";

         labeledst = ((left arrow symbol).id ': / .empty) statement;

         type = "INTEGER" / "REAL" ;

         procname = .id;

      Functions are differentiated from procedures to aid compilers in
      better code production and run time checks.

         Functions return values.

         Procedures do not return values.

      Co-routines do not have names or arguments.  Their initial
      envocation points are given the pipe declaration.

      It is not clear just how global declarations are to be??

DECLARATIONS

   SYNTAX

      declaration = numbertype / structuredtype / label / lcl2uhr /
      uhr2rmt / pipetype;

      numbertype = : ("REAL" / "INTEGER") ("CONSTANT" conlist /
      varlist);

      conlist =

         .id '(left arrow symbol)constant

         $('. .id '(left arrow symbol)constant);

      varlist =

         .id ('(left arrow symbol)constant / .empty)

         $('. .id('(left arrow symbol)constant / .empty));

      idlist = .id $('. .id);

      structuredtype = (tree" / "pointer" / "buffer" ) idlist;

      label = "LABEL1" idlist;

      pipetype = PIPE" pairedids $(', pairedids);

      pairedids = .id .id;

      procname = .id;

      integerv = .id;

      pipename = .id;

      labelv = .id;

   Variables which are declared to be constant, may be put in
   read-only memory at run time.

   The label declaration is to declare cells which may contain the
   machine addresses of labels in the program as their values.  This 
   is not the B5500 label declaration.

   In the pipe declaration the first .ID of each pair is the name of
   the pipe, the second is thke initial starting point for the pipe.

ARITHMETIC

   SYNTAX

      exp = "IF" conjunct "THEN" exp "ELSE" exp;

      sum = term (

         '+ sum /

         '- sum /

         -empty);

      term = factor (

         '* term /

         '/ term /

         '(up arrow symbol) term /

         .empty);

      factor = '- factor / bitop;

      bitop = compliment (

         '/' bitop /

         '/'\ bitop /

         '& bitop / (

         .empty);

      compliment = "--" primary / primary;

   (symbol for up arrow) means mod. and /\ means exclusive or.

   Notice that the uniary minus is allowable, and parsed so you can
   write x*-y.

   Since there is no standard convention with bitwise operators, they
   all have the same precedence, and parentheses must be used for
   grouping.

   Compliment is the l's compliment.

   It is assumed that all arithmetic and bit operations take place in
   the mode and style of the machine running the code.  Anyone who
   takes advantage of word lengths, two's compliment arithmetic, etc.
   will eventually have problems.

PRIMARY

   SYNTAX

      primary =

         constant /

         builtin /

         variable / (

         block /

         '( exp ');

      variable = .id (

         '(symbol for left arrow) exp /

         '( block ') /

         .empty);

      constant =  integer / real / string;

      builtin =

         mesinfo /

         cortnin /

         ("MIN" / "MAX") exp $('. exp) '/ ;

   parenthesized expressions may be a series of expressions.  The
   value of a series is the value of the last one executed at run time.

   Subroutines may have one call by name argument.

   Expressions may be mixed.  Strings are a big problem?  Rulifson
   also wants to get rid of real numbers!!

CONJUNCTIVE EXPRESSION

   SYNTAX

      conjunct = disjunct ("AND" conjunct / .empty);

      disjunct = negation ("OR" negation / .empty);

      negation = "NOT" relation / relation;

      relation =

         '( conjunct ') /

         sum (

           "<=" sum /

           ">=" sum /

           '< sum /

           '> sum /

           '= sum /

           '" sum /

           .empty);

   The conjunct construct is rigged in such a way that a conjunct
   which is not a sum need not have a value, and may be evaluated
   using jumps in the code.  Reference to the conjunct is made only
   in places where a logical decision is called for (e.g. if and
   while statements).

   We hope that most compilers will be smart enough to skip
   unnecessary evaluations at run time.  I.e a conjunct in which the
   left part is false or a disjunct with the left part true need not
   have the corresponding right part evaluated.

ARITHMETIC EXPRESSION

   SYNTAX

      statement = conditional / unconditional;

      unconditional = loopst / cases / cibtrikst / uist / treest /
      block / null / exp;

      conditional = "IF" conjunct "THEN" unconditional (

         "ELSE" conditional /

         .empty);

      block = "begin" exp $('; exp) "end";

   An expressions may be a statement.  In conditional statements the
   else part is optional while in expressions it is mandatory.  This
   is a side effect of the way the left part of the syntax rules are
   ordered.

SEMI-TREE MANIPULATION AND TESTING

   SYNTAX

      treest = setpntr / insertpntr / deletepntr;

      setpntr = "set" "pointer" pntrname "to" pntrexp;

      pntrexp = direction pntrexp / pntrname;

      insertpntr = "insert" pntrexp "as"

         (("left" / "right") "brother") /

         (("first" / "last: ) "daughter") "of" pntrexp;

      direction =

         "up" /

         "down" /

         "forward" /

         "backward: /

         "head" /

         "tail";

      plantree = "replace" pntrname "with" pntrexp;

      deletepntr = "delete: pntrname;

      tree = '( tree1 ') ;

      tree1 = nodename $nodename ;

      nodename = terminal / '( tree1 ');

      terminal = treename / buffername / point ername;

      treename = id;

      treedecl = "pointer" .id / "tree" .id;

   Extra parentheses in tree building results in linear subcategorization,
   just as in LISP.

FLOW AND CONTROL

   controlst = gost / subst / loopstr / casest;

   GO TO STATEMENTS

      gost = "GO" "TO" (labelv / .id);

         assignlabel = "ASSIGN" .id "TO" labelv;

   SUBROUTINES

      subst = callst / returnst / cortnout;

         callst = "CALL" procname (exp / .emptyu);

         returnst = "RETURN" (exp / .empty);

         cortnout = "STUFF" exp "IN" pipename;

      cortnin = "FETCH" pipename;

      FETCH is a builtin function whose value is computed by envoking
      the named co-routine.

   LOOP STATEMENTS

      SYNTAX

         loopst = whilest / untilst / forst;

         whilest = "WHILE" conjunct "DO" statement;

         untilst = "UNTIL" conjunct "DO" statement;

         forst = "FOR" integerv '- exp ("BY" exp / .empty) "TO" exp

         "DO" statements;

      The value of while and until statements is defined to be false
      and true (or 0 and non-zero) respectively.

      For statements evaluate their initial exp, by part, and to part
      once, at initialization time.  The running index of for
      statements is not available for change within the loop, it may
      only be read.  If, some compilers can take advantage of this
      (say put it in a register) all the better.  The increment and
      the to bound will both be rounded to integers during the
      initialization.

CASE STATEMENTS

   SYNTAX

      casest = ithcasest / condcasest;

      ithcasest = "ITHCASE" exp "OF" "BEGIN" statement $(';
      statement) "END";

      condcasest = "CASE" exp "OF" "BEGIN" condcs $('; condcs)
      "OTHERWISE" statement "END";


      condcs = conjunct ': statement;

   The value of a case statement is the value of the last case executed.

EXTRA STATEMENTS

   null = "NULL";

I/O STATEMENTS

   iost = messagest / dspyst ;

   MESSAGES

      SYNTAX

         messagest = buildmes / demand;

            buildmest = startmes / appendmes / sendmes;

              startmes = "start" "message";

              appendmes = "append" "message" "byute" exp;

              sendmes = "send" "message";

              
           demandmes = "demand" "Message";

      mesinfo =

         "get" "message" "byte"

         "message1" "length" /

         "message" empty: '?;

      mesdecl = "message" "bytes" "are" ,byn "bits" long" '..

DISPLAY BUFFERS

   SYNTAX

      dspyst = startbuffer / bufappend / estab;

      startbuffer - "start" "buffer";

      bufappend = "append" bufstuff $('& bufstuff);

      bufstuff = :

         "parameters" dspyparm $('. dspyparm) /

         "character" exp /

         "string"1 strilng /

         "vector" ("from" exp ':exp / .empty) "to" exp '. exp /

         "position" (onoff / .empty) "beam" "to" exp '= exp/

         curve" ;

      dspyparm F :

         "intensity" "to" exp /

         "character" "width" "to" exp /

         "blink" onoff /

        "italics" onff;

      onoff = "on" / "off";

      estab = "establish" buffername;

   LOGICAL SCREEN

      The screen is taken to be a square.  The coordinates are
      normalized from -1 to +1 on both axes.

      Associated with the screen is a position register, called
      PREG.  The register is a triple <x.y.r> where x and y 
      specify a point on the screen and r is a rotation in
      radians, counter clockwise, from the x-axis.

      The intensity, called INTENSITY, is a real number in the
      range from 0 to 1.  0 is black, 1 is as light as your
      display can go, and numbers in between specify the relative
      log of the intensity difference.

      Character frame size.

      Blink bit.

   BUFFER BUILDING

      The terminal nodes of semi-trees are either semi-tree names
      or display buffers.  A display buffer is a series of logical
      entities, called bufstuff.

      When the buffer is initilized, it is empty.  If no
      parameters are initially appended, those in effect at the
      end of the display of the last node in the semi-tree will be in
      effect for the display of this node.

      As the buffer is built, the logical entities are added to it.
      When it is established as a buffername, the buffer is
      closed, and further appends are prohibited.  It is only a
      buffername has been established that it may be used in a tree
      building statement.

   LOGICAL INPUT DEVICES

      Wand

      Joy Stick

      Keyboard

      Buttons

      Light Pens

      Mice

   AUDIO OUTPUT DEVICES

   .end


SAMPLE PROGRAMS

   Program to run display and keyboard as tty.

   to run NLS

      input part

      display part

         DEMAND MESSAGE;

         While LENGTH " O DO

            ITHCASE GETBYTE OF Begin

            ITHCASE GETBYTE OF %file area uipdate% BEGIN

               %literal area%

               %message area%

               %name area%

               %bug%

               %sequence specs%

               %filter specs%

               %format specs%

               %command feedback line%

               %filer area%

               %date time%

               %echo register%

           BEGIN %DEL control%

DISTRIBUTION LIST

   Steve Carr
      Department of Computer Science
      University of Utah
      Salt Lake City, Utah  84112
      Phone 801-322-7211 X8224

   Steve Crocker

      Boelter Hall
      University of California
      Los Angeles, California
      Phone 213-825-4864

   Jeff Rulifson

      Stanford Research Institute
      333 Ravenswood
      Menlo Park, California  94035
      Phone 415-326-6200 X4116

   Ron Stoughton

      Computer Research Laboratory
      University of California
      Santa Barbara, California  93106
      Phone 805-961-3221

   Mehmet Baray

      Corey Hall
      University of California
      Berkeley, California  94720
      Phone 415-843-2621