MULTICS TECHNICAL BULLETIN                             MTB-758-03

  To:       MTB Distribution

  From:     Gary Dixon

  Date:     January 31, 1987

  Subject:  Video Support for DSA

                 -----------------------------------

  This MTB describes the interface between the Multics Video System
  and  the communications  system which  is part  of the  Honeywell
  Distributed Systems Architecture (DSA) protocols.

                 -----------------------------------

  Revision  1  corrects  typographical  and  minor calling sequence
  errors.  Revisions  2 and 3 correct correct  terminology used for |
  the  session  identifier,  provide  a  better  definition for the |
  correspondent parameter of dsa_tty_$connect, and correct the list |
  of orders supported by dsa_tty_$order.                            |

  Send comments by Multics mail to:

     GDixon.Multics on System M

  ACKNOWLEDGMENTS:   I thank  Ron Barstad  for laying  much of  the
  groundwork  for the  video system  to DSA  interface.  His MTB756
  describes the very similar interface between video and MOWSE.

  _________________________________________________________________

  Multics project  internal documentation; not to  be reproduced or
  distributed outside the Multics project without permission of the
  Director of MDC.


  MTB-758-03                                  Video Support for DSA

                               CONTENTS

                                                           Page

      1:  Purpose of this MTB . . . . . . . . . . . . . .   1
      2:  Attaching a DSA Channel:  Functional Overview .   2
      2.1:  Attaching via tty_  . . . . . . . . . . . . .   2
      2.2:  Attaching via tc_io_  . . . . . . . . . . . .   2
      2.3:  Attaching via
       video_utils_$turn_on_login_channel . . . . . . . .   2
      3:  New dsa_tty_ Subroutines  . . . . . . . . . . .   4
         dsa_tty_ . . . . . . . . . . . . . . . . . . . .   5
            dsa_tty_$abort  . . . . . . . . . . . . . . .   5
            dsa_tty_$attach . . . . . . . . . . . . . . .   6
            dsa_tty_$connect  . . . . . . . . . . . . . .   7
            dsa_tty_$detach . . . . . . . . . . . . . . .   9
            dsa_tty_$event  . . . . . . . . . . . . . . .   10
            dsa_tty_$index  . . . . . . . . . . . . . . .   11
            dsa_tty_$order  . . . . . . . . . . . . . . .   12
            dsa_tty_$read . . . . . . . . . . . . . . . .   15
            dsa_tty_$read_echoed  . . . . . . . . . . . .   16
            dsa_tty_$read_with_mark . . . . . . . . . . .   18
            dsa_tty_$write  . . . . . . . . . . . . . . .   19
            dsa_tty_$write_whole_string . . . . . . . . .   20


  Video Support for DSA                                  MTB-758-03

  111:::  PPPUUURRRPPPOOOSSSEEE OOOFFF TTTHHHIIISSS MMMTTTBBB

  This  document provides  a  short  functional description  of the
  Multics modules needed to use  the Video system with DSA terminal
  channels.

  Support for DSA communications  protocols was planned for Multics
  Release 12.0 as an RPQ requested  by Bull.  Roger Negaret of Bull
  implemented  a  set  of  video  system  changes,  based  upon the
  proposal in this  MTB.  The MOWSE developers then  built on these
  changes  to add  MOWSE support  to the  video system.   The MOWSE
  changes are described in MTB741  by Michael Flegel, and MTB756 by
  Ron Barstad.

  Unfortunately,  DSA support has  been delayed until  MR12.1.  For
  MR12.0,  we need  to MCR  and  install  the video  system to  DSA
  interface,  so that   the already-implemented  changes supporting
  both MOWSE and DSA channels can be installed.  This MTB describes
  the  video to DSA  interface.  The remainder  of the Multics  DSA
  support will be described in future MTBs for MR12.1 installation.


  MTB-758-03                                  Video Support for DSA

  222:::  AAATTTTTTAAACCCHHHIIINNNGGG AAA DDDSSSAAA CCCHHHAAANNNNNNEEELLL:::  FFFUUUNNNCCCTTTIIIOOONNNAAALLL OOOVVVEEERRRVVVIIIEEEWWW

  This section gives a brief overview of how a DSA terminal becomes
  attached to a  Multics process, how the video  system learns that
  the login channel is a DSA terminal, and how it interfaces with a
  DSA channel.

  222...111:::  AAAttttttaaaccchhhiiinnnggg vvviiiaaa ttttttyyy_

  A Multics process first attaches  a DSA terminal using tty_, just
  as  for MCS  terminals.  tty_   will detect  connection to  a DSA
  channel  by examining  the channel  name format  (a channel  name
  beginning with  "dsa."  is a DSA channel).   For DSA connections,
  tty_ performs I/O operations via new dsa_tty_$XXX subroutines and
  the network  type is set  to DSA_NETWORK_TYPE.  For  nonDSA (MCS)
  channel  names, tty_  performs  I/O  operations via  the existing
  hcs_$tty_XXX   interface   and   sets   the   network   type   to
  MCS_NETWORK_TYPE.   These  network  type  constants  are  already
  defined in net_event_message.incl.pl1 (based on an earlier MCR).

  222...222:::  AAAttttttaaaccchhhiiinnnggg vvviiiaaa tttccc_iiiooo_

  Similarly, when the video  system (tc_io_$tc_io_attach) is called
  to  attach a  DSA terminal,   it will  examine the  channel name,
  detect   the   "dsa."    prefix,   set   the   network   type  to
  DSA_NETWORK_TYPE  and  perform  I/O  operations  through  the new
  dsa_tty_$XXX subroutines.

  222...333:::  AAAttttttaaaccchhhiiinnnggg vvviiiaaa vvviiidddeeeooo_uuutttiiilllsss_$$$tttuuurrrnnn_ooonnn_lllooogggiiinnn_ccchhhaaannnnnneeelll

  video_util_$turn_on_login_channel   will   examine   the  current
  attachment of the  login channel to determine if it  is an MCS or
  DSA channel.  It does this by issuing a new iox_$control request,
  get_network_type.

  When tty_ is attached to  an MCS channel, iox_$control operations
  are   routed   (via   the   iocb.control   entry   variable)   to
  tty_io_$control, and its ring 0 helper, hcs_$tty_order.  MCS will
  not be  changed to support the new  get_network_type control, and
  will  therefore return  error_table_$undefined_order_request when
  asked to perform an unknown control request.

  When tty_  is attached to a DSA  channel, iox_$control operations
  will  be  routed  to  dsa_tty_io_$control.   This subroutine will
  implement  the new  get_network_type control  request, which will
  return the network type of the connection, DSA_NETWORK_TYPE.

  video_utils_$turn_on_login_channel   will    make   the   MCS/DSA
  determination as  follows.  If it  receives a zero  code from the


  Video Support for DSA                                  MTB-758-03

  call, it assumes the login channel is connected to a DSA channel.
  If it  receives a nonzero  code from the  call, it assumes  it is
  attached via MCS.

  After  learning  the  network  type,  video_utils_ then preserves
  information about the tty_ attachment  of the channel (eg, modes,
  editing  chars,  delays,  output  conversion  and  special  chars
  tables, etc), closes/detaches the tty_ connection, and reattaches
  the  channel  via  tc_io_,  and  sets  the  output conversion and
  special chars tables from the preserved information.  It uses the
  network type  to tailor its information  preservation operations,
  based upon the types of information available for each network.


  MTB-758-03                                  Video Support for DSA

  333:::  NNNEEEWWW DDDSSSAAA_TTTTTTYYY_ SSSUUUBBBRRROOOUUUTTTIIINNNEEESSS

  As   mentioned  above,  tc_io_   will  interface  with   the  DSA
  communications   system  in   MR12.1  by   calling  new  dsa_tty_
  subroutines.   However  DSA  itself  and  dsa_tty_  will  not  be
  installed for MR12.0.  Since tc_io_ will never see a DSA channel,
  it will never attempt to call dsa_tty_, so no linkage faults will
  occur.

  The paragraphs below describe the dsa_tty_ subroutine calls coded
  into  tc_io_ for  MR12.0.  These   calls are  similar in  calling
  sequence and function to the tty_io_ and hcs_$tty_XXX subroutines
  of the MCS communications system.  The subroutine calls in tc_io_
  are:

       dsa_tty_$abort
       dsa_tty_$attach
       dsa_tty_$connect
       dsa_tty_$detach
       dsa_tty_$event
       dsa_tty_$index
       dsa_tty_$order
       dsa_tty_$read_echoed
       dsa_tty_$read_with_mark
       dsa_tty_$write
       dsa_tty_$write_whole_string

  These  subroutine   interfaces  are  briefly  described   in  the
  following sections of this MTB.  These are the interfaces used in
  the DSA modules currently being developed for MR12.1.


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  NNNaaammmeee:::  dddsssaaa_ttttttyyy_

  This subroutine  provides the interface between  the video system
  and the DSA session control and terminal manager programs.

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$aaabbbooorrrttt

  This  entry resets  the read   and/or write  buffers for  a given
  channel.

  UUUsssaaagggeee

  dcl dsa_tty_$abort entry (fixed bin(35), fixed bin, fixed bin,
       fixed bin(35));

  call dsa_tty_$abort (tty_dsa_id, reset_switch, state, code);      |

  AAArrrggguuummmeeennntttsss

  tty_dsa_id                                                        |
     is tty_'s DSA session identifier for the channel, returned by  |
     dsa_tty_$attach.  (Input)

  reset_switch
     indicates whether read or write are to be reset.  (Input)
     1 reset read
     2 reset write
     3 reset both

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$aaattttttaaaccchhh

  This entry attaches an existing DSA session to the process, given
