1 Introduction
2 Ground Rules

Building a File System
3 File Systems
4 File Content Data Structure
5 Allocation Cluster Manager
6 Exceptions and Emancipation
7 Base Classes, Testing, and More
8 File Meta Data
9 Native File Class
10 Our File System
11 Allocation Table
12 File System Support Code
13 Initializing the File System
14 Contiguous Files
15 Rebuilding the File System
16 Native File System Support Methods
17 Lookups, Wildcards, and Unicode, Oh My
18 Finishing the File System Class

The Init Program
19 Hardware Abstraction and UOS Architecture
20 Init Command Mode
21 Using Our File System
22 Hardware and Device Lists
23 Fun with Stores: Partitions
24 Fun with Stores: RAID
25 Fun with Stores: RAM Disks
26 Init wrap-up

The Executive
27 Overview of The Executive
28 Starting the Kernel
29 The Kernel
30 Making a Store Bootable
31 The MMC
32 The HMC
33 Loading the components
34 Using the File Processor
35 Symbols and the SSC
36 The File Processor and Device Management
37 The File Processor and File System Management
38 Finishing Executive Startup

Users and Security
39 Introduction to Users and Security
40 More Fun With Stores: File Heaps
41 File Heaps, part 2
42 SysUAF
43 TUser
44 SysUAF API

Terminal I/O
45 Shells and UCL
46 UOS API, the Application Side
47 UOS API, the Executive Side
48 I/O Devices
49 Streams
50 Terminal Output Filters
51 The TTerminal Class
52 Handles
53 Putting it All Together
54 Getting Terminal Input
55 QIO
56 Cooking Terminal Input
57 Putting it all together, part 2
58 Quotas and I/O

UCL
59 UCL Basics
60 Symbol Substitution
61 Command execution
62 Command execution, part 2
63 Command Abbreviation
64 ASTs
65 Expressions, Part 1
66 Expressions, Part 2: Support code
67 Expressions, part 3: Parsing
68 SYS_GETJPIW and SYS_TRNLNM
69 Expressions, part 4: Evaluation

UCL Lexical Functions
70 PROCESS_SCAN
71 PROCESS_SCAN, Part 2
72 TProcess updates
73 Unicode revisted
74 Lexical functions: F$CONTEXT
75 Lexical functions: F$PID
76 Lexical Functions: F$CUNITS
77 Lexical Functions: F$CVSI and F$CVUI
78 UOS Date and Time Formatting
79 Lexical Functions: F$CVTIME
80 LIB_CVTIME
81 Date/Time Contexts
82 SYS_GETTIM, LIB_Get_Timestamp, SYS_ASCTIM, and LIB_SYS_ASCTIM
83 Lexical Functions: F$DELTA_TIME
84 Lexical functions: F$DEVICE
85 SYS_DEVICE_SCAN
86 Lexical functions: F$DIRECTORY
87 Lexical functions: F$EDIT and F$ELEMENT
88 Lexical functions: F$ENVIRONMENT
89 SYS_GETUAI
90 Lexical functions: F$EXTRACT and F$IDENTIFIER
91 LIB_FAO and LIB_FAOL
92 LIB_FAO and LIB_FAOL, part 2
93 Lexical functions: F$FAO
94 File Processing Structures
95 Lexical functions: F$FILE_ATTRIBUTES
96 SYS_DISPLAY
97 Lexical functions: F$GETDVI
98 Parse_GetDVI
99 GetDVI
100 GetDVI, part 2
101 GetDVI, part 3
102 Lexical functions: F$GETJPI
103 GETJPI
104 Lexical functions: F$GETSYI
105 GETSYI
106 Lexical functions: F$INTEGER, F$LENGTH, F$LOCATE, and F$MATCH_WILD
107 Lexical function: F$PARSE
108 FILESCAN
109 SYS_PARSE
110 Lexical Functions: F$MODE, F$PRIVILEGE, and F$PROCESS
111 File Lookup Service
112 Lexical Functions: F$SEARCH
113 SYS_SEARCH
114 F$SETPRV and SYS_SETPRV
115 Lexical Functions: F$STRING, F$TIME, and F$TYPE
116 More on symbols
117 Lexical Functions: F$TRNLNM
118 SYS_TRNLNM, Part 2
119 Lexical functions: F$UNIQUE, F$USER, and F$VERIFY
120 Lexical functions: F$MESSAGE
121 TUOS_File_Wrapper
122 OPEN, CLOSE, and READ system services

