ASMB,Q,C
      HED RTE UNIVERSAL INTERFACE DRIVER - 09580-16079
      NAM DVM72,0 09580-16079 REV.2026 800318 
* 
********************************************************************
* 
*      RELOC.       09580-16079 
*      SOURCE       09580-18079 
*      ERS        A-09580-16079-1 
* 
*      C. LEATH     03/15/77    REV. A
*      T. KONDO     10/24/77    REV. B
*      D. LAMPMAN    3/18/80    REV.2026
* 
*      HP 92425A TEST SYSTEM SOFTWARE IS THE PROPRIETARY
*      MATERIAL OF THE HEWLETT-PACKARD COMPANY.  USE AND
*      DISCLOSURE THEREOF ARE RESTRICTED BY WRITTEN AGREEMENT.
* 
*      (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.
*      ALL RIGHTS RESERVED.  NO PART OF THIS PROGRAM
*      MAY BE PHOTOCOPIED, REPRODUCED OR TRANSLATED 
*      TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR
*      WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY.
* 
**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
      SPC 3 
      SPC 3 
*    I. IDENTIFICATION -   UNIVERSAL INTERFACE DRIVER 
*    -----------------
* 
*    II. LANGUAGE - ASSEMBLY LANGUAGE, RELOCATABLE
*    ------------ 
* 
*    III. TYPE - RTE EXEC CALLABLE DRIVER 
*    ---------
* 
*    IV. LENGTH -   476 (DECIMAL) 
*    ---------- 
* 
*    V. SPECIAL HARDWARE REQUIRED - 
* 
*    ---------------------------- 
* 
*             12556 -40 BIT I/O CARD  OR
*             12566 -MICROCIRCUIT CARD OR 
*             12604 -DATA SOURCE INTERFACE CARD OR
*             12661 -DVS PROGRAMMER CARD
*             DMA   -FOR SPECIAL APPLICATIONS(E.G.1010) 
* 
* 
*    VII. ENTRY POINTS - IM72,CM72
*    -----------------
* 
*    VIII. EXTERNALS - $LIST
*    ---------------
* 
      SKP 
* 
* 
*    XI. PROGRAM LISTING -
*    -------------------
* 
      ENT IM72,CM72 
      EXT $LIST 
* 
* 
********************************************************************
*          THE FOLLOWING IS AN EXPLANATION OF SOME OF THE SALIENT  *
*  FEATURES OF THE DRIVER.  SOME MORE EXPLANATIONS WITH GREATER    *
*  DETAIL ARE INCLUDED IN THE COMMENTS PRECEDING THE OPERATION.    *
*     TO GAIN A LESS THAN MURKY UNDERSTANDING OF WHAT IS GOING ON IT   *
*  WOULD BEHOOVE ONE TO UNDERSTAND HOW A DEVICE SUBROUTINE MAKES   *
*  THE DRIVER UNDERSTAND WHAT IT WANTS DONE. THIS IS DONE WITH
*  THE CONTROL WORD (ICNWRD) SEEN IN ALL RTE MANUALS UNDER EXEC    *
*  I/O CALLS.THIS CONTROL WORD IS FORMATTED IN THE DEVICE SUBROUTINE
*  AND WHEN AN EXEC I/O CALL IS MADE THIS WORD IS CHANGED BY THE   *
*  EXEC TO REFLECT THE ICODE IN BITS 0-5 (ICODE:READ=1,WRITE=2,CON-*
*  TROL = 3). 
*  THE CONWRD IS THEN STORED IN WORD 6 OF THE EQT TABLE.           *
*  SINCE A PICTURE SPEAKS LOUDER THAN A BUNCH OF WORDS, THE        *
*  ILLUSTRATION BELOW SHOWS THE CONTROL WORD BEFORE THE EXEC CALL  *
*  AND AFTER.                                                      *
*                                                                  *
*                                                                  *
*       BEFORE: CONWRD FORMAT SENT FROM DEVICE SUBROUTINE VIA AN   *
*               EXEC I/O CALL                                      *
*     +++++++++++++++++++++++++++++++++++++++++++++++++++++++++    *
*     +BITS 6 TO 15 FUNCTION CODES++BITS 0 TO 5 LU NUMBER     +    *
*     +++++++++++++++++++++++++++++++++++++++++++++++++++++++++    *
*                                                                  *
*       AFTER: CONWRD FORMAT AFTER PASSING THRU RTIOC              *
*              (NOTE: A REGISTER CONTAINS DEVICE SUBCHANNEL        *
*                     UPON ENTERRING DRIVER)                       *
*      +++++++++++++++++++++++++++++++++++++++++++++++++++++++     *
*      +BITS 6-15 SAME AS BEFORE+++BITS 0-5 = ICODE           +    *
*      +++++++++++++++++++++++++++++++++++++++++++++++++++++++     *
*                                                                  *
*      THE ROUTINE USES THE SELECT CODE       TO FORMAT THE        *
*   I/0 INSTRUCTIONS, AND THE ICODE TO DETERMINE I/O DIRECTION     *
*   (READ OR WRITE).                                               *
*                                                                  *
*     BITS 6 TO 10 ARE USED BY DVR72 TO DETERMINE  MANY THINGS     *
*  ABOUT WHAT TYPE OF I/O THE DEVICE SUBROUTINE WANTS TO DO. BIT   *
*  6 IS ALWAYS SET TO INDICATE BINARY MODE OF ICO DATA TRANSFER.   *
*  IF BIT 6 IS NOT SET THE A REGISTER IS SET TO 2 TO INDICATE      *
*  ILLEGAL         REQUEST AND A RETURN IS MADE TO RTIOC. 
*                                                                  *
*     BITS 7 AND 8 DESIGNATE  FOUR DIFFERENT TYPES OF I/O SEQUEN-  *
*  CES DEPENDING ON WHETHER THE I/O REQUEST IS READ OR WRITE.      *
*  THE FOLLOWING TABLE DESCRIBES THE DIFFERENT TYPES OF I/O        *
*  SEQUENCES OBTAINABLE WITH THE DIFFERENT SETTINGS OF BITS 7 AND  *
*  8.                                                              *
*     COLUMN 1 SHOWS THE SETTING OF BITS 6,7&8 OF THE CONWD, NOTE THAT *
*  IN PROGRAMMING THEY WOULD BE LOOKED AT IN THE OPPOSITE DIRECTION*
*  (I.E. 876).
* 
*     COLUMN 2 DESIGNATES THE MODE OF INTERRUPT (INTERRUPT OR      *
*  NONINTERRUPT).  THE INTERRUPT MODE WOULD 
*  START THE I/O IN THE INITIATOR AND COMPLETE IT IN THE COMPLETION*
*  SECTION OF THE DRIVER.  THE SET CONTROL FLIP FLOP IS SET IN THIS*
*  MODE AND RETURN TO RTIOC WITH THE A REGISTER = 0.
*  THE CONTINUATION OR COMPLETION SECTION IN THIS MODE CONTINUES   *
*  THE I O TRANSFER,SETTING THE CONTROL FF EACH TIME. UPON COMPLE- *
*  TION THE CONTROL FLIP IS CLEARED (CLC) AND THE FLAG FF IS SET
*  (STF)                                                           *
*     THE NONINTERRUPT MODE DEPENDING ON BIT 8 COMPLETES ALL I/O EITHER*
* IN THE INITIATOR (BIT 8 = 0) OR AFTER THE FIRST INTERRUPT        *
*  (BIT 8 = 1).THE SETTING OF BIT 8 IMPLIES THAT AN INTERRUPT IS   *
*  EXPECTED, HOWEVER ANY I/O TRANSFERS BEFORE OR AFTER THE SETTING *
*  OF THE CONTROL FF ARE DONE WITHOUT AN INTERRUPT. THERE IS A DIF-*
*  FERRENCE IN WHAT HAPPENS WITH A READ OR WRITE WHEN BIT 8 IS SET.*
*  FOR A "READ" THE CONTROL FF IS SET BEFORE ANY I/O TRANSFER, AND *
*  THE NONINTERRUPT TRANSFER TAKES PLACE IN THE CONTINUATOR OR     *
*  COMPLETION SECTION. FOR A WRITE OPERATION ALL I/O TRANSFERS TAKE*
*  PLACE BEFORE SETTING THE CONTROL FF, AND TERMINATION OCCURS     *
*  AFTER THE INTERRUPT. 
*                                                                  *
*     COLUMN 3 IS THE DIRECTION OF TRANSFER, READ OR WRITE. 
*                                                                  *
*     COLUMN 4 SHOWS THE I/O OPERATION IN THE INITIATOR . 
*                                                                  *
*     COLUMN 5 SHOWS THE I/O OPERATIONS IN THE CONTINUATOR SECTION
*  (AKA COMPLETION SECTION). WHERE NO FURTHER I/O IS EXPECTED AS   *
*  A RESULT OF SAY THE NONINTERRUPT MODE "N/A" APPEARS. 
*                                                                  *
*     COLUMN 6 SHOWS WHAT HAPPENS WHEN ALL I/O TRANSFER IS DONE 
*  EITHER IN THE INITIATOR OR CONTINUATOR.                         *
* 
*    THE SETTING OF BITS 9 AND 10 ARE FOR SPECIAL APPLICATIONS TO  *
*  BE EXPLAINED LATER.
      SKP 
********************************************************************
*          *              *          *         *         *         *
*BITS 876  * MODE         * I/O MODE * INIT.   * CONTIN. * FINI    *
********************************************************************
*     001  * INTERRUPT    * READ     * CLC,X   * LIA,X   *CLC,X    *
*          *              *          * LIA,X   * STC,C   *STF,X    *
*          *              *          * STC,C,X * FOR EACH*         *
*          *              *          *         * WORD.   *         *
****************************************************************** *
*          *              *          *         *         *         *
*     101  *INTERRUPT     * READ    * CLC,X    *        * CLC,X    *
*          *              *         * STC,C    * LIA,X  * STF,X    *
*          *              *         *          * STC,C,X*          *
*          *              *         *          *FOR EACH*          *
*          *              *         *          *WORD    *          *
********************************************************************
*     011  *NON-INTERRUPT * READ    * CLC,X    * N/A    * CLC,X    *
*          *              *         * LIA,X    *        * STF,X    *
*          *              *         * LIA,X    *        * RETURN   *
*          *              *         * ETC.UNTIL*        * TO RTIOC *
*          *              *         * FINISHED *        * W/A=4 !! *
****************************************************************** *
*          *              *         *          *        *          *
*     111  *NON-INTERRUPT * READ    * CLC,X    * LIA,X  * CLC,X    *
*          * AFTER AN INI-*         * STC,C    * LIA,X  * STF,X    *
*          * TIAL INTER-  *         *          * ETC.   *          *
*          * RUPT.        *         *          *UNTIL              *
*          *              *         *          *FINISHED*          *
********************************************************************
*     001  *INTERRUPT     * WRITE   * CLC,X    *        * CLC,X    *
*          *              *         * OTA,X    * OTA,X  * STF,X    *
*          *              *         * STC,C,X  * STC,C,X*          *
*          *              *         *          *FOR EA. *          *
*          *              *         *          *WORD    *          *
********************************************************************
*     101  *INTERRUPT     * WRITE   * CLC,X    *        *          *
*          *              *         * STC,C    * OTA ,X * CLC,X    *
*          *              *         * OTA,X    * STC,C,X* STF,X    *
*          *              *         * STC,C,X  * FOR EA.*          *
*          *              *         *          * WORD.  *          *
*          *              *         *          *        *          *
********************************************************************
*     011  *NON-INTERRUPT * WRITE   * CLC,X    * N/A    * CLC,X    *
*          *              *         * OTA,X    *        * STF,X    *
*          *              *         * OTA,X    *        * RETURN   *
*          *              *         * ETC.UNTIL*        * W/A=4!!  *
*          *              *         * FINISHED *        *          *
********************************************************************
*     111  *NON-INTERRUPT * WRITE   * CLC,X    * N A    * CLC,X    *
*          *              *         * OTA,X    *        * STF,X    *
*          *              *         * OTA,X    *        *          *
*          *              *         * ETC.UNTIL*        *          *
*          *              *         * FINISHED *        *          *
*          *              *         * THEN STC,*        *          *
********************************************************************* 
      SKP 
      SPC 2 
*                                                                  *
*  NOTE: THE CLC,X THATIS SHOWN IN THE INITIATION COLUMN IS        *
*        EXECUTED ONCE UPON ENTRY INTO DRIVER AND NOT FOR EACH WORD 
*        TRANSFERRED.                                              *
*                                                                  *
*        WHERE N/A APPEARS IN THE CONTINUATION COLUMN - THIS INDI- *
*        CATES THAT NO MORE I/O TAKES PLACE AFTER ALL DATA IS      *
*        TRANSFERRED.  THE ONLY THING THAT HAPPENS IN THIS CASE    *
*        EITHER AFTER AN INTERRUPT (BIT 7 = 0), OR AT THE EXPIRA-  *
*        TION OF THE WORD COUNTER IN THE NON-INTERRUPT MODE (BIT 7=*
*        1) IS THE SEQUENCE CLC,X - STF,X.
*                                                                  *
*    ! - THIS LAST STC,C ARMS THE CARD FOR AN INTERRUPT, AND THE   *
*        PREVIOUS SET CONTROLS (STC) WERE USED FOR STROBING DATA   *
*        INTO THE I/O DEVICE. 
*        !! - RETURNING TO RTIOC WITH THE <A> REGISTER =4,TELLS    *
*             IT THAT I/O IS COMPLETE.                             *
*             THIS EXISTS IN CASES WHERE TERMINATION TAKES PLACE   *
*             IN THE INITIATION SECTION OF THE DRIVER.             *
*             RETURNS IN THE COMPLETION SECTION ARE OF TWO TYPES
* 
*             P+1 : COMPLETION WITH A=0 
*             P+2 : CONTINUATION (AN INTERRUPT IS EXPECTED TO COM- *
*                   CONTINUE I/O OR TERMINATE). 
*                                                                  *
*                                                                  *
      SKP 
      SPC 3 
*  IN ADDITION TO THE SEQUENCES SPECIFIED BY BITS 7 AND 8, BITS 9  *
*  AND 10 HAVE BEEN UTILIZED TO EXPAND THE CONTROL AND I O SEQUENCE  *
*  CAPABILITY OF THIS DRIVER.                                      *
*                                                                  *
*  BIT 9 SET = 1, INDICATES THAT IN ADDITION TO THE CONTROL INFOR  *
*  MATION SPECIFIED BY THE CONWD IN EQT6 THERE IS ADDITIONAL CON-  *
*  TROL INFORMATION IN THE FIRST WORD OF THE I O BUFFER OF THE     *
*  CALLING DEVICE SUBROUTINE. AT THIS TIME THE CODES THAT EXIST    *
*  HAVE THE FOLLOWING MEANINGS: 
* 
*  9= DMA TRANSFER W/O STC,C TO START DEVICE
* 10=  "      "    WITH "     "   "     " 
* 11= I/O SEQUENCE IN CNTRL BUFFER - COMPLETION IN INITIATOR
* 12=   "    "      "  "     "     -    "        "   "
*                                     WITH INTERRUPT EXPECTED 
* 13=   "    "      "  "     "     -WITH DATA FOLLOWING IN
*                                DATA BUFFER W/O CLC,STF AT FINI
* 14    "    "      "  "     "     -WITH DATA FOLLOWING IN
*                                 DATA BUFFER WITH CLC,STF AT FINI
* 15= LIA/LIB OR OTA/OTB STC,C THEN SFC,CLC FOR EACH TRANSFER 
* 
* 
      SKP 
      SPC 3 
*     SUMMARY OF SUBFUNCTION CODES AND BITS SETTINGS
*     IN THE CONWRD.
**********************************************************
*SUBFUNC- !  6  !  7  !  8  !  9  ! 10  !  12  ! BITS    !
*TION     ************************************************
* CODES   * 
************************************************
*    9    !  1  !  0  !  0  !  1  !  0  !  0   !
************************************************
*   10    !  1  !  0  !  0  !  1  !  0  !  0   !
************************************************
*   11    !  1  ! DC  !  DC !  1  !  0  !  1   !
************************************************
*   12    !  1  !  DC !  DC !  1  !  1  !  1   !
************************************************
*   13    !  1  !  X  !  X  !  1  !  X  !  1   !
************************************************
*   14    !  1  !  X  !  X  !  1  !  X  !  1   !
************************************************
*   15    !  1  !  X  !  X  !  1  !  0  !  0   !
************************************************
* 
*      DC = DON'T CARE (IGNORED DURING PROCESSING)
*      X = 0 OR 1 
************************************************
      SKP 
*                                                                  *
* THE EQT TABLE FOR DVM72 :                                        *
* 
* EQT1 - SUSPENDED LIST LINKAGE. LINKED TO THE ID SEGMENT OF THE   *
*        CALLING PROGRAM. IF REIO IS USED IN THE CALL THE LINKAGE  *
*        IS TO AN ID SEGMENT CREATED BY EXEC. 
* EQT2 - INITIATION SECTION ENTRY POINT 
* EQT3 - CONTINUATION SECTION ENTRY POINT.                         *
* 
* 
***** EQT 4 - FORMAT D BPS TUU UUU CCC CCC
* 
*      D = DMA ASSIGNED , 0=NO(ASSIGNED DYNAMICALLY)
*      B = BUFFERING ON YES = 1 OR NO =0
*      P = POWER FAIL NO = 0
*      S = TIME OUT SERVICED BY DVM YES=1 
*      T = TIME OUT OCCURANCE 
*      U = UNIT OR SUBCHANNEL 
*      C = I/O CHANNEL(SLOT)
* 
***** EQT 5 - FORMAT A ATT TTT TSS SSS SSS
* 
*      A = AVAILABILITY 
*      T = DEVICE TYPE 72 
*      S = STATUS BYTE WHERE: 1 = ILLEGAL CONTROL CODE
*                             2 = TIME OUT 500USEC DELAY
*                             3 = TIME OUT BETWEEN
*                                 I/O TRANSFERS.
*                                 BIT10 OF EQT6 SET=1.
*                             4 = TIME OUT ERROR
*                                 BIT 10 OF EQT6 NOT SET
*                             5 = NON EXISTENT IDSEG
*                             6 = ILLEGAL CODE FOR I/O INST.
*                             7 = ILLEGAL CW1 FOR DMA 
*                             8 = ALARM PROGRAM SCHEDULED 
* 
* 
* EQT6 -  CONWRD
* EQT7 -  REQUEST BUFFER ADDRESS
* EQT8 -  REQUEST BUFFER LENGTH 
* EQT9 -  TEMPORARY STORAGE . IF BIT 12 IS SET IN THE CONWRD THEN  *
*         THIS WORD CONTAINS THE CONTROL BUFFER ADDRESS.
* EQT10-  WORD COUNTER FOR BOTH NORMAL I/O REQUESTS AND CONTROL    *
*         REQUESTS.                                                *
* EQT11 - SPECIAL INTERRUPT FLAG. 
* EQT12 - STORAGE FOR SUBFUNCTION CODES.
* EQT13 - STORAGE FOR ID SEGMENT ADDRESS FOR INTERRUPT PROCESSING  *
*         ROUTINES. THIS LOCATIONS IS ZERO IF NO INTERRUPT PROGRAM
*         IS AVAILABLE AND A NEGATIVE IDSEGMENT ADDRESS IF THE
*         INTERRUPT PROGRAM HAS BEEN DISARMED.
* EQT14 - TIME OUT VALUE. 
* EQT15 - TIME OUT COUNTER.                                        *
********************************************************************
      SKP 
*                                                                  *
*    INITIATION SECTION                           /////////////////*
IM72  NOP           INITIATOR SECTION ENTRY POINT 
      STA SCODE     SAVE SELECT CODE
      JSB SETIO 
      CLB           CLEAR STATUS WORD 
      JSB STEQ5 
      LDA EQT6,I    GET AND 
      AND .3         ISOLATE REQUEST CODE 
* 
      CPA .1        IF REQUEST CODE = 1 OR 2, 
      RSS             GO PROCESS READ OR WRITE
      CPA .2             REQUEST
      JMP D04 
      CPA .3        SEE IF THIS IS A CONTROL REQUEST
      JMP CNTRL 
* 
* REQUEST ERROR - CAUSE REJECT RETURN TO I/O CONTROL
* 
REJEC LDA .2       SET (A) = 2 FOR REQUEST REJECT 
      JMP IM72,I     -EXIT- 
REJ   LDB .1        ILLEGAL SUBFUNCTION CODE
      JSB STEQ5 
      JMP REJEC 
      SPC 3 
* 
*     PROCESS READ OR WRITE REQUEST 
* 
D04   JSB CKMOD     GET CONTROL WORD AND
      NOP            ROTATE MODE BIT TO MSB 
      SSB,RSS       IF NOT BINARY MODE (MSB = 1), 
      JMP REJEC      REJECT REQUEST 
      CLA           0 EQT ENTRY FOR SUBFUNCTION CODE
      STA EQT12,I 
* 
CONT  JSB TMCHK     GO SET BIT12 OF EQT4
CONT1 RBR,RBR       CHECK BIT 9 TO SEE IF SUBFUNCTION 
      SLB,RSS       IS IN THE FIRST WORD OF BUFFER
      JMP IO2       NO IT ISN'T SO CONTINUE 
      LDB EQT7,I    BUFFER ADDRESS
      ISZ EQT7,I    BUMP ADDRESS POINTER
      LDA EQT8,I    DECREMENT WORD COUNTER
      ADA N1
      STA EQT8,I
      LDA B,I       CONTENTS OF BUFFER
      STA EQT12,I   TEMP STORAGE FOR SUBFUNCTION CODE 
      ADA LCD       CODE LEGALITY CHECKS  LCD =LOWER NUMBER 
      SSA           LESS THAN LCD 
      JMP REJ       YES ERROR 
      LDA EQT12,I   SEE IF GREATER THAN UPPPER LIMIT
      ADA HCD1
      SZA            = 16 
      SSA,RSS        >16
      JMP REJ       YES REJECT REQUEST
      JSB DMACK     SEE IF THIS IS A DMA TRANSFER 
      JMP DMA 
      JMP VARIN     GO PROCESS CONTROL BUFFER 
IO2   CLC 0         RESET I/O CARD
CONT2 LDA EQT7,I
      STA EQT9,I     SET AS CURRENT ADDRESS 
      LDA EQT8,I    GET BUFFER LENGTH 
      SZA           IF ZERO OR NEGATIVE BUFFER LENGTH,
      SSA            REJECT REQUEST 
      JMP REJEC 
      CMA,INA       MAKE NEGATIVE FOR COUNTER 
      STA EQT10,I    SET AS CURRENT COUNT 
      LDA IEXIT     SET UP RETURN 
      STA CM72       TO INITIATOR SECTION 
      CLA           CLEAR TERMINAL INTERRUPT FLAG 
      STA EQT11,I 
      JSB CKMOD     POSITION BITS 
      NOP 
      SEZ,RSS       IS THIS A WRITE REQUEST 
      JMP D10       YES GO OUTPUT FIRST WORD
      SLB,RSS       INTERRUPT READ? 
      JMP IO3        YES, SET FOR INTERRUPT 
      RBR 
      SLB           NO, INITIAL INTERRUPT REQUESTED?
      JMP IO3        YES, SET FOR INITIAL INTERRUPT 
      JMP IO4       GO INPUT WORD 
EXIT  JMP IM72,I     -EXIT- 
      SKP 
***       CONTINUATOR SECTION ENTRY POINT (C.72)       ***
* 
CM72  NOP           CONTINUATOR SECTION ENTRY POINT 
      JSB SETIO     CONFIGURE I/O INSTRUCTIONS
* 
NODMA LDB EQT1,I    SEE IF NORMAL I/O IS IN PROGRESS
      SZB 
      JMP D8        REQUEST IS QUEUED SO GO SEE WHATS HAPPENING 
      STB EQT15,I   ZERO TIME OUT WORD
      CLB 
      CPB EQT13,I   DOES ALARM PROGRAM EXIST? 
      JMP FINI      NO THEN BAIL OUT P+2
      JMP SCHED     ATTEMPT TO SCHEDULE INTERRUPT ROUTINE 
D8    LDA EQT4,I    TEST BIT 11 TO SEE IF TIME OUT
      ALF 
      SSA           WAS ENTRY DUE TO TIME OUT?
      JMP TMOUT     YES THEN PROCESS TIME OUT 
TCONT JSB DMACK     SEE IF DMA XFER WAS IN PROGRESS 
      JMP C.DMA     YES TAKE SPECIAL EXIT 
      JSB CKMOD     IS IT READ REQUEST
      NOP 
      SEZ 
      JMP D12        YES, GO INPUT WORD 
      JMP D9        WRITE REQUEST 
*  BIT 15 OF A REGISTER IS SET TO INDICATE TO 
*  RTIOC TO RELEASE DMA CHANNEL ASSIGNED TO THIS
*  DRIVER.
* 
C.DMA LDA CW2       SET A = BIT 15 SET TO 1-SO THAT DMA 
      JMP IO6       CHANNEL WILL BE RETURNED TO SYSTEM
* 
      SPC 3 
      SKP 
* 
*     CONTINUATOR OUTPUT SECTION
* 
D9    CLA           IF CURRENT BUFFER LENGTH = 0, 
      CPA EQT10,I    SEE IF FINISHED
      JMP D11 
* 
D10   LDB EQT9,I    GET CURRENT BUFFER ADDRESS
      ISZ EQT9,I      INDEX BUFFER ADDRESS
      LDA B,I       GET WORD FROM BUFFER
      ISZ EQT10,I    INDEX WORD COUNTER 
      NOP 
* 
IO1   OTA 0         OUTPUT WORD TO I/O CARD 
      JSB CKMOD     CHECK MODE. NON-INTERRUPT?
      JMP D9         YES, OUTPUT NEXT WORD
IO3   STC 0,C       NO, SET FOR INTERRUPT 
      JSB DELAY     SEE IF WE MUST SFC BEFORE LEAVING 
      JMP D9        P+1 RETURN -TO SEE IF MORE DATA TO TRANSMIT 
* 
FINI  CLA           SET (A) = 0 FOR NO ERRORS 
      ISZ CM72       SET RETURN TO P+2
      JMP CM72,I      -EXIT-
* 
D11   RBR            CHECK FOR TERMINAL INTERRUPT 
*                   THAT IS DO A STC,C BEFORE EXIT
      SLB,RSS       TERMINAL INTERRUPT REQUESTED? 
      JMP D15        NO, UPDATE STATUS AND EXIT 
      CLA,INA       HAS THE TERMINAL
      CPA EQT11,I    INTERRUPT FLAG BEEN SET? 
      JMP D15         YES, UPDATE STATUS AND EXIT 
      ISZ EQT11,I   NO, SET THE INTERRUPT FLAG
      JMP IO3        GO SET FOR INTERRUPT 
      SPC 3 
* 
*     CONTINUATOR INPUT SECTION 
* 
D12   CLA 
      CPA EQT10,I 
      JMP D15 
IO4   LIA 0         GET WORD FROM I/O CARD
      LDB EQT9,I    GET BUFFER ADDRESS
      STA B,I       SET WORD IN BUFFER
      ISZ EQT9,I     INDEX BUFFER ADDRESS 
      ISZ EQT10,I   INDEX WORD COUNTER
      RSS 
      JMP D15       NO MORE, EXIT 
      JSB CKMOD     CHECK MODE, NON-INTERRUPT?
      JMP IO4        YES, INPUT NEXT WORD 
      JMP IO3       NO, SET FOR INTERRUPT 
      SPC 3 
      SKP 
* 
*     STATUS AND COMPLETION SECTION 
* 
D15   CLA           SET (A) = 0 FOR NO ERRORS 
      JSB CKMOD     CHECK MODE, NON-INTERRUPT?(BIT7=1)
      LDA .4         YES, SET (A) = 4 FOR DONE
      RBR           INITIAL OR TERMINAL 
      SLB            INTERRUPT REQUESTED? (BIT8=1)
      CLA             YES, SET (A) = 0 FOR DONE 
      SZA           ANY INTERRUPTS IN THIS REQUEST? 
      ISZ CM72       NO, SET RETURN TO INITIATOR
      LDB EQT12,I 
      CPB .13 
      JMP COMEX     AVOID CLC AND STF  IF SUBFUNC=13
IO7   STF 0         RESET DEVICE FLAG 
IO6   CLC 0          DISABLE ANY INTERRUPTS 
COMEX LDB EQT8,I    SET (B) = # WORDS 
      JMP CM72,I       -EXIT- 
      SKP 
      SPC 3 
* 
* 
*     THIS SUBROUTINE PROCESSES TIME OUTS. IF A TIME OUT IS DETECTED
* BY DVR72 IT IS HANDLED IN EITHER OF THE FOLLOWING TWO MANNERS:
* 
*                                                                    *
*     1. IF BIT 10 HAD BEEN SET IN THE CONWD (EQT6) THE DRIVER INTERPRETS*
*  THIS AS UTILIZATION OF THE I/O SUSPEND FEATURE OF RTE TO ENFORCE A*
*  DELAY BETWEEM EACH I/O TRANSFER.  THIS TYPE OF TIME OUT IS NOT    *
*  INTERPRETED AS AN ERROR. 
* 
*     2. IF BIT 10 HAD NOT BEEN SET THE TIME OUT WOULD BE FLAGGED AS AN  *
*    ERROR AND BITS 0-7 OF EQT 5 IS SET TO 4. 
*     IF DMA HAD BEEN IN PROGRESS THE DMA CHANNEL IS RETURNED TO THE     *
*  SYSTEM.
* 
* 
* 
* 
TMOUT LDA BIT11 
      CMA           MAKE 4000B = 173777 
      AND EQT4,I    RESET TIME OUT BIT 11 
      STA EQT4,I
      LDA BIT10     CHECK BIT 10
      AND EQT6,I
      SZA,RSS       IS A = 0
      JMP TOERR     YES - TIME OUT ERROR
      LDB .3        SET EQT5
      JSB STEQ5 
      JMP TCONT     CONTINUE I/O IF ANYMORE 
TOERR LDB .4
      JSB STEQ5 
      JSB DMACK     SEE IS DMA WAS IN PROGRESS
      JMP C.DMA     IF SO - RETURN CHANNEL AND EXIT.
      CLA 
      JMP IO7       EXIT P+1
* 
      SPC 3 
STEQ5 NOP 
      LDA EQT5,I
      AND MSKUB 
      IOR B 
      STA EQT5,I
      JMP STEQ5,I 
      SKP 
      SPC 3 
*     SUBROUTINE <SETIO> TO CONFIGURE I/O INSTRUCTIONS
* 
SETIO NOP 
      IOR OTA       COMBINE <OTA> WITH I/O ADDRESS
      STA IO1       SET 
      STA IO15
      STA OTX 
* 
      ADA .1100    CONSTRUCT  <STC,C> INSTRUCTION 
      STA IO3 
      STA STX 
      STA IO22
      XOR .1500     CONSTRUCT <SFC> INSTRUCTION 
      STA IO14
* 
      XOR .700      CONTSRUCT <LIA> INSTRUCTION 
      STA IO4 
      STA LIX 
* 
      XOR .400      CONSTRUCT <STF> INSTRUCTION 
      STA IO7 
      STA SFX 
* 
      IOR .4600     CONSTRUCT <CLC> INSTRUCTION 
      STA IO2 
      STA IO13
      STA IO6 
      STA IO23
      STA CLX 
* 
      XOR .5600 
      STA CFX 
      JMP SETIO,I 
* 
* 
* 
* 
      SKP 
      SPC 3 
* 
*     SUBROUTINE TO CHECK REQUEST TYPE
*       AND INTERRUPT MODE
*     THIS SUBROUTINE MAKES BIT6 OF EQT6 THE MSB, AND 
*     BIT7 THE LSB. 
*     THE RETURNS TO THE CALLING PROGRAM ARE AS FOLLOWS:
*          P+2 = BIT7 IS 0 (INTERRUPT MODE) 
*          P+1 =BIT7 IS 1 (NON-INTERRUPT MODE)
* 
* 
CKMOD NOP 
      LDB EQT6,I    GET CONTROL WORD
      CLE,ERB       SET READ/WRITE FLAG 
      BLF,BLF        ROTATE MODE BIT TO MSB 
      RBL,RBL 
      SLB,RSS       INTERRUPT OPERATION (LSB = 0)?
      ISZ CKMOD      YES, SET RETURN TO P+2 
      JMP CKMOD,I   NO, RETURN TO P+1 
      SPC 3 
* 
* TMCHK IS RESPONSIBLE FOR: 
* 
*     1. SETTING BIT 12 OF EQT4 TO TELL RTE THAT WE WILL HANDLE 
*    TIME OUT.
*     2. IF EQT14 IS NE 0, MEANING A TIME OUT VALUE HAS BEEN
*    SPECIFIED THEN A T.O. VALUE OF .5SEC IS INSERTED 
*    INTO EQT14 AND EQT15.
* 
TMCHK NOP 
      LDA EQT4,I
      IOR BIT12 
      STA EQT4,I
      LDA EQT14,I 
      SZA 
      JMP TMCHK,I 
      LDA UNO 
      STA EQT14,I 
      STA EQT15,I 
      JMP TMCHK,I 
      SKP 
* 
*     SCHEDULE INTERRUPT HANDLING ROUTINE FOR DEVICE FOR IMMEDIATE
*     EXECUTION UPON RETURN TO RTIOC. 
*     'SCHED' FIRST CHECKS TO SEE IF THE INTERRUPT ROUTINE IS 
*     DORMANT, AND IF NOT IT RETURNS TO RTIOC AND IF SO IT PROCEEDS 
*     TO SCHEDULE THE ROUTINE VIA $LIST.
* 
* 
* 
SCHED LDB EQT13,I   GET ID SEGMENT ADDRESS
      SSB           IS THE ADDRESS NEGATIVE (INTERRUPT PROGRAM DISARMED)
      JMP FINI      YES THEN IGNORE INTERRUPT.RETURN P+2. 
      STB SCH 
      ADB O12       SAVE EQT4 IN BREG SAVE WORD OF IDSEG
      LDA EQT4
      STA B,I 
      ADB .5        SEE IF ROUTINE IS DORMANT 
      LDB B,I 
      SZB 
      JMP SCHW      NOT DORMANT SO GET OUT
      JSB $LIST     MAKE CALL TO SCHEDULE PROGRAM 
      OCT 101 
SCH   NOP 
IO13  CLC 0 
      JMP FINI
SCHW  LDB .8        STATUS = INTERRUPT PROGRAM SCHEDULED
      JSB STEQ5 
      LDA DLY       50 MSEC DELAY 
      STA EQT15,I   TIME OUTS 
      STA EQT14,I 
      JMP IO13      CONTINUATION EXIT 
* 
      SKP 
      SPC 3 
* 
*     THIS PORTION OF DVR72 IS RESPONSIBLE FOR PROCESSING 
*  SPECIAL I/O SEQUENCES.  THE CODES DESIGNATING WHICH
*  I/O INSTRUCTION TO EXECUTE IS CONTAINED WITHIN THE 
*  CONTROL BUFFER FROM THE CALLING SEQUENCE. THE CONTROL
*  CODES HAVE THE FOLLOWING MEANINGS: 
* 
*     1 = LIA 
*     2 = OTA 
*     3 = STC,C 
*     4 = CLC 
*     5 = CLF 
*     6 = STF 
* 
*     THE CODES THAT GOT US DOWN HERE TO THIS PORTION 
*  OF THE ROUTINE ARE EXPLAINED IN THE BEGINNING
*  COMMENTS.  THE CALLING SEQUENCE FOR USING THE SPECIAL
*  I/O CONTROL FEATURES ARE AS FOLLOWS: 
* 
*     IN FORTRAN: CALL EXEC(I/O,CONWD+LU,IDBUF,IDBL,
*                           ICBUF,ICBL) 
* 
*     WHERE: I/O = 1,2 OR 3 
*            CONWD+LU=CONTROL WORD AND LU(CONWD HAS BIT 9 SET)
*            IDBUF = DATA BUFFER (FIRST WORD IS THE COMMAND CODE, 
*                    11,12,13 OR 14). THE REST OF THE BUFFER IF ANY 
*                    IS DATA. 
*            IDBL = DATA BUFFER LENGTH (=0 FOR CONTROL I/O ONLY 
*                   (11 OR 12)
*            ICBUF = COMMAND BUFFER- CONTAINING A SEQUENCE OF THE 
*                    AFOREMENTIONED CODES.
*            ICBL  = COMMAND BUFFER LENGTH
* 
* 
      SPC 3 
VARIN LDA EQT12,I 
      ADA HCD       MAKE SURE THAT WE SHOULD
      SSA,RSS       BE HERE, IF NOT 
      JMP CONT2     LEAVE!! 
      LDA EQT10,I 
      CMA,INA 
      STA EQT10,I 
LOOP  LDB EQT9,I    ADDRESS OF CONTROL BUFFER 
      LDA B,I       CONTENTS
      ADA ADVAR     GET ADDR. POINTING TO 1ST I/O CMD 
      LDA A,I       C(ADVAR) + C(ICBUF(B))
      STA IOINS 
      LDA B,I 
      SZA,RSS       LEGALITY CHECKS - DON'T WANT TO BLOW SYSTEM 
      JMP ERR6      CODE = 0 ERROR
      CMA,INA 
      SSA,RSS       SEE IF POSITIVE 
      JMP ERR6      CODE IS A NEGATIVE NUMBER 
      ADA .7
      SZA 
      SSA 
      JMP ERR6      CODE > 6
      CLA 
IOINS NOP           VARIABLE I/O CMD. 
      ISZ EQT9,I    BUFFER ADDR 
      ISZ EQT10,I   COUNTER 
      JMP LOOP
      CLA 
      LDB .13 
      CMB,INB       SEE WHETHER THIS IS 11,12,13 OR 14
      ADB EQT12,I 
      SSB,RSS 
      JMP CONT2     CODE = 13 OR 14, DATA IN IDBUF
      CMB,INB       CHECK FOR 11 OR 12
      SLB 
      JMP EXIT      A=0 CODE = 12 (WAIT FOR INT)
      LDA .4        IMMEDIATE COMPLETION-TELL RTIOC 
      JMP EXIT      CODE = 11 
      SPC 3 
ERR6  LDB .6
      JSB STEQ5 
      JMP ERTN
      SKP 
      SPC 3 
* 
*     INTERNAL SKIP FLAG - PRIMARILY FOR 6940 MULTI-
*     PROGRAMMER AND ALLOWS A 500USEC DELAY FOR INTERRUPTS
*     TO OCCUR.  IF NO INTERRUPT OCCURS WITHIN THE ALLOTTED 
*     TIME A TIME OUUT ERROR IS NOTED IN EQT5 (=1)
*     FOR THE 6940 THIS DELAY TAKES PLACE WHEN THE DEVICE IS
*     IN THE HANDSHAKE MODE.
*    (THIS MAY BE CHANGED LATER TO ALLOW A VARIABLE TIME OUT) 
* 
* 
DELAY NOP 
      LDA EQT12,I   SHOULD WE BE HERE 
      CPA .15 
      JMP DLY1
      ISZ DELAY     EXIT P+2
      JMP DELAY,I   GO TO FINI
DLY1  LDA M82       500 USEC
IO14  SFC 0 
      JMP OK        FLAG OCCURRED IN TIME 
      INA,SZA       INCREMENT COUNTER  AND SKIP IF =0 
      JMP IO14      TIME LEFT 
      JMP TMERR     BAD NEWS TIME OUT 
OK    CLA 
      CPA EQT10,I   SEE IF I/O XFER IS FINI 
      JMP DEXIT     YES GO HOME 
      JMP DELAY,I   CONTINUE I/O IF ANY MORE
DEXIT LDA .4        EXIT WITH COMPLETION CODE =4
      ISZ CM72
      JMP IO6       EXIT
* 
*           TIME OUT
* 
TMERR LDB .2
      JSB STEQ5     SET STATUS INTO EQT5
      JMP DEXIT 
* 
* 
      SKP 
      SPC 2 
* 
      SKP 
* 
* 
* 
* 
* 
*     THIS SECTION HANDLES CONTROL REQUESTS (ICODE = 3
*     THE FORMAT FOR A CONTROL REQUEST IS AS FOLLOWS: 
* 
*     CALL EXEC(3,CONWD+LU,[IPRAM]) 
* 
*     WHERE: 3 IS AN RTE CONTROL REQUEST CODE 
*            CONWD = CONTROL CODE 
*            IPRAM = OPTIONAL PARAMETER 
* 
*     CONTROL REQUESTS IN EFFECT THUS FAR:
* 
* 
*     CODE = 1      RESET TIME OUT(TAKE THE CONTENTS OF IPRAM 
*                   AND TRANSFER IT TO EQT14. 
*     CODE = 2      CLEAR BIT 12 (DRIVER WILL NO LONGER PROCESS 
*                   TIME OUT
* 
*     CODE = 3      INTERRUPT PROGRAM SETUP WITH IPRAM = ADDRESS
*                   OF PROGRAM NAME.
* 
*     CODE = 4      DISARM INTERRUPT PROGRAM
* 
*     CODE = 5      ARM INTERRUPT PROGRAM.
* 
* 
* 
      SPC 3 
CNTRL JSB CKMOD 
      NOP 
      RBL           FORM 876
      LDA B 
      AND O37       MASK BITS 6-10
      CPA .1        TIME OUT REQ? 
      JMP T.O 
      CPA .2
      JMP TMCLR 
      CPA .3
      JMP IDSEG 
      CPA .4
      JMP CLARM 
      CPA .5     ARM INTERRUPT PROGRAM? 
      JMP CLARM     COMPLEMENT CONTENTS OF EQT13
      JMP ERTN
CLARM LDA EQT13,I   GET THE ID SEGMENT ADDRESS. 
      CMA,INA       COMPLEMENT AND PUT AWAY.
      STA EQT13,I 
      JMP CEXIT 
T.O   LDA EQT7,I    GET NEW TIME OUT VALUE
      CMA,INA 
      STA EQT14,I   RESET 
      JMP CEXIT 
TMCLR LDA BIT12     CLEAR TIME OUT BIT
      CMA 
      AND EQT4,I
      STA EQT4,I
CEXIT LDA .4
      JMP EXIT
ERTN  LDA .2        ILLEGAL CONTROL REQUEST 
      JMP EXIT
* 
      SKP 
      SPC 3 
* 
*     THIS PORTION OF THE CONTROL REQUEST SECTION TAKES 
*  THE PROGRAM NAME IN IPRAM AND SEARCHES THRU THE
*  ID SEGMENTS ATTACHED TO THE KEYWORD LIST FOR 
*  THE ID SEGMENT FOR THE ASSOCIATED PROGRAM AND WHEN 
*  FOUND PLACES THE ID SEGMENT ADDRESS INTO EQT13.
* 
* 
IDSEG LDA KEYWD     TOP OF KEYWORD LIST 
      STA SCODE 
IDSG1 LDA EQT7,I    PROGRAM NAME
      STA T2
      LDB SCODE,I   ID SEGMENT ADDRESS
      SZB,RSS       END OF LIST?
      JMP IDSGE     SET ERROR CODE
      ADB .14       INDEX DOWN TO FW OF PROGRAM NAME IN ID SEG. 
      LDA B,I 
      CPA T2,I   FIRST TWO CHARACTERS MATCH?
      INB,RSS 
      JMP IDSG2     NO
      ISZ T2        CHECK NEXT TWO CHARACTERS 
      LDA B,I 
      CPA T2,I
      INB,RSS 
      JMP IDSG2 
      ISZ T2
      LDA B,I       LOOK AT 5TH CHARACTER 
      AND MSKUB 
      STA B 
      LDA T2,I
      AND MSKUB 
      CPA B 
      JMP IDSG3     EUREKA!!
IDSG2 ISZ SCODE 
      JMP IDSG1 
IDSG3 LDA SCODE,I   ID SEGMENT ADDRESS
      STA EQT13,I 
      JMP CEXIT 
IDSGE LDB .5
      JSB STEQ5 
      JMP CEXIT 
      SKP 
      SPC 3 
* 
* 
*     THIS IS THE DMA PROCESSING PORTION OF DVR 72, IT IS 
*  RESPONSIBLE FOR RETRIEVING A DMA CHANNEL FROM RTE, CON-
*  FIGURING DMA COMMAND WORDS, OUTPUTTING THESE WORDS TO THE
*  APPROPRIATE DMA CHANNEL, AND FINALLY INITIATETING THE DMA
*  TRANSFER. THE DETERMINATION OF WHAT TO DO IN RELATION TO 
*  THE DMA IS DETERMINED BY THE CODE SUPPLIED IN THE EXTENDED 
*  CONTROL WHICH HAS BEEN TRANSFERRED TO EQT12. 
*     THE APPLICABLE CODES AND THEIR RELATED MEANINGS ARE 
*  DEFINED AS FOLLOWS:
* 
*         CODE                 MEANING
*          9         DMA TRANSFER WITHOUT STC TO START DEVICE 
*         10           "    "     WITH     "    "      "     "
* 
*     THE REASON FOR THESE TWO CODES IS THAT SOME I/O DEVICES 
*  PARTICULARLY THOSE USED FOR INPUT REQUIRE AN STC,C TO
*  START AN I/O TRANSFER ( TO TURN THEM ON).
* 
*     THE EXEC CALL FORMAT AND THE REQUIRED BIT AND BUFFER FORMATS
*  ARE DEFINED AS FOLLOWS:
* 
*     EXEC CALL:  JSB EXEC
*                 DEF ICODE = 1 OR 2(READ OR WRITE) 
*                 DEF ICNWD = 11LU
*                             WHERE BITS 6 AND 9 ARE SET AND
*                             LU = LOGICAL UNIT NUMBER
*                             BIT 6 = BINARY MODE 
*                             BIT 9 = INDICATES THAT THE CONTROL
*                                     WORD FOR THIS I/O TRANSFER
*                                     IS CONTAINED IN WORD 1 OF THE 
*                                     OUTPUT BUFFER.
*                 DEF IBUFR = OUTPUT BUFFER 
*                             WHERE WORD 1 = 9 OR10 EXPLAINED ABOVE 
*                                   WORD 2 = CONTROL WORD 1 FOR DMA 
*      CONTROL WORD 1 (CW1) = 100000B OR JUST PLAIN 0. WHERE IF BIT 
*  15 IS SET = 1, THIS INDICATES THAT THE DMA IS TO GIVE A STC,C TO 
*  THE I/O CHANNEL AT THE END OF EACH DMA CYCLE (EXCEPT ON THE LAST 
*  CYCLE IF MODE IS INPUT. IF CW1 =0 THIS INDICATES NO STC,C AT EACH
*  DMA TRANSFER,. 
* 
*      THE REST OF THE WORDS IN IBUFR WOULD BE DATA.
* 
*                 DEF IBUFL = BUFFER LENGTH, REPRESENTING THE ACTUAL
*                             NUMBER OF DATA WORDS TO BE TRANSFERRED
*                                 INCLUDING THE FIRST TWO WORDS WHICH 
*                             CONTAIN CONTROL INFORMATION.
      SPC 3 
      SKP 
DMA   DLD INTBA,I   SEE WHICH DMA CHANNEL IF ANY IS ASSIGNED
      CPA EQT1      CHANNEL 6 ASSIGNED
      JMP CH6 
      CPB EQT1      CHANNEL 7 ASSIGNED? 
      JMP CH7 
      LDA .5        REQUEST CODE FOR DMA CHANNEL
      JMP EXIT      GO BACK TO RTIOC
CH6   LDA .6
      JMP CFDMA     CONFIGURE DMA I/O INSTRUCTIONS
CH7   LDA .7
* 
*    CONFIGURE I/O INSTRUCTIONS 
* 
CFDMA JSB SETIO 
      LDA IO15      CONFIGURE OTA FOR CHANNELS 2 OR 3 
      AND DLY        MAKE BITS 0-5 = TO 2 OR 3
      STA IO17      OTA 2 OR 3
      STA IO21       "       "
      ADA .100      FORM STC  2 OR 3
      STA IO20
      ADA BIT11     FORM CLC
      STA IO16
      LDA IO24      STC,C TO START DEVICE 
      IOR SCODE     BITS 0-5
      STA IO24
* 
*       NOW FORM AND OUTPUT THE THREE CONTROL WORDS 
*  FOR DMA TRANSFER.
* 
* 
      LDB EQT7,I    BUFFER ADDRESS
      LDA B,I       CONTENTS CW1 FOR DMA
      SZA 
      CPA CW2       =100000 
      JMP DMCON 
      JMP DMERR 
DMCON AND NOT13     CLEAR BIT 13 (NO CLC ON I.O CHANNEL AT END) 
      ISZ EQT7,I    BUMP BUFFER ADDRESS 
      IOR SCODE     MASK SELECT CODE INTO BITS 0-5
IO15  OTA 0         OUTPUT CW1 TO DMA CHANNEL 6 OR 7
IO16  CLC 0         PREPARE MEMORY ADDR. REG FOR CW2
      JSB CKMOD 
      NOP 
      CLA 
      SEZ,RSS       READ OR WRITE REQUEST 
      JMP DMA2      WRITE 
      LDA CW2       BIT 15 = 1 TO INDICATE INPUT
DMA2  IOR EQT7,I    BUFFER ADDRESS
IO17  OTA 0         OUTPUT CW2 TO CHANNEL 2 OR 3
IO20  STC 0         PREPARE WORD COUNTER FOR CW3
      LDA EQT8,I    # OF WORDS TO BE TRANSFERRED
      ADA N1        ADJUST FOR DMA CONTROL WORD 
      STA EQT8,I
      CMA,INA       TAKE TWOS COMPLEMENT
IO21  OTA 0 
      LDA EQT12,I   SEE IF STC,C REQUIRED BEFORE XFER 
      CPA O12 
IO24  STC 0,C       YES 
IO22  STC 0,C       TURN DMA CHANNEL
IO23  CLC 0         CLEAR DMA CHANNEL CONTROL FLIP FLOP 
      CLA 
      JMP EXIT      RETURN TO RTIOC 
* 
DMERR LDB .7
      JSB STEQ5 
      LDA CW2       RELEASE DMA CHANNEL 
      JMP EXIT
      SPC 6 
* 
*     DMA CONFIRMATION ROUTINE (P+1 RETURN =YES)
* 
DMACK NOP 
      LDA EQT12,I   GET SUBFUNCTION CODE
      CPA .9        IS IT 9?
      JMP DMOUT     YES RETURN P+1
      CPA O12       NO IS IT 10?
      JMP DMOUT 
      ISZ DMACK     RETURN P+2
DMOUT JMP DMACK,I 
      SKP 
*  CONSTANTS AND STORAGE AREA 
* 
A     EQU 0        DEFINE SYMBOLIC REFERENCE FOR
B     EQU 1         A AND B REGISTERS.
* 
.1    OCT 1 
UNO   DEC -100
.2    OCT 2 
.3    OCT 3 
.4    OCT 4 
.5    OCT 5 
.6    OCT 6 
.7    OCT 7 
.8    DEC 8 
.13   DEC 13
.14   OCT 14
.9    DEC 9 
O37   OCT 37
.15   DEC 15
MSKUB OCT 177400
O12   DEC 10
LCD   DEC -9
HCD1  DEC -16 
HCD   DEC -15 
ADVAR DEF LIX-1 
LIX   LIA 0 
OTX   OTA 0 
STX   STC 0,C 
CLX   CLC 0 
CFX   CLF 0 
SFX   STF 0 
CW2   OCT 100000
.100  OCT 100 
.400  OCT 400 
.1100 OCT 1100
.1500 OCT 1500
.700  OCT 700 
.4600 OCT 4600
BIT12 OCT 10000 
BIT10 OCT 2000
NOT13 OCT 157777
M82   DEC -82       500USEC 
.5600 OCT 5600
BIT11 OCT 4000
DLY   OCT -5
SCODE NOP 
T2    NOP 
N6    DEC -6
N1    DEC -1
* 
OTA   OTA 0 
IEXIT DEF EXIT-1
* 
      SPC 3 
* 
*     SYSTEM BASE PAGE COMMUNICATION AREA 
* 
.     EQU 1650B     ESTABLISH ORIGIN OF AREA
* 
INTBA EQU .+4       FWA OF INTERRUPT TABLE
* 
*     I/O MODULE COMMUNICATION
* 
KEYWD EQU .+7 
EQT1  EQU .+8    LIST LINKAGE WORD
EQT4  EQU .+11
EQT5  EQU .+12
EQT6  EQU .+13
EQT7  EQU .+14
EQT8  EQU .+15
EQT9  EQU .+16
EQT10 EQU .+17
EQT11 EQU .+18
EQT12 EQU .+81
EQT13 EQU .+82
EQT14 EQU .+83
EQT15 EQU .+84
* 
* 
* 
      END 
                                                                                                                                            