| its  channel  name.   It  returns  tty_'s  DSA session identifier
  associated with the  channel.  This session ID is  used in future
  dsa_tty_ calls to identify the channel.

  UUUsssaaagggeee

  dcl dsa_tty_$attach entry (char(*), fixed bin(71), fixed bin(35),
       fixed bin, fixed bin(35));

| call dsa_tty_$attach (channel_name, event, tty_dsa_id, state,
|      code);

  AAArrrggguuummmeeennntttsss

  channel_name
     is the channel name of the DSA channel to be attached.
     (Input)

  event
     is the event channel over which the caller of dsa_tty_ events
     are to be reported to the caller.  (Input)

| tty_dsa_id
|    is tty_'s DSA session identifier which dsa_tty_$attach assigns
|    to the channel.  (Output)

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$cccooonnnnnneeecccttt

  This entrypoint creates a new DSA  session.  It is used by tc_io_
  to create an outbound, dial-out connection through DSA.

  UUUsssaaagggeee

  dcl dsa_tty_$connect entry (char(*), ptr, fixed bin(71),
       char(*) var, ptr, char(*), fixed bin(35), ptr,
       fixed bin(21), char(*) var, (2) bit(72), fixed bin(35));

  call dsa_tty_$connect (correspondent, area_ptr, event_channel,
       network_address, user_id_ptr, channel_name, session_handle,
       dsa_connection_info_ptr, dsa_connection_info_len,
       attach_description, access_class_range, code);

  AAArrrggguuummmeeennntttsss

  correspondent
     is the name of an application which must be defined in a       |
     correspondent entry in the Network Information Table (NIT).    |
     This NIT entry describes how to access the application (eg,    |
     name of the network used to access the application, system on  |
     which the application exists, name of the endpoint which       |
     handles requests to use the application, etc).  (Input)        |

  area_ptr
     is a pointer to an area in which dsa_connection_info can be
     allocated.  (Input)

  event_channel
     is an event channel dsa_tty_ uses to signal events associated
     with this channel.  If 0, then events are not signalled.       |
     (Input)                                                        |

  network_address
     is the network address to use when making the dial-out
     connection.  (Input)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  user_id_ptr
