\toctexentry {9}{\RTLnumber {}}{Preface}{\RTLnumber {xi}} \toctexentry {0}{\RTLnumber {1}}{Device Handlers}{\RTLnumber {1\foliodelim 1}} \toctexentry {1}{\RTLnumber {1.1}}{How to Plan a Device Handler}{\RTLnumber {1\foliodelim 1}} \toctexentry {2}{\RTLnumber {1.1.1}}{Get to Know Your Device}{\RTLnumber {1\foliodelim 2}} \toctexentry {2}{\RTLnumber {1.1.2}}{Study the Structure of a Standard Device Handler}{\RTLnumber {1\foliodelim 2}} \toctexentry {2}{\RTLnumber {1.1.3}}{Study the Skeleton Device Handler}{\RTLnumber {1\foliodelim 2}} \toctexentry {2}{\RTLnumber {1.1.4}}{Think About Using the Special Features}{\RTLnumber {1\foliodelim 2}} \toctexentry {2}{\RTLnumber {1.1.5}}{Study the Sample Handlers}{\RTLnumber {1\foliodelim 2}} \toctexentry {2}{\RTLnumber {1.1.6}}{Prepare a Flowchart of the Device Handler}{\RTLnumber {1\foliodelim 2}} \toctexentry {2}{\RTLnumber {1.1.7}}{Write the Code}{\RTLnumber {1\foliodelim 3}} \toctexentry {2}{\RTLnumber {1.1.8}}{Install, Test, and Debug the Handler}{\RTLnumber {1\foliodelim 3}} \toctexentry {1}{\RTLnumber {1.2}}{Structure of a Device Handler}{\RTLnumber {1\foliodelim 3}} \toctexentry {2}{\RTLnumber {1.2.1}}{Preamble Section}{\RTLnumber {1\foliodelim 4}} \toctexentry {3}{\RTLnumber {1.2.1.1}}{.DRDEF Macro}{\RTLnumber {1\foliodelim 5}} \toctexentry {4}{\RTLnumber {1.2.1.1.1}}{System Conditionals}{\RTLnumber {1\foliodelim 7}} \toctexentry {4}{\RTLnumber {1.2.1.1.2}}{Queue Element Offsets}{\RTLnumber {1\foliodelim 7}} \toctexentry {4}{\RTLnumber {1.2.1.1.3}}{Symbol Definitions}{\RTLnumber {1\foliodelim 9}} \toctexentry {4}{\RTLnumber {1.2.1.1.4}}{Device-Identifier Byte}{\RTLnumber {1\foliodelim 9}} \toctexentry {4}{\RTLnumber {1.2.1.1.5}}{Device Status Word}{\RTLnumber {1\foliodelim 10}} \toctexentry {4}{\RTLnumber {1.2.1.1.6}}{Device Size Word}{\RTLnumber {1\foliodelim 11}} \toctexentry {3}{\RTLnumber {1.2.1.2}}{.DREST Macro}{\RTLnumber {1\foliodelim 11}} \toctexentry {3}{\RTLnumber {1.2.1.3}}{.DRINS Macro}{\RTLnumber {1\foliodelim 12}} \toctexentry {3}{\RTLnumber {1.2.1.4}}{.DRPTR Macro}{\RTLnumber {1\foliodelim 13}} \toctexentry {3}{\RTLnumber {1.2.1.5}}{.DRSPF Macro}{\RTLnumber {1\foliodelim 13}} \toctexentry {3}{\RTLnumber {1.2.1.6}}{.DRTAB Macro}{\RTLnumber {1\foliodelim 13}} \toctexentry {3}{\RTLnumber {1.2.1.7}}{.DRUSE Macro}{\RTLnumber {1\foliodelim 14}} \toctexentry {3}{\RTLnumber {1.2.1.8}}{.DRSET Macro}{\RTLnumber {1\foliodelim 14}} \toctexentry {3}{\RTLnumber {1.2.1.9}}{Information in File Image Block 0}{\RTLnumber {1\foliodelim 14}} \toctexentry {2}{\RTLnumber {1.2.2}}{Header Section}{\RTLnumber {1\foliodelim 16}} \toctexentry {3}{\RTLnumber {1.2.2.1}}{.DRBEG Macro}{\RTLnumber {1\foliodelim 17}} \toctexentry {3}{\RTLnumber {1.2.2.2}}{Multivector Handlers: .DRVTB Macro}{\RTLnumber {1\foliodelim 17}} \toctexentry {3}{\RTLnumber {1.2.2.3}}{Information in File Image Block 1}{\RTLnumber {1\foliodelim 19}} \toctexentry {2}{\RTLnumber {1.2.3}}{I/O Initiation Section}{\RTLnumber {1\foliodelim 19}} \toctexentry {3}{\RTLnumber {1.2.3.1}}{Guidelines for Starting the Data Transfer}{\RTLnumber {1\foliodelim 20}} \toctexentry {3}{\RTLnumber {1.2.3.2}}{Transferring the Data}{\RTLnumber {1\foliodelim 21}} \toctexentry {4}{\RTLnumber {1.2.3.2.1}}{Byte Transfer from the User Buffer to the Device}{\RTLnumber {1\foliodelim 21}} \toctexentry {4}{\RTLnumber {1.2.3.2.2}}{Byte Transfer from the Device to the User Buffer}{\RTLnumber {1\foliodelim 22}} \toctexentry {4}{\RTLnumber {1.2.3.2.3}}{Word Transfer from the Device to the User Buffer}{\RTLnumber {1\foliodelim 23}} \toctexentry {4}{\RTLnumber {1.2.3.2.4}}{Non-DMA Transfers}{\RTLnumber {1\foliodelim 24}} \toctexentry {4}{\RTLnumber {1.2.3.2.5}}{DMA Transfers}{\RTLnumber {1\foliodelim 24}} \toctexentry {2}{\RTLnumber {1.2.4}}{Interrupt Service Section}{\RTLnumber {1\foliodelim 24}} \toctexentry {3}{\RTLnumber {1.2.4.1}}{.DRAST Macro}{\RTLnumber {1\foliodelim 25}} \toctexentry {3}{\RTLnumber {1.2.4.2}}{Abort Entry Point}{\RTLnumber {1\foliodelim 25}} \toctexentry {3}{\RTLnumber {1.2.4.3}}{Lowering the Priority to Device Priority}{\RTLnumber {1\foliodelim 26}} \toctexentry {3}{\RTLnumber {1.2.4.4}}{Guidelines for Coding the Interrupt Service Section}{\RTLnumber {1\foliodelim 26}} \toctexentry {2}{\RTLnumber {1.2.5}}{I/O Completion Section}{\RTLnumber {1\foliodelim 28}} \toctexentry {2}{\RTLnumber {1.2.6}}{Handler Termination Section}{\RTLnumber {1\foliodelim 29}} \toctexentry {3}{\RTLnumber {1.2.6.1}}{.DREND Macro}{\RTLnumber {1\foliodelim 29}} \toctexentry {2}{\RTLnumber {1.2.7}}{Pseudodevices}{\RTLnumber {1\foliodelim 29}} \toctexentry {2}{\RTLnumber {1.2.8}}{Handler Data Structures Related to Block 0}{\RTLnumber {1\foliodelim 30}} \toctexentry {3}{\RTLnumber {1.2.8.1}}{Handler Service Routine Environment}{\RTLnumber {1\foliodelim 30}} \toctexentry {3}{\RTLnumber {1.2.8.2}}{Special Function Code Support Table (H.SPFx) }{\RTLnumber {1\foliodelim 34}} \toctexentry {3}{\RTLnumber {1.2.8.3}}{Bad-Block Replacement Geometry Table (H.REPL) }{\RTLnumber {1\foliodelim 35}} \toctexentry {3}{\RTLnumber {1.2.8.4}}{Bad-Block Replacement Table (HB.BAD)}{\RTLnumber {1\foliodelim 36}} \toctexentry {3}{\RTLnumber {1.2.8.5}}{Second Handler Status Word (H.STS2)}{\RTLnumber {1\foliodelim 36}} \toctexentry {3}{\RTLnumber {1.2.8.6}}{Handler SYSGEN Options Byte (H.GEN) }{\RTLnumber {1\foliodelim 37}} \toctexentry {3}{\RTLnumber {1.2.8.7}}{Handler Internal Data Table and Descriptor Structure (H.TYPE, H.DATA, and H.DLEN) }{\RTLnumber {1\foliodelim 37}} \toctexentry {3}{\RTLnumber {1.2.8.8}}{UMR Support and Extended Device-Unit Handlers (H.64UM)}{\RTLnumber {1\foliodelim 38}} \toctexentry {2}{\RTLnumber {1.2.9}}{Handler Data Structures Related to Block 1}{\RTLnumber {1\foliodelim 39}} \toctexentry {3}{\RTLnumber {1.2.9.1}}{Handler Flag Word (H1.FLG)}{\RTLnumber {1\foliodelim 39}} \toctexentry {3}{\RTLnumber {1.2.9.2}}{Handler Service Routine Entry Point Word (H1.NOP)}{\RTLnumber {1\foliodelim 39}} \toctexentry {3}{\RTLnumber {1.2.9.3}}{Second Handler Flag Word (H1.FG2)}{\RTLnumber {1\foliodelim 40}} \toctexentry {2}{\RTLnumber {1.2.10}}{Skeleton Outline of a Device Handler}{\RTLnumber {1\foliodelim 41}} \toctexentry {1}{\RTLnumber {1.3}}{Abort Processing}{\RTLnumber {1\foliodelim 43}} \toctexentry {2}{\RTLnumber {1.3.1}}{Handler Status Word Bits ABTIO\$ and HNDLR\$}{\RTLnumber {1\foliodelim 43}} \toctexentry {2}{\RTLnumber {1.3.2}}{Types of Aborts and Action Taken by RMON}{\RTLnumber {1\foliodelim 44}} \toctexentry {1}{\RTLnumber {1.4}}{Handlers That Queue Internally}{\RTLnumber {1\foliodelim 47}} \toctexentry {2}{\RTLnumber {1.4.1}}{Implementing Internal Queuing}{\RTLnumber {1\foliodelim 47}} \toctexentry {2}{\RTLnumber {1.4.2}}{Interrupt Service for Handlers That Queue Internally}{\RTLnumber {1\foliodelim 47}} \toctexentry {2}{\RTLnumber {1.4.3}}{Abort Procedures for Handlers That Queue Internally}{\RTLnumber {1\foliodelim 48}} \toctexentry {1}{\RTLnumber {1.5}}{Set Options}{\RTLnumber {1\foliodelim 49}} \toctexentry {2}{\RTLnumber {1.5.1}}{How the SET Command Executes}{\RTLnumber {1\foliodelim 50}} \toctexentry {2}{\RTLnumber {1.5.2}}{SET Table Format}{\RTLnumber {1\foliodelim 50}} \toctexentry {2}{\RTLnumber {1.5.3}}{.DRSET Macro}{\RTLnumber {1\foliodelim 51}} \toctexentry {2}{\RTLnumber {1.5.4}}{Routines to Modify the Handler}{\RTLnumber {1\foliodelim 52}} \toctexentry {2}{\RTLnumber {1.5.5}}{Examples of SET Options}{\RTLnumber {1\foliodelim 53}} \toctexentry {1}{\RTLnumber {1.6}}{Device I/O Timeout}{\RTLnumber {1\foliodelim 55}} \toctexentry {2}{\RTLnumber {1.6.1}}{.TIMIO Macro}{\RTLnumber {1\foliodelim 55}} \toctexentry {2}{\RTLnumber {1.6.2}}{.CTIMIO Macro}{\RTLnumber {1\foliodelim 57}} \toctexentry {2}{\RTLnumber {1.6.3}}{Device Timeout Applications}{\RTLnumber {1\foliodelim 58}} \toctexentry {3}{\RTLnumber {1.6.3.1}}{Multiterminal Service}{\RTLnumber {1\foliodelim 58}} \toctexentry {3}{\RTLnumber {1.6.3.2}}{Typical Timer Procedure for a Disk Handler}{\RTLnumber {1\foliodelim 59}} \toctexentry {3}{\RTLnumber {1.6.3.3}}{Printer Handler Example}{\RTLnumber {1\foliodelim 60}} \toctexentry {1}{\RTLnumber {1.7}}{Error Logging}{\RTLnumber {1\foliodelim 61}} \toctexentry {2}{\RTLnumber {1.7.1}}{When and How to Call the Error Logger}{\RTLnumber {1\foliodelim 62}} \toctexentry {3}{\RTLnumber {1.7.1.1}}{To Log a Successful Transfer}{\RTLnumber {1\foliodelim 62}} \toctexentry {3}{\RTLnumber {1.7.1.2}}{To Log a Hard Error}{\RTLnumber {1\foliodelim 63}} \toctexentry {3}{\RTLnumber {1.7.1.3}}{To Log a Soft Error}{\RTLnumber {1\foliodelim 63}} \toctexentry {3}{\RTLnumber {1.7.1.4}}{Differences Between Hard and Soft Errors}{\RTLnumber {1\foliodelim 64}} \toctexentry {3}{\RTLnumber {1.7.1.5}}{To Call the Error Logger}{\RTLnumber {1\foliodelim 64}} \toctexentry {2}{\RTLnumber {1.7.2}}{Error Logging Examples}{\RTLnumber {1\foliodelim 64}} \toctexentry {2}{\RTLnumber {1.7.3}}{How to Add a Device to the Reporting Program}{\RTLnumber {1\foliodelim 64}} \toctexentry {1}{\RTLnumber {1.8}}{Special Functions}{\RTLnumber {1\foliodelim 65}} \toctexentry {2}{\RTLnumber {1.8.1}}{.SPFUN Programmed Request}{\RTLnumber {1\foliodelim 66}} \toctexentry {2}{\RTLnumber {1.8.2}}{How to Support Special Functions in a Device Handler}{\RTLnumber {1\foliodelim 67}} \toctexentry {2}{\RTLnumber {1.8.3}}{Variable Size Volumes}{\RTLnumber {1\foliodelim 67}} \toctexentry {2}{\RTLnumber {1.8.4}}{Bad-Block Replacement}{\RTLnumber {1\foliodelim 68}} \toctexentry {1}{\RTLnumber {1.9}}{Devices with Special Directories}{\RTLnumber {1\foliodelim 68}} \toctexentry {1}{\RTLnumber {1.10}}{Device Handlers in Mapped Systems}{\RTLnumber {1\foliodelim 69}} \toctexentry {2}{\RTLnumber {1.10.1}}{Naming Conventions and the System Conditional}{\RTLnumber {1\foliodelim 69}} \toctexentry {2}{\RTLnumber {1.10.2}}{Mapped Monitor Environment}{\RTLnumber {1\foliodelim 70}} \toctexentry {2}{\RTLnumber {1.10.3}}{Address Translation}{\RTLnumber {1\foliodelim 71}} \toctexentry {3}{\RTLnumber {1.10.3.1}}{\$MPMEM Routine}{\RTLnumber {1\foliodelim 71}} \toctexentry {3}{\RTLnumber {1.10.3.2}}{\$MPPHY Routine}{\RTLnumber {1\foliodelim 71}} \toctexentry {2}{\RTLnumber {1.10.4}}{Character Devices: \$GETBYT and \$PUTBYT Routines}{\RTLnumber {1\foliodelim 72}} \toctexentry {3}{\RTLnumber {1.10.4.1}}{\$GETBYT Routine}{\RTLnumber {1\foliodelim 72}} \toctexentry {3}{\RTLnumber {1.10.4.2}}{\$PUTBYT Routine}{\RTLnumber {1\foliodelim 73}} \toctexentry {2}{\RTLnumber {1.10.5}}{Any Device: \$PUTWRD Routine}{\RTLnumber {1\foliodelim 74}} \toctexentry {2}{\RTLnumber {1.10.6}}{Mapping Directly to the User Buffer}{\RTLnumber {1\foliodelim 75}} \toctexentry {2}{\RTLnumber {1.10.7}}{Extended Memory Subroutines}{\RTLnumber {1\foliodelim 78}} \toctexentry {3}{\RTLnumber {1.10.7.1}}{Converting a Virtual Address into a Physical Address (\$JBREL)}{\RTLnumber {1\foliodelim 79}} \toctexentry {3}{\RTLnumber {1.10.7.2}}{Moving Data Within Extended Memory (\$BLKMV)}{\RTLnumber {1\foliodelim 81}} \toctexentry {3}{\RTLnumber {1.10.7.3}}{Obtaining Free Memory (XALLOC)}{\RTLnumber {1\foliodelim 81}} \toctexentry {3}{\RTLnumber {1.10.7.4}}{Returning Memory to the Free List (XDEALC)}{\RTLnumber {1\foliodelim 81}} \toctexentry {3}{\RTLnumber {1.10.7.5}}{Finding a Global Region (FINDGR)}{\RTLnumber {1\foliodelim 82}} \toctexentry {3}{\RTLnumber {1.10.7.6}}{Converting a Virtual Address into a Physical Address (\$USRPH)}{\RTLnumber {1\foliodelim 82}} \toctexentry {1}{\RTLnumber {1.11}}{System Device Handlers and Bootstraps}{\RTLnumber {1\foliodelim 83}} \toctexentry {2}{\RTLnumber {1.11.1}}{Monitor Files}{\RTLnumber {1\foliodelim 83}} \toctexentry {2}{\RTLnumber {1.11.2}}{Creating a System Device Handler}{\RTLnumber {1\foliodelim 83}} \toctexentry {3}{\RTLnumber {1.11.2.1}}{.DRBOT Macro}{\RTLnumber {1\foliodelim 83}} \toctexentry {3}{\RTLnumber {1.11.2.2}}{Primary Driver}{\RTLnumber {1\foliodelim 84}} \toctexentry {3}{\RTLnumber {1.11.2.3}}{Entry Routine}{\RTLnumber {1\foliodelim 84}} \toctexentry {3}{\RTLnumber {1.11.2.4}}{Software Bootstrap}{\RTLnumber {1\foliodelim 85}} \toctexentry {3}{\RTLnumber {1.11.2.5}}{Bootstrap Read Routine}{\RTLnumber {1\foliodelim 85}} \toctexentry {3}{\RTLnumber {1.11.2.6}}{Bootstrap Error Routine}{\RTLnumber {1\foliodelim 86}} \toctexentry {2}{\RTLnumber {1.11.3}}{DUP and the Bootstrap Process}{\RTLnumber {1\foliodelim 86}} \toctexentry {3}{\RTLnumber {1.11.3.1}}{BOOT ddn:filnam}{\RTLnumber {1\foliodelim 86}} \toctexentry {3}{\RTLnumber {1.11.3.2}}{COPY{\slash }BOOT xxn:filnam ddm:}{\RTLnumber {1\foliodelim 87}} \toctexentry {3}{\RTLnumber {1.11.3.3}}{BOOT ddn:}{\RTLnumber {1\foliodelim 88}} \toctexentry {1}{\RTLnumber {1.12}}{Including Support for Multiterminal Handler Hooks}{\RTLnumber {1\foliodelim 89}} \toctexentry {2}{\RTLnumber {1.12.1}}{Installation Support}{\RTLnumber {1\foliodelim 91}} \toctexentry {2}{\RTLnumber {1.12.2}}{SET Command Support}{\RTLnumber {1\foliodelim 91}} \toctexentry {2}{\RTLnumber {1.12.3}}{Establish Hooks Connection with Monitor}{\RTLnumber {1\foliodelim 92}} \toctexentry {2}{\RTLnumber {1.12.4}}{Handler Hook Interrupt Processing}{\RTLnumber {1\foliodelim 95}} \toctexentry {2}{\RTLnumber {1.12.5}}{Remove Handler Hooks Connection to Monitor at UNLOAD{\slash }RELEASE}{\RTLnumber {1\foliodelim 96}} \toctexentry {1}{\RTLnumber {1.13}}{Including Extended Device-Unit Support}{\RTLnumber {1\foliodelim 97}} \toctexentry {2}{\RTLnumber {1.13.1}}{.DRDEF and .DRBEG Macros}{\RTLnumber {1\foliodelim 97}} \toctexentry {2}{\RTLnumber {1.13.2}}{LOAD{\slash }FETCH and UNLOAD{\slash }RELEASE Routines}{\RTLnumber {1\foliodelim 98}} \toctexentry {3}{\RTLnumber {1.13.2.1}}{LOAD{\slash }FETCH Routine}{\RTLnumber {1\foliodelim 98}} \toctexentry {3}{\RTLnumber {1.13.2.2}}{UNLOAD{\slash }RELEASE Routine}{\RTLnumber {1\foliodelim 98}} \toctexentry {3}{\RTLnumber {1.13.2.3}}{Example LOAD{\slash }FETCH and UNLOAD{\slash }RELEASE Routines}{\RTLnumber {1\foliodelim 98}} \toctexentry {2}{\RTLnumber {1.13.3}}{Q.FUNC Definition}{\RTLnumber {1\foliodelim 101}} \toctexentry {2}{\RTLnumber {1.13.4}}{Programmed Requests of Extended-Unit Handlers}{\RTLnumber {1\foliodelim 102}} \toctexentry {1}{\RTLnumber {1.14}}{How to Assemble, Link, and Install a Device Handler}{\RTLnumber {1\foliodelim 102}} \toctexentry {2}{\RTLnumber {1.14.1}}{Assembling a Device Handler}{\RTLnumber {1\foliodelim 102}} \toctexentry {2}{\RTLnumber {1.14.2}}{Linking a Device Handler}{\RTLnumber {1\foliodelim 103}} \toctexentry {2}{\RTLnumber {1.14.3}}{Installing a Device Handler}{\RTLnumber {1\foliodelim 103}} \toctexentry {3}{\RTLnumber {1.14.3.1}}{Using the Bootstrap to Install Handlers Automatically}{\RTLnumber {1\foliodelim 103}} \toctexentry {3}{\RTLnumber {1.14.3.2}}{Using the INSTALL Command to Install Handlers Manually}{\RTLnumber {1\foliodelim 104}} \toctexentry {3}{\RTLnumber {1.14.3.3}}{Using the DEV Macro to Aid Automatic Installation}{\RTLnumber {1\foliodelim 106}} \toctexentry {3}{\RTLnumber {1.14.3.4}}{Installing Devices Whose Hardware Is Present}{\RTLnumber {1\foliodelim 107}} \toctexentry {3}{\RTLnumber {1.14.3.5}}{Writing an Installation Verification Routine}{\RTLnumber {1\foliodelim 108}} \toctexentry {3}{\RTLnumber {1.14.3.6}}{Overriding the Hardware Restriction}{\RTLnumber {1\foliodelim 110}} \toctexentry {1}{\RTLnumber {1.15}}{How to Test and Debug a Device Handler}{\RTLnumber {1\foliodelim 110}} \toctexentry {2}{\RTLnumber {1.15.1}}{Using DBG--11 to Test a Handler}{\RTLnumber {1\foliodelim 111}} \toctexentry {2}{\RTLnumber {1.15.2}}{Using ODT to Test a Handler}{\RTLnumber {1\foliodelim 111}} \toctexentry {2}{\RTLnumber {1.15.3}}{Using ODT in a Mapped Environment}{\RTLnumber {1\foliodelim 112}} \toctexentry {1}{\RTLnumber {1.16}}{Contents of .SYS Image of a Device Handler}{\RTLnumber {1\foliodelim 113}} \toctexentry {15}{\RTLnumber {A}}{DX, DL, and XL Device Handlers}{\RTLnumber {A\foliodelim 1}}