Annotation of 43BSDTahoe/new/X/libibm/doc/emulator, revision 1.1.1.1

1.1       root        1: .RP
                      2: .TL
                      3: EMULATORS IN WORKSTATION UNIX
                      4: .AU
                      5: By David O. Bundy
                      6: Research System Programmer for ACIS/IBM
                      7: .AL
                      8: .AI
                      9: Institute for Research in Information and Scholarship
                     10: Brown University
                     11: Providence, Rhode Island 02912
                     12: .AB
                     13: This paper explains the need for and design of Emulators in
                     14: Workstation UNIX.
                     15: The development of this emulator package under UNIX was driven by the
                     16: fact that the existing line discipline and console driver interface do not
                     17: support the complexities of today's new workstations.
                     18: The complexities are that today's workstations do not consist of dumb
                     19: hardcopy terminals or character oriented consoles but
                     20: elaborate bitmapped displays with an assortment
                     21: of sizes, densities, capabilities, and protocols.
                     22: Workstations also include sophisticated keyboards
                     23: and mice that are separate from the terminal hardware
                     24: and need a different device driver.
                     25: To further complicate things, we can hang a mouse off any serial
                     26: port supported by the workstation and expect these mice to interact with the
                     27: console.  Lastly, you can have more than one console or mouse on the 
                     28: workstation simultaneously.
                     29: The challenge is to develop a package to which it is easy to add existing and
                     30: new devices.  This package should be flexible enough to handle any
                     31: combination and number of devices at the same time.
                     32: .AE
                     33: .NH
                     34: History
                     35: .PP
                     36: In traditional UNIX the console driver takes character input
                     37: from a hardcopy terminal, send it to the selected line discipline to do
                     38: any filtering, and then echo the character back to
                     39: the console by passing it back to the hardware with
                     40: appropriate parity.
                     41: The line discipline filter performs any special functions depending on
                     42: the data passed (e.g. on receiving a delete character
                     43: the line discipline sends a signal to the process
                     44: running on the console).
                     45: .PP
                     46: Eventually non-hardcopy consoles with more intelligence appeared,
                     47: which could
                     48: decipher special character sequences for displaying
                     49: characters with different
                     50: attributes or at any location on the screen.
                     51: UNIX was expanded to handle this with the development of the
                     52: termcap package which
                     53: describes any particular console within a certain set of
                     54: capabilities and how operations are performed
                     55: on that console.  All this information is represented in fixed rules in a
                     56: termcap data base for easy access.
                     57: .PP
                     58: By giving the user a software package which reads in any particular
                     59: terminal's information from the the termcap data base and performs any
                     60: requested function based on that terminal's capabilities, the user is now
                     61: relieved from knowing what hardware he/she is coding to.
                     62: The application only needs to know what functions are available
                     63: in the termcap toolbox in order to work on any terminal.
                     64: .PP
                     65: The cominbation of the termcap data base and line discipline filtering was
                     66: sufficient but does not support today's new complications of bitmap displays and
                     67: sophisticated keyboards/mice.
                     68: .NH
                     69: Todays Workstations
                     70: .PP
                     71: The first problem is that bitmap displays are not character oriented so you
                     72: can not send a character to the display and have it appear on the
                     73: screen.  Second, bitmap displays do not have capabilities that fit into
                     74: the normal termcap data base (e.g. there is no character sequence to tell the
                     75: display where to put a character).  Lastly the new keyboards and mice are
                     76: separated from the display and do not return ascii characters, but codes
                     77: which must be translated to determine what action has taken place
                     78: (up and down key transitions, etc.).
                     79: .PP
                     80: In order to integrate this
                     81: into the existing system, it was determined that an extension was needed
                     82: to the normal console/line discipline structure.
                     83: .PP
                     84: Before listing the requirements of the emulator package,
                     85: I will explain and compare what
                     86: a line discipline and an emulator are and what each is used for.
                     87: This will help in understanding why the
                     88: .ul
                     89: emulator package
                     90: was needed.
                     91: .NH
                     92: What is a Line Discipline?
                     93: .PP
                     94: A
                     95: .ul
                     96: line discipline
                     97: acts like a filter between the user
                     98: and communication hardware on the workstation.
                     99: A line discipline is a form of higher level software controller for
                    100: communication lines.  Essentially, a line discipline will buffer the user
                    101: from handling the data stream responsibilities from/to communication lines.
                    102: The following list summarizes the functions that the standard
                    103: terminal-oriented line disciplines handle:
                    104: .RS
                    105: .IP 1.
                    106: Input lines are collected and input editing is provided.
                    107: The edited line is made available when it is completed by a newline or
                    108: when an EOT (end of transmission)
                    109: is detected.  A line will be buffered up to 256 characters.
                    110: .IP 2.
                    111: Any input characters can be mapped to special functions for line editing or
                    112: interrupt generation.
                    113: .IP 3.
                    114: Input characters are buffered if the process can not read the data
                    115: faster than it is received.
                    116: .IP 4.
                    117: Output processing like delay generation, tab expansion,
                    118: erasing characters from the screen on input editing, echoing of control
                    119: characters and other unprintable characters in special formats, and other
                    120: functions such as mapping lower case characters to upper case for terminals
                    121: that only handle upper case.
                    122: .IP 5.
                    123: Flow control for output processing.  This consist of controlling the flow
                    124: between the process sending characters and the display.  The line
                    125: discipline will buffer data from the process to the terminal/display and
                    126: suspend the process if data is arriving faster then the display can show
                    127: it.
                    128: .IP 6.
                    129: A user can control the output flow by typing special control
                    130: characters to flush the output, and stop/start the output.
                    131: .IP 7.
                    132: Other line disciplines allow some or all input/output processing to be
                    133: excluded so that character by character input or raw data can be accepted.
                    134: .IP 8.
                    135: Other line disciplines know about certain protocols that may come in
                    136: on networked communication lines.
                    137: .RE
                    138: .PP
                    139: Line discipline filtering is very powerful
                    140: and important but does not completely satisfy the requirements of
                    141: today's input/output devices.  The major
                    142: deficiency is that we need to deal with more than character data
                    143: manipulation.
                    144: .NH
                    145: What is an Emulator?
                    146: .PP
                    147: Bitmap terminals are bit addressable and
                    148: do not deal with characters but with turning on/off and moving
                    149: bits on the screen.  To represent a single character on the screen a bitmap
                    150: terminal must have a number of bits at different locations turned on/off.
                    151: To scroll a bitmap screen you must move all the bits on the screen up a
                    152: line and turn off the bits on the bottom line with all this depending on
                    153: the size of the font used etc..  Some bitmap terminals will do some or all
                    154: of this in hardware for you.
                    155: It is then clear that each bitmap terminal must have
                    156: code written to control them for doing standard operations in
                    157: order to act like a normal
                    158: .ul
                    159: glass tty style console.
                    160: So the question is: What
                    161: software do you need to make a bitmap display take characters and command
                    162: strings like a glass tty?  Once this software is written it can be
                    163: intergrated with the existing line disciplines which handles character
                    164: manipulation for us.
                    165: .PP
                    166: Since we want to support multiple types of displays, the question also
                    167: comes up: What is the best way to design the code so that we can emulate a
                    168: glass tty on each display without reproducing the same code for each
                    169: display?  The emulator package gives you a solution.  It is a
                    170: intermediary between the low level device specific drivers and the higher
                    171: level line disciplines.  On output it differentiates
                    172: the set of Generic functional procedures that must be
                    173: device-dependent for controlling each display
                    174: and device-independent code which deciphers character streams and
                    175: decides when to perform an action on the display.
                    176: The device dependent set of procedures have to be sufficient
                    177: enough so that a piece of code, emulator, can be written with them and be
                    178: able to support normal glass tty operations.
                    179: .PP
                    180: Therefore, an emulator is the code that intercepts
                    181: characters and analyzes them according to the type of tty it emulates and
                    182: then calls the appropriate display/device dependent procedures to perform
                    183: the operation on the display.  With this separation, any emulator written
                    184: will work on any display on the workstation without having to know anything
                    185: about the display.  This type of emulator will be know as an
                    186: .ul
                    187: output emulator.
                    188: .PP
                    189: This notion can be expanded to input emulation as well.  This would enable
                    190: any keyboard or mouse on the system to pass data through an input
                    191: emulator filter and have the resulting filtered data be presented to the
                    192: user in any particular format.
                    193: Therefore, an 
                    194: .ul
                    195: input emulator
                    196: will be know as an emulator that accepts data from a keyboard and a mouse
                    197: and deciphers the data to present actual ascii characters (usually), and mouse
                    198: button/motion data reports.
                    199: .PP
                    200: Once an emulator is written it then can take output from or give input to
                    201: the normal line discipline routines as if the emulator was a normal UNIX
                    202: tty hardware driver.  It should be noted here that the emulator
                    203: package also supports window manager type device-dependent
                    204: routines.  This facilitates the implementation of
                    205: emulators which do not want to act like a
                    206: glass tty but rather be an interface to a window manager/graphics system
                    207: which takes control of output to the screen.
                    208: .NH
                    209: The Output Emulator Interface to the Low Level Display Dependent Routines
                    210: .PP
                    211: I have found that the following device dependent procedures are enough to
                    212: support any basic output emulator.
                    213: .RS
                    214: .IP 1.
                    215: Probe the display to see if it is there.
                    216: .IP 2.
                    217: Initialize the display.
                    218: .IP 3.
                    219: Position cursor anywhere on the display.
                    220: .IP 4.
                    221: Take a character and put up a bitmap, from some internal data font,
                    222: that represents that
                    223: character where your cursor is currently pointing.
                    224: .IP 5.
                    225: Blank a given section of the display (by character).
                    226: .IP 6.
                    227: Move a group of lines on the display.
                    228: .IP 7.
                    229: Print the screen contents on the standard printer.
                    230: .RE
                    231: .PP
                    232: Besides these base procedures, an emulator also needs general information
                    233: about the display it will be using like how many lines, and how wide a line
                    234: will fit on the screen with the font the display dependent routine is
                    235: using.  The following is the structure that describes the interface between
                    236: the emulator and the display-dependent routines.  The top part down to
                    237: .ul
                    238: flags
                    239: is the standard glass tty information; the other entries will be
                    240: described later when I explain how window manager systems integrate into the
                    241: emulator package.  The following is from "screen_conf.h".  This structure
                    242: is initialized in "screen_conf.c".
                    243: .sp 2
                    244: .nf
                    245: struct screen_sw {
                    246:        char    *name;                  /* Name of Display */
                    247:        int     (*probe)();             /* Probe for Screen */
                    248:        int     (*init)();              /* Initialize Screen */
                    249:        int     (*s_putc)();            /* Put character on Screen */
                    250:        int     (*pos_cur)();           /* Position Cursor on Screen */
                    251:        int     (*blank)();             /* Blank A section of Screen */
                    252:        int     (*move)();              /* Move Some lines on Screen */
                    253:        int     (*printscreen)();       /* routine to print screen */
                    254:        char    *rwaddr;                /* Read & writable addr on screen */
                    255:        short   lines;                  /* Number of lines on screen */
                    256:        short   width;                  /* Width of screen in characters */
                    257:        short   vbits;                  /* Vertical number of screen bits */
                    258:        short   hbits;                  /* Horizontal number of screen bits */
                    259:        int     flags;                  /* some flags about the screen */
                    260:        int     def_oute;               /* Default output emulator */
                    261:        int     (*pos_loc)();           /* Position Locator on Screen */
                    262:        int     (*load_loc)();          /* Load Locator description */
                    263:        int     (*show_loc)();          /* Show Locator on Screen*/
                    264:        int     (*hide_loc)();          /* Hide Locator on Screen */
                    265:        int     (*apa_init)();          /* All Points Addressable screen init */
                    266:        int     fill_int[14];           /* Fill out to 32 ints (2^7) */
                    267: };
                    268: .sp 2
                    269: .fi
                    270: .RE
                    271: .PP
                    272: The following is a synopsis from "screen_conf.h" which shows the interface to
                    273: the above structure.  All that the emulator needs to use are the following
                    274: routines and attributes.
                    275: .sp 2
                    276: .nf
                    277: /* General Defines for emulators to use with the screen_sw structure */
                    278: #define WS             si->which_screen
                    279: #define SCREEN_LENGTH  (screen_sw[WS].lines)
                    280: #define SCREEN_WIDTH   (screen_sw[WS].width)
                    281: #define SCREEN_SIZE    (SCREEN_LENGTH * SCREEN_WIDTH)
                    282: #define STATUS_LINE    (SCREEN_LENGTH - 1)
                    283: 
                    284: /* Character Attributes */
                    285: #define NORMAL_VIDEO   0x01
                    286: #define REVERSE_VIDEO  0x02
                    287: #define UNDERLINE_VIDEO        0x04
                    288: #define HI_INTENSITY   0x08
                    289: #define BLINK          0x10
                    290: 
                    291: /* Defines for calling console screen dependent switched routines */
                    292: 
                    293: /* Put character 'c' with attribute 'screen_attr' on console */
                    294: #define screen_putc(c, screen_attr) (*screen_sw[WS].s_putc) (c, screen_attr)
                    295: 
                    296: /* Move cursor to x,y position */
                    297: #define pos_cursor(x, y) (*screen_sw[WS].pos_cur) (x, y)
                    298: 
                    299: /* blank with screen_attribute from start coordinates to end coordinates */
                    300: #define screen_blank(s_a, sy, sx, ey, ex) (*screen_sw[WS].blank) (s_a, sy, sx, ey, ex)
                    301: 
                    302: /* Macro for blanking a line */
                    303: #define blank_line(s_a, line) screen_blank(s_a, line, 0, line, SCREEN_WIDTH-1)
                    304: 
                    305: /* move line1 ... line2 to dest */
                    306: #define screen_move(l1, l2, dest) (*screen_sw[WS].move) (l1, l2, dest)
                    307: 
                    308: /* Position screen locator on screen at x,y position with msbox restriction */
                    309: #define pos_locator(x, y, msbox) (*screen_sw[WS].pos_loc) (x, y, msbox)
                    310: 
                    311: /* Load a new screen locator discription with msbox restriction */
                    312: #define load_locator(c, msbox) (*screen_sw[WS].load_loc) (c, msbox)
                    313: 
                    314: /* Show screen locator with msbox restriction */
                    315: #define show_locator(msbox) (*screen_sw[WS].show_loc) (msbox)
                    316: 
                    317: /* Hide screen locator */
                    318: #define hide_locator() (*screen_sw[WS].hide_loc) ()
                    319: 
                    320: /* APA Screen init */
                    321: #define apa_initialize() (*screen_sw[WS].apa_init) ()
                    322: .sp 2
                    323: .fi
                    324: .RE
                    325: .NH
                    326: Input Emulator Interface to Input Device Dependent Routines
                    327: .PP
                    328: The input emulator low level interface is not as strictly defined as the 
                    329: output emulator interface.  Essentially there are a set of hardware routines
                    330: in
                    331: .ul
                    332: keyboard.c
                    333: and
                    334: .ul
                    335: mouse.c
                    336: which an input emulator can call to control the keyboard, speaker, and
                    337: mouse.
                    338: The interface to input emulators is much
                    339: less rigid than an output emulator (this should change in the future).
                    340: Basically the input emulator
                    341: will receive an interrupt with data from the keyboard or mouse along with
                    342: an indication of which sent the interrupt.
                    343: The emulator is then responsible for deciphering the data and keeping track
                    344: of the state of the device.  The input emulator will then pass on its
                    345: processed data to the user through a
                    346: .ul
                    347: line discipline
                    348: or through some other emulator specific method (shared memory, etc.).
                    349: .PP
                    350: There are only a few procedures needed to control a keyboard for setting
                    351: things like the auto keyclick rate, bell tone, and key characteristics
                    352: (repeat rate, make/break, etc.).  And because any workstation I have run
                    353: into so far only supports one keyboard at a time,
                    354: there is no reason to set up a
                    355: switch table for these hardware routines, yet!
                    356: Workstation mice also have few control operations (set sampling or
                    357: resolution rate) and input emulators, as yet, do not deal with these directly
                    358: but instead pass on
                    359: .ul
                    360: ioctl
                    361: system calls to the appropriate driver for these operations.
                    362: .NH
                    363: Window Manager Device Dependent Routines
                    364: .PP
                    365: The following lists the window manager type Device Dependent Routines which
                    366: are available with the
                    367: .ul
                    368: screen_sw
                    369: low level routines.  These are normaly used in an input emulator in order to
                    370: control the mouse tracking to the display cursor/locator.
                    371: .RS
                    372: .IP pos_loc()
                    373: Position the locator at a given coordinate on the display.
                    374: .IP load_loc()
                    375: Load a locator bitmap for the display.  This will be the locator until the
                    376: next load_loc.
                    377: .IP show_loc()
                    378: Make the locator visible and keep showing when positioned.
                    379: Usually used after a hide_loc.
                    380: .IP hide_loc()
                    381: Make the locator invisible but does not effect the tracking.
                    382: .IP apa_init()
                    383: All Points Addressable Init the display for graphic type operations needed
                    384: for using the locator on the display.  Usefull for displays with hardware
                    385: cursors/locators.
                    386: .RE
                    387: .NH
                    388: System Interface to the Emulator
                    389: .PP
                    390: Given the above any emulator can be written, but more is needed than
                    391: supplying the routines and interface for an emulator to use.
                    392: You must be able to add a new emulator to the system easily and have
                    393: support for allowing that new emulator to coexist with other emulators.
                    394: An emulator is much like a tty hardware device driver with many similar
                    395: system entry points and functions.  The main difference is that they
                    396: all funnel through one console driver and all call a
                    397: common set of hardware routines.  They never deal with the hardware
                    398: directly as device drivers do.
                    399: To put an emulator into the system you must add the following routines and
                    400: place them into the following switch table structure
                    401: (modeled after line disciplines).  This structure is declared in
                    402: .ul
                    403: screen_conf.h
                    404: and the table is initialized in
                    405: .ul
                    406: screen_conf.c.
                    407: .sp 2
                    408: .nf
                    409: /*
                    410:  * Emulator line control switch.
                    411:  */
                    412: struct emulsw
                    413: {
                    414:        int     (*e_open)();
                    415:        int     (*e_close)();
                    416:        int     (*e_read)();
                    417:        int     (*e_write)();
                    418:        int     (*e_ioctl)();
                    419:        int     (*e_rint)();
                    420:        int     (*e_putc)();
                    421:        int     (*e_select)();
                    422:        int     (*e_putstatus)();       /* to put up status information */
                    423:        int     fill[7];
                    424: };
                    425: .sp 2
                    426: .fi
                    427: .PP
                    428: This emulator switch table
                    429: list all routines necessary for a device driver to interface with an
                    430: emulator.
                    431: Therefore each emulator, depending on its needs, will have the following
                    432: entry points in the kernel.
                    433: .RS
                    434: .IP E_OPEN
                    435: .br
                    436: Open the emulator to do any initialization necessary.  Perform initial
                    437: operations like clearing the screen, initialize the cursor, and position
                    438: the cursor on the screen.
                    439: .IP E_CLOSE
                    440: .br
                    441: Close the emulator; do any cleanup necessary.
                    442: .IP E_READ
                    443: .br
                    444: Read data from the emulator.  This routine usually forwards the read
                    445: request to the user defined line discipline.  The read routines in line
                    446: disciplines currently perform all the operations necessary for this routine.
                    447: This consist of taking the already received characters off a
                    448: .ul
                    449: clist queue
                    450: and passing them to the user program's read buffer.
                    451: .IP E_WRITE
                    452: .br
                    453: Write data to the emulator.  This procedure takes a character stream
                    454: passed from the
                    455: user level program.  The emulator usually calls the line discipline which
                    456: the user has specified to do any character preprocessing.
                    457: Again, the line discipline routines already perform the necessary duties
                    458: for this routine.  This routine and the E_READ routines are in the emulator
                    459: package for completeness and allowing for future flexibility.
                    460: You will find that some specialized emulators do use these routines for other
                    461: than calling the associated line discipline routines (see buf_emul).
                    462: .IP E_IOCTL
                    463: .br
                    464: I/O control to emulator for changing or setting any characteristics of the
                    465: emulator or performing operations which do not fit into the normal
                    466: interface to the emulator.  An emulator's IOCTL routine should return a (-1)
                    467: if the command is not recognized.
                    468: .IP E_RINT
                    469: .br
                    470: Receive interrupt to emulator.  This procedure is only needed by input
                    471: emulators. The emulator receives an interrupt from
                    472: a driver's interrupt routine
                    473: and processes the data depending on the type of
                    474: interrupt received.
                    475: This procedure will then pass on the processed input data 
                    476: to the user assigned line discipline input routine.
                    477: Some specialized window manager emulators will not forward this data to a
                    478: line discipline but do their own queuing and interaction with the window
                    479: manager.
                    480: .IP E_PUTC
                    481: .br
                    482: Put a character on the display.  This emulator routine is passed a
                    483: character from a user's write or kernel print.  The emulator is then
                    484: responsible to decipher the data passed and do any emulation before passing
                    485: the appropriate characters to the hardware putc routine.
                    486: This is the procedure which makes use of the screen switch table (screen_sw)
                    487: to call the device dependent routines to perform the emulation on any
                    488: display.
                    489: .IP E_SELECT
                    490: .br
                    491: Select call to emulator.  This routine is used in input emulators to
                    492: perform the normal select duty of informing the user process
                    493: when new data is ready.
                    494: .IP E_PUTSTATUS
                    495: .br
                    496: Put status call to emulator.  The emulator is responsible to take the 
                    497: string passed and place it at an offset on the status line.
                    498: .RE
                    499: .NH
                    500: What the Emulator Package gives you
                    501: .RS
                    502: .IP 1.
                    503: Probe and initialize every display that is present on the workstation.
                    504: .IP 2.
                    505: Decide which display should be the default on bootup.
                    506: .IP 3.
                    507: A way for the user to reinitialize any hardware or emulator.
                    508: .IP 4.
                    509: A default emulator is defined for any particular hardware so that at
                    510: start up an application does not have to choose an emulator.
                    511: .IP 5.
                    512: A mechanism to select between the set of existing emulators for a display.
                    513: .IP 6.
                    514: Multiple displays running on the system simultaneously.
                    515: Each display can be associated with a different process.  This allows
                    516: a separate login to run on each display.
                    517: .IP 7.
                    518: Emulators are written to support more than one display at a time,
                    519: multithreaded.
                    520: .IP 8.
                    521: A way to switch between the displays currently open on the workstation.
                    522: When you switch screens the focus of the keyboard and mouse follows to that
                    523: display.  With this you can run a different window system on each display
                    524: and hot-key between them.
                    525: .IP 9.
                    526: A way to find out and change what the hot-key is.
                    527: .IP 10.
                    528: A way to lock out the user or system from using the display.
                    529: User lockout
                    530: is useful for window managers that wish to lock out other applications
                    531: from taking over the screen after they have.
                    532: Kernel or system lockout is useful when you don't want the kernel to
                    533: attempt to use a display for output because the controller has no display
                    534: hanging off it.
                    535: .RE
                    536: .NH
                    537: How does the console driver fit all this together?
                    538: .PP
                    539: The following diagram shows the relation of all the parts of the system I
                    540: have described with the standard
                    541: parts of a UNIX system.
                    542: .sp 1
                    543: .TS
                    544: center box;
                    545: cb s s
                    546: c s | cb
                    547: c | c | cb
                    548: .
                    549: Console System Diagram
                    550: =
                    551: User Application       User Level
                    552: \_     \_      \^
                    553: System Call Interface  Event Queue in  \^
                    554: \^     Shared Memory   \_
                    555: \^     \^      Kernel Level
                    556: \_     \_      \^
                    557: Line Discipline Package        Emulator Package        \^
                    558: \_     \_      \^
                    559: Standard Device Drivers        Low Level Display       \^
                    560: \^     Dependent Routines      \^
                    561: \_     \_      \_
                    562: Displays/Keyboard/Speaker      System or Serial Mouse  Hardware
                    563: .TE
                    564: .PP
                    565: The above is a conceptual view of the system and does not show you all
                    566: the specific parts and what interfaces with what, but it does
                    567: give you an idea of the levels of flow. 
                    568: The console driver is now a controller/router of sorts.
                    569: It takes the normal driver
                    570: requests and routes them to the correct display and display's
                    571: input/output emulator depending on the minor device specified.
                    572: The following shows how the minor device number maps to an emulator and display:
                    573: .sp 1
                    574: .TS
                    575: center allbox;
                    576: cb s
                    577: c c
                    578: .
                    579: Minor Device Number
                    580: _
                    581: Emulator FLAG  Display number
                    582: High Nibble    Low Nibble
                    583: 0 or 1 0 ... 15
                    584: .TE
                    585: .PP
                    586: The following is a list of currently used displays on our system.
                    587: .sp 1
                    588: .TS
                    589: center allbox;
                    590: cb s s
                    591: n l l
                    592: .
                    593: Console Displays
                    594: _
                    595: Display #      Symbolic Name   Description
                    596: 0      CONS_GEN        Generic console (Current display)
                    597: 1      CONS_AED        ACIS Experimental Display (Stream ordered)
                    598: 2      CONS_MONO       Standard Monocrome (Character driven)
                    599: 3      CONS_APA8       All Points Addr with 8 bit bus (Bitmap)
                    600: 4      CONS_APA16      All Points Addr with 16 bit bus (Bitmap)
                    601: 5      CONS_APA8C      All Points Addr color with 8 bit bus (Bitmap)
                    602: .TE
                    603: .PP
                    604: The emulator field in the minor device number is used to tell the console
                    605: driver to use the default glass tty input/output emulators for the display (0)
                    606: or to indicate that a nonstandard combination of input/output emulators will
                    607: be used by the user (1).  This is needed so that the system will know to
                    608: restore the display to the
                    609: .ul
                    610: standard state (default emulators)
                    611: wen the program exits.
                    612: The following is a list off all current emulators available:
                    613: .sp 1
                    614: .TS
                    615: center allbox;
                    616: cb s s
                    617: n l l
                    618: .
                    619: Emulators available
                    620: _
                    621: Emulator #     Symbolic Name   Description
                    622: 0      E_STDINPUT      Standard Input Emulator
                    623: 1      E_STDOUTPUT     Standard Output Emulator
                    624: 2      E_IBMOUTPUT     IBM 3101 Output Emulator
                    625: 3      E_ANSIOUTPUT    ANSI Output Emulator (Not implemented)
                    626: 4      E_XINPUT        X Event Queuing Input Emulator
                    627: 5      E_BUFOUTPUT     Buffering Output Emulator
                    628: 6      E_MACINPUT      Macintosh Event Queuing Input Emulator (Not Avail)
                    629: 7      E_MACOUTPUT     Macintosh Output Emulator (Not Avail)
                    630: 8      E_KBDINPUT      Intelligent Keyboard mapping Input Emulator
                    631: 9      E_AED   Raw AED microcode interface Emulator
                    632: .TE
                    633: .sp 1
                    634: .PP
                    635: The
                    636: .ul
                    637: default emulators
                    638: for each display are:
                    639: .sp 1
                    640: .TS
                    641: center allbox;
                    642: cb s s
                    643: l | l l
                    644: .
                    645: Default Input/Output Emulators for each display
                    646: Display        Input Emulator  Output Emulator
                    647: AED    E_STDINPUT      E_STDOUTPUT
                    648: MONO   E_STDINPUT      E_IBMOUTPUT
                    649: APA8   E_STDINPUT      E_IBMOUTPUT
                    650: APA16  E_STDINPUT      E_IBMOUTPUT
                    651: APA8C  E_STDINPUT      E_IBMOUTPUT
                    652: .TE
                    653: .NH 2
                    654: Input From Keyboard Scenario
                    655: .RS
                    656: .IP 1.
                    657: User types character on keyboard.
                    658: .IP 2.
                    659: Receive Interrupt in keyboard driver, keyboar.c, interrupt routine 
                    660: .ul
                    661: cnrint().
                    662: This routine extracts the key code from the hardware.
                    663: .IP 3.
                    664: Call emulator receive interrupt routine from the switch table indexed by
                    665: the current
                    666: .ul
                    667: input focus
                    668: after setting the 
                    669: emulator structure flag indicating that this was a keyboard interrupt.
                    670: .IP 4.
                    671: Emulator will check if this was a keyboard interrupt.
                    672: If so it will either translate code into a character
                    673: and call normal line discipline routine for this console with the character
                    674: that it mapped the code to or
                    675: perform some emulator specific function like store the raw key
                    676: code in a shared memory area (X like)
                    677: and set a semaphore, also in shared memory, for
                    678: the user process to know that a new event has arrived.
                    679: .IP 5.
                    680: If a line discipline input routine is called, it will then perform any of
                    681: its normal input editing/mapping talked about previously and pass the
                    682: result to the user through the read system call interface.
                    683: .IP 6.
                    684: If a shared memory queue interface was used the user process would note
                    685: the queue update through the semaphore and then proceed to read the data
                    686: from the shared memory without preforming a read or any other system call.
                    687: .IP 7.
                    688: In either of the above two cases, if the user has previously done a select
                    689: call, he/she would then have the select satisfied.
                    690: .RE
                    691: .NH 2
                    692: Output To Display Scenario
                    693: .PP
                    694: This
                    695: .ul
                    696: scenario
                    697: only applys to glass tty operations and not window managers since window
                    698: manager system go directly to the display hardware through its own
                    699: graphics routines.  A special
                    700: .ul
                    701: buffer emulator
                    702: has been set up to handle the case it someone trys to write through the
                    703: system to the display while a window manger is controlling the display.
                    704: This emulator would then be called, instead of a glass tty like emulator,
                    705: in the scenario listed below.
                    706: .RS
                    707: .IP 1.
                    708: The user performs a
                    709: .ul
                    710: write system call
                    711: with a buffer of data for the display.  This data consists of straight
                    712: ascii data or display order streams.
                    713: .IP 2.
                    714: The console write routine will then call the minor device switched
                    715: output emulator's write routine.
                    716: .IP 3.
                    717: The output emulator write will usually then forward this data to the line
                    718: discipline write routine specified by the user.  Certain emulators, like the
                    719: .ul
                    720: buf emulator
                    721: mentioned, will intercept this data and capture it for printing latter or
                    722: any other specific need.
                    723: .IP 4.
                    724: The line discipline will interpret the data and call the console start
                    725: routine, as normal, to print the ascii characters.
                    726: .IP 5.
                    727: The console driver's start routine loops through
                    728: dequeuing each character and calling
                    729: the output emulator put-character routine,
                    730: .ul
                    731: e_putc,
                    732: for each character.
                    733: .IP 6.
                    734: The output emulator
                    735: .ul
                    736: put-character routine
                    737: then deciphers the data and
                    738: calls the appropriate device-dependent routine to display the
                    739: character or perform the display command.
                    740: .RE
                    741: .NH
                    742: The User interface to the Emulators
                    743: .PP
                    744: As with standard UNIX the user interfaces to the system through system
                    745: calls to the console driver.  The following explains how this interface has
                    746: changed to support the emulator package and multiple devices.
                    747: For more details on the
                    748: .ul
                    749: console and mouse drivers
                    750: you should see
                    751: .ul
                    752: cons(4) and  ms(4).
                    753: .NH 2
                    754: Interface to Keyboard Input and Display Output
                    755: .NH 3
                    756: Standard Interface
                    757: .PP
                    758: In the simplest case a user program would still perform the same
                    759: operations as in the past, therefore allowing previously written programs to
                    760: work without change.  The following lists the normal scenario and what the
                    761: emulator package does:
                    762: .RS
                    763: .IP 1.
                    764: An application, say login, opens "/dev/console".
                    765: Since "/dev/console" is the special CONS_GEN minor device, the open is
                    766: mapped to the current input focused display.  The effect is that the
                    767: display at which you start a program is the display that is associated with
                    768: the process.  The system will then start the default input and output
                    769: emulators for that display.
                    770: .IP 2.
                    771: The application reads or writes to the file descriptor returned
                    772: from the open system call.
                    773: The system will map reads or writes to the GEN_CONSOLE minor device
                    774: to the display with the current input focus which causes the appropriate
                    775: display indexed input/output emulators to be used.
                    776: .IP 3.
                    777: The application exits or closes "/dev/console" file descriptor.  The system
                    778: will close the input/output emulators and the stream for the display with
                    779: the current input focus.
                    780: .RE
                    781: .PP
                    782: This mapping of "/dev/console" to the current display is important for
                    783: most applications which do not want to bother with which display they are
                    784: running on.  This mapping is also very important
                    785: at system bootup time where the single user
                    786: shell does not know what display it
                    787: is starting on and it is simply mapped to the what the system choose as the
                    788: starting input focus. 
                    789: But you want to tell some applications (e.g. login, widow manager.) which 
                    790: .ul
                    791: display
                    792: they should start on.
                    793: Therefore, the following devices where made to support the displays
                    794: available on our system.
                    795: .TS
                    796: center allbox;
                    797: cb s s s s
                    798: c c c c c
                    799: l l c c l
                    800: .
                    801: Standard TTY Like Display Devices
                    802: _
                    803: Protections    Owner   Major   Minor   Device
                    804: crw-rw-rw-     root    0,      0       /dev/console
                    805: crw-rw-rw-     root    0,      1       /dev/ttyaed
                    806: crw-rw-rw-     root    0,      2       /dev/ttymono
                    807: crw-rw-rw-     root    0,      3       /dev/ttyapa8
                    808: crw-rw-rw-     root    0,      4       /dev/ttyapa16
                    809: crw-rw-rw-     root    0,      5       /dev/ttyapa8c
                    810: .TE
                    811: .PP
                    812: To start up an application on a particular display, all that is needed is
                    813: to reassign its standard input and outputs to any one of these devices or
                    814: have the application specifically open one of them.  The system will then
                    815: handle the routing of output from that application to the appropriate
                    816: display and its default emulators.  Input to the application from the
                    817: keyboard will only occur when the input focus is assigned to that display.
                    818: To switch between open displays you can hit the specified hot-key for your
                    819: system or use an application which performs an
                    820: .ul
                    821: ioctl system call
                    822: to set the input focus.
                    823: .PP
                    824: Putting this all together with the startup facilities in UNIX you
                    825: can now specify the different displays you have on your system in the
                    826: .ul
                    827: /etc/ttys
                    828: startup file and tell the system to start logins on each one of the
                    829: displays.  A user can then hot-key to the display he/she wishes to use and
                    830: after logging in run any applications needed.  Any application started on that
                    831: display will stay associated with it because it was started while the input
                    832: focus was on that display.  Remember that this is an
                    833: application transparent mapping to that display taking place in the
                    834: kernel.  Therefore a user can log on as many of the displays simultaneously
                    835: as needed.
                    836: .NH 3
                    837: Nonstandard Interface
                    838: .PP
                    839: For applications which call for a specific emulator that might not be the
                    840: default for a particular display, the following devices have been created.
                    841: .sp 1
                    842: .TS
                    843: center allbox;
                    844: cb s s s s
                    845: c c c c c
                    846: l l c c l
                    847: .
                    848: Nonstandard Display Devices
                    849: _
                    850: Protections    Owner   Major   Minor   Device
                    851: crw-rw-rw-     root    0,      17      /dev/aed
                    852: crw-rw-rw-     root    0,      18      /dev/mono
                    853: crw-rw-rw-     root    0,      19      /dev/apa8
                    854: crw-rw-rw-     root    0,      20      /dev/apa16
                    855: crw-rw-rw-     root    0,      21      /dev/apa8c
                    856: .TE
                    857: .PP
                    858: You will notice that the emulator bit flag is on for each of these
                    859: devices.  This indicates to the system that a nonstandard input and/or
                    860: output emulator is going to be used on this display and that on close the
                    861: system should return the display to its default emulators.
                    862: The system will open the standard input emulator and a special
                    863: buffering output emulator.  This is done because most applications that
                    864: open the nonstandard device will take over the screen and want any output
                    865: from other sources (such as kernel prints) to be buffered and displayed
                    866: when the display is closed.  See the manual page on the
                    867: .ul
                    868: buf emulator
                    869: for more information.
                    870: .PP
                    871: The following is a list of commands through the
                    872: .ul
                    873: ioctl system call
                    874: to the console emulator package:
                    875: .TS
                    876: center allbox;
                    877: cb s s s
                    878: c c c c
                    879: l l l ltw(3i)
                    880: .
                    881: Ioctl Commands to Emulator Package
                    882: _
                    883: Command        Read    Write   Description
                    884: CON_SELECT_SCREEN      Yes     Yes     T{
                    885: Input focus is set to display Number (Arg > 0) or to next display in list
                    886: (Arg < 0).  Previous display number is returned.
                    887: T}
                    888: CON_GET_SCREEN Yes     No      T{
                    889: Just returns the current input focus display number.
                    890: T}
                    891: EIGETD Yes     No      T{
                    892: Get the number of the current input emulator for this display.
                    893: T}
                    894: EOGETD Yes     No      T{
                    895: Get the number of the current output emulator for this display.
                    896: T}
                    897: EISETD Yes     Yes     T{
                    898: Set the input emulator and return the previous for this display.
                    899: T}
                    900: EOSETD Yes     Yes     T{
                    901: Set the output emulator and return the previous for this display.
                    902: T}
                    903: CON_INIT_SCREEN        No      Yes     T{
                    904: Initialize the specified display (Arg >= 0) or
                    905: this display (Arg < 0).
                    906: T}
                    907: CON_GET_FOCUS_CODE     Yes     No      T{
                    908: Get the current keyboard code for setting the input focus (hot-key code).
                    909: T}
                    910: CON_SET_FOCUS_CODE     Yes     Yes     T{
                    911: Set the current keyboard code for setting the input focus (hot-key code),
                    912: and return the previous code.
                    913: T}
                    914: SCRIOCGETF     Yes     Yes     T{
                    915: Get screen control flags for the given display number.
                    916: T}
                    917: SCRIOCSETC     Yes     Yes     T{
                    918: Set screen control flags for the given display number.
                    919: T}
                    920: .TE
                    921: .PP
                    922: All of the above commands take integer arguments except the last two
                    923: (SCRIOCGETF and SCRIOCSETC) which use the following structure:
                    924: .sp 2
                    925: .nf
                    926: struct screen_control   {
                    927:        int     device;         /* which screen/display to control */
                    928:        int     switches;       /* Flags for this screen */
                    929: };
                    930: .fi
                    931: .sp 1
                    932: .TS
                    933: center allbox;
                    934: cb s 
                    935: c c
                    936: l l
                    937: .
                    938: Flags/Switches for Each Display
                    939: Flag   Description
                    940: CONSDEV_PRESENT        Display is present on this system.
                    941: CONSDEV_KERNEL Display is available to the kernel.
                    942: CONSDEV_USER   Display is available to the user.
                    943: CONSDEV_INIT   Display has been initialized for output.
                    944: CONSDEV_OPEN   Display has been open directly by minor device number.
                    945: .TE
                    946: .PP
                    947: All of the above
                    948: .ul
                    949: ioctl system calls
                    950: are
                    951: .ul
                    952: device independent controls
                    953: for dealing with the emulators.  Each emulator has its own set of ioctls
                    954: for its own emulation purposes.  These other
                    955: .ul
                    956: ioctls
                    957: are used in window manager type emulators for operations such as
                    958: passing/positioning the mouse locator for/on the display.
                    959: See the man page for any particular emulator for more information.
                    960: .NH 2
                    961: Mouse Input Interface and Other Input Devices
                    962: .PP
                    963: The interface to the system mouse is similar to that for the keyboard.
                    964: If you open the generic mouse device
                    965: .ul
                    966: /dev/ms,
                    967: minor device 0, the mouse input will be attached to the display which the
                    968: current input focus is on.  Opening any other mouse device will attach the
                    969: mouse input stream to the process only when the input focus is on the
                    970: associated display.  Since there can be a large assortment of serial type
                    971: hardware ports in which you can hang a mouse off of I have decided, for the
                    972: present, not to change all the associated drivers to support the console
                    973: like minor devices and input focus forwarding.  Therefore a Mouse off a
                    974: async port will always report its data to the process no matter what
                    975: display it was started on.  If more that one process opens an async mouse
                    976: they will compete for data from the mouse.
                    977: .sp 1
                    978: .TS
                    979: center allbox;
                    980: cb s s s s
                    981: c c c c c
                    982: l l c c l
                    983: .
                    984: Mouse Input Devices
                    985: _
                    986: Protections    Owner   Major   Minor   Device
                    987: crw-rw-rw-     root    15,     0       /dev/ms
                    988: crw-rw-rw-     root    15,     1       /dev/msaed
                    989: crw-rw-rw-     root    15,     2       /dev/msmono
                    990: crw-rw-rw-     root    15,     3       /dev/msapa8
                    991: crw-rw-rw-     root    15,     4       /dev/msapa16
                    992: crw-rw-rw-     root    15,     5       /dev/msapa8c
                    993: .TE
                    994: .PP
                    995: The
                    996: .ul
                    997: system mouse
                    998: and
                    999: .ul
                   1000: serial port mice
                   1001: drivers are essentially the same as you find in normal UNIX.  These drivers
                   1002: hook into the emulator package through a user selecting a
                   1003: special line discipline.  This line discipline
                   1004: filters the mouse data and then passes a generic
                   1005: data packet to the user through normal read system calls
                   1006: or calls the user specified emulator with the data packet.
                   1007: This line discipline is explained in the manual page for
                   1008: .ul
                   1009: tty_tb(4).
                   1010: .NH
                   1011: The Emulator Package RoadMap
                   1012: .PP
                   1013: The following tables briefly explains the files that make up the emulator
                   1014: package.  The tables are split up the different parts that
                   1015: make up the emulator package according to functionality
                   1016: Each table state what that functionality is and where the files can be
                   1017: found as well as a description of what can be found in that file.
                   1018: Tables with a column marked
                   1019: .ul
                   1020: User
                   1021: distinguishes between purely kernel files
                   1022: and user/kernel shared include files.  This indicates what files a user
                   1023: should include to get at the basic emulator functions and any particular
                   1024: emulator now available.
                   1025: .bp
                   1026: .TS
                   1027: expand allbox;
                   1028: cb s s
                   1029: cb s s
                   1030: c c c
                   1031: l c ltw(4i)
                   1032: .
                   1033: Emulator Control Files
                   1034: _
                   1035: "/sys/machinecons"
                   1036: File   User    Description
                   1037: cons.c no      T{
                   1038: Console Driver, routes requests to appropriate emulator and its Input/Output
                   1039: device or to the emulator controller.
                   1040: Console driver is also responsible for console message forwarding.
                   1041: T}
                   1042: consdefs.h     no      T{
                   1043: This file contains hardware interface information about system input
                   1044: devices.  Emulators as well as device dependent routines use this to
                   1045: interface with each other and the hardware.
                   1046: T}
                   1047: consio.h       yes     T{
                   1048: Defines for what displays and screen controls/flags are available.  The
                   1049: IOCTL commands and structure for screen_control are in here.  This file is
                   1050: indirectly included by screen_conf.h.
                   1051: T}
                   1052: consvars.h     no      T{
                   1053: Emulator control variables are declared here.
                   1054: T}
                   1055: bus.c  no      T{
                   1056: I/O Bus control driver, which allows access to the I/O bus on a per process
                   1057: basis.  Window managers which need to get directly at the display from user
                   1058: space should open "/dev/bus".
                   1059: T}
                   1060: screen_conf.c  no      T{
                   1061: Where all the displays and emulators are configured for the system.  This
                   1062: file also contains the emulator control routines discussed in "What the
                   1063: Emulator Package gives you".
                   1064: T}
                   1065: screen_conf.h  yes     T{
                   1066: Where all the structures, defines, and macros for the emulator package
                   1067: live.  This contains all the macros for an emulator to interface with the
                   1068: Device Dependent routines as well as the IOCTL information for the user to
                   1069: interface with the Emulator Package.
                   1070: T}
                   1071: .TE
                   1072: .TS
                   1073: expand box;
                   1074: cb s s
                   1075: cb s s
                   1076: c | c | c
                   1077: l | c | ltw(4i)
                   1078: .
                   1079: Emulators
                   1080: =
                   1081: "/sys/machinecons"
                   1082: _
                   1083: File   User    Description
                   1084: aed.c  no      T{
                   1085: AED raw microcode graphic emulator.
                   1086: T}
                   1087: aeddefs.h      \^      \^
                   1088: _
                   1089: buf_emul.c     no      T{
                   1090: Buffering emulator, which saves messages sent to display and then flushes
                   1091: them when the output emulator is changed.
                   1092: T}
                   1093: _
                   1094: ibm_emul.c     no      T{
                   1095: IBM3101 output emulator.  Takes a considerable subset of IBM3101 commands
                   1096: defined in tcap.
                   1097: T}
                   1098: mono_tcap.h    \^      \^
                   1099: _
                   1100: kbd_emul.c     no      T{
                   1101: A smarter keyboard emulator which allows mapping of key codes to a character
                   1102: stream.
                   1103: T}
                   1104: kbd_emul.h     \^      \^
                   1105: kbde_codes.h   \^      \^
                   1106: _
                   1107: std_emul.c     no      T{
                   1108: Standard input and output emulator routines.  A straight key code to
                   1109: character mapping is done on input and the raw characters are sent to the
                   1110: display on output.  This output emulator is used for displays which perform
                   1111: their own emulations.
                   1112: T}
                   1113: std_emul.h     \^      \^
                   1114: _
                   1115: x_emul.c       no      T{
                   1116: X window system input emulator.  This queues up keyboard and mouse events
                   1117: into a shared memory area between kernel and user.  This emulator also has
                   1118: a variety of IOCTLs for controlling the locator on a display, as well as
                   1119: performing other X related functions (e.g. tracking the cursor, etc.).
                   1120: T}
                   1121: xio.h  yes     T{
                   1122: X dependent structures and defines for kernel and usr process.
                   1123: T}
                   1124: _
                   1125: qevent.h       yes     T{
                   1126: Event Queue structures and defines used by only the X emulator currently.
                   1127: T}
                   1128: .TE
                   1129: .bp
                   1130: .TS
                   1131: expand allbox;
                   1132: cb s s
                   1133: cb s s
                   1134: c c c
                   1135: l c ltw(4i)
                   1136: .
                   1137: New/Changed Line Discipline files
                   1138: =
                   1139: "/sys/sys" and "/sys/h"
                   1140: _
                   1141: File   User    Description
                   1142: tty_conf.c     no      T{
                   1143: Line discipline configure file.
                   1144: T}
                   1145: tty.h  yes     T{
                   1146: Line discipline structures and defines.
                   1147: T}
                   1148: =
                   1149: tty_tb.c       no      T{
                   1150: Normal tablet line discipline changed to support system/serial type mice also.
                   1151: Also changed for forwarding data packets to input emulator if specified.
                   1152: T}
                   1153: tbdefs.h       no      T{
                   1154: Tablet/Mouse generic data packet structures and defines.
                   1155: T}
                   1156: tbioctl.h      yes     T{
                   1157: IOCTL commands and structures.
                   1158: T}
                   1159: .TE
                   1160: .TS
                   1161: expand allbox;
                   1162: cb s
                   1163: cb s
                   1164: c c
                   1165: l ltw(4i)
                   1166: .
                   1167: Low Level Output Display Dependent Files
                   1168: _
                   1169: "/sys/machinecons"
                   1170: File   Description
                   1171: aed_tty.h      T{
                   1172: Macros and defines for interfacing with the Glass TTY microcode for the
                   1173: AED display.
                   1174: T}
                   1175: aed_tty_mcode.h        T{
                   1176: Glass TTY microcode for download to the AED display.
                   1177: T}
                   1178: aedloc.c       T{
                   1179: AED locator low level device dependent routines.
                   1180: T}
                   1181: aedtty.c       T{
                   1182: AED Glass TTY low level device dependent routines.
                   1183: T}
                   1184: apa16loc.c     T{
                   1185: APA16 locator low level device dependent routines.
                   1186: T}
                   1187: apa16tty.c     T{
                   1188: APA16 Glass TTY low level device dependent routines.
                   1189: T}
                   1190: apa16tty.h     T{
                   1191: APA16 device dependent structures and define.
                   1192: T}
                   1193: apa16tty_font.h        T{
                   1194: APA16 Font for Glass TTY emulation.
                   1195: T}
                   1196: apa8cloc.c     T{
                   1197: APA8 Color locator low level device dependent routines.
                   1198: T}
                   1199: apa8ctty.c     T{
                   1200: APA8 Color Glass TTY low level device dependent routines.
                   1201: T}
                   1202: apa8ctty.h     T{
                   1203: APA8 Color device dependent structures and define.
                   1204: T}
                   1205: apa8loc.c      T{
                   1206: APA8 locator low level device dependent routines.
                   1207: T}
                   1208: apa8tty.c      T{
                   1209: APA8 Glass TTY low level device dependent routines.
                   1210: T}
                   1211: apa8tty.h      T{
                   1212: APA8 device dependent structures and define.
                   1213: T}
                   1214: apa8tty_font.h T{
                   1215: APA8 and APA8 Color Font for Glass TTY emulation.
                   1216: T}
                   1217: apa_fontblt.c  T{
                   1218: Generic routines for font manipulation on APA displays.
                   1219: T}
                   1220: apa_structs.h  T{
                   1221: Generic structures and defines for font manipulation on APA displays.
                   1222: T}
                   1223: apaaed.h       T{
                   1224: Structures and defines for dealing with the AED as an APA display.
                   1225: T}
                   1226: mono.c T{
                   1227: Monocrome Glass TTY low level device dependent routines.
                   1228: T}
                   1229: monocons.h     T{
                   1230: Monocrome device dependent structures.
                   1231: T}
                   1232: monodefs.h     T{
                   1233: Monocrome device dependent defines.
                   1234: T}
                   1235: .TE
                   1236: .bp
                   1237: .TS
                   1238: expand allbox;
                   1239: cb s
                   1240: cb s
                   1241: c c
                   1242: l ltw(4i)
                   1243: .
                   1244: Low Level Keyboard Device Dependent Routines
                   1245: _
                   1246: "/sys/machinecons"
                   1247: File   Description
                   1248: keyboard.c     System Keyboard hardware routines.
                   1249: keyboard.h     System Keyboard hardware structures and defines.
                   1250: .TE
                   1251: .sp 1
                   1252: .TS
                   1253: expand allbox;
                   1254: cb s s
                   1255: cb s s
                   1256: c c c
                   1257: l c ltw(4i)
                   1258: .
                   1259: System and Serial Mouse Device Drivers
                   1260: _
                   1261: "/sys/machineio"
                   1262: File   User    Description
                   1263: asy.c  no      T{
                   1264: Serial asynchronous driver, supports 4 port board and
                   1265: Parallel/Serial board.
                   1266: T}
                   1267: asyregs.h      no      T{
                   1268: Serial hardware structures and defines.
                   1269: T}
                   1270: mouse.c        no      T{
                   1271: Driver for system mouse.
                   1272: T}
                   1273: mouseio.h      yes     T{
                   1274: System Mouse structures and defines.  Also includes IOCTL controls/defines
                   1275: for user processes.
                   1276: T}
                   1277: mousereg.h     no      T{
                   1278: System mouse driver declarations.
                   1279: T}
                   1280: psp.c  no      T{
                   1281: System (Planar) Serial Port driver.
                   1282: T}
                   1283: pspreg.h       no      T{
                   1284: Planar Serial Port hardware structures and defines.
                   1285: T}
                   1286: .TE

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.