|    is a pointer to a user identification structure.  Currently,
|    this is used only to dial_out from Multics to an application
|    running on the DN8 (eg, edit or debug).  Thus, information in
|    the structure defines person_id, project_id, billing_id and
|    password of a user application on the DN8.  The submitter_id
|    structure is declared in dsa_scu_sec_info.incl.pl1.  For
|    caller not connecting to a DN8 application, this can be a null
|    pointer.  (Input)

  channel_name
     is the name of the actual DSA channel to be used for the
     dial-out connection.  (Output)

  session_handle
     is a handle used for communications between session control
     and the Login_Server.  (Output)

  dsa_connection_info_ptr
     is a pointer to information about the DSA connection.  This
     information is allocated in the area pointed to by area_ptr.
     This information currently isn't used.  (Output)

  dsa_connection_info_len
     is the length in words of the DSA connection information.
     (Output)

  attach_description
     is an attach description that can be used to attach the tty_
     I/O module to the dial-out channel.  (Output)

  access_class_range
     is the access class of the dial-out channel.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$dddeeetttaaaccchhh

  This entry detaches a DSA  session from the process.  The session
  may optionally be disconnected at the same time.

  UUUsssaaagggeee

  dcl dsa_tty_$detach entry (fixed bin(35), fixed bin, fixed bin,
       fixed bin(35));

  call dsa_tty_$detach (tty_dsa_id, dflag, state, code);            |

  AAArrrggguuummmeeennntttsss

  tty_dsa_id                                                        |
     is tty's DSA session identifier for the channel.  (Input)      |

  dflag
     is the disconnection flag.  (Input)
     1 disconnect (destroy) the session.
     0 just detach the session from the process.

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$eeevvveeennnttt

  This entry sets the event channel associated with the connection.

  UUUsssaaagggeee

  dcl dsa_tty_$event entry (fixed bin(35), fixed bin(71),
       fixed bin, fixed bin(35));

