[an error occurred while processing this directive]

HP OpenVMS Systems Documentation

Content starts here

OpenVMS/Hangul RTL Korean Screen Management (SMG$) Manual


Previous Contents


SMG$DISABLE_BROADCAST_TRAPPING

The Disable Broadcast Trapping routine disables trapping of broadcast messages for the specified terminal.

Format

SMG$DISABLE_BROADCAST_TRAPPING pasteboard-id


RETURNS


OpenVMS usage cond_value
type longword (unsigned)
access write only
mechanism by value


Arguments

pasteboard-id


OpenVMS usage identifier
type longword (unsigned)
access read only
mechanism by reference

Specifies the pasteboard for the terminal to be affected. The pasteboard-id argument is the address of an unsigned longword that contains the pasteboard identifier.

Description

SMG$DISABLE_BROADCAST_TRAPPING disables trapping of broadcast messages for the specified terminal. SMG$DISABLE_BROADCAST_TRAPPING deassigns the mailbox set with SMG$SET_BROADCAST_TRAPPING, resets the terminal characteristics, and therefore allows the user to call LIB$SPAWN. This routine must be used to disable any broadcast trapping set with the routine SMG$SET_BROADCAST_TRAPPING.

When you disable broadcast trapping, any broadcast messages that have been queued to the terminal are lost. If you enable broadcast trapping with SMG$SET_BROADCAST_TRAPPING but do not disable it with SMG$DISABLE_BROADCAST_TRAPPING before the image exits, any messages that have been broadcast to the terminal are lost when the image exits.

Note that if both broadcast trapping and the trapping of unsolicited input are enabled, then both SMG$DISABLE_BROADCAST_TRAPPING and SMG$DISABLE_UNSOLICITED_INPUT must be invoked to deassign the mailbox.


Condition Values Returned

SS$_NORMAL Normal successful completion.
SMG$_WRONUMARG Wrong number of arguments.

Any condition value returned by $QIOW.


Example


