******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1435]S1435C1.SDML;164
defined in SYSMAC.SML, a system macro library stored on the system volume.
The library also contains macro routines you use to write device handlers and
interrupt service routines.
***************
(UNNUMBERED)
Interrupt service routines
Device handlers
Memory management control blocks
***************
I/O buffers
Device handlers
Interrupt service routines
Queue elements
Defined channels
***************
handlers that are loaded. If a
foreground job in a foreground/background environment accesses a device
directly through an in-line interrupt service routine, the foreground job
must notify the monitor that it must have exclusive use of the vectors.
Using the .PROTECT programmed request lets the foreground job gain
***************
Completion routines are part of your program that execute following the
(Input/output operationscompletion routines)
completion of some external operation, interrupting the normal program
flow. On entry to an I/O completion routine, R0 contains the
contents of the Channel Status Word and R1 contains the channel
***************
jobs) and
run at priority 0. Completion routines
do not interrupt one another but are queued; the next
completion routine is not entered until the first is completed.
***************
Also, it is possible to request a completion
routine from an in-line interrupt service routine through a .SYNCH
programmed request. This enables the interrupt service routine to issue
other programmed requests to the monitor.
***************
Completion routines should never reside in memory space that is used for
the USR, since the USR can be interrupted when I/O terminates and the
completion routine is entered. If the USR has overlaid the routine, control
passes to a random place in the USR, with a HALT or error trap being the
***************
I/O completion routines, .MRKT routines are asynchronous and independent of
the main program. After the specified time elapses, the main program is
interrupted, the timer completion routine executes, and control returns to
the interrupted program.
***************
(DEV_BOOK).
(Interrupt Service Routines)
Some macros in system macro library (SYSMAC.SML) are not
(Interrupt service routines)
programmed requests, but are
used like programmed requests in interrupt service communication to the
monitor.
.INTEN, the first macro call in every interrupt routine,
causes the system to use the system stack for interrupt service and enables
the monitor scheduler to make note of the interrupt. If device service is
all the routine does, .INTEN is the only call it has to make.
You must issue the .SYNCH call whenever you need to issue from the
interrupt service routine, one or more programmed requests, such as .READ
or .WRITE. The .INTEN call switches execution to the system state
and, since programmed requests can only be made in the user state, the
***************
.SYNCH call is the return address on error, while the second word is the
return on success. The (SIM_BOOK) contains a detailed
description of interrupt service routines.
***************
Macros used in interrupt service routines and in writing device
handlers are listed since they are a part of the system macro library.
***************
Sets up .DPRINT environment.)
(.DELETE(.DELETEsummary)\375\0\Deletes the file from the specified device)
(.DEVICE(.DEVICEsummary)\375\14\Enables device interrupts
to be
disabled upon program termination)
***************
handler data tables)
(.DRVTB(.DRVTBsummary)\--\--\Used with multivector device handlers to
generate a table that contains the vector location, interrupt entry point, and
processor status word for each device vector)
(.DSTAT(.DSTATsummary)\342\--\Returns the status of a specified device)
***************
(.FORK(.FORKsummary)\--\--\Generates a subroutine call in an
interrupt service routine that permits long but not critical processing to
be postponed until all other interrupts are dismissed)
(.FPROT(.FPROTsummary)\375\43\Sets or removes a file's protection)
(.GFDAT(.GFDATsummary)\375\44\Returns in R0 the creation date from a
***************
operation)
(.INTEN(.INTENsummary)\--\--\Generates a subroutine call to notify the
monitor that an interrupt has occurred, requests system state, and sets
processor priority to the specified value)
(.LOCK(.LOCKsummary)\346\--\Makes the monitor User Service Routine
***************
(.SFINF(.SFINFsummary)\375\44\Returns in R0 the word contents of the
directory entry offset specified in file's directory entry)
(.SFPA(.SFPAsummary)\375\30\Sets user interrupt for floating-point
processor exceptions)
(.SFSTA(.SFSTAsummary)\375\44\Returns in R0 the status information from a
***************
handlers from memory)
(.SYNCH(.SYNCHsummary)\--\--\Generates a subroutine call that enables
your program to perform programmed requests from within an interrupt
service routine)
(.TIMIO(.TIMIOsummary)\--\--\Generates a subroutine call in a handler to
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1435]S1435C2.SDML;292
describing each one in detail and providing an example of its use in a
program. Also described are macros and subroutines that are used to
implement device handlers and interrupt service routines. The
following parameters are commonly used as arguments in the various
calls:
***************
The .CTIMIO macro cancels the device time-out request in the handler
interrupt service section when an interrupt occurs to
disable the completion routine (See .TIMIO). The device time-out
feature is only useable if it was selected during the system generation
***************
request or a CTRL/C from the terminal, the system loads these
designated addresses with the corresponding values. In this way
your program can turn off a device's interrupt enable
bit whenever the program servicing the device terminates.
***************
;+
; .DEVICE - This is an example in the use of the .DEVICE request.
; The example shows how .DEVICE is used to disable interrupts from
; a device upon termination of the program. In this case the device
; is a DL11 Serial Line Interface.
***************
START: .DEVICE #AREA,#LIST ;Setup disables DL11 interrupts
;on .EXIT or ^C^C
.PROTECT #AREA,#DLVEC+4 ;Protect the DL11 output vector
***************
(.DRAST macrodescription)
The .DRAST macro sets up the interrupt and abort entry points, lowers
the processor priority, and enters the $INTEN routine in the resident
monitor, which it finds by using the pointer $INPTR.
***************
(\(name)\is the two-character device name)
(\(pri)\is the priority of the device, and also the priority at which
the interrupt service code is to execute)
(\(abo)\is an optional argument that represents the label of an abort
entry point. If you omit this argument, the macro generates a RETURN
instruction at the abort entry point, which is the word immediately
preceding the interrupt entry point.)
***************
BCC XXERR ;A read from a write/only device?
BEQ XXDUN ;Zero word count...just exit
XXRET: BIS #100,@#XX$CSR ;Enable DL-11 interrupt
RETURN ;Return to monitor
; INTERRUPT SERVICE ROUTINE
.DRAST XX,XX$PRI ;Use .DRAST to define Int Svc Sect.
***************
TST @#XX$CSR ;Error?
BMI XXRET ;Yes...'hang' until read,
BIC #100,@#XX$CSR ;Disable interrupts
.FORK XXFORK ;Continue at FORK level
XXNXT: TSTB @#XX$CSR ;Is device ready?
***************
RETURN
.DRAST SK,4,ABORT ; Interrupt entry point
BCS INT2 ; Interrupt from second vector
...
RETURN
INT2: ; Second interrupt vector code
...
RETURN
***************
The .DRVTB macro sets up a table of three-word entries for each vector
of a multivector device. The table entries contain the vector
location, interrupt entry point, and processor status word. You must
use this macro once for each device vector. The .DRVTB macros must be
placed consecutively in the device handler between the .DRBEG macro
***************
(\(vec)\is the location of the vector, and must be
between 0 and 474)
(\(int)\is the symbolic name of the interrupt handling routine. It
must appear elsewhere in the handler code. It generally takes the form
ddINT, where dd represents the two-character device name)
(\(ps)\is an optional value that specifies the low-order four bits of
the new Processor Status Word in the interrupt vector. This argument
defaults to zero if omitted. The priority bits of the PS are set to 7,
even if you omit this argument)
***************
If you want to use the .FORK macro in an in-line interrupt service
routine rather than in a device handler, you must set up $FKPTR. The
recommended way to do this is as follows:
***************
...
INTIN: ;Interrupt entry
.INTEN 4 ;Declare interrupt and drop to PR4
... ;Process quick stuff
.FORK FORKBK ;do a fork
... ;Process slow stuff
RETURN ;and return from interrupt
AREA: .BLKW 2 ;EMT request block
***************
The fork request is linked into a fork queue and serviced on a first-in
first-out basis. On return to the handler or interrupt service routine
following the call, the interrupt has been dismissed and the processor
is executing at priority 0. Therefore, the .FORK request must not be
used where it can be reentered using the same fork block by another
interrupt. It also should not be used with devices that have
continuous interrupts that cannot be disabled. The
(DEV_BOOK) gives additional information on the .FORK request.
***************
(.INTEN macro description)
Interrupt service routines use .INTEN:
(UNNUMBERED)
To notify the monitor that an interrupt has occurred and to switch to
system state.
To set the processor priority to the correct value.
To save the contents of R4 and R5 before returning to the Interrupt
Service Routine. Any other registers must be saved by the routine.
***************
(3\3\6)
(\(prio)\is the processor priority at which
the interrupt routine is to run, normally the priority at which
the device requests an interrupt)
(\(pic)\is an optional argument that should be
non-blank if the interrupt routine is written as a PIC
(position-independent code) routine. Any interrupt routine written as
a device handler must be a PIC routine and must specify this argument)
***************
All external interrupts must cause the processor to go to priority
level 7. .INTEN is used to lower the priority to the value, at which
point the device should be run. On return from .INTEN, the device interrupt
can be serviced, at which point the interrupt routine returns with a
RETURN instruction.
An RTI instruction should not be used to return from an interrupt routine
that uses an .INTEN.
***************
;+
; DL11.MAC - This is an example in the use of the .INTEN request.
; The example is an in-line, interrupt service routine, which may
; be assembled separately and linked with a mainline program.
; The routine transfers data from a user specified buffer to a DL11
***************
ASL WCNT ;Make word count byte count
BEQ 1$ ;Just leave if zero word count
MOV #DLINT,@#DLVEC ;Initialize DL11 interrupt vector
BIS #100,@#DLCSR ;Enable interrupts
1$: RTS R5 ;Return to caller
DLINT: .INTEN DLPRI ;Interrupt service - Notify RT-11
;and drop priority to that of DL11
MOVB @BUFAD,@#DLCSR+2 ;Transfer a byte
***************
DEC WCNT ;All bytes transferred?
BEQ DLDUN ;Branch if yes
RETURN ;No return from interrupt thru RT-11
DLDUN: BIC #100,@#DLCSR ;All done - disable DL11 interrupts
RETURN ;Return thru RT-11
.END
***************
(DTACH$\####20\\Detach in progress)
(WRWT$\####40\\TT: I/O flag)
(INEXP$\###100\\Output interrupt is expected)
(PAGE$\###200\\Output is suspended by XOFF)
(SHARE$\##2000\10\Terminal is shared console)
***************
vector (two words) in the area of 0 to 474. If the request is
successful, it indicates that the locations are not currently in use
by another job or by the monitor. The job then can place an interrupt
address and priority into the protected locations and begin using the
associated device.
***************
; .PROTECT / .UNPROTECT - This is an example in the use of the .PROTECT
; and .UNPROTECT requests. The example illustrates how to protect the
; vectors of a device while an inline interrupt service routine does
; a data transfer (in this case the device is a DL11 Serial Line
;Interface).
***************
.GLOBL DL11
START: .DEVICE #AREA,#LIST ;Setup to disable DL11 interrupts on
;.EXIT or ^C^C
.PROTECT #AREA,#300 ;Protect the DL11 vectors
***************
.SFPA #AREA,#FPTRAP ;Set up FPU error trap
; . ;continue mainline program
DIVF F0,%1 ;cause a divide by 0 interrupt
.EXIT ;Exit program
***************
10$: MOV (SP)+,R0
RTI ;Before returning from interrupt
F0: .WORD 0,0
***************
A .SPND or .RSUM, like most other programmed requests, can be issued
from within a user-written interrupt service routine if the
.INTEN/.SYNCH sequence is followed. All notes referring to .SPND/.RSUM
from a completion routine also apply to this case.
***************
This macro call enables your program to issue programmed requests from
an interrupt service routine. Code following the .SYNCH call
runs at priority level 0 as a completion routine in the issuing job's
context. Programmed requests issued from interrupt routines are not
supported by the system and should not be performed unless a .SYNCH is
used. .SYNCH, like .INTEN, is not an EMT monitor request, but rather a
***************
(Notes)
The monitor dismisses the interrupt without returning to the .SYNCH
routine if one of the following conditions occur:
***************
free, and do not contain the same information they contained before
the .SYNCH request. A long time can elapse before the program returns
from a .SYNCH request since all interrupts must be serviced before the
main program can continue. Enter a RETURN to exit from the routine.
***************
; .SYNCH - This is an example of the .SYNCH request.
; The example is a skeleton of a program which could input data
; from the outside world by means of an in-line interrupt service routine,
; buffer it until a whole block's worth has been input, then use
; a .WRITE request to store the data on an RT-11 device.
***************
; . ;Here we open an RT-11 output
; . ;device, then initiate input from
; . ;a "foreign" device, interrupts to
; . ;be handled by our in-line interrupt
; . ;service routine....
INTRPT: ;INTERRUPT SERVICE ROUTINE
.INTEN 5 ;Notify RT-11 and drop to priority 5
; . ;Process interrupt and buffer input
; . ;Time to write a buffer - switch
; . ;buffers (should be double buffered
; . ;so that interrupt processing can
; . ;continue during write operation).
.SYNCH #SYNBLK ;Do a .SYNCH so we can use a .WRITE
***************
;Queue a write to store the data
INC BLK ;and bump the block number.
RETURN ;Re-enable interrupts and leave
SYNBLK: .WORD 0 ;.SYNCH block
***************
SYNFAIL: ;.SYNCH failed...
; . ;This can be a problem if the
; . ;next interrupt came in before the
; . ;buffer was written out!
***************
runs in the context of the job indicated in the timer block. In mapped
systems, the completion routine executes with Kernel mapping, since it
is still a part of the interrupt service routine. (See the
(SIM_BOOK) for more information about interrupt service
routines and the mapped monitor.) As usual with completion routines, R0
and R1 are available for use. When the completion routine is entered,
***************
MOV R5,TBLK+14 ;Move it to argument block
.TIMIO TBLK,0,TIME ;Schedule a marktime
BIS #100,@#SP$CSR ;Enable DL-11 interrupt
RETURN ;Return to monitor
; INTERRUPT SERVICE ROUTINE
.DRAST SP,SP$PRI ;Use .DRAST to define Int Svc Sect.
***************
In the mapped monitor, traps dispatched to a user program by .TRPSET
execute in User mode. They appear as interrupts of the user program by
a synchronous trap operation. Programs that intercept error traps by
trying to steal the trap vectors must be carefully designed to handle
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1436]FIG_USR.SDML;5
500 | | | |
+--------------------+ | USR |
476 | Interrupt Vectors | | |
| | | |
60 | | +-----------+
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1436]S1436C1.SDML;71
Facilities for communication between foreground and background jobs.
FORTRAN language interrupt service routines for user devices.
Complete timer support facilities, including
***************
current job have higher priority than other parts of the job.
When a completion routine is initiated (because of its
associated event), it interrupts execution of the job and continues to
execute until it relinquishes control.
***************
If an error occurs in a completion routine or in a subroutine at completion
(Completion routineserror handling)
level, the error handler traces back through to the original interruption
of the main program. Thus, the traceback is shown as though the completion
routine were called from the main program.
***************
subroutine can be used many times as a completion routine or as a routine
in the main program, but a subroutine executing as main program code does
not work properly if it is interrupted and then called again at the
completion level. This restriction applies to all subroutines that can be
invoked at the completion level while they are active in the main program.
***************
(USRswapping over data)
unpredictable results, you must restrict interrupt service routines
and completion routines to locations outside the USR swapping area.
Identify the limits of this swapping area by examining the link map
***************
Routines that request USR functions (such as IENTER and LOOKUP)
Data structures for USR requests
Interrupt service routines
Completion routines
Data areas for interrupt service routines and completion routines
***************
requesting job will be blocked until the other job releases the USR. The
requesting job
may be locked out for seconds or minutes at a time. Interrupt service and
completion routines can run, but mainline code cannot. You can minimize or
eliminate these resulting timing problems by observing the following:
***************
Do not use devices with slow directory operations, such as magtapes.
Write real-time operations as completion and interrupt service routines in
your foreground job so that a locked-out mainline program does not
impede real-time operations.
***************
An initialization phase that opens all required channels and begins a
real-time operation
A real-time phase that performs interrupt service and I/O operations
A completion phase that halts real-time activity and then closes the
channels.
***************
foreground enables the background task to do USR operations during the
real-time phase without locking out the foreground. This action simplifies
USR swapping because the USR can swap over interrupt routines and I/O
buffers as long as they are inactive.
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1436]S1436C2.SDML;168
directly to another background
program and pass specified information to it. CHAIN cannot be called from a
completion or interrupt routine. The FORTRAN impure area is not preserved
across a chain. Therefore, when chaining from one program to another, the
information must be reset in the program being chained to. When chaining to
***************
This function is primarily designed to allow user programs to load device
registers with necessary values. In particular, it is used to turn off a
device's interrupt enable bit when the program servicing the device
terminates.
***************
(UNNUMBERED)
ENTER cannot be issued from a completion or interrupt routine.
ENTER requires that the appropriate device handler be in memory.
***************
LOCK cannot be called from a completion or interrupt routine.
***************
Specified locations are not currently in use by
another job or the monitor.
Calling job can place an interrupt address and priority in the
protected 2-word vector and begin the device associated with those
vectors.
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1437]C7.SDML;2
(1\Bits have meaning only if global SCCA is enabled.)
(OFFSET\Symbol\ByteLengthin Octal\Description)
(0\$RMON\4\Common interrupt entry point; contains the instruction
JMP $INTEN. The .INTEN macro uses it.)
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1437]C8.SDML;2
(Interrupt, Trap, and Software Vectors)
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1437]S1437C3.SDML;8
([NO]WAIT)
WAIT interrupts output to spooled device (x), while
output to any other spooled device continues.
NOWAIT resumes sending spooled output to
device (x) after output to
that device has been interrupted.
([NO]WIDE)
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1437]S1437C3_QK.SDML;60
The .CTIMIO macro cancels the device time-out request in the handler
interrupt service section when an interrupt occurs to
disable the completion routine (See .TIMIO).
(indent\1\smallskip)(.CTIMIO tbk)
***************
(.DRAST macrodescription)
The .DRAST macro sets up the interrupt and abort entry points, lowers
the processor priority, and references global symbol $INPTR, which
contains a pointer to the $INTEN routine in the resident monitor.
***************
(\(name)\is the two-character device name)
(\(pri)\is the priority of the device, and also the priority at which
the interrupt service code is to execute)
(\(abo)\is an optional argument that represents the label of an abort
entry point. If you omit this argument, the macro generates a RETURN
instruction at the abort entry point, which is the word immediately
preceding the interrupt entry point.)
***************
The .DRVTB macro sets up a table of three-word entries for each vector
of a multivector device. The table entries contain the vector
location, interrupt entry point, and processor status word. You must
use this macro once for each device vector.
(indent\1\smallskip)(.DRVTB name,vec,int[,ps])
***************
(\(vec)\is the location of the vector, and must be
between 0 and 474)
(\(int)\is the symbolic name of the interrupt handling routine. It
must appear elsewhere in the handler code. It generally takes the form
ddINT, where dd represents the two-character device name)
(\(ps)\is an optional value that specifies the low-order four bits of
the new Processor Status Word in the interrupt vector. This argument
defaults to zero if omitted. The priority bits of the PS are set to 7,
even if you omit this argument)
***************
If you want to use the .FORK macro in an in-line interrupt service
routine rather than in a device handler, you must set up $FKPTR.
***************
(.INTEN macro description)
Interrupt service routines use .INTEN:
(UNNUMBERED)
To notify the monitor that an interrupt has occurred and to switch to
system state.
To set the processor priority to the correct value.
To save the contents of R4 and R5 before returning to the Interrupt
Service Routine. Any other registers must be saved by the routine.
***************
(3\3\6)
(\(prio)\is the processor priority at which
the interrupt routine is to run, normally the priority at which
the device requests an interrupt)
(\(pic)\is an optional argument that should be
non-blank if the interrupt routine is written as a PIC
(position-independent code) routine. Any interrupt routine written as
a device handler must be a PIC routine and must specify this argument)
***************
(DTACH$\####20\Detach in progress)
(WRWT$\####40\>>>Meaning???)
(INEXP$\###100\Output interrupt is expected)
(PAGE$\###200\Output is suspended by XOFF)
(SHARE$\##2000\Terminal is shared console)
***************
This macro call enables your program to issue programmed requests from
an interrupt service routine. Code following the .SYNCH call runs at
priority level 0 as a completion routine in the issuing job's context.
(indent\1\smallskip)(.SYNCH area[,pic])
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1437]S1437C5.SDML;28
The .CTIMIO macro cancels the device time-out request in the handler
interrupt service section when an interrupt occurs to
disable the completion routine (See .TIMIO).
(indent\1\smallskip)(.CTIMIO tbk)
***************
(.DRAST macrodescription)
The .DRAST macro sets up the interrupt and abort entry points, lowers
the processor priority, and references global symbol $INPTR, which
contains a pointer to the $INTEN routine in the resident monitor.
***************
(\(name)\is the two-character device name)
(\(pri)\is the priority of the device, and also the priority at which
the interrupt service code is to execute)
(\(abo)\is an optional argument that represents the label of an abort
entry point. If you omit this argument, the macro generates a RETURN
instruction at the abort entry point, which is the word immediately
preceding the interrupt entry point.)
***************
The .DRVTB macro sets up a table of three-word entries for each vector
of a multivector device. The table entries contain the vector
location, interrupt entry point, and processor status word. You must
use this macro once for each device vector.
(indent\1\smallskip)(.DRVTB name,vec,int[,ps])
***************
(\(vec)\is the location of the vector, and must be
between 0 and 474)
(\(int)\is the symbolic name of the interrupt handling routine. It
must appear elsewhere in the handler code. It generally takes the form
ddINT, where dd represents the two-character device name)
(\(ps)\is an optional value that specifies the low-order four bits of
the new Processor Status Word in the interrupt vector. This argument
defaults to zero if omitted. The priority bits of the PS are set to 7,
even if you omit this argument)
***************
If you want to use the .FORK macro in an in-line interrupt service
routine rather than in a device handler, you must set up $FKPTR.
***************
(.INTEN macro description)
Interrupt service routines use .INTEN:
(UNNUMBERED)
To notify the monitor that an interrupt has occurred and to switch to
system state.
To set the processor priority to the correct value.
To save the contents of R4 and R5 before returning to the Interrupt
Service Routine. Any other registers must be saved by the routine.
***************
(3\3\6)
(\(prio)\is the processor priority at which
the interrupt routine is to run, normally the priority at which
the device requests an interrupt)
(\(pic)\is an optional argument that should be
non-blank if the interrupt routine is written as a PIC
(position-independent code) routine. Any interrupt routine written as
a device handler must be a PIC routine and must specify this argument)
***************
(DTACH$\####20\Detach in progress)
(WRWT$\####40\TT: I/O flag)
(INEXP$\###100\Output interrupt is expected)
(PAGE$\###200\Output is suspended by XOFF)
(SHARE$\##2000\Terminal is shared console)
***************
This macro call enables your program to issue programmed requests from
an interrupt service routine. Code following the .SYNCH call runs at
priority level 0 as a completion routine in the issuing job's context.
(indent\1\smallskip)(.SYNCH area[,pic])
******************************
DISK$DATA:[SHOPPA.PDP11.RT.DOC56.ARCHIVE.RT-11.S1437]S1437C7.SDML;11
(1\Bits have meaning only if global SCCA is enabled.)
(Offset\Symbol\ByteLengthin Octal\Description)
(0\$RMON\4\Common interrupt entry point; contains the instruction
JMP $INTEN. The .INTEN macro uses it.)
***************
(12\SP$SCN\1 = Print screen (CTI bus-based computers only).)
(13\SP$GTM\1 = Date and time request for flag pages.)
(14\SP$IEN\1 = Fake interrupt enable.)
(15\SP$ERR\1 = Error bit (set by SPOOL).)
***************
line count.)
(-\I.IRNG\2\Input ring buffer low limit.)
(-\I.IPUT\2\Input PUT pointer for interrupts.)
(-\I.ICTR\2\Input character count.)
(-\I.IGET\2\Input GET pointer for .TTYIN.)
***************
(-\I.OCTR\1\Output character count.)
(-\I.CTLO\1\^C flag)