| call dsa_tty_$event (tty_dsa_id, event_channel, state, code);

  AAArrrggguuummmeeennntttsss

| tty_dsa_id
|    is tty_'s DSA session identifier for the channel.  (Input)

  event_channel
     identifies the event channel to be used.  (Input)

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$iiinnndddeeexxx

  This entry  returns tty_'s DSA session identifier  for a channel, |
  given its channel name.

  UUUsssaaagggeee

  dcl dsa_tty_$index entry (char(*), fixed bin(35), fixed bin,
       fixed bin(35));

  call dsa_tty_$index (channel_name, tty_dsa_id, state, code);      |

  AAArrrggguuummmeeennntttsss

  channel_name
     is the channel name.  (Input)                                  |

  tty_dsa_id                                                        |
     is tty's DSA session identifier for the channel.  (Output)     |

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$ooorrrdddeeerrr

  This  entry  performs  the  specified  control  order  on the i/o
  switch.

  UUUsssaaagggeee

  dcl dsa_tty_$order entry (fixed bin(35), char(*), ptr, fixed bin,
       fixed bin(35));

| call dsa_tty_$order (tty_dsa_id, order, info_ptr, state, code);

  AAArrrggguuummmeeennntttsss

| tty_dsa_id
|    is tty's DSA session identifier for the channel.  (Input)

  order
     is the name of the control order.  (Input)

  info_ptr
     is null or points to the data whose form depends on the
     control order.  (Input)

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)

  NOTES:

  The following list of tty_ control requests are also supported by
  dsa_tty_.   Requests  followed  by   an  asterisk  (*)  are  used
  explicitly  by  tc_io_  in   managing  the  screen.   Others  are
  available to the user from command level and from applications.


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

       get_echo_break_table       quit_enable
       get_editing_chars          read_status
       get_event_channel          resetread
       get_input_conversion       resetwrite
       get_input_translation      set_echo_break_table *
       get_line_status_enabled    set_editing_chars
       get_meters                 set_input_conversion
       get_output_conversion      set_input_translation
       get_output_translation     set_line_status_enabled
       get_special                set_output_conversion
       hangup                     set_output_translation
       interrupt                  set_prompt
       line_length                set_special
       line_status                set_terminal_data *
       modes *                    start *
       printer_off *              store_id
       printer_on                 terminal_info *
       quit_disable               write_status

  The following tty_ control requests  are supported in dsa_tty_ by
  ignoring the request and returning a code of 0.  None are used by
  the video system.

       accept_printer_off           reset_more
       input_flow_control_chars     set_delay
       output_flow_control_chars    set_framing_chars
       refuse_printer_off

  The following control requests are implemented especially for DSA
  connections.  None  are used by the video  system, therefore they
  are not documented in this MTB.


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

