ASMB,R,L,C
      HED DVR65 91700-16100 REV.1728 * (C) HEWLETT-PACKARD CO. 1977 * 
      NAM DVR65 91700-16100 REV.1728 770630 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 2 
      ENT I.65,C.65 
      EXT $LIST 
      IFZ 
      EXT $DDT
      XIF 
* 
* 
* DVR65 
* SOURCE: 91700-18100 
* BINARY: 91700-16100 
* PRGMR: BOB SHATZER
* DATE: 12 JAN 76 
* 
* 
* 
*     THIS IS THE COMMUNICATIONS DRIVER DESIGNED TO SUPPORT THE 
*     DS1B DISTRIBUTED SYSTEMS NETWORK. THIS DRIVER IS NOT COM- 
*     PATABLE WITH EARLIER VERSIONS OF DVR65, SCE/1, OR DS-1. 
*     BOTH THE CALLING SEQUENCES AND THE LINE PROTOCOL HAVE BEEN
*     MODIFIED TO FACILITATE BETTER RESOURCE MANAGEMENT WITHIN
*     THE SYSTEM. THE DRIVER IS DESIGNED TO BE USED IN AN RTE-II
*     OR RTE-III SYSTEM.
* 
*     THIS DRIVER IS DESIGNED TO FUNCTION WITH EITHER THE HP 12665
*     SERIAL DATA INTERFACE (SDI) CARD OR THE HP 12773 SERIAL 
*     MODEM DATA INTERFACE (SMDI) CARD. THE DRIVER MAKES NO DIS-
*     TINCTION BETWEEN THE TWO BOARDS OR BETWEEN VARIOUS DATA 
*     RATES.
* 
* 
*     ***** CAUTION ***** CAUTION ***** CAUTION ***** CAUTION ***** 
* 
*     DO NOT ATTEMPT TO USE THIS DRIVER OUTSIDE OF THE DS-1 ENVIRON-
*     MENT WITHOUT THE PROPER SUPPORTING COMMUNICATIONS MANAGEMENT
*     STRUCTURE! THE DRIVER IS SPECIFICALLY DESIGNED TO INTERACT
*     WITH THE VARIOUS DS-1 MODULES SO AS TO PROVIDE PROPER RESOURCE
*     MANAGEMENT. 
* 
*     ***** CAUTION ***** CAUTION ***** CAUTION ***** CAUTION ***** 
* 
      SKP 
* 
*     CALLING SEQUENCES 
* 
*     *** NOTE: THESE CALLING SEQUENCES ARE SHOWN AS CLASS CALLS. 
*     HOWEVER, THE DRIVER IS ABLE TO HANDLE NON-CLASS I/O AS WELL.
*     TO DO NON-CLASS I/O, SIMPLY CONVERT THE CALLS TO THEIR PROPER 
*     FORMAT. *** 
      SPC 2 
*     TRANSMIT REQUEST AND RECEIVE OR TRANSMIT DATA 
      SPC 1 
*     JSB EXEC
*     DEF *+8 
*     DEF IRW       REQUEST CODE = 20 (CLASS WRITE/READ)
*     DEF CONWD     CONTROL WORD (SEE BELOW)
*     DEF RBUFR     REQUEST BUFFER ADDRESS
*     DEF RBUFL     REQUEST BUFFER LENGTH 
*     DEF DBUFR     DATA BUFFER ADDRESS 
*     DEF DBUFL     DATA BUFFER LENGTH
*     DEF CLASS 
* 
* 
*     RECEIVE OR TRANSMIT REQUEST OR DATA ONLY
      SPC 1 
*     JSB EXEC
*     DEF *+8 
*     DEF IRW       REQUEST CODE (17 = READ AND 18 = WRITE) 
*     DEF CONWD     CONTROL WORD (SEE BELOW)
*     DEF BUFFR     REQUEST OR DATA BUFFER ADDRESS
*     DEF BUFFL     REQUEST OR DATA BUFFER LENGTH 
*     DEF TIME1     TIME TAG WORD 1 (DATA CALLS ONLY) 
*     DEF TIME2     TIME TAG WORD 2 (DATA CALLS ONLY) 
*     DEF CLASS 
* 
* 
*     CONTROL REQUEST 
      SPC 1 
*     JSB EXEC
*     DEF *+5 
*     DEF IRW       REQUEST CODE = 19 (CLASS CONTROL) 
*     DEF CONWD     CONTROL WORD (SEE BELOW)
*     DEF BUFFR     LRN/PRN BUFFER
*     DEF CLASS 
* 
      SKP 