10    !+
      !This VAX BASIC program creates three virtual displays on
      !one pasteboard.
      !
      !The first virtual display contains instructions for the user,
      !the second shows trapped unsolicited input, and the third
      !lists trapped broadcast messages. The program sits in an
      !infinite loop until the user types a CTRL/Z.
      !
      !When the program traps unsolicited input, both broadcast message
      !and unsolicited input trapping are disabled, and a subprocess
      !is spawned which executes the trapped user input.
      !
      !When control returns to the main process, broadcast trapping and
      !the trapping of unsolicited input are both reenabled. If the
      !unsolicited input which is trapped is a CTRL/Z, the program exits.
      !-

      OPTION TYPE = EXPLICIT

      !+
      !Declaration of all routines called by the main program.
      !-

      %INCLUDE "LIB$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
      %INCLUDE "SMG$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"

      !+
      !Declaration of the two AST routines:
      !GET_MSG is called when a broadcast message is trapped
      !GET_INPUT is called when there is unsolicited input
      !GET_INPUT is the routine which spawns the subprocess
      !-

      EXTERNAL INTEGER GET_MSG
      EXTERNAL INTEGER GET_INPUT

      DECLARE LONG pb_id, ret_status, display_id, display2_id, display3_id, &
                   key_id, key_tab_id, counter

      !+
      !Create a MAP area for variables which must be shared between the
      !main program and the AST routines.
      !-

      MAP (params) LONG disp_info(2), LONG keyboard_info(4), LONG done_flag

      DECLARE STRING CONSTANT top_label = "User Input"
      DECLARE STRING CONSTANT ins_label = "Instructions"
      DECLARE STRING CONSTANT msg_label = "Messages"
      DECLARE STRING CONSTANT instr_0 = "Type commands to fill INPUT display."
      DECLARE STRING CONSTANT instr_1 = "Type CTRL/T to fill MESSAGES display."
      DECLARE STRING CONSTANT instr_2 = "Type CTRL/Z to exit."
      DECLARE LONG CONSTANT   advance = 1

      %INCLUDE "$SMGDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
      %INCLUDE "$SMGMSG" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"

      !+
      !The done_flag variable is clear (0) unless the user input was
      !a CTRL/Z - in that case the program exits.
      !-
      done_flag = 0

      !+
      !Create the pasteboard and the virtual keyboard
      !-

      ret_status = SMG$CREATE_PASTEBOARD (pb_id)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      !+
      !This is one of the values which must be stored in the MAP area.
      !-

      disp_info(0) = pb_id

      ret_status = SMG$CREATE_VIRTUAL_KEYBOARD (key_id)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$CREATE_KEY_TABLE (key_tab_id)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF


      !+
      !Create the three virtual displays
      !-

      ret_status = SMG$CREATE_VIRTUAL_DISPLAY(3 BY REF, 75 BY REF, &
              display3_id, SMG$M_BORDER BY REF, SMG$M_REVERSE BY REF)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$CREATE_VIRTUAL_DISPLAY(6 BY REF, 75 BY REF, &
              display_id, SMG$M_BORDER BY REF, SMG$M_REVERSE BY REF)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$CREATE_VIRTUAL_DISPLAY(6 BY REF, 75 BY REF, &
              display2_id, SMG$M_BORDER BY REF, SMG$M_REVERSE BY REF)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      !+
      !The disp_info and keyboard_info arrays are required in the MAP.
      !-
      disp_info(1) = display2_id


      keyboard_info(0) = key_id
      keyboard_info(1) = key_tab_id
      keyboard_info(2) = display_id
      keyboard_info(4) = pb_id

      !+
      !Put Label borders around the three virtual displays.
      !-

      ret_status = SMG$LABEL_BORDER (display3_id, ins_label,,, &
              SMG$M_BOLD BY REF, SMG$M_REVERSE BY REF)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$LABEL_BORDER (display_id, top_label,,, &
              SMG$M_BOLD BY REF,)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$LABEL_BORDER (display2_id, msg_label,,, &
              SMG$M_BOLD BY REF,)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF


      !+
      !Fill the INSTRUCTIONS virtual display with user instructions.
      !-

      ret_status = SMG$PUT_LINE(display3_id, instr_0, &
              advance,,, smg$m_wrap_char)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$PUT_LINE(display3_id, instr_1, &
              advance,,, smg$m_wrap_char)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$PUT_LINE(display3_id, instr_2, &
              advance,,, smg$m_wrap_char)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF


      !+
      !Paste the virtual displays to the screen.
      !-

      ret_status = SMG$PASTE_VIRTUAL_DISPLAY(display3_id, pb_id, &
              2 BY REF, 4 BY REF)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$PASTE_VIRTUAL_DISPLAY(display_id, pb_id, &
              8 BY REF, 4 BY REF)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      ret_status = SMG$PASTE_VIRTUAL_DISPLAY(display2_id, pb_id, &
              18 BY REF, 4 BY REF)
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF


      !+
      !Enable the trapping of unsolicited input. GET_INPUT is the
      !AST procedure that is called when unsolicited input is
      !received. This AST has one parameter, passed as null.
      !-

      ret_status = SMG$ENABLE_UNSOLICITED_INPUT(pb_id, LOC(GET_INPUT))
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      !+
      !Enable the trapping of broadcast messages. GET_MSG is the
      !AST which is called when broadcast messages are received.
      !This AST outputs the trapped message into the MESSAGES display.
      !-

      ret_status = SMG$SET_BROADCAST_TRAPPING(pb_id, LOC(GET_MSG))
      IF (ret_status AND 1%) = 0% THEN
         CALL LIB$STOP(ret_status BY VALUE)
      END IF

      !+
      !This loop continually executes until done_flag is set to 1.
      !Done_flag is set to 1 when the user input is a CTRL/Z.
      !If done_flag is 1, delete the pasteboard and exit the program.
      !-

    Infinite_loop:
      IF done_flag = 0 THEN
         GOTO infinite_loop
      ELSE
         ret_status = SMG$DELETE_PASTEBOARD (pb_id)
         GOTO all_done
      END IF

   All_done:
      END