UCL Commands
123 WRITE
124 Symbol assignment
125 The @ command
126 @ and EXIT
127 CRELNT system service
128 DELLNT system service
129 IF...THEN...ELSE
130 Comments, labels, and GOTO
131 GOSUB and RETURN
132 CALL, SUBROUTINE, and ENDSUBROUTINE
133 ON, SET {NO}ON, and error handling
134 INQUIRE
135 SYS_WRITE Service
136 OPEN
137 CLOSE
138 DELLNM system service
139 READ
140 Command Recall
141 RECALL
142 RUN
143 LIB_RUN
144 The Data Stream Interface
145 Preparing for execution
146 EOJ and LOGOUT
147 SYS_DELPROC and LIB_GET_FOREIGN

CUSPs and utilities
148 The I/O Queue
149 Timers
150 Logging in, part one
151 Logging in, part 2
152 System configuration
153 SET NODE utility
154 UUI
155 SETTERM utility
156 SETTERM utility, part 2
157 SETTERM utility, part 3
158 AUTHORIZE utility
159 AUTHORIZE utility, UI
160 AUTHORIZE utility, Access Restrictions
161 AUTHORIZE utility, Part 4
162 AUTHORIZE utility, Reporting
163 AUTHORIZE utility, Part 6
164 Authentication
165 Hashlib
166 Authenticate, Part 7
167 Logging in, part 3
168 DAY_OF_WEEK, CVT_FROM_INTERNAL_TIME, and SPAWN
169 DAY_OF_WEEK and CVT_FROM_INTERNAL_TIME
170 LIB_SPAWN
171 CREPRC
172 CREPRC, Part 2
173 COPY
174 COPY, part 2
175 COPY, part 3
176 COPY, part 4
177 LIB_Get_Default_File_Protection and LIB_Substitute_Wildcards
178 CREATESTREAM, STREAMNAME, and Set_Contiguous
179 Help Files
180 LBR Services
181 LBR Services, Part 2
182 LIBRARY utility
183 LIBRARY utility, Part 2
184 FS Services
185 FS Services, Part 2
186 Implementing Help
187 HELP
188 HELP, Part 2
189 DMG_Get_Key and LIB_Put_Formatted_Output
190 LIBRARY utility, Part 3
191 Shutting Down UOS
192 SHUTDOWN
193 WAIT
194 SETIMR
195 WAITFR and Scheduling
196 REPLY, OPCOM, and Mailboxes
197 REPLY utility
198 Mailboxes
199 BRKTHRU
200 OPCOM

Glossary/Index


Downloads

SETTERM utility

The next CUSP that we are looking at is SETTERM, which is used to change terminal settings. There are some special VMS cases that we don't handle (such as DDMP), and some of the options indicate features that we may never support in UOS, but are there to set flags that applications can query (such as Regis graphics). Many of the features are for specific hardware which may not even be in use any more, but we support them for two reasons: 1) VMS supports the hardware, so UOS will also, but more important: 2) Virtual terminals may emulate these features. As mentioned in a previous article, we won't be addressing autobaud detection at this time, but we will set the appropriate terminal characteristics based on the options provided by the user. Here is the user documentation:

SET TERMINAL

Sets the characteristics of a terminal. Specifying a switch changes a characteristic while omitting a switch leaves the characteristic unmodified.

Format

SET TERMINAL {devicename{:}} {switches}

Description

The SET TERMINAL utility modifies terminal characteristics. Modifications to remote terminals are reset when the terminal "hangs up". If no device is specified, the process' attached terminal is affected.

Switches

/ADVANCED_VIDEO
/NOADVANCED_VIDEO

This is only for physical terminals. If /ADVANCED_VIDEO is specified, the terminal is set to 24 lines. If /NOADVANCED_VIDEO is specified, the terminal is set to 14 lines.

/ALTYPEAHD=n
Sets the terminal's type-ahead buffer to the specified number of bytes. This is only effective until the system is rebooted or another /ALTYPEAHD is specified.

ANSI_CRT (default)
/NOANSI_CRT

Controls whether or not the terminal responds to VT100 escape sequences.

/APPLICATION_KEYPAD
Specified that the terminal's keypad be set to application mode. By default, the keypad is numeric.

/AUTOBAUD
/NOAUTOBAUD

Controls whether the terminal baud rate is set when you log in. The default rate is 9600. Pressing Enter two or more times at intervals of at least 1 second will cause the baud rate to be detected. Any other characters may result in an incorrect baud rate being set until the LOGIN program terminates.