|      attention1            get_line_indicator
|      attention2            get_modes
|      attention3            get_network_type
|      attention4            get_page_indicator
|      attention5            get_switch_logical_device
|      attention6            get_tabulation
|      attention7            get_terminal_characteristics
|      attention8            request_device_status
|      attention9            select_output_device
|      begin_ack_unit        set_attention_fcn
|      conceal_input         set_delimiter_fcn
|      conceal_next_line     set_editing_fcn
|      demand_turn           set_event_info
|      disable_input_device  set_line_indicator
|      enable_input_device   set_modes
|      end_ack_unit          set_page_indicator
|      get_attention_fcn     set_switch_logical_device
|      get_delimiter_fcn     set_tabulation
|      get_editing_fcn       set_terminal_characteristics
|      get_event_info


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$rrreeeaaaddd

  This entry reads unechoed characters from the terminal.

  UUUsssaaagggeee

  dcl dsa_tty_$read entry (fixed bin(35), ptr, fixed bin(21),
       fixed bin(21), fixed bin(21), fixed bin, fixed bin(35));

  call dsa_tty_$read (tty_dsa_id, buffer_ptr, offset,               |
       n_chars_to_read, n_chars_read, state, code);                 |

  AAArrrggguuummmeeennntttsss

  tty_dsa_id                                                        |
     is tty's DSA session identifier for the channel.  (Input)      |

  buffer_ptr
     pointer to buffer in which characters read from terminal are
     placed.  (Input)

  offset
     is the offset in buffer at which first input character is
     placed.  (Input)

  n_chars_to_read
     is the maximum number of characters to return.  (Input)

  n_chars_read
     is the actual number of characters returned.  (Output)

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$rrreeeaaaddd_eeeccchhhoooeeeddd

  This   entry   reads   echoed   characters   from  the  terminal.
  Echo-negotiated input  starts when this entrypoint  is called and
  no  unechoed   characters  exist  in  the   input  already  read.
  Negotiated echoing continues until  a break character is reached,
  or the remaining space in the  current window line is filled with
  echoed  characters.  Type  ahead entered  before echo negotiation
  begins or after it stops is not echoed by the terminal.

  UUUsssaaagggeee

  dcl dsa_tty_$read_echoed entry (fixed bin(35), ptr,
       fixed bin(21), fixed bin(21), fixed bin(21), fixed bin(21),
       fixed bin, fixed bin, fixed bin(35));

| call dsa_tty_$read_echoed (tty_dsa_id, buffer_ptr, offset,
|      n_chars_to_read, n_chars_read, echoed, screen_left, state,
       code);

  AAArrrggguuummmeeennntttsss