20    !+
      !Start of AST routine GET_INPUT. This AST is called whenever there
      !is unsolicited input. The unsolicited input is displayed in the
      !INPUT virtual display, and if this input is not CTRL/Z, a subprocess
      !is spawned and the input command is executed. While this spawned
      !subprocess is executing, broadcast and unsolicited input trapping
      !are disabled.
      !-

      SUB GET_INPUT (paste_id, param, nl_1, nl_2, nl_3, nl_4)

      MAP (params) LONG disp_info(2), LONG keyboard_info(4), LONG done_flag

      DECLARE LONG z_status, status2, keybd_id, keybd_tab_id, disp_id, &
                   pastebd, new_display, spawn_status
      DECLARE WORD msg2_len
      DECLARE STRING msg2
      DECLARE LONG CONSTANT next_line = 1

      %INCLUDE "SMG$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
      %INCLUDE "LIB$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
      %INCLUDE "$SMGMSG" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"

      EXTERNAL INTEGER GET_MSG
      EXTERNAL INTEGER GET_INPUT

      !+
      !Assign to the local variables the values that were stored from
      !the main program using the MAP area.
      !-

      keybd_id = keyboard_info(0)
      keybd_tab_id = keyboard_info(1)
      disp_id = keyboard_info(2)
      pastebd = keyboard_info(3)

      !+
      !SMG$ENABLE_UNSOLICITED_INPUT does not read the input, it simply
      !signals the specified AST when there is unsolicited input present.
      !You must use SMG$READ_COMPOSED_LINE to actually read the input.
      !
      !At this time, we check to see if the unsolicited input was a CTRL/Z.
      !If so, we skip over the program lines that spawn the subprocess and
      !get ready to exit the program.
      !-

      status2 = SMG$READ_COMPOSED_LINE (keybd_id, keybd_tab_id, msg2,, &
                 msg2_len, disp_id)
      IF (status2 = SMG$_EOF) THEN
         GOTO Control_Z
      END IF

      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF

      !+
      !In order to spawn a subprocess, we must first disable
      !unsolicited input trapping and broadcast trapping.
      !-

      status2 = SMG$DISABLE_UNSOLICITED_INPUT (pastebd)
      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF

      status2 = SMG$DISABLE_BROADCAST_TRAPPING (pastebd)
      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF


      !+
      !Save the current screen so that it will not be destroyed when
      !the subprocess is executing.
      !-

      status2 = SMG$SAVE_PHYSICAL_SCREEN (pastebd, new_display)
      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF

      !+
      !Call LIB$SPAWN to create the subprocess, and pass the unsolicited
      !input as the command line.
      !-

      spawn_status = LIB$SPAWN (msg2)

      !+
      !Restore the saved screen image.
      !-

      status2 = SMG$RESTORE_PHYSICAL_SCREEN (pastebd, new_display)
      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF

      !+
      !Reenable broadcast trapping and unsolicited input trapping.
      !-

      status2 = SMG$ENABLE_UNSOLICITED_INPUT (pastebd, LOC(GET_INPUT))
      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF

      status2 = SMG$SET_BROADCAST_TRAPPING (pastebd, LOC(GET_MSG))
      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF

      !+
      !Skip the steps which are performed if the unsolicited input
      !was a CTRL/Z.
      !-

      GOTO Out_of_sub

    Control_Z:
      !+
      !We should disable unsolicited input and broadcast trapping
      !before we leave the program.
      !-

      status2 = SMG$DISABLE_UNSOLICITED_INPUT (pastebd)
      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF
      status2 = SMG$DISABLE_BROADCAST_TRAPPING (pastebd)
      IF (status2 AND 1%) = 0% THEN
         CALL LIB$STOP (status2 BY VALUE)
      END IF

      !+
      !Set the done_flag to 1 so that the main program knows we have
      !to exit.
      !-

      done_flag = 1

    Out_of_sub:
      END SUB

30    !+
      !Start of AST routine GET_MSG. This AST is called whenever there
      !is a broadcast message. This routine prints the message in the
      !MESSAGES virtual display.
      !-

      SUB GET_MSG (paste_id, nl_1, nl_2, nl_3, nl_4)
      DECLARE LONG status1, pasteboard, second_disp
      DECLARE WORD msg_len
      DECLARE STRING msg
      DECLARE LONG CONSTANT forward = 1

      MAP (params) LONG disp_info(2), LONG keyboard_info(4)

      %INCLUDE "SMG$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
      %INCLUDE "LIB$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
      %INCLUDE "$SMGDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
      %INCLUDE "$SMGMSG" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"

      !+
      !Assign values to the local variables according to the values stored
      !in the MAP area.
      !-

      pasteboard  = disp_info(0)
      second_disp = disp_info(1)

      !+
      !Print the trapped message in the MESSAGES display. If there are no
      !more messages, go back to the infinite loop in the main program.
      !-

      WHILE 1
            status1 = SMG$GET_BROADCAST_MESSAGE (pasteboard, msg, msg_len)
            IF (status1 = SMG$_NO_MORMSG) THEN
               GOTO Exitloop
            END IF
            IF (status1 AND 1%) = 0% THEN
               CALL LIB$STOP (status1 BY VALUE)
            END IF

            status1 = SMG$PUT_LINE (second_disp, msg, &
                                    forward,,, SMG$M_WRAP_CHAR)
            IF (status1 AND 1%) = 0% THEN
               CALL LIB$STOP (status1 BY VALUE)
            END IF
      NEXT
  Exitloop:
      END SUB


      