* 
*     THE LRN/PRN BUFFER IS A SIX WORD BUFFER WHICH IS SUPPLIED BY
*     THE CALLER FOR AN ENABLE LISTEN MODE (MODE=3) CALL. THE DRIVER
*     PLACES THE FIRST THREE VALUES INTO THE EQT EXTENSION (WORDS 1, 2
*     AND 3). THE REMAINING THREE WORDS ARE STORED IN THE DRIVER. 
*     FOR A CLEAR REQUEST (MODES 2 AND 4), THE DRIVER WILL CLEAR
*     THE LRN/PRN VALUES BEING MAINTAINED IN EQT EXTENSION WORDS
*     1 AND 2, AND WILL RETURN THEIR VALUES TO THE USER IN THE
*     BUFFER ADDRESS SUPPLIED.
* 
*     THE FORMAT FOR THE USER-SUPPLIED BUFFER IS AS FOLLOWS:
*         WORD 1  -  LINE RESOURCE NUMBER 
*         WORD 2  -  PROGL RESOURCE NUMBER
*         WORD 3  -  INTRA-REQUEST TIMEOUT (-10'S OF MILLISECONDS)
*         WORD 4  -  ADDRESS OF #SBIT SUBROUTINE IN RES 
*         WORD 5  -  ADDRESS OF $CGRN ENTRY POINT IN THE SYSTEM 
*         WORD 6  -  #0 IF THIS IS A PRIMARY NETWORK NODE 
*                    =0 IF THIS IS A SECONDARY NODE 
* 
*     NOTE: THE DISTINCTION BETWEEN PRIMARY AND SECONDARY IS NECESSARY
*     TO RESOLVE THE CONTENTION PROBLEM WHICH PERIODICALLY OCCURS 
*     WHEN TWO REQUESTS ARE MADE SIMULTANEOUSLY, ONE FROM EITHER
*     END OF THE COMMUNICATIONS LINE. IN THIS CASE, THE SECONDARY 
*     DRIVER YIELDS TO THE OTHER END AND RETURNS TO THE USER WITH 
*     THE 'BR' AND THE 'RB' BITS SET TO INDICATE A SIMULTANEOUS 
*     REQUEST CONDITION OCCURED. IN NORMAL USAGE, ALL SATELLITES
*     ARE PRIMARY AND CCE IS SECONDARY. A CCE MAY BE MADE PRIMARY IF
*     IT COMMUNICATES WITH ANOTHER CCE (VIA PTOP OR OPERATOR COMMANDS), 
*     AND IT DOES NOT SUPPORT ANY SATELLITES. 
* 
*     THE INTRA-REQUEST TIMEOUT IS USED TO PROVIDE A TIMEOUT COUNTER
*     WHICH RUNS IN THE INTERVAL BETWEEN REQUEST AND DATA PORTIONS OF 
*     A I/O CALL. IN A CCE NODE, THE VALUE SHOULD BE ZERO, SINCE CCE
*     HAS A MECHANISM FOR PROVIDING AN ALL-ENCOMPASSING TRANSACTION 
*     TIMEOUT. IN SCE/4 AND 5 NODES, A VALUE SHOULD BE SUPPLIED TO
*     PROVIDE SOME FORM OF TRANSACTION TIMEOUT, SINCE THAT IS NOT 
*     SUPPLIED BY THE SUPPORTING SOFTWARE.
* 
*     IF #SBIT AND $CGRN DO NOT EXIST IN A PARTICULAR NODE, A ZERO
*     IS PASSED FOR EACH OF THESE ADDRESSES. THE DRIVER CHECKS FOR
*     A ZERO PRIOR TO EXECUTING A 'JSB' TO THAT LOCATION. 
* 
      SKP 
*     CONTROL WORD FORMAT 
      SPC 1 
*      15!14 13 12!11 10  9! 8  7  6! 5  4  3! 2  1  0
*     ************************************************* 
*     *        * Z*NW*BR*MR*  MODE  *   LOGICAL UNIT  * 
*     ************************************************* 
* 
* 
*     WHERE:
* 
*     NW IS THE NO WAIT BIT WHICH IS USED BY A CALLER TO SPECIFY
*     THAT HE BE GIVEN CONTROL BACK IMMEDIATELY IF THE REMOTE 
*     CANNOT SERVICE HIS REQUEST PROMPTLY. NOT USED BY THE DRIVER,
*     BUT IS SPECIFIED IN A DRIVER-LIKE CALLING SEQUENCE TO D65MS.
* 
*     BR IS THE BLIND REQUEST BIT WHICH IS USED BY A CALLER TO
*     SPECIFY THAT HE DOES NOT WANT TO WAIT FOR THE REPLY TO COME 
*     BACK FROM THE REMOTE. NOT USED BY THE DRIVER, BUT IS SPECIFIED
*     IN A DRIVER-LIKE CALL TO D65MS. 
* 
*     MR IS USED TO INDICATE A MASTER REQUEST TO THE DRIVER SO THAT 
*     IT CAN SET THE I/O COMPLETION FLAG IN THE LIST ENTRY ASSOCIATED 
*     WITH THE CURRENT REQUEST UPON I/O COMPLETION. 
* 
*     MODE:   READ-WRITE REQUESTS 
*                 0 FOR SEND OR RECEIVE REQUEST ONLY
*                 1 FOR SEND REQUEST AND READ DATA
*                 2 FOR SEND REQUEST AND SEND DATA
*                 3 FOR SEND OR RECEIVE DATA ONLY 
*                 4 FOR SEND DATA ONLY WITHOUT A PRE- 
*                   EXISTING DATA PENDING CONDITION 
*             CONTROL REQUESTS
*                 0 FOR SEND STOP 
*                 1 FOR ENABLE LISTEN MODE
*                 2 FOR CLEAR REQUEST 
*                 3 FOR ENABLE LISTEN MODE AND SETUP LRN AND PRN
*                 4 FOR CLEAR AND SET EQT DOWN
* 
*     Z:     REQUIRED BY RTE FOR REQUEST AND DATA CALLS TO FORCE
*            FORCE THE SYSTEM TO TRANSPORT BOTH REQUEST AND 
*            DATA BUFFERS BEFORE AND AFTER THE I/O CALL.
* 
*     NOTE:  MODE 4 IS A PRIVILEGED MODE DESIGNED FOR USE BY PROGL AND
*     OTHER USERS WHO HAVE NEED TO SEND BLOCKS OF PURE DATA AND, IN 
*     DOING SO, MUST BYPASS THE NORMAL COMMUNICATIONS RESOURCE
*     MANAGEMENT AND TRANSACTION MANAGEMENT FUNCTIONS. THIS MODE
*     IS LEGAL FOR WRITING ONLY.
* 
      SKP 
*     EQUIPMENT TABLE USAGE 
*     ********************* 
* 
*     EQT #         USE 
*     *************************** 
*     1             DEFINED 
*     2             DEFINED 
*     3             DEFINED 
*     4             DEFINED 
*     5             DEFINED 
*     6             DEFINED 
*     7             FIRST BUFFER ADDRESS
*     8             FIRST BUFFER LENGTH 
*     9             DATA BUFFER ADDRESS (REQ AND DATA)
*     10            DATA BUFFER LENGTH (REQ AND DATA) 
*     11            COROUTINE POINTER 
*     12            EXTENDED STATUS WORD
*     13            EQT EXTENSION ADDRESS 
*     14            DEFINED TIMEOUT VALUE 
*     15            TIMEOUT COUNTER 
*     EXT1          VALUE OF LINE RESOURCE NUMBER 
*     EXT2          VALUE OF PROGL RESOURCE NUMBER
*     EXT3          INTRA-REQUEST TIMEOUT VALUE (- 10'S OF MSECS.)
*     EXT4          STREAM TYPE FROM CURRENT PARMB
*     EXT5          MASTER REQUESTOR CLASS NUMBER FROM CURRENT PARMB
*     EXT6          ID SEG. ADDR. OF PGM. TO BE INTERRUPT SCHEDULED 
*     EXT7          1ST TIME TAG OF LAST RECEIVED REQUEST 
*     EXT8          2ND TIME TAG OF LAST RECEIVED REQUEST 
* 
      SKP 
*     STATUS WORD FORMAT
* 
* 
*      15!14 13 12!11 10  9! 8  7  6! 5  4  3! 2  1  0
*     ************************************************* 
*     *                       *BL*IR*IL*SR*TO*CL*BR*GC*     EQT 5 
*     ************************************************* 
*     *RW*OC*RD*DD*MM*LM*RP*DP*TP*SF*RB*RM*PE*PAR CNTR*     EQT 12
*     ************************************************* 
* 
*     WHERE:
* 
*      BL - BROKEN LINE 
*      IR - ILLEGAL REQUEST TYPE
*      IL - ILLEGAL LENGTH RECEIVED 
*      SR - STOP RECEIVED (GC ALSO SET IF VALID DATA REJECT)
*      TO - TIME OUT
*      CL - ILLEGAL LENGTH SPECIFIED IN CALLING SEQUENCE
*      BR - BUSY REJECT (RP OR DP CONDITION EXISTS) 
*      GC - GOOD COMPLETION 
*      RW - READ/WRITE DIRECTION FOR CURRENT REQUEST SEGMENT
*      OC - OPEN/CLOSED LOOP TRANSMISSION MODE
*      RD - REQUEST AND DATA MODE 
*      DD - DATA DIRECTION FOR REQ AND DATA (1 = WRITE) 
*      MM - MASTER REQUEST MODE 
*      LM - LISTEN MODE ENABLED 
*      RP - REQUEST PENDING 
*      DP - DATA PENDING
*      TP - TRANSACTION PENDING 
*      SF - SYSTEM FAILURE
*      RB - REMOTE BUSY 
*      RM - RECEIVED MODE (OPEN/CLOSED LOOP)
*      PE - PARITY ERROR
*      PAR CNTR - PARITY COUNTER
* 
      SKP 
I.65  NOP 
      IFZ 
      JMP *+3       NORMAL DRIVER ENTRY 
      JSB $DDT      SPECIAL ENTRY - CALL $DDT 
      DEF *+1 
      XIF 
      JSB SETIO     CONFIGURE I/O INSTRUCTIONS
      LDA EQT13,I   EXT. AREA ADDRESS 
      SZA,RSS       SKIP IF ONE SPECIFIED 
      JMP GENER     ELSE SYSTEM GENERATED INCORRECTLY 
      LDA EQTX6,I   FIRST ENTRY 
      SZA                       FOR DEVICE? 
      JMP NFIR      NO. 
      LDA EQT6,I    GET EQT6
      AND B377      ISOLATE REQUEST CODE AND MODE 
      CPA B303      IS THIS AN INITIALIZE REQUEST?
      RSS           YES - GO PROCESS IT 
      JMP RQERR     NO - REJECT REQUEST 
      LDA EQT4,I    FETCH SELECT CODE 
      AND B77       ISOLATE 
      ADA MN6       SUBTRACT 6 TO FIND
      ADA INTBA       ENTRY IN INTERRUPT TABLE
      LDB A,I       FETCH USER INTERRUPT LINK 
      SSB,RSS       IS IT POSITIVE? (EQT ADDRESS) 
      JMP GENER     YES - SYSTEM INCORRECTLY GENERATED
      CMB,INB       GET INTERRUPT LINK
      STB EQTX6,I     AND SAVE
      LDB EQT1      SET DRIVER
      STB A,I         INTERRUPT LINK
      JSB RDD.C     CLEAR RECEIVER AND STATUS WORDS 
      LDA EQT4,I    TELL RTE THAT I WANT CONTROL ON TIME OUTT 
      IOR BIT12 
      IOR BIT13     AND ON POWER FAIL 
      STA EQT4,I
* 
NFIR  LDA EQT5,I    GET EQT WORD 5
      SSA,RSS       IS THE EQT ENTRY BUSY?
      JMP NFIR1     NO - NORMAL ENTRY 
      LDA B103      WAS BUSY - SIMULATE LISTEN REQUEST
      STA EQT6,I    (POWER FAIL CONDITION)
NFIR1 LDA EQT12,I   GET EQT 12
      ALF,ALF       ROTATE RP AND DP BITS TO LOWER BYTE 
      AND B3        ISOLATE THEM
      STA STATE     AND SAVE AS CURRENT DRIVER STATE
      LDA EQT6,I    GET EQT6 AGAIN
      ALF,ALF       ROTATE MODE TO LOWER BYTE 
      RAL,RAL 
      AND B7        MASK IT OFF 
      STA MODE      AND SAVE IT 
      ADA M5
      SSA,RSS       MODE>4 IS AN ERROR
      JMP RQERR     YES - MODE > 4 - ERROR
      LDA EQT6,I    GET EQT6 AGAIN
      AND B3        ISOLATE REQUEST CODE
      SZA,RSS       IS IT ZERO? 
      JMP RQERR     YES - ERROR 
      CPA B3        IS IT A CONTROL REQUEST?
      JMP CNREQ     YES - GO PROCESS
      ADA M1        MAKE REQUEST CODE 0 OR 1
      MPY D15       MULTIPLY BY 15 FOR RQTBL INDEXING 
      LDB MODE      GET MODE
      BLS 
      ADB MODE      MODE * 3
      ADB 0         ADD REQUEST TYPE
      ADB STATE     AND STATE 
      ADB RQTBL     SET UP REQUEST TABLE INDEX
      LDA 1,I       GET CONTENTS OF RQTBL AT INDEX
      AND MN400     CLEAR LOW HALF
      SZA,RSS       IS IT ZERO? 
      JMP ER.IR     YES - ILLEGAL REQUEST 
      SSA           IS THE VALUE NEGATIVE?
      JMP ER.BR     YES - DO A 'SOFT' REJECT
      LDA EQT6,I    PICK UP EQT 6 
      AND BIT9      ISOLATE MASTER REQUEST BIT
      RAL,RAL       ROTATE IT TO BIT 11 
      STA MSTR      AND SAVE IT FOR LATER USAGE 
      LDB 1,I       GET ADDRESS FROM TABLE
      JMP 1,I       JUMP TO PROCESSOR 
* 
B103  OCT 103 
B377  OCT 377 
MODE  NOP 
STATE NOP 
MSTR  NOP 
* 
      SKP 
* 
*     REQUEST PROCESSOR TABLE 
* 
*     THIS TABLE IS ACTUALLY A THREE DIMENSIONAL ARRAY WHICH IS INDEXED 
*     BY REQUEST CODE, MODE, AND DRIVER STATE. IF THE ENTRY WHICH IS
*     INDEXED BY A PARTICULAR REQUEST AT A SPECIFIC TIME IS ZERO, THE 
*     REQUEST IS ILLEGAL AND WILL BE REJECTED BY THE DRIVER (THE SYSTEM 
*     WILL RETURN AN 'IO07' TO THE REQUESTOR.) IF THE ENTRY IS NEGATIVE,
*     THE DRIVER WILL RETURN WITH AN IMMEDIATE COMPLETION RETURN AND
*     BIT 1 OF THE EQT5 STATUS AREA WILL BE SET TO INDICATE A DRIVER
*     BUSY REJECT. IF THE ENTRY IS POSITIVE, THE REQUEST IS VALID AND 
*     THE ENTRY CONTAINS THE ADDRESS OF THE REQUEST PROCESSOR.
* 
* 
RQTBL DEF *+1       RCODE   MODE    STATE      REQ TYPE 
******************************************************************************
B1    DEC 1           1      0       0         READ REQ 
MN6   OCT 177772      1      0       1 (DP)    READ REQ 
      DEF R.REQ       1      0       2 (RP)    READ REQ 
      DEF RQ.RD       1      1       0         REQ & RDATA
BIT15 OCT 100000      1      1       1 (DP)    REQ & RDATA
MN3   OCT 177775      1      1       2 (RP)    REQ & RDATA
      DEF RQ.SD       1      2       0         REQ & SDATA
MN4   OCT -4          1      2       1 (DP)    REQ & SDATA
DCLCC CLC 7,C         1      2       2 (RP)    REQ & SDATA
B2    DEC 2           1      3       0         READ DATA
      DEF R.DTA       1      3       1 (DP)    READ DATA
B3    DEC 3           1      3       2 (RP)    READ DATA
B4    DEC 4           1      4       0         READ DATA
BIT3  OCT 10          1      4       1 (DP)    READ DATA
BIT5  OCT 40          1      4       2 (RP)    READ DATA
      DEF S.REQ       2      0       0         SEND REQ 
MN400 OCT 177400      2      0       1 (DP)    SEND REQ 
M1    OCT -1          2      0       2 (RP)    SEND REQ 
      DEF RQ.RD       2      1       0         REQ & RDATA
RC    OCT 170017      2      1       1 (DP)    REQ & RDATA
TNW   OCT 170360      2      1       2 (RP)    REQ & RDATA
      DEF RQ.SD       2      2       0         REQ & SDATA
M5    DEC -5          2      2       1 (DP)    REQ & SDATA
CLCC  CLC 0,C         2      2       2 (RP)    REQ & SDATA
D15   DEC 15          2      3       0         SEND DATA
      DEF S.DTA       2      3       1 (DP)    SEND DATA
B77   OCT 77          2      3       2 (RP)    SEND DATA
      DEF SP.DT       2      4       0         SEND DATA
      DEF SP.DT       2      4       1 (DP)    SEND DATA
      DEF SP.DT       2      4       2 (RP)    SEND DATA
* 
      SKP 
* 
*     CONTROL REQUEST PROCESSOR 
* 
CNREQ LDA STATE     TEST DATA PENDING CONDITION 
      CPA B1        IS IT SET?
      JMP STPRQ     YES - SEND STOP 
      JSB CNPRC     CALL CONTROL REQUEST PROCESSOR SUBROUTINE 
      STA EQT12,I   SAVE EQT12 STATUS 
      JSB ICHAS     SET UP COROUTINE POINTER
      CLB,INB       SET B FOR GOOD COMPLETION 
      JMP ER.BR+1   AND EXIT
* 
      SKP 
*     CONTROL REQUEST PROCESSOR SUBROUTINE
* 
CNPRC NOP 
      LDB MODE      GET MODE
      ADB CNTBL     SET UP TO INDEX CONTROL TABLE 
      JMP B,I       AND JUMP TO PROCESSOR 
* 
CNTBL DEF *+1,I 
      DEF STPRQ     MODE 0
      DEF LSN.1     MODE 1
      DEF CLR.2     MODE 2
      DEF LSN.3     MODE 3
      DEF CLR.4     MODE 4
* 
CLR.2 CLB,RSS       NORMAL CLEAR REQUEST
CLR.4 LDB BIT14     CLEAR AND DOWN REQUEST
      JSB STAT      SET EQT DOWN IF C AND D REQUEST 
      LDB EQT7,I    GET ADDRESS PROVIDED BY USER
      JSB ICHAS     CHASE DOWN INDIRECTS
      LDA EQTX1,I   GET LRN 
      STA B,I       AND RETURN TO USER
      INB           BUMP USER BUFFER POINTER
      LDA EQTX2,I   GET PRN 
      STA B,I       AND RETURN TO USER
      JSB RDD.C     CLEAR THE CARD
      JSB CGRN
      CLA 
      STA EQTX1,I   CLEAR LRN VALUE IN EQT EXTENTION
      STA EQTX2,I   CLEAR PRN VALUE IN EXTENSION
      LDB UNKNI     GET UNKNOWN INTERRUPT POINTER 
      JMP CNPRC,I   AND EXIT
* 
LSN.3 LDB EQT7,I    LISTEN AND SETUP MODE 
      JSB ICHAS     GET USER BUFFER ADDRESS 
      LDA B,I       GET LRN 
      STA EQTX1,I   AND SAVE IT 
      INB           BUMP BUFFER POINTER 
      LDA B,I       GET PRN 
      STA EQTX2,I   AND SAVE THAT, TOO
      INB           BUMP BUFFER POINTER 
      LDA B,I       GET INTRA-REQUEST TIMEOUT 
      STA EQTX3,I   AND SAVE IT 
      INB           BUMP BUFFER POINTER 
      LDA B,I       GET #SBIT ADDR. AND $CGRN ADDRESS 
      STA #SBIT     AND SAVE THEM 
      INB 
      LDA B,I       IN BODY OF DRIVER 
      STA $CGRN 
      INB           BUMP POINTER AGAIN
      LDA B,I       GET PRIMARY FLAG
      STA PRIMY     AND SAVE IT 
LSN.1 STC 0,C       SET I/O CARD TO LISTEN MODE 
      JSB CGRN
      LDB LSTNI     GET LISTEN INTERRUPT POINT
      LDA BIT10     GET LISTEN STATUS BIT 
      JMP CNPRC,I   AND RETURN
      SKP 
* 
*     HERE FOR IMMEDIATE COMPLETION RETURN
*     A REG SHOULD CONTAIN THE STATUS OF LAST REQUEST 
* 
*     ER.BR LABEL IS USED FOR 'SOFT' REJECTS OF REQUESTS. 
*     THAT IS, A REQUEST WHICH IS RECEIVED WHEN THERE IS
*     EITHER A REQUEST PENDING OR A DATA PENDING CONDITION IS 
*     CURRENTLY EXISTING. 
* 
ER.BR LDB B2        GET BUSY BIT FOR IMMED COMPL REJECT 
      JSB STAT      PUT NEW STATUS IN EQT 5 
      LDA B4        SET FOR IMMEDIATE COMPLETION
* 
*     HERE FOR COMPLETION RETURN
*     EQT 11 WILL BE SET DEPENDING UPON LISTEN MODE STATUS
* 
IDON  STA TEMP2     SAVE COMPLETION STATUS
      LDA EQT12,I   GET EQT12 
      AND BIT10     ISOLATE LISTEN MODE BIT 
      LDB UNKNI     SET FOR ILLEGAL INTERRUPT 
      SZA           IS THE DRIVER IN LISTEN MODE? 
      LDB LSTNI     YES - SET FOR LISTEN INTERRUPT
      LDA TEMP2     GET STATUS AGAIN
IDON1 JSB ICHAS     SAVE ROUTINE ADDRESS
      LDB EQT12,I   GET EQT12 FOR RETURN TO CALLER
      JMP I.65,I    RETURN TO RTE SYSTEM
* 
ER.IR LDB BIT6      ILLEGAL REQUEST 
      JSB STAT      UPDATE EQT5'S STATUS
      CLA,INA,RSS   SET FOR READ-WRITE ERROR
RQERR LDA B2        REQUEST ERROR CODE
      JMP IDON      AND EXIT
* 
GENER LDA B3        SET A=3 FOR DEVICE NOT READY REJECT 
      JMP IDON
* 
      SKP 
* 
*     STOP REQUEST PROCESSOR
* 
STPRQ JSB SSTOP     SEND STOP 
      LDB STPRA     GET STOP REQUEST CONTINUATOR ADDRESS
STRQ1 STC 0         PUT CARD IN TRANSMIT MODE 
      JMP IEXIT+1   AND RETURN WITH OPERATION IN PROGRESS 
* 
*     SUBROUTINE TO SEND A STOP 
* 
SSTOP NOP           SAVE RETURN ADDRESS 
      LDA STOP      GET STOP WORD 
      JSB OUTPA     SEND STOP 
      JMP SSTOP,I   RETURN
* 
*     SUBROUTINE TO SEND TNW
* 
STNW  NOP 
      LDA TNW       GET TRANSMIT NEXT WORD
      JSB OUTPA     OUTPUT WORD 
      JMP STNW,I    RETURN
* 
*     SUBROUTINE TO RETRANSMIT LAST WORD
* 
SRLW  NOP 
      LDA RLW       RETRANSMIT LAST WORD
      JSB OUTPA     OUTPUT CHARACTER
      JMP SRLW,I    RETURN
* 
      SKP 
* 
*     HERE FOR RECEIVE OR TRANSMIT DATA ONLY
* 
S.DTA CCE,RSS       SET E=1 FOR SEND DATA REQUEST 
R.DTA CLE           AND TO ZERO FOR RECEIVE DATA REQUEST
      JSB DLCHK     CHECK DATA LENGTH 
* 
      LDA EQTX4,I   GET FRIENDLY BIT (11) 
      ALF 
      SSA,RSS       IS IT FRIENDLY? 
      JMP DTAGO     NO, DON'T CHECK TIME-TAGS 
* 
      LDB EQT10,I   EQT10 HAS TAGS ADDR IF XSIO CALL
      LDA EQT6,I
      RAL,SLA       TEST "T" FIELD
      SSA           SKIP IF "SYSTEM" REQUEST
      LDB EQT9      NORMAL CALL, EQT 9 & 10 HAVE TAGS 
      LDA 1,I       GET 1ST TAG 
      CPA EQTX7,I   MATCH REQUEST'S TIME-TAG 1? 
      INB,RSS       YES 
      JMP ER.IR     NO, TREAT AS ILLEGAL REQUEST
      LDA 1,I       GET 2ND TIME-TAG
      ISZ EQTX7 
      CPA EQTX7,I   MATCH REQUEST'S TIME-TAG 2? 
      RSS           YES, DO THE TRANSFER
      JMP ER.IR     REJECT REQUEST
* 
DTAGO LDA EQT12,I   GET EQT12 
      AND BIT4      ISOLATE REMOTE'S MODE 
      ALF,ALF       ROTATE TO BIT 14 TO SET OUR MODE
      RAL,RAL 
      RAL,ERA       SET BIT 15 TO REFLECT DATA DIRECTION
      IOR EQT12,I   INCLUSIVE OR IN EQT12 
      AND NBIT8     CLEAR DATA PENDING CONDITION
      STA EQT12,I 
      JSB CLPAR     CLEAR PARITY COUNTER
      LDB WDINT     SET FOR POSSIBLE WRITE INTERRUPT
      SSA           READ OR WRITE?
      JMP TRDT3     WRITE...DO NOT SET FOR DMA TRANSFER UNTIL READY 
      JSB GTDMA     SET UP DMA
      LDB RDINT     GET READ INTERRUPT
TRDT3 JSB STNW      TELL OTHER SIDE TO "LET HER GO" 
* 
*     ALL NORMAL EXITS FROM INITIATOR COME THRU HERE
* 
IEXIT STC 0,C       SET FOR RECEIVE MODE
      CLA           GET A ZERO
      JMP IDON1     RETURN
* 
* 
B303  OCT 303 
BIT8  OCT 400 
NBIT8 OCT 177377
UNKNI DEF IUNKN 
LSTNI DEF ILSTN 
RDINT DEF INTRD 
WDINT DEF INTWD 
WR1IT DEF ITWR1 
BIT10 OCT 2000
BIT9  OCT 1000
* 
      SKP 
* 
* 
*     REQUEST AND DATA TRANSMISSION MODE
* 
RQ.RD CLA,RSS       SEND REQUEST AND READ DATA
RQ.SD LDA BIT12     REQ AND SEND DATA - SET DATA WRITE FLAG 
      JSB DLCHK     DO LENGTH CHECK 
      IOR BIT13     SET REQUEST AND DATA MODE INTO STATUS 
* 
*     HERE FOR STARTING OF A SEND REQUEST 
* 
SREQ1 IOR BIT15     SET FOR WRITING...BIT 15
      IOR BIT10     MASK IN LISTEN ENABLED FLAG 
      IOR MSTR      STUFF IN MASTER REQUEST BIT 
      STA EQT12,I   SAVE IT AWAY
      LDA EQT7,I    GET FIRST 2 WORDS OF REQUEST
      DLD A,I 
      DST EQTX4,I   AND PUT INTO EQT EXTENSION
      JSB CLPAR     CLEAR PARITY COUNTER
      JSB SRC       SEND REQUEST COMING 
      LDB WR1IT 
      JMP IEXIT     DO A NORMAL CONTINUATION EXIT 
* 
BIT12 OCT 10000 
BIT14 OCT 40000 
* 
      SKP 
* 
*     HERE FOR RECEIVE OR TRANSMIT REQUEST ONLY 
* 
S.REQ CLA           SEND REQUEST ONLY CALL
      JMP SREQ1 
* 
R.REQ LDA BIT10     SET LISTEN FLAG..CURRENT STATUS OF DRIVER 
      IOR MSTR      STUFF IN MASTER REQUEST FLAG
      STA EQT12,I   SAVE NEW STATUS 
      JSB CLPAR     CLEAR PARITY COUNTER
      LDB LNRCI     GET READ REQ INTERRUPT
      JMP TRDT3     TELL OTHER SIDE TO CONTINUE 
* 
LNRCI DEF ILNRC 
* 
*     ROUTINE TO CLEAR PARITY COUNTER 
* 
CLPAR NOP 
      LDA PMSK      GET MASK FOR PARITY COUNTER 
      AND EQT12,I   MASK OFF PARITY COUNT 
      STA EQT12,I   AND RESTORE EQT12 
      JMP CLPAR,I 
* 
*     ROUTINE TO CHECK DATA LENGTH LEGALITY 
* 
DLCHK NOP 
      LDB EQT8,I    GET DATA BUFFER LENGTH
      SZB           IS IT ZERO? 
      JMP DLCHK,I   NO - RETURN ON LEGAL LENGTH 
      LDB B4        YES 
      JMP ER.IR+1   TAKE ERROR EXIT 
* 
      SKP 
* 
*     SPECIAL DATA TRANSMISSION MODE
* 
SP.DT JSB DLCHK     CHECK DATA LENGTH 
      LDA EQT12,I   GET EQT 12
      IOR BIT15     SET TRANSMIT MODE 
      STA EQT12,I   AND SAVE IT 
      JSB CLPAR     CLEAR PARITY COUNTER
      LDB DWDEF     GET RETURN-POINTER ADDRESS. 
      JSB SPECL     GO TO START SPECIAL DMA TRANSMISSION. 
      JMP IEXIT     TAKE INITIATOR EXIT.
* 
SP.EN CLE 
      JSB PRIV      DEALLOCATE DMA
      JSB CEXT2     AWAIT RESPONSE
      JSB TIMCK     REENTERED, IS IT TIMEOUT? 
      JMP LNRC2     YES 
      JSB RDD.D     GET SCE-1'S REPLY 
      CPA RLW       RETRY?
      RSS           YES 
      JMP REQDN     NO, DONE WITH THIS RECORD 
      LDB DWDEF 
      JMP SPDMA     RETRY 
* 
DWDEF DEF SP.EN 
* 
SPECL NOP           ENTRY/EXIT: SPECIAL DMA START-UP
      LDA EQT7,I    GET THE FIRST ELEMENT 
      LDA A,I         FROM THE CALLER'S DATA BUFFER.
      DST SPTMP     SAVE FIRST WORD AND RETURN POINTER. 
      ISZ EQT7,I    ADVANCE BUFFER POINTER FOR DMA. 
      LDB EQT8,I    GET THE TRANSMISSION LENGTH.
      ADB M1        SUBTRACT ONE FOR FIRST WORD.
      STB EQT8,I    SAVE DECREMENTED LENGTH FOR DMA.
      SZB           ONE WORD TRANSMISSION?
      JSB GTDMA      NO. PREPARE FOR DMA TRANSFER.
      DLD SPTMP     GET FIRST DATA WORD & RETURN POINTER. 
      JSB OUTPA     OUTPUT IN RCV MODE--RESPONSE STARTS DMA.
      JMP SPECL,I   RETURN: <B>=RETURN-POINTER. 
* 
SPTMP OCT 0,0       TEMPORARY STORAGE.
                                                                        