/BACKSPACE=keyword
Controls how the backspace (Ctrl+H) character is treated. The possible keywords are: BACKSPACE - Returns the cursor/printhead to return to the start of the line.
DELETE (default) - Backspaces are interpreted as Delete characters.

/BLOCK_MODE
/NOBLOCK_MODE

Controls whether or not block mode transmission, local editing, and field protection are performed.

/BRDCSTMBX
/NOBRDCSTMBX

Controls whether or not broadcast messages are sent to an associated mailbox, if one exists.

/BROADCAST (default)
/NOBROADCAST

Controls whether or not reception of broadcast messages is enabled. /NOBROADCAST should be used on terminals that shouldn't have broadcast text displayed, such as a printer connected to a terminal port.

/COLOR
/NOCOLOR

Identifies the terminal has being able to support ANSI color escape sequences, or not.

/COMMSYNC
/NOCOMMSYNC (default)

Indicates that the terminal flow control should be done via DSR/CTS hardward signals rather than XON/XOFF.

/CRFILL{=count}
Specifies the number of null characters transmitted after each carriage return. The default is /CRFILL=0.

/DEC_CRT{=(value1,value2,value3)}
/NODEC_CRT{=(value1,value2,value3)}

Defines which kind of DEC escape sequences are handled by the terminal. The following values are allowed:
ValueDescription
1Sets DEC_CRT characteristics
2Sets DEC_CRT2 characteristics
3Sets DEC_CRT3 characteristics
4Sets DEC_CRT4 characteristics
The default is /DEC_CRT=1.

/DEVICE_TYPE=terminaltype
Sets the terminal characteristic according to the terminaltype specified.

/DIALUP
/NODIALUP (default)

Controls whether or not the terminal is a dialup terminal.

/DISCONNECT
/NODISCONNECT (default)

Controls whether or not the process is detached when a terminal "hang up" is detected. /DISCONNECT is only valid when the /PERMANENT switch is used.

/DISMISS
/NODISMISS

Controls whether or not parity errors on a serial line are ignored (dismissed) or terminate the current I/O with an error.

/DMA
/NODMA

Controls whether or not direct memory access (DMA) is used for devices that support it.

/ECHO (default)
/NOECHO

Indicates whether or not terminal input is echoed back to the terminal. With /NOECHO, the terminal displays only system or applications output.

/EDIT_MODE
/NOEDIT_MODE

Controls whether or not ANSI editing functions are handled by the terminal.

/EIGHT_BIT
/NOEIGHT_BIT

Controls whether the serial terminal line supports 8 data bits or only 7.

/ESCAPE
/NOESCAPE (default)

Controls whether or not escape sequences are validated.

/FALLBACK
/NOFALLBACK

Controls whether 8-bit DEC Multinational character set characters are displayed on the terminal in their 7-bit representation. This only has meaning of terminal fallback is supported on the system.

/FORM
/NOFORM

Controls whether or not a form feed is transmitted rather than multiple linefeeds.

/FRAME=n
Indicates the number of data bits for serial terminals. The value must be from 5 to 8, inclusive. The default value depends on the values specied by /EIGHT_BIT and /PARITY.

/FULLDUP (default)
/NOFULLDUP

Determines whether or not the terminal operates in full duplex mode. This is the inverse of /HALFDUP and /NOHALFDUP.

/HALFDUP
/NOHALFDUP

Determines whether or not the terminal operates in half-duplex mode. This is the inverse of /FULLDUP and /NOFULLDUP.

/HANGUP
/NOHANGUP (default)

Note: May require LOG_IO or PHY_IO privilege.
Controls whether or not the modem is hung up when a process logs out. Only applies to serial lines connected to modems or remote terminals.

/HARDCOPY
/NOHARDCOPY

Indicates whether or not a terminal is a hardcopy terminal. This is the inverse of /SCOPE and /NOSCOPE.

/HOSTSYNC
/NOHOSTSYNC (default)

Controls whether or not the computer sends XON and XOFF to handle flow control.

/INQUIRE
/INQUIRE=OLD

When the DEC_CRT characteristic is set, this sends an identification escape sequence to the terminal, and the terminal characteristics are set according to the response received from the terminal. /INQUIRE=OLD doesn't query the terminal, instead setting the screen height to 24 rows and the width to 80 columns.

/INSERT
Sets the terminal to insert mode. Ctrl+A can be used to toggle between insert and overwrite mode.