| tty_dsa_id
|    is tty's DSA session identifier for the channel.  (Input)

  buffer_ptr
     pointer to buffer in which characters read from terminal are
     placed.  (Input)

  offset
     offset in buffer at which first character is to be placed.
     (Input)

  n_chars_to_read
     is the maximum number of characters to return.  (Input)

  n_chars_read
     is the actual number of characters returned.  (Output)

  echoed
     is the number of characters echoed during echo negotiated
     input.  (Output)

  screen_left
     is the space left on current line of current window.  (Input)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$rrreeeaaaddd_wwwiiittthhh_mmmaaarrrkkk

  This entry is like read, but an additional argument indicates the
  number  of input  characters read  prior to  the mark  set in the
  input by dsa_tty_$write_whole_string.

  UUUsssaaagggeee

  dcl dsa_tty_$read_with_mark entry (fixed bin(35), char(*),
       fixed bin(21), fixed bin(21), fixed bin, fixed bin(35));

| call dsa_tty_$read_with_mark (tty_dsa_id, buffer, n_chars_read,
|      mark_index, state, code);

  AAArrrggguuummmeeennntttsss

| tty_dsa_id
|    is tty's DSA session identifier for the channel.  (Input)

  buffer
     buffer in which characters read from terminal are placed.
     (Input)

  n_chars_read
     is the actual number of characters returned.  (Output)

  mark_index
     is the number of input characters read prior to setting of the
     mark (by dsa_tty_$write_whole_string) in the input.  (Output)

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$wwwrrriiittteee

  This entry writes text to the terminal screen.

  UUUsssaaagggeee

  dcl dsa_tty_$write entry (fixed bin(35), ptr, fixed bin(21),
       fixed bin(21), fixed bin(21), fixed bin, fixed bin(35));

  call dsa_tty_$write (tty_dsa_id, buffer_ptr, offset,              |
       n_chars_to_write, n_chars_written, state, code);             |

  AAArrrggguuummmeeennntttsss

  tty_dsa_id                                                        |
     is tty's DSA session identifier for the channel.  (Input)      |

  buffer_ptr
     pointer to buffer holding data to be written.  (Input)

  offset
     offset in buffer of first character to be written.  (Input)

  n_chars_to_write
     is the number of characters supplied.  (Input)

  n_chars_written
     is the actual number of characters written.  (Output)

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  EEEnnntttrrryyy:::  dddsssaaa_ttttttyyy_$$$wwwrrriiittteee_wwwhhhooollleee_ssstttrrriiinnnggg

  This entry  is the same as  $write, except that it  guarantees to
  send the entire  buffer to the terminal as a  single unit, rather
  than sending a partial buffer.  This ensures that terminal escape
  sequences get sent to the terminal  as a single unit, rather than
  possibly  being   split  across  several  transmissions   to  the
  terminal.

  UUUsssaaagggeee

  dcl dsa_tty_$write_whole_string entry (fixed bin(35), char(*),
       bit(1), fixed bin(21), fixed bin, fixed bin(35));

| call dsa_tty_$write_whole_string (tty_dsa_id, string, mark_flag,
       n_chars_written, state, code);

  AAArrrggguuummmeeennntttsss

| tty_dsa_id
|    is tty's DSA session identifier for the channel.  (Input)

  string
     is the character string to write.  The buffer can be at most
     512 characters long.  This is the size of the video system
     output holding buffer.  (Input)

  mark_flag
     indicates whether to set a mark in the input stream to
     separate input typed prior to printing string on the terminal
     from characters typed after string is printed.  This mark
     allows type-ahead input to be separated from MORE responses.
     (Input)
     "0"b do not set mark
     "1"b set mark

  n_chars_written
     is the actual number of characters written.  This should equal
     the length of string, if writing was successful, or 0 if the
     string could not be written as a single unit.  It may also be
     some intermediate value if an unexpected error occurs.
     (Output)


  ________                                                 ________

  dsa_tty_                                                 dsa_tty_
  ________                                                 ________

  state
     indicates the tty state.  See tty_states.incl.pl1 for a list
     of possible values.  (Output)

  code
     is a standard status code.  (Output)