|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.