/LFFILL=count
Sets the number of nulls output to the terminal after each linefeed character. The default is /LFFILL=0.

/LINE_EDITING
/NOLINE_EDITING

Sets or clears the line editing capabilities of the terminal.

/LOCAL_ECHO
/NOLOCAL_ECHO (default)

/LOCAL_ECHO is the same as /NOECHO and /NOLOCAL_ECHO is the same as /ECHO.

/LOWERCASE
/NOLOWERCASE

/NOLOWERCASE translates all incoming characters to uppercase. This switch is the inverse of /UPPERCASE and /NOUPPERCASE.

/MODEM
/NOMODEM

Indicates whether or not the terminal is connected via a modem.

/NUMERIC_KEYPAD (default)
Indicates that the keys of the numeric keypad are treated as numbers. This only has an effect on DEC_CRT terminals.

/OVERSTRIKE
Puts the terminal in overstrike mode. Ctrl+A switches between insert and overstrike modes.

/PAGE{=lines}
Specifies the page size, in rows, for hardcopy terminals. The default is /PAGE=0, which uses a Formfeed to advance to the next page.

/PARITY{=option}
/NOPARITY (default)

Sets a serial line to use the specified parity. The options are ODD and EVEN. The default is EVEN.

/PASTHRU
/NOPASTHRU (default)

Determines whether or not terminal input is accepted uncooked (passthru) or cooked (nopassthru).

/PERMANENT
Note: Requires LOG_IO or PHY_IO privilege.
Makes the characteristics permanent - that is, across terminal sessions. However, these changes do not persist across reboots.

/PRINTER_PORT
/NOPRINTER_PORT

Defines whether or not a terminal has a printer port.

/READSYNC
/NOREADSYNC (default)

Defines whether the terminal uses XOFF/XON flow control. By default, XOFF/XON is accepted from terminals for flow control.

/REGIS
/NOREGIS (default)

Specifies whether or not the terminal understands ReGIS graphic commands.

/SCOPE
/NOSCOPE

Determines whether or not a terminal is a video terminal. This is the inverse of the /NOHARDCOPY and /HARDCOPY comands. Most terminals default to /NOSCOPE unless there is an integrated terminal on the system (such as a PC).

/SECURE_SERVER
/NOSECURE_SERVER (default)

Note: Requires LOG_IO or PHY_IO privilege.
Controls whether or not the Break key on the terminal logs the current process out. When set, Break will terminate a logged-in process or begin a login of an unattached terminal.

/SET_SPEED
/NOSET_SPEED

Note: Requires LOG_IO or PHY_IO privilege.
Controls whether or not the /SPEED switch can be used to change the terminal speed.

/SIXEL_GRAPHICS
/NOSIXEL_GRAPHICS (default)

Specifies whether or not a terminal is capable of displaying graphics using the sixel graphics protocol.

/SOFT_CHARACTERS
/NOSOFT_CHARACTERS (default)

Specifies whether or not the terminal is capable of loading user-defined character sets.

/SPEED=rate
/SPEED=(inputrate,outputrate)

Sets the baud rate of the terminal. Remote (non-serial/modem) and virtual terminals have no baud rates and this switch has no effect on them. If only one rate is specified, both input and output rates are set to that.

/SYSPASSWORD
/NOSYSPASSWORD (default)

Note: Requires LOG_IO privilege.
Defines whether or not the terminal requires a system password be entered before the Username: prompt.

/TAB (default)
/NOTAB

Defines whether tab characters are sent as-is (the default) or converted to spaces before being sent to the terminal.

/TTSYNC (default)
/NOTTSYNC

Defines whether or not output to the terminal is controlled by XON/XOFF flow control.

/TYPE_AHEAD (default)
/NOTYPE_AHEAD

Controls whether or not the terminal accepts unsolicited input (up to the limit of the type-ahead buffer size). /NOTYPE_AHEAD means that input from the terminal is not accepted until software issues a read command from the terminal.

/UNKNOWN
Specifies that the terminal is an unknown type. This sets it to the baseline default terminal settings.

/UPPERCASE
/NOUPPERCASE (default)

Specifies whether or not lowercase characters are converted to uppercase characters before being output to the terminal. This is the inverse of the /NOLOWERCASE and /LOWERCASE switches.

/WIDTH=columns
Specifies the number of columns displayed on one line on the terminal. If the specified with is 132 on an ANSI terminal (DEC_CRT) and without advanced video option, the screen height is set to 14 lines.

/WRAP (default)
/NOWRAP