To run the example program, use the following commands.


$ BASIC TRAPPING
$ LINK TRAPPING
$ RUN TRAPPING

The output for this program is illustrated in the following figures. In Figure SMG-14, the program is waiting for either unsolicited input or broadcast messages.

Figure SMG-14 Output Generated Before Any Input or Messages Are Trapped


The output generated after the user types a Ctrl/T is shown in Figure SMG-15.

Figure SMG-15 Output Generated After a Broadcast Message Is Trapped


If the user types a command, that command is displayed in the INPUT display, and a subprocess is spawned. The output generated after the user types the command MAIL is shown in Figure SMG-16.

Figure SMG-16 Output Generated After a Call to LIB$SPAWN


Once the subprocess completes execution, control is returned to the main process. At this point, the screen is repainted and the program continues to wait for broadcast messages or unsolicited input. The user must type a Ctrl/Z to exit the program.


SMG$DISABLE_UNSOLICITED_INPUT

The Disable Unsolicited Input routine disables the trapping of unsolicited input.

Format

SMG$DISABLE_UNSOLICITED_INPUT pasteboard-id


RETURNS


OpenVMS usage cond_value
type longword (unsigned)
access write only
mechanism by value


Arguments

pasteboard-id


OpenVMS usage identifier
type longword (unsigned)
access read only
mechanism by reference

Specifies the keyboard (associated with the specified pasteboard) for which unsolicited input is being disabled. The pasteboard-id argument is the address of an unsigned longword that contains the pasteboard identifier.

Pasteboard-id is returned by SMG$CREATE_PASTEBOARD.


Description

SMG$DISABLE_UNSOLICITED_INPUT disables unsolicited input ASTs for the specified pasteboard. SMG$DISABLE_UNSOLICITED_INPUT deassigns the mailbox set with SMG$ENABLE_UNSOLICITED_INPUT, resets the terminal characteristics, and therefore allows the user to call LIB$SPAWN. This routine must be used to disable any unsolicited input trapping enabled with the SMG$ENABLE_UNSOLICITED_INPUT routine.

Note that if both unsolicited input trapping and the trapping of broadcast messages are enabled, then both SMG$DISABLE_UNSOLICITED_INPUT and SMG$DISABLE_BROADCAST_TRAPPING must be invoked in order to deassign the mailbox.


Condition Values Returned

SS$_NORMAL Normal successful completion.
SMG$_WRONUMARG Wrong number of arguments.
SMG$_INVPAS_ID Invalid pasteboard-id.

Any condition values returned by $QIOW.


Example


      

For an example of using SMG$DISABLE_UNSOLICITED_INPUT, see the example for the routine SMG$DISABLE_BROADCAST_TRAPPING.


SMG$DRAW_CHAR

The Draw a Character in a Virtual Display routine draws a character at the specified position in a virtual display.

Format

SMG$DRAW_CHAR display-id ,flags [,row] [,column] [,rendition-set] [,rendition-complement]


RETURNS


OpenVMS usage cond_value
type longword (unsigned)
access write only
mechanism by value


Arguments

display-id


OpenVMS usage identifier
type longword (unsigned)
access read only
mechanism by reference

Identifier of the virtual display. The display-id argument is the address of an unsigned longword containing this identifier.

flags


OpenVMS usage mask_longword
type longword (unsigned)
access read only
mechanism by reference

Optional bit mask indicating the character to be drawn. The flags argument is the address of an unsigned longword that contains the flag. Flags accepts the following character values:
  • SMG$M_UP
  • SMG$M_DOWN
  • SMG$M_LEFT
  • SMG$M_RIGHT

Note that you may perform a logical OR operation to draw T characters, corner characters, cross characters, and so forth. A value of 0 draws a diamond character.

row


OpenVMS usage longword_signed
type longword (signed)
access read only
mechanism by reference

Optional row number specifying the row position at which the specified character is drawn. The row argument is the address of a signed longword containing the row number. If row is omitted, the character is drawn at the row position of the current virtual cursor.

column


OpenVMS usage longword_signed
type longword (signed)
access read only
mechanism by reference

Optional column number specifying the column position at which the specified character is drawn. The column argument is the address of a signed longword containing the column number. If column is omitted, the character is drawn at the column position of the current virtual cursor.

In case that the column is on the right portion of a Korean character, the left portion of the character will become an undefined character. Also if it's on the left portion of a Korean character, the right portion of the character will become an undefined character.

rendition-set


OpenVMS usage mask_longword
type longword (unsigned)
access read only
mechanism by reference

Attribute specifier. The optional rendition-set argument is the address of a longword bit mask in which each attribute set causes the corresponding attribute to be set in the display. The following attributes can be specified using the rendition-set argument:
SMG$M_BLINK Displays blinking characters.
SMG$M_BOLD Displays characters in higher-than-normal intensity.
SMG$M_REVERSE Displays characters in reverse video, that is, using the opposite of the default rendition of the virtual display.
SMG$M_UNDERLINE Displays underlined characters.
SMG$M_INVISIBLE Specifies invisible characters; that is, the characters exist in the virtual display but do not appear on the pasteboard.
SMG$M_USER1 through SMG$M_USER8 Displays user-defined attributes.

The display-id argument must be specified when you use the rendition-set argument.

rendition-complement


OpenVMS usage mask_longword
type longword (unsigned)
access read only
mechanism by reference

Attribute complement specifier. The optional rendition-complement argument is the address of a longword bit mask in which each attribute set causes the corresponding attribute to be complemented in the display. All of the attributes that can be specified with the rendition-set argument can be complemented with the rendition-complement argument. The display-id argument must be specified when you use the rendition-complement argument.

The optional arguments rendition-set and rendition-complement let the user control the attributes of the virtual display. The rendition-set argument sets certain virtual display attributes, while rendition-complement complements these attributes. If the same bit is specified in both the rendition-set and rendition-complement parameters, rendition-set is evaluated first, followed by rendition-complement. By using these two parameters together, the user can control each virtual display attribute in a single procedure call. On a single-attribute basis, the user can cause the following transformations:

Set Complement Action
0 0 Attribute set to default
1 0 Attribute on
0 1 Attribute set to complement of default setting
1 1 Attribute off

Description

SMG$DRAW_CHAR draws a designated character at the specified position in the specified virtual display. Note that this routine does not change the position of the virtual cursor. The characters drawn depend on the type of terminal. For example, SMG$ uses the terminal's line-drawing character set if possible. If that is not available, SMG$ will use the characters +, -, and | to draw a line.

In case that the Korean language character set is used, and the column is on the right portion of a Korean character, the left portion of the character will become an undefined character. Also if it's on the left portion of a Korean character, the right portion of the character will become an undefined character.


Condition Values Returned

SS$_NORMAL Normal successful completion.
SMG$_INVCOL Invalid column number.
SMG$_INVROW Invalid row number.
SMG$_WRONUMARG Wrong number of arguments.

Example


C+
C This DEC Fortran example demonstrates the use of
C SMG$DRAW_CHAR to use the terminal line drawing
C characters.
C-
        IMPLICIT INTEGER (A-Z)
        INCLUDE '($SMGDEF)'

        s = SMG$CREATE_PASTEBOARD(p_id)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$CREATE_VIRTUAL_DISPLAY(17,7,d_id,SMG$M_BORDER)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$PASTE_VIRTUAL_DISPLAY(d_id,p_id,4,30)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$SET_CURSOR_REL(d_id,1,3)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))

        s = SMG$DRAW_CHAR(d_id,SMG$M_UP,1,4,SMG$M_BOLD)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_DOWN,2,4,0,SMG$M_REVERSE)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_LEFT,3,4,SMG$M_BLINK)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_RIGHT,4,4,0,0)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_UP + SMG$M_DOWN,5)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_UP + SMG$M_LEFT,6)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_UP + SMG$M_RIGHT,7)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_DOWN + SMG$M_LEFT,8)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_DOWN + SMG$M_RIGHT,9)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_LEFT + SMG$M_RIGHT,10)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_UP + SMG$M_DOWN + SMG$M_LEFT,11)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_UP + SMG$M_DOWN + SMG$M_RIGHT,12)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_DOWN + SMG$M_LEFT + SMG$M_RIGHT,13)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_UP + SMG$M_LEFT + SMG$M_RIGHT,14)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,SMG$M_UP + SMG$M_DOWN + SMG$M_RIGHT +
     1          SMG$M_LEFT, 15)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))
        s = SMG$DRAW_CHAR(d_id,0,16)
        IF (.NOT. s) CALL LIB$SIGNAL(%VAL(s))

        END

      


Previous Next Contents