home *** CD-ROM | disk | FTP | other *** search
/ Handbook of Infosec Terms 2.0 / Handbook_of_Infosec_Terms_Version_2.0_ISSO.iso / text / rfcs / rfc0005.txt next >
Text File  |  1996-05-07  |  27KB  |  694 lines

  1. Network Working Group                        4691 RFC-5                                Jeff Rulifson                                 June 2, l969 
  2.  
  3.  
  4.  
  5.                 DEL 
  6.  
  7.  
  8.  
  9. :DEL, 02/06/69 1010:58   JFR   ;   .DSN=1; .LSP=0; ['=] AND NOT SP ; ['?]; dual transmission? 
  10.  
  11. ABSTRACT 
  12.  
  13.    The Decode-Encode Language (DEL) is a machine independent language    tailored to two specific computer network tasks: 
  14.  
  15.       accepting input codes from interactive consoles, giving immediate       feedback, and packing the resulting information into message        packets for network transmissin. 
  16.  
  17.       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. 
  18.  
  19.    This is a working document for the evolution of the DEL language.    Comments should be made through Jeff Rulifson at SRI. 
  20.  
  21. FORWARD 
  22.  
  23.    The initial ARPA network working group met at SRI on October 25-26,    1968. 
  24.  
  25.       It was generally agreed beforehand that the runmning of interactive       programs across the network was the first problem that would be       faced. 
  26.  
  27.       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. 
  28.  
  29.       At the meeting were Andrews, Baray, Carr, Crocker, Rulifson, and       Stoughton. 
  30.  
  31.    A second round of meetings was then held in a piecemeal way. 
  32.  
  33.       Crocker meet with Rulifson at SRI on November 18, 1968.  This       resulted in the incorporation of formal co-routines. 
  34.  
  35.       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. 
  36.  
  37.    The first public release of this paper was at the BBN NET meeting in    Cambridge on February 13, 1969. 
  38.  
  39. NET STANDARD TRANSLATORS     
  40.  
  41.    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. 
  42.  
  43.    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. 
  44.  
  45.       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. 
  46.  
  47.       And the DEL 1 program becomes merely a message builder and       sender. 
  48.  
  49.    A more intermediate use of NST-DEL is to have echo tables for a    TTY at the user-host. 
  50.  
  51.       In this mode, the DEL program would run a full duplex TTY for       the user. 
  52.  
  53.       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. 
  54.  
  55.       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. 
  56.  
  57.    A more ambitious task for DEL is the operation of large,    display-oriented systems from remote consoles over the NET. 
  58.  
  59.       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. 
  60.  
  61.          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. 
  62.  
  63.      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. 
  64.  
  65.       One of the more difficult, and often neglected, problems is the       effective simulation of one nonstandard console on another non-       standard console. 
  66.  
  67.      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. 
  68.  
  69.  UNIVERSAL HARDWARE REPRESENTATION 
  70.  
  71.    To minimize the number of translators needed to map any facility's    user codes to any other facility, there is a universal hardware    representation. 
  72.  
  73.    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. 
  74.  
  75.    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. 
  76.  
  77.    The representation is discussed in the semantic explanations    accompanying the formal description of DEL. 
  78.  
  79. INTRODUCTION TO THE NETWORK STANDARD TRANSLATOR (NST) 
  80.  
  81.    Suppose that a user at a remote site, say Utah, is entered in the    AHI system and wants to run NLS. 
  82.  
  83.    The first step is to enter NLS in the normal way.  At that time    the Utah system will request a symbolic program from NLS. 
  84.  
  85.       REP   This program is written in DEL.  It is called the NLS       Remote Encode Program (REP). 
  86.  
  87.       The program accepts input in the Universal Hardware       Representation and translates it to a form usable by NLS. 
  88.  
  89.       It may pack characters in a buffer, also do some local       feedback. 
  90.  
  91.    When the program is first received at Utah it is compiled and    loaded to be run in conjunction with a standard library. 
  92.  
  93.    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. 
  94.  
  95.  ADVANTAGES OF NST 
  96.  
  97.    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. 
  98.  
  99.       This is the minimum programming that can be expected if        console is used to its fullest extent. 
  100.  
  101.       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. 
  102.  
  103.       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. 
  104.  
  105.    The advantages of having the encode translation programs    transferred symbolically should be obvious. 
  106.  
  107.       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. 
  108.  
  109.       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. 
  110.  
  111.     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??) 
  112.  
  113.  AHI NLS - USER CONSOLE COMMUNICATION - AN EXAMPLE 
  114.  
  115.    BLOCK DIAGRAM 
  116.  
  117.       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. 
  118.  
  119.      Each label in the picture corresponds to a statement with the      same name. 
  120.  
  121.      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. 
  122.  
  123.      [">tif:] OR I" >nif"]; ["<tif:] OR ["<nif"]; 
  124.  
  125. USER-TO-HOST TRANSMISSION 
  126.  
  127.    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)] 
  128.  
  129.    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)] 
  130.  
  131.       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. 
  132.  
  133.       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. 
  134.  
  135.    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. 
  136.  
  137.       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. 
  138.  
  139.       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. 
  140.  
  141.    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. 
  142.  
  143.       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. 
  144.  
  145.       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. 
  146.  
  147.    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)] 
  148.  
  149.  HOST-TO-USER TRANSMISSION 
  150.  
  151.    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)] 
  152.  
  153.       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. 
  154.  
  155.      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. 
  156.  
  157.      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. 
  158.  
  159.      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. 
  160.  
  161.       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)] 
  162.  
  163.       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. 
  164.  
  165.    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. 
  166.  
  167.    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)] 
  168.  
  169.       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)] 
  170.  
  171.       prgmctrl   Another action may be the selective translation and       routing of information to particular user-site subsystems.       [>tif(dctrl)<tif(urt)] 
  172.  
  173.          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. 
  174.  
  175.      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. 
  176.  
  177.       (display)   is the output to the user.  [<nif(d ctrl)] 
  178.  
  179.        USER-TO-HOST INDIRECT TRANSMISSION 
  180.  
  181.       (net mode)   This is the mode where a remote user can link to a node       indirectly through another node.   [<nif(decode)<tif(hrt)] 
  182.  
  183.  DEL SYNTAX 
  184.  
  185.    NOTES FOR NLS USERS          All statements in this branch which are not part of the compiler       must end with a period. 
  186.  
  187.       To compile the DEL compiler: 
  188.  
  189.      Set this pattern for the content analyzer ( (symbol for up arrow)P1      SE(P1) <-"-;). The pointer "del" is on the first character of pattern. 
  190.  
  191.      Jump to the first statement of the compiler.  The pointer "c"      is on this statement. 
  192.  
  193.      And output the compiler to file  ( '/A-DEL' ).  The pointer "f"      is on the name of the file for the compiler output - 
  194.  
  195.    PROGRAMS 
  196.  
  197.       SYNTAX 
  198.  
  199.      -meta file (k=100.m=300,n=20,s=900) 
  200.  
  201.      file = mesdecl $declaration $procedure "FINISH"; 
  202.  
  203.      procedure = 
  204.  
  205.        procname ( 
  206.  
  207.           ( 
  208.  
  209.              type "FUNCTION" / 
  210.  
  211.          "PROCEDURE" ) .id (type .id / -empty)) / 
  212.  
  213.           "CO-ROUTINE") ' / 
  214.  
  215.        $declaration labeledst $(labeledst ';) "endp."; 
  216.  
  217.      labeledst = ((left arrow symbol).id ': / .empty) statement; 
  218.  
  219.      type = "INTEGER" / "REAL" ; 
  220.  
  221.      procname = .id; 
  222.  
  223.       Functions are differentiated from procedures to aid compilers in       better code production and run time checks. 
  224.  
  225.      Functions return values. 
  226.  
  227.      Procedures do not return values. 
  228.  
  229.       Co-routines do not have names or arguments.  Their initial       envocation points are given the pipe declaration. 
  230.  
  231.       It is not clear just how global declarations are to be?? 
  232.  
  233. DECLARATIONS 
  234.  
  235.    SYNTAX 
  236.  
  237.       declaration = numbertype / structuredtype / label / lcl2uhr /       uhr2rmt / pipetype; 
  238.  
  239.       numbertype = : ("REAL" / "INTEGER") ("CONSTANT" conlist /       varlist); 
  240.  
  241.       conlist = 
  242.  
  243.      .id '(left arrow symbol)constant 
  244.  
  245.      $('. .id '(left arrow symbol)constant); 
  246.  
  247.       varlist = 
  248.  
  249.      .id ('(left arrow symbol)constant / .empty) 
  250.  
  251.      $('. .id('(left arrow symbol)constant / .empty)); 
  252.  
  253.       idlist = .id $('. .id); 
  254.  
  255.       structuredtype = (tree" / "pointer" / "buffer" ) idlist; 
  256.  
  257.       label = "LABEL1" idlist; 
  258.  
  259.       pipetype = PIPE" pairedids $(', pairedids); 
  260.  
  261.       pairedids = .id .id; 
  262.  
  263.       procname = .id; 
  264.  
  265.       integerv = .id; 
  266.  
  267.       pipename = .id; 
  268.  
  269.       labelv = .id; 
  270.  
  271.    Variables which are declared to be constant, may be put in    read-only memory at run time. 
  272.  
  273.    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. 
  274.  
  275.    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. 
  276.  
  277. ARITHMETIC 
  278.  
  279.    SYNTAX 
  280.  
  281.       exp = "IF" conjunct "THEN" exp "ELSE" exp; 
  282.  
  283.       sum = term ( 
  284.  
  285.      '+ sum / 
  286.  
  287.      '- sum / 
  288.  
  289.      -empty); 
  290.  
  291.       term = factor ( 
  292.  
  293.      '* term / 
  294.  
  295.      '/ term / 
  296.  
  297.      '(up arrow symbol) term / 
  298.  
  299.      .empty); 
  300.  
  301.       factor = '- factor / bitop; 
  302.  
  303.       bitop = compliment ( 
  304.  
  305.      '/' bitop / 
  306.  
  307.      '/'\ bitop / 
  308.  
  309.      '& bitop / ( 
  310.  
  311.      .empty); 
  312.  
  313.       compliment = "--" primary / primary; 
  314.  
  315.    (symbol for up arrow) means mod. and /\ means exclusive or. 
  316.  
  317.    Notice that the uniary minus is allowable, and parsed so you can    write x*-y. 
  318.  
  319.    Since there is no standard convention with bitwise operators, they    all have the same precedence, and parentheses must be used for    grouping. 
  320.  
  321.    Compliment is the l's compliment. 
  322.  
  323.    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. 
  324.  
  325. PRIMARY 
  326.  
  327.    SYNTAX 
  328.  
  329.       primary = 
  330.  
  331.      constant / 
  332.  
  333.      builtin / 
  334.  
  335.      variable / ( 
  336.  
  337.      block / 
  338.  
  339.      '( exp '); 
  340.  
  341.       variable = .id ( 
  342.  
  343.      '(symbol for left arrow) exp / 
  344.  
  345.      '( block ') / 
  346.  
  347.      .empty); 
  348.  
  349.       constant =  integer / real / string; 
  350.  
  351.       builtin = 
  352.  
  353.      mesinfo / 
  354.  
  355.      cortnin / 
  356.  
  357.      ("MIN" / "MAX") exp $('. exp) '/ ; 
  358.  
  359.    parenthesized expressions may be a series of expressions.  The    value of a series is the value of the last one executed at run time. 
  360.  
  361.    Subroutines may have one call by name argument. 
  362.  
  363.    Expressions may be mixed.  Strings are a big problem?  Rulifson    also wants to get rid of real numbers!! 
  364.  
  365. CONJUNCTIVE EXPRESSION 
  366.  
  367.    SYNTAX 
  368.  
  369.       conjunct = disjunct ("AND" conjunct / .empty); 
  370.  
  371.       disjunct = negation ("OR" negation / .empty); 
  372.  
  373.       negation = "NOT" relation / relation; 
  374.  
  375.       relation = 
  376.  
  377.      '( conjunct ') / 
  378.  
  379.      sum ( 
  380.  
  381.        "<=" sum / 
  382.  
  383.        ">=" sum / 
  384.  
  385.        '< sum / 
  386.  
  387.        '> sum / 
  388.  
  389.        '= sum / 
  390.  
  391.        '" sum / 
  392.  
  393.        .empty); 
  394.  
  395.    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). 
  396.  
  397.    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. 
  398.  
  399. ARITHMETIC EXPRESSION 
  400.  
  401.    SYNTAX 
  402.  
  403.       statement = conditional / unconditional; 
  404.  
  405.       unconditional = loopst / cases / cibtrikst / uist / treest /       block / null / exp; 
  406.  
  407.       conditional = "IF" conjunct "THEN" unconditional ( 
  408.  
  409.      "ELSE" conditional / 
  410.  
  411.      .empty); 
  412.  
  413.       block = "begin" exp $('; exp) "end"; 
  414.  
  415.    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. 
  416.  
  417. SEMI-TREE MANIPULATION AND TESTING 
  418.  
  419.    SYNTAX 
  420.  
  421.       treest = setpntr / insertpntr / deletepntr; 
  422.  
  423.       setpntr = "set" "pointer" pntrname "to" pntrexp; 
  424.  
  425.       pntrexp = direction pntrexp / pntrname; 
  426.  
  427.       insertpntr = "insert" pntrexp "as" 
  428.  
  429.      (("left" / "right") "brother") / 
  430.  
  431.      (("first" / "last: ) "daughter") "of" pntrexp; 
  432.  
  433.       direction = 
  434.  
  435.      "up" / 
  436.  
  437.      "down" / 
  438.  
  439.      "forward" / 
  440.  
  441.      "backward: / 
  442.  
  443.      "head" / 
  444.  
  445.      "tail"; 
  446.  
  447.       plantree = "replace" pntrname "with" pntrexp; 
  448.  
  449.       deletepntr = "delete: pntrname; 
  450.  
  451.       tree = '( tree1 ') ; 
  452.  
  453.       tree1 = nodename $nodename ; 
  454.  
  455.       nodename = terminal / '( tree1 '); 
  456.  
  457.       terminal = treename / buffername / point ername; 
  458.  
  459.       treename = id; 
  460.  
  461.       treedecl = "pointer" .id / "tree" .id; 
  462.  
  463.    Extra parentheses in tree building results in linear subcategorization,    just as in LISP. 
  464.  
  465. FLOW AND CONTROL 
  466.  
  467.    controlst = gost / subst / loopstr / casest; 
  468.  
  469.    GO TO STATEMENTS 
  470.  
  471.       gost = "GO" "TO" (labelv / .id); 
  472.  
  473.      assignlabel = "ASSIGN" .id "TO" labelv; 
  474.  
  475.    SUBROUTINES 
  476.  
  477.       subst = callst / returnst / cortnout; 
  478.  
  479.      callst = "CALL" procname (exp / .emptyu); 
  480.  
  481.      returnst = "RETURN" (exp / .empty); 
  482.  
  483.      cortnout = "STUFF" exp "IN" pipename; 
  484.  
  485.       cortnin = "FETCH" pipename; 
  486.  
  487.       FETCH is a builtin function whose value is computed by envoking       the named co-routine. 
  488.  
  489.    LOOP STATEMENTS 
  490.  
  491.       SYNTAX 
  492.  
  493.      loopst = whilest / untilst / forst; 
  494.  
  495.      whilest = "WHILE" conjunct "DO" statement; 
  496.  
  497.      untilst = "UNTIL" conjunct "DO" statement; 
  498.  
  499.      forst = "FOR" integerv '- exp ("BY" exp / .empty) "TO" exp 
  500.  
  501.      "DO" statements; 
  502.  
  503.       The value of while and until statements is defined to be false       and true (or 0 and non-zero) respectively. 
  504.  
  505.       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. 
  506.  
  507. CASE STATEMENTS 
  508.  
  509.    SYNTAX 
  510.  
  511.       casest = ithcasest / condcasest; 
  512.  
  513.       ithcasest = "ITHCASE" exp "OF" "BEGIN" statement $(';       statement) "END"; 
  514.  
  515.       condcasest = "CASE" exp "OF" "BEGIN" condcs $('; condcs)       "OTHERWISE" statement "END"; 
  516.  
  517.        condcs = conjunct ': statement; 
  518.  
  519.    The value of a case statement is the value of the last case executed. 
  520.  
  521. EXTRA STATEMENTS 
  522.  
  523.    null = "NULL"; 
  524.  
  525. I/O STATEMENTS 
  526.  
  527.    iost = messagest / dspyst ; 
  528.  
  529.    MESSAGES 
  530.  
  531.       SYNTAX 
  532.  
  533.          messagest = buildmes / demand; 
  534.  
  535.         buildmest = startmes / appendmes / sendmes; 
  536.  
  537.           startmes = "start" "message";            appendmes = "append" "message" "byute" exp; 
  538.  
  539.           sendmes = "send" "message"; 
  540.  
  541.                   demandmes = "demand" "Message"; 
  542.  
  543.       mesinfo = 
  544.  
  545.          "get" "message" "byte" 
  546.  
  547.      "message1" "length" / 
  548.  
  549.      "message" empty: '?; 
  550.  
  551.       mesdecl = "message" "bytes" "are" ,byn "bits" long" '.. 
  552.  
  553. DISPLAY BUFFERS 
  554.  
  555.    SYNTAX 
  556.  
  557.       dspyst = startbuffer / bufappend / estab; 
  558.  
  559.       startbuffer - "start" "buffer"; 
  560.  
  561.       bufappend = "append" bufstuff $('& bufstuff); 
  562.  
  563.       bufstuff = : 
  564.  
  565.      "parameters" dspyparm $('. dspyparm) / 
  566.  
  567.      "character" exp / 
  568.  
  569.      "string"1 strilng / 
  570.  
  571.         "vector" ("from" exp ':exp / .empty) "to" exp '. exp / 
  572.  
  573.      "position" (onoff / .empty) "beam" "to" exp '= exp/ 
  574.  
  575.      curve" ; 
  576.  
  577.       dspyparm F : 
  578.  
  579.      "intensity" "to" exp / 
  580.  
  581.      "character" "width" "to" exp / 
  582.  
  583.      "blink" onoff / 
  584.  
  585.     "italics" onff; 
  586.  
  587.       onoff = "on" / "off"; 
  588.  
  589.       estab = "establish" buffername; 
  590.  
  591.    LOGICAL SCREEN 
  592.  
  593.       The screen is taken to be a square.  The coordinates are       normalized from -1 to +1 on both axes. 
  594.  
  595.       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. 
  596.  
  597.       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. 
  598.  
  599.       Character frame size. 
  600.  
  601.       Blink bit. 
  602.  
  603.    BUFFER BUILDING 
  604.  
  605.       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. 
  606.  
  607.       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. 
  608.  
  609.       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. 
  610.  
  611.    LOGICAL INPUT DEVICES 
  612.  
  613.       Wand 
  614.  
  615.       Joy Stick 
  616.  
  617.       Keyboard 
  618.  
  619.       Buttons 
  620.  
  621.       Light Pens 
  622.  
  623.       Mice 
  624.  
  625.    AUDIO OUTPUT DEVICES 
  626.  
  627.    .end 
  628.  
  629.  SAMPLE PROGRAMS 
  630.  
  631.    Program to run display and keyboard as tty. 
  632.  
  633.    to run NLS 
  634.  
  635.       input part 
  636.  
  637.       display part 
  638.  
  639.      DEMAND MESSAGE; 
  640.  
  641.      While LENGTH " O DO 
  642.  
  643.         ITHCASE GETBYTE OF Begin 
  644.  
  645.         ITHCASE GETBYTE OF %file area uipdate% BEGIN 
  646.  
  647.            %literal area% 
  648.  
  649.            %message area% 
  650.  
  651.            %name area% 
  652.  
  653.            %bug% 
  654.  
  655.            %sequence specs% 
  656.  
  657.            %filter specs% 
  658.  
  659.            %format specs% 
  660.  
  661.            %command feedback line% 
  662.  
  663.            %filer area% 
  664.  
  665.            %date time% 
  666.  
  667.            %echo register% 
  668.  
  669.        BEGIN %DEL control% 
  670.  
  671. DISTRIBUTION LIST 
  672.  
  673.    Steve Carr       Department of Computer Science       University of Utah       Salt Lake City, Utah  84112       Phone 801-322-7211 X8224 
  674.  
  675.    Steve Crocker 
  676.  
  677.       Boelter Hall       University of California       Los Angeles, California       Phone 213-825-4864 
  678.  
  679.    Jeff Rulifson 
  680.  
  681.       Stanford Research Institute       333 Ravenswood       Menlo Park, California  94035       Phone 415-326-6200 X4116 
  682.  
  683.    Ron Stoughton 
  684.  
  685.       Computer Research Laboratory       University of California       Santa Barbara, California  93106       Phone 805-961-3221 
  686.  
  687.    Mehmet Baray 
  688.  
  689.       Corey Hall       University of California       Berkeley, California  94720       Phone 415-843-2621 
  690.  
  691.      
  692.  
  693.  
  694.