Specifies whether or not a carriage return and line feed (CRLF) are sent to the terminal after output exceeds the current terminal width setting.

Examples

$ SET TERMINAL/HARDCOPY/NOBROADCAST/WIDTH=132/PAGE=66
$ SET TERMINAL/DEVICE=VT100
In the first example, the terminal is being set up as a hardcopy printer with 66 lines per page and 132 columns. The second example sets the terminal to settings that match the characteristics of a VT100 terminal.

Privileges required

LOG_IO (depending upon operation)
PHY_IO (depending upon operation)

const UI =  'object Main:rectangle' + CR +
            '  top = 2' + CR +
            '  object label:label' + CR +
            '    text = "Device:"' + CR +
            '    top = $margin' + CR +
            '    left = $margin' + CR +
            '  end' + CR +
            '  object device:string' + CR +
            '    hint = "Device"' + CR +
            '    top = $margin' + CR +
            '    left = label.width + $margin' + CR +
            '  end' + CR +
            '  object Options:rectangle' + CR +
            '    object Inquire:action' + CR +
            '      text = "Inquire"' + CR +
            '      hint = "Click to query terminal for type"' + CR +
            '    end' + CR +
            '    object Unknown:action' + CR +
            '      text = "Set terminal to unknown"' + CR +
            '      hint = "Click to set terminal to unknown"' + CR +
            '    end' + CR +
            '    object device_Type:list' + CR +
            '      text = ""' + CR +
            '    end' + CR +
            '    object Advanced_Video:boolean' + CR +
            '      text = "Advanced video"' + CR +
            '      truehint = "Click to allow advanced video"' + CR +
            '      falsehint = "Click to disallow advanced video"' + CR +
            '    end' + CR +
            '    object label1:label' + CR +
            '      text = "Type-ahead buffer size"' + CR +
            '    end' + CR +
            '    object Altypeahd:integer' + CR +
            '      left = label1.width + $margin' + CR +
            '      hint = "Set type-ahead buffer size"' + CR +
            '      text = 0' + CR +
            '    end' + CR +
            '    object ANSI_CRT:boolean' + CR +
            '      text = "ANSI CRT"' + CR +
            '      truehint = "Click to allow VT100 escape sequences"' + CR +
            '      falsehint = "Click to not allow VT100 escape sequences"' + CR +
            '    end' + CR +
            '    object Appliation_Keypad:boolean' + CR +
            '      text = "Application Keypad"' + CR +
            '      truehint = "Click to set terminal''s keypad to application mode"' + CR +
            '      falsehint = "Click to set terminal''s keypad to application mode" ' + CR +
            '    end' + CR +
            '    object Autobaud:boolean' + CR +
            '      text = "Autobaud"' + CR +
            '      hint = "Determine baud rate at login"' + CR +
            '    end' + CR +
            '    object label2:label' + CR +
            '      text = "Backspace handling"' + CR +
            '    end' + CR +
            '    object Backspace:list' + CR +
            '      left = label2.width + $margin' + CR +
            '      hint = "Backspace handling"' + CR +
            '      list = "Backspace", "Delete"' + CR +
            '      text = "Delete"' + CR +
            '      type = constrained' + CR +
            '    end' + CR +
            '    object Block_mode:boolean' + CR +
            '      text = "Block mode"' + CR +
            '      truehint = "Click to set terminal to block mode"' + CR +
            '      falsehint = "Click to set terminal to non-block mode"' + CR +
            '    end' + CR +
            '    object Brdcstmbx:boolean' + CR +
            '      text = "Block mode"' + CR +
            '      truehint = "Click to send broadcast messages to associated mailbox"' + CR +
            '      falsehint = "Click to broadcast messages to terminal"' + CR +
            '    end' + CR +
            '    object Broadcast:boolean' + CR +
            '      text = "Broadcast"' + CR +
            '      falsehint = "Click to disable broadcast messages to terminal"' + CR +
            '      truehint = "Click to enable broadcast messages to terminal"' + CR +
            '    end' + CR +
            '    object Color:boolean' + CR +
            '      text = "Color"' + CR +
            '      falsehint = "Click to enable color support on terminal"' + CR +
            '      truehint = "Click to disable color support to terminal"' + CR +
            '    end' + CR +
            '    object Commsync:boolean' + CR +
            '      text = "Commsync"' + CR +
            '      falsehint = "Click to enable hardware flow control"' + CR +
            '      truehint = "Click to disable hardware flow control"' + CR +
            '    end' + CR +
            '    object label3:label' + CR +
            '      text = "CR Fill"' + CR +
            '    end' + CR +
            '    object CRFill:integer' + CR +
            '      left = label3.width + $margin' + CR +
            '      hint = "Number of fill characters after CR"' + CR +
            '      text = 0' + CR +
            '    end' + CR +
            '    object CRT_Options:rectangle' + CR +
            '      text = "Backspace handling"' + CR +
            '      hint = "Which DEC escape sequences are handled by terminal"' + CR +
            '      object DEC_CRT:boolean' + CR +
            '        text = "DEC_CRT"' + CR +
            '        selected' + CR +
            '      end' + CR +
            '      object DEC_CRT2:boolean' + CR +
            '        text = "DEC_CRT2"' + CR +
            '      end' + CR +
            '      object DEC_CRT3:boolean' + CR +
            '        text = "DEC_CRT3"' + CR +
            '      end' + CR +
            '      object DEC_CRT4:boolean' + CR +
            '        text = "DEC_CRT4"' + CR +
            '      end' + CR +
            '    end' + CR +
            '    object Dialup:boolean' + CR +
            '      text = "Dialup"' + CR +
            '      falsehint = "Click to enable modem control"' + CR +
            '      truehint = "Click to disable modem control"' + CR +
            '    end' + CR +
            '    object Disconnect:boolean' + CR +
            '      text = "Disconnect"' + CR +
            '      falsehint = "Click to detach process when hung up"' + CR +
            '      truehint = "Click to kill process when hung up"' + CR +
            '    end' + CR +
            '    object Dismiss:boolean' + CR +
            '      text = "Dismiss"' + CR +
            '      falsehint = "Click to terminate I/O on error"' + CR +
            '      truehint = "Click to skip serial I/O errors"' + CR +
            '    end' + CR +
            '    object DMA:boolean' + CR +
            '      text = "DMA"' + CR +
            '      falsehint = "Click to enable DMA"' + CR +
            '      truehint = "Click to disable DMA"' + CR +
            '    end' + CR +
            '    object Echo:boolean' + CR +
            '      text = "Echo"' + CR +
            '      falsehint = "Click to enable echo"' + CR +
            '      truehint = "Click to disable echo"' + CR +
            '      inverse = Localecho' + CR +
            '    end' + CR +
            '    object Edit_mode:boolean' + CR +
            '      text = "Edit mode"' + CR +
            '      falsehint = "Click to enable edit mode"' + CR +
            '      truehint = "Click to disable edit mode"' + CR +
            '    end' + CR +
            '    object Eight_bit:boolean' + CR +
            '      text = "Eight bits"' + CR +
            '      falsehint = "Click to switch to 8 data bits"' + CR +
            '      truehint = "Click to switch to 7 data bits"' + CR +
            '    end' + CR +
            '    object Escape:boolean' + CR +
            '      text = "Escape"' + CR +
            '      falsehint = "Click to enable escape sequence validation"' + CR +
            '      truehint = "Click to disable escape sequence validation"' + CR +
            '    end' + CR +
            '    object Fallback:boolean' + CR +
            '      text = "Fallback"' + CR +
            '      falsehint = "Click to enable terminal fallback"' + CR +
            '      truehint = "Click to disable terminal fallback"' + CR +
            '    end' + CR +
            '    object Form:boolean' + CR +
            '      text = "Form"' + CR +
            '      falsehint = "Click to transmit literal form feeds"' + CR +
            '      truehint = "Click to simulate form feeds with line feeds"' + CR +
            '    end' + CR +
            '    object label4:label' + CR +
            '      text = "Frame size"' + CR +
            '    end' + CR +
            '    object Frame:integer' + CR +
            '      left = label4.width + $margin' + CR +
            '      hint = "Data bits"' + CR +
            '      text = 8' + CR +
            '      minimum = 5' + CR +
            '      maximum = 8' + CR +
            '    end' + CR +
            '    object Fulldup:boolean' + CR +
            '      text = "Full duplex"' + CR +
            '      falsehint = "Click to set the terminal to full duplex mode"' + CR +
            '      truehint = "Click to set the terminal to half duplex mode"' + CR +
            '      inverse = halfdup' + CR +
            '    end' + CR +
            '    object Halfdup:boolean' + CR +
            '      text = "Full duplex"' + CR +
            '      falsehint = "Click to set the terminal to half duplex mode"' + CR +
            '      truehint = "Click to set the terminal to full duplex mode"' + CR +
            '      visible = false' + CR +
            '      inverse = Fulldup' + CR +
            '    end' + CR +
            '    object Form:boolean' + CR +
            '      text = "Form"' + CR +
            '      falsehint = "Click to transmit literal form feeds"' + CR +
            '      truehint = "Click to simulate form feeds with line feeds"' + CR +
            '    end' + CR +
            '    object Hardcopy:boolean' + CR +
            '      text = "Hardcopy"' + CR +
            '      falsehint = "Click to switch to hardcopy"' + CR +
            '      truehint = "Click to switch to scope"' + CR +
            '      inverse = scope' + CR +
            '      selected' + CR +
            '      invisible = true' + CR +
            '    end' + CR +
            '    object Hostsync:boolean' + CR +
            '      text = "Hostsync"' + CR +
            '      falsehint = "Click to turn on host synchronization"' + CR +
            '      truehint = "Click to turn off host synchronization"' + CR +
            '    end' + CR +
            '    object Insert:boolean' + CR +
            '      text = "Insert mode"' + CR +
            '      falsehint = "Click to turn on insert mode"' + CR +
            '      truehint = "Click to turn off insert mode"' + CR +
            '    end' + CR +
            '    object label5:label' + CR +
            '      text = "LF Fill"' + CR +
            '    end' + CR +
            '    object LFFill:integer' + CR +
            '      left = label5.width + $margin' + CR +
            '      hint = "Number of fill characters after LF"' + CR +
            '      text = 0' + CR +
            '    end' + CR +
            '    object Line_editing:boolean' + CR +
            '      text = "Line editing mode"' + CR +
            '      falsehint = "Click to turn on line editing mode"' + CR +
            '      truehint = "Click to turn off line editing mode"' + CR +
            '    end' + CR +
            '    object Local_Echo:boolean' + CR +
            '      text = "Echo"' + CR +
            '      falsehint = "Click to disable echo"' + CR +
            '      truehint = "Click to enable echo"' + CR +
            '      inverse = echo' + CR +
            '      visible = False' + CR +
            '    end' + CR +
            '    object Lowercase:boolean' + CR +
            '      text = "Lowercase"' + CR +
            '      falsehint = "Click to turn on lowercase characters"' + CR +
            '      truehint = "Click to turn on uppercase-only characters"' + CR +
            '      inverse = uppercase' + CR +
            '      visible = false' + CR +
            '    end' + CR +
            '    object Modem:boolean' + CR +
            '      text = "Modem"' + CR +
            '      falsehint = "Click to indicate a modem connection"' + CR +
            '      truehint = "Click to indicate not a modem connection"' + CR +
            '    end' + CR +
            '    object Numeric_Keypad:boolean' + CR +
            '      text = "Numeric keypad"' + CR +
            '      falsehint = "Click to indicate a modem connection"' + CR +
            '      truehint = "Click to indicate not a modem connection"' + CR +
            '      selected' + CR +
            '      inverse = Application_keypad' + CR +
            '    end' + CR +
            '    object Overstrike:boolean' + CR +
            '      text = "Overstrike"' + CR +
            '      falsehint = "Click to switch to overstrike mode"' + CR +
            '      truehint = "Click toswitch to insert mode"' + CR +
            '      selected' + CR +
            '      Visible = False' + CR +
            '      inverse = Insert' + CR +
            '    end' + CR +
            '    object label6:label' + CR +
            '      text = "Page size"' + CR +
            '    end' + CR +
            '    object Page:integer' + CR +
            '      left = label6.width + $margin' + CR +
            '      hint = "Number of lines per page"' + CR +
            '      text = 0' + CR +
            '    end' + CR +
            '    object label7:label' + CR +
            '      text = "Parity"' + CR +
            '    end' + CR +
            '    object Parity:list' + CR +
            '      left = label7.width + $margin' + CR +
            '      hint = "Parity"' + CR +
            '      list = "None", "Even", "Odd"' + CR +
            '      text = "None"' + CR +
            '      type = constrained' + CR +
            '    end' + CR +
            '    object Passthru:boolean' + CR +
            '      text = "Pass through"' + CR +
            '      falsehint = "Click to switch to uncooked (pass through) mode"' + CR +
            '      truehint = "Click to switch to cooked mode"' + CR +
            '    end' + CR +
            '    object Permanent:boolean' + CR +
            '      text = "Permanent"' + CR +
            '      hint = "Click to make changes permanent"' + CR +
            '    end' + CR +
            '    object Printer_port:boolean' + CR +
            '      text = "Printer port"' + CR +
            '      falsehint = "Click to enable printer port"' + CR +
            '      truehint = "Click to disable printer port"' + CR +
            '    end' + CR +
            '    object Readsync:boolean' + CR +
            '      text = "Read synch"' + CR +
            '      falsehint = "Click to enable terminal XON/XOFF flow control"' + CR +
            '      truehint = "Click to disable terminal XON/XOFF flow control"' + CR +
            '      selected' + CR +
            '    end' + CR +
            '    object Regis:boolean' + CR +
            '      text = "Regis graphics"' + CR +
            '      falsehint = "Click to enable Regis graphics"' + CR +
            '      truehint = "Click to disable Regis graphics"' + CR +
            '    end' + CR +
            '    object Scope:boolean' + CR +
            '      text = "Scope"' + CR +
            '      falsehint = "Click to set terminal to scope"' + CR +
            '      truehint = "Click to set terminal to hardcopy"' + CR +
            '      inverse = hardcopy' + CR +
            '    end' + CR +
            '    object Secure_server:boolean' + CR +
            '      text = "Secure server"' + CR +
            '      falsehint = "Click to allow break key functionality"' + CR +
            '      truehint = "Click to ignore break key"' + CR +
            '    end' + CR +
            '    object Set_speed:boolean' + CR +
            '      text = "Set speed"' + CR +
            '      falsehint = "Click to allow speed to be set"' + CR +
            '      truehint = "Click to disable speed from being set"' + CR +
            '    end' + CR +
            '    object Sixel_graphics:boolean' + CR +
            '      text = "Sixel graphics"' + CR +
            '      falsehint = "Click to enable Sixel graphics"' + CR +
            '      truehint = "Click to disable Sixel graphics"' + CR +
            '    end' + CR +
            '    object Soft_Characters:boolean' + CR +
            '      text = "Soft characters"' + CR +
            '      falsehint = "Click to enable loading of user-defined character sets"' + CR +
            '      truehint = "Click to disable loading of user-defined character sets"' + CR +
            '    end' + CR +
            '    object Syspassword:boolean' + CR +
            '      text = "System password"' + CR +
            '      falsehint = "Click to require system password on log in"' + CR +
            '      truehint = "Click to not require system password on log in"' + CR +
            '    end' + CR +
            '    object Tab:boolean' + CR +
            '      text = "Tab"' + CR +
            '      falsehint = "Click to transmit literal tabs"' + CR +
            '      truehint = "Click to simulate tabs with spaces"' + CR +
            '    end' + CR +
            '    object TTSync:boolean' + CR +
            '      text = "TTSync"' + CR +
            '      falsehint = "Click to transmit XON/XOFF flow control to terminal"' + CR +
            '      truehint = "Click to turn off transmitting XON/XOFF flow control to terminal"' + CR +
            '      selected' + CR +
            '    end' + CR +
            '    object Type_ahead:boolean' + CR +
            '      text = "Type ahead"' + CR +
            '      falsehint = "Click to allow type-ahead"' + CR +
            '      truehint = "Click to ignore type-ahead"' + CR +
            '      selected' + CR +
            '    end' + CR +
            '    object Uppercase:boolean' + CR +
            '      text = "Uppercase"' + CR +
            '      truehint = "Click to turn on lowercase characters"' + CR +
            '      falsehint = "Click to turn on uppercase-only characters"' + CR +
            '      inverse = lowercase' + CR +
            '      visible = true' + CR +
            '    end' + CR +
            '    object label8:label' + CR +
            '      text = "Page width"' + CR +
            '    end' + CR +
            '    object Width:integer' + CR +
            '      left = label8.width + $margin' + CR +
            '      hint = "Number of columns per line"' + CR +
            '      text = 80' + CR +
            '    end' + CR +
            '    object Wrap:boolean' + CR +
            '      text = "Wrap lines"' + CR +
            '      falsehint = "Click to wrap lines"' + CR +
            '      truehint = "Click to not wrap lines"' + CR +
            '      selected' + CR +
            '    end' + CR +
            'end' ;
This is the UUI definition that defines (most of) the SETTERM interface. I've left out most positioning directions for clarity since those only apply to the GUI interface and we'll cover that in the future. We will look at the rest of the SETTERM code in the next article.

 

Copyright © 2022 by Alan Conroy. This article may be copied in whole or in part as long as this copyright is included.