ASMB,R,L,C
      HED DVR50: BISYNC TELECOM DRIVER * (C) HEWLETT-PACKARD CO.1979 *
      NAM DVR50,0 91780-16015 REV.1913 790131 
      ENT I.50,C.50,P.50
      EXT $IOUP 
* 
*    NAME:         DVR50
*    SOURCE:       91780-18015
*    RELOC:        91780-16015
*    PGMR:         P. KAPOOR   ( 11/20/73 ) 
* 
*    MODIFIED BY:  P. KAPOOR, R.SHATZER ( 01/11/75 )
*                  C. WHELAN   ( 06/30/76 ) 
*                  C. HAMILTON ( 04/12/77 ) 
*                  R. GUDZ     ( 01/31/79 ) 
* 
*  *****************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.         *
*  *****************************************************************
* 
*  RTE/IBM BINARY SYNCHRONOUS COMMUNICATIONS DRIVER 
*  CAUTION: THIS SYSTEM MODULE IS A FRONT-END FOR 
*           THE SSGA/LIBRARY PORTION OF DVR50 (#BSC). 
* 
*  UNIVERSAL (RTE-C/II/III/IV) VERSION, W/ DMS MAPPING DONE RIGHT.  
* 
* 
********************************************************************
* 
*                   PCO 1913  JANUARY 31,1979 
* 
*        MAPPING FIXED FOR TYPE 4 PROGRAMS IN RTE-IV
* 
*        CLMSK FIXED TO ONLY MASK LOW EIGHT BITS OF EQT WORD 5
      SKP 
* 
*  DRIVER INITIALIZATION: BEFORE USING THIS DRIVER, 
*  THE USER MUST MAKE AN INITIALIZATION CALL. THIS
*  ENABLES THE SYSTEM RESIDENT FRONT-END TO SET UP
*  LINKS TO ENTRY POINTS #I.50, #C.50 AND #P.50 IN
*  THE LIBRARY PORTION OF DVR50. INITIALIZATION 
*  CALLING SEQUENCE IS: 
* 
*     JSB EXEC
*     DEF *+4 
*     DEF ICODE 
*     DEF ICNWD 
*     DEF IPRM
*  RETURN POINT 
*      .
*      .
*  ICODE DEC 3
* 
*  ICNWD OCT 37XX 
* 
*  IPRM  DEF *+1
*        OCT ZZZZ 
*  MAPSW NOP
*  TIMAD DEF #TIME
*  BSCAD DEF #BSC 
* 
*  WHERE ZZZZ = 100026 FOR ASCII WITH CRC 
*             =     26 FOR ASCII WITH LRC & VRC 
*             = 100062 FOR EBCDIC WITH CRC
*             =     62 FOR EBCDIC WITH LRC
* 
*      MAPSW  = 0  TO ALLOW DMS MAP SWITCHING FOR RTE-III 
*             =-1  EXECUTE ONLY DMS-STATUS SAVE/RESTORE FOR P.50 (RTE-III)
*             <-1  TO BYPASS ALL DMS INSTRUCTIONS (RTE-C/II). 
* 
*  TIMAD IS THE ADDRESS OF THE TIMEOUT-CONTROL ARRAY (IN #COMN),
*  AND #BSC IS AN ENTRY POINT IN LIBRARY PORTION
*  OF THE DRIVER :
* 
*  #BSC  OCT 150003 
*        DEF #I.50
*        DEF #C.50
*        DEF #P.50
* 
*  ON RETURN FROM INITIALIZATION, REG A = EQT5 AND
*  REG B = PASSWORD (ID SEG ADDR OF CALLING PROGRAM)
* 
*  ON ALL SUBSEQUENT CALLS TO DVR50 (TILL THE LINE
*  GOES DOWN) THE CALLING PROGRAM MUST INSERT THIS
*  NUMBER IN THE OPTIONAL PARAMETER WORD OF THE 
*  CALLING SEQUENCE.
* 
      SKP 
*  FUNCTIONS AVAILABLE:   (XX = L.U.) 
*---------------------------------------------------
* 
* ICODE ICNWD NAME       DESCRIPTION      REJECT
* ----- ----- ----       -----------      ------
*   3   37XX  INIT-  SET FLAGS. LINK     ALREADY
*            IALIZE  LIBRARY AND SYSTEM  INITIALIZED
*                    RESIDENT POTIONS 
*                    OF DRIVER. SET UP
*                    I/O INSTRUCTIONS.
* 
*   3   36XX  DIS-    PUT I/O BOARD   1. DRIVER NOT 
*            CONNECT  ON-HOOK.           INITIALIZED
*                                     2. SECURITY 
*                                        CODE ERASED
* 
*   3  35XX  CONTROL  CAUSES L.U. TO  1. DRIVER NOT 
*              TO     BECOME A SENDER    INITIALIZED
*             SEND    AND REMOTE TO   2. SECURITY 
*                     BECOME RECEIVER.   CODE ERASED
*                                     3. TRML NOT IN
*                                        CONTROL
*                                        MODE.
* 
*   3  34XX  HAND-    CONNECT WITH    1. DRIVER NOT 
*            SHAKE    REMOTE. TRML       INITIALIZED
*                     BECOMES SENDER. 2. SECURITY 
*                                        CODE ERASED
*                                     3. ALREADY "ON
*                                        LINE". 
* 
*   3  33XX  AUTO-    CONNECT WITH    1. DRIVER NOT 
*            ANSWER   REMOTE. TRML       INITIALIZED
*                     BECOME RECEIVER.2. SECURITY 
*                                        VIOLATION. 
* 
*   3  32XX  SEND     SEND END-OF-    1. SECURITY 
*            END-     TRANSMISSION       CODE ERASED
*            OF-FILE  CHARACTER TO    2. DRIVER NOT 
*                     REMOTE. CHANGE     INITIALIZED
*                     STATE TO RCV    3. TERMINAL IN
*                     IF REMOTE SENDS    RCV MODE.
*                     "ENQ".
* 
*   3  31XX  CONTROL  ANSWER PHONE    1. DRIVER NOT 
*              TO     FOR LONG           INITIALIZED
*            RECEIVE  TIMEOUT AND     2. SECURITY 
*                     BECOME             VIOLATION. 
*                     RECEIVER        3. TRML NOT IN
*                                        CONTROL MODE 
* 
*   3  00XX  CLEAR    DROP LINE & 
*                     CLEAN DRIVER
* 
*   3  30XX  EXTENDED STATISTICS RETURNED IN REG-B. 
* 
*   1  33XX  READ  SEND ACK0 OR ACK1  1. SECURITY 
*                  TO PREVIOUS MESSAGE   CODE ERASED
*                  AND READ FROM LINE.2. DRIVER NOT 
*   1  34XX  READ  SEND NAK TO LAST      INITIALIZED
*                  MESSAGE AND READ   3. TERMINAL 
*                  FROM THE LINE.        OFF LINE.
*   1  35XX  READ  REPLY ACK0 TO      4. TERMINAL IN
*                  CONVERSATIONAL READ   SEND STATE.
*                  AND READ FROM      5. LONG OR RECV 
*                  LINE.                 TIMEOUT
*                                        OR 8 
*   1  36XX  READ  SEND RVI IN RESPONSE  TRIES
*                  TO LAST MESSAGE AND   FAILED AND 
*                  READ FROM THE LINE.   LINE PUT 
*                                        DOWN.
*   1  37XX  WRITE    SEND DATA TO    6. 'DLE EOT'
*          CONVERSA-  REMOTE AS          RECEIVED 
*          TIONAL     ACKNOWLEDGEMENT    AND LINE 
*                     OF LAST MESSAGE    DROPPED. 
*                     AND READ FROM 
*                     LINE INTO THE 
*                     SAME BUFFER.
* 
*   2  37XX  WRITE  SEND DATA TO      1. SECURITY 
*                   REMOTE AND GET       CODE ERASED
*                   ACK. START TTD    2. DRIVER NOT 
*                   AND RETURN TO        INITIALIZED
*                   USER.             3. TERMINAL 
*                                        OFF LINE.
*                                     4. TERMINAL IN
*                                        RECEIVE
*                                        STATE. 
*                                     5. REMOTE DOES
*                                        NOT ACKNOW-
*                                        LEDGE; LINE
*                                        DROPPED. 
*                                     6. 'DLE EOT'
*                                        RECEIVED;
*                                        LINE 
*                                        DROPPED. 
* 
*  13    XX  STATUS  DRIVER IS NOT
*                   ENTERED FOR THIS
*                   REQUEST. SYSTEM 
*                   PUTS EQT5 IN A
*                   REGISTER AND
*                   CONTROL RETURNS 
*                   TO USER.
*---------------------------------------------------
* 
* THE DRIVER NEVER CAUSES THE USER PROGRAM TO BE
* ABORTED BECAUSE I.50 ONLY RETURNS A=0, 2 OR 4.
* C.50 RETURNS A=0 OR 1. ON RETURN TO USER FROM I.50, B=0 
* MEANS THAT THE REQUEST WAS NOT INITIATED. 
*---------------------------------------------------
* 
      SKP 
*   DVR50/#BSC STATUS-BIT DEFINITIONS:
*   --------------------------------- 
* 
*   EQT5 ( RETURNED IN <A> FOR ALL REQUESTS ):
* 
*   BIT#                          MEANING 
*   ----                  ----------------------
*     0    0 = REQUEST SERVICED W/O ERROR    1 = IRRECOVERABLE LINE ERROR.
*     1    0 = TERMINAL OFF LINE             1 = TERMINAL ON LINE.
*     2    0 = *                             1 = TRANSMIT MODE. 
*     3    0 = *                             1 = RECEIVE MODE.
*     4    0 = [ DON'T CARE ]                1 = 'RVI' RECEIVED.
*     5    0 = [ DON'T CARE ]                1 = BUFFER OVERFLOW. 
* 
*              * BITS #2&3 =0, AND BIT #1 =1 IMPLIES:  CONTROL MODE.
* 
*   EQT12 ( RETURNED IN <B> FOR EXTENDED STATUS REQUEST ):
* 
*   BIT#      MEANING WHEN EQUAL TO 1 
*   ----      ----------------------- 
*     0       SECURITY CODE VIOLATION.
*                [  RJE: 20 ] 
*     1       PASSWORD VIOLATION. 
*                [  RJE: 21 ] 
*     2       ILLEGAL MODE FOR REQUEST ISSUED TO DRIVER.
*                [  RJE: 22 ] 
*     3       ILLEGAL BUFFER FORMAT SPECIFIED.
*                [  RJE: 23 ] 
*     4       ILLEGAL BISYNC SEQUENCE RECEIVED REPEATEDLY (7 TIMES).
*                [  RJE: 24 ] 
*     5       LOSS OF 'CLEAR-TO-SEND' FROM MODEM. 
*                [  RJE: 25 ] 
*     6       RECEIVED BUFFER 'NAK'ED' 7 TIMES. 
*                [  RJE: 26 ] 
*     7       XMITTED BUFFER 'NAK'ED' BY REMOTE 7 TIMES.
*                [  RJE: 27 ] 
*     8       RECEIVE TIMEOUT OCCURRED REPEATEDLY (7 TIMES).
*                [  RJE: 30 ] 
*     9       LONG TIMEOUT FAILURE. 
*                [  RJE: 31 ] 
*    10       DISCONNECT (DLE-EOT) SENT TO REMOTE & LINE DROPPED. 
*                [  RJE: 32 ] 
*    11       DISCONNECT (DLE-EOT) RECEIVED FROM REMOTE & LINE DROPPED. 
*                [  RJE: 33 ] 
*    12       LOSS OF 'DATA-SET-READY' FROM MODEM.
*                [  RJE: 34 ] 
*    13       LOSS OF 'CARRIER-DETECT' FROM MODEM, DURING RECEIVE MODE. 
*                [  RJE: 35 ] 
*    14       'TTD' OR 'WACK' LIMIT EXCEEDED. 
*                [  RJE: 36 ] 
*    15       CONTROL-TIMEOUT FAILURE - LINE IN 'CONTROL-MODE' AND USER 
*              FAILED TO MAKE A REQUEST BEFORE EXPIRATION OF 'LONG TIMEOUT. 
*              THE LINE IS DISCONNECTED, FOLLOWING A 'CONTROL-TIMEOUT.
*                [  RJE: 37 ] 
* 
      SKP 
*  INITIATION SECTION 
* 
I.50  NOP 
      STA SCODE     SAVE SELECT CODE OF RCV BOARD 
      LDA EQT6,I
      AND M3777 
      CPA M3        CLEAR REQUEST ? 
      JMP RSET      YES. CLEAN DRIVER & DROP LINE.
      CPA M3003     EXTENDED STATUS REQUEST ? 
      JMP STATR     YES. RETURN EXTENDED STATUS.
      LDB EQT15,I   GET CLOCK VALUE 
      SZB,RSS       IS CLOCK ACTIVE ? 
      JMP ICHK      NO. CHECK FOR INITIALIZE CALL.
      CPA M3703     IS IT INITIALIZE AGAIN. 
      JMP MVIOL     YES, RECORD MODE VIOLATION. 
* 
* CHECK SECURITY CODE BEFORE ALLOWING ENTRY INTO LIBRARY SECTION. 
* 
SURCH LDA SPTR,I    GET SECURITY WORD FROM LIBRARY DVR
      CPA SECD      IS SECURITY VIOLATED ?
      JMP IENTR     NO, THEN ENTER #I.50
      JSB SVIOL     YES, RECORD SECURITY VIOLATION. 
REJ2  LDA P2        INDICATE: 
      CLB            ERROR RETURN!
      JMP I.50,I    RETURN
* 
* THIS SECTION IS ENTERED WHEN EQT15=0. IN THAT CASE
* IT MUST EITHER BE AN INITIALIZATION CALL OR HAND- 
* SHAKE/AUTO-ANSWER CALL. IF HAND-SHAKE OR AUTO-
* ANSWER THEN PASSWORD AND SECURITY CODE MUST BE VALID. 
* 
ICHK  CPA M3703     IS IT INITIALIZE CALL ? 
      JMP SETUP     YES. SET UP INITIALIZATION. 
      CPA M3403     HAND-SHAKE ?
      JMP SURCH     YES, CHECK SECURITY CODE. 
      CPA M3303     AUTO-ANSWER ? 
      JMP SURCH     YES, CHECK SECURITY CODE. 
* 
MVIOL LDB P4
      JSB SET       RECORD MODE VIOLATION IN BIT 2
      JMP REJ2      REJECT REQUEST. 
* 
SVIOL NOP 
      CLB,INB       RECORD SECURITY VIOLATION 
      JSB SET          IN BIT 0 . 
      JMP SVIOL,I    REJECT REQUEST.
* 
SET   NOP 
      LDA EQT12,I   SET APPROPRIATE ERROR 
      IOR B          BIT IN EXTENDED STATUS WORD
      STA EQT12,I 
      CLB,INB 
      LDA EQT5,I    ALSO SET 'OPERATION IN
      IOR B          ERROR' BIT IN STANDARD 
      STA EQT5,I       STATUS WORD. 
      JMP SET,I     RETURN
* 
RSET  JSB CLC$      INHIBIT INTERRUPTS
      STB FLG       CLEAR REQUEST-IN-PROGRESS FLAG. 
      JSB OFBRD     TURN OFF MODEM
      JMP IMCMP     GO FOR IMMEDIATE COMPLETION 
* 
* 
IENTR CLA 
      STA FLG 
      LDA TIMAD     PASS #TIME ADDRESS FOR INITIALIZATION.
      JSB #I.50,I 
* 
      SZA,RSS       REQUEST INITIATED ? 
      ISZ FLG       YES, SET FLAG 
      JMP I.50,I    RETURN. 
* 
*  RESOLVE REG-A POINTER
* 
APTR  NOP 
APTR1 SSA,RSS       INDIRECT ADDRESS ?
      JMP APTR,I    NO, THEN RETURN.
      ELA,CLE,ERA   CLEAR BIT15 
      LDA A,I       GET NEXT ADDRESS LINK 
      JMP APTR1     RESOLVE INDIRECT AGAIN
* 
*  RETURN EXTENDED STATISTICS IN REG-B
* 
STATR CCA           OFFSET SYSTEM EQT15 POINTER TO
      ADA EQT15     PREVENT RESETTING OF CURRENT
      STA EQT15     CLOCK VALUE.
      LDB EQT12,I   GET EXTENDED STATUS FROM EQT12
IMCMP LDA P4        INDICATE IMMEDIATE COMPLETION 
      JMP I.50,I    RETURN TO THE CALLER. 
* 
      SKP 
* THIS IS THE INITIALIZATION SET-UP ROUTINE. IT 
* ESTABLISHES #I.50, #C.50 AND #P.50 LINKS WITH 
* THE LIBRARY RESIDENT DRIVER. A POINTER TO A 
* SECURITY CODE (LOCATED IN #BSC) IS ESTABLISHED. 
* SOME EQT POINTERS ARE SET UP AND "CLC" & "OTA"
* INSTRUCTIONS ARE CONFIGURED.
* 
SETUP LDA EQT7,I    GET ADDR OF "IPRM" FROM CALL
      JSB APTR
      LDB A,I 
      STB EQT7,I    SET ASC/EBCDIC & CRC/LRC FLAG 
      INA           BUMP POINTER
      LDB A,I       GET MAP SWITCHING PARAMETER.
      INA           POINT TO NEXT PARAMETER.
      SZB           IF MAP SWITCHING IS NOT NEEDED (B#0), 
      JMP CKPRV      LEAVE BYPASS INSTRUCTIONS INTACT;
      STB MAP1        ELSE, 
      STB MAP2         CLEAR ALL OF THE 
      STB MAP3          BYPASS INSTRUCTIONS,
      STB MAP4           IN ORDER TO ENABLE 
      STB MAP5            MAP SWITCHING FOR RTE-III.
      JMP *+3       CONTINUE THE PROCESS. 
CKPRV INB,SZB       IF <MAPSW>=-1, ENABLE DMS STATUS-ONLY;
      JMP GTAD       ELSE, IGNORE ALL DMS INSTRUCTIONS! 
      STB MAP6      ALLOW P.50 TO SAVE DMS STATUS, ON ENTRY.
      STB MAP7      ALLOW P.50 TO RESET DMS STATUS, ON EXIT.
GTAD  LDB A,I       GET THE TIMEOUT-ARRAY ADDRESS 
      STB TIMAD      AND SAVE FOR #BSC INITIALIZATION.
      INA           ADVANCE POINTER TO #BSC ADDRESS.
      LDA 0,I       GET THE ADDRESS OF #BSC 
      JSB APTR
      LDB 0 
      STB SPTR      SET POINTER TOWARDS SECURITY LOC
      INB           BUMP TO NEXT ADDRESS
      LDA B,I       SET 
      JSB APTR
      STA #I.50      POINTERS 
      INB             TO
      LDA B,I          #I.50
      JSB APTR
      STA #C.50        #C.50
      INB               AND 
      LDA B,I          #P.50
      JSB APTR
      STA #P.50         IN THE LIB DVR. 
* 
MAP1  JMP FCLC      BYPASS MAP SWITCH (NOP: SWITCH) 
      LDA BUF1A 
      USA           GET USER MAP FOR RJE/#BSC 
* 
FCLC  LDA CLC       CONFIGURE 
      IOR SCODE       CLC XX,C
      STA CLC1         FOR RECEIVE
      INA               AND 
      STA CLC2           TRANSMIT BOARDS. 
      LDA OTA       CONFIGURE "OTA XX" INSTRUCTIONS 
      IOR SCODE 
      STA OTA1
      STA OTSYN 
      INA           BUMP TO XMIT CHANNEL
      STA OTA2
      LDA EQT1,I    GET ADDRESS OF WORD #16 
      ADA P15         OF CALLING PROGRAM'S ID SEGMENT 
      STA STPNT         WHICH HAS STATUS OF PROGRAM.
      LDA EQT15     SET 
      STA EQP15       EQT15 POINTER 
      JMP SURCH     GO FOR #I.50 ENTRY
* 
      SKP 
* 
*               ** TIME-OUT / COMPLETION SECTION ** 
* 
*   THIS ROUTINE IS ENTERED ON A 'TIME-OUT' (DVR50 SETS BIT#12 OF EQT4 TO 
* TELL RTE THAT IT IS HANDLING IT'S OWN TIMEOUT). COMPLETION IS INDICATED 
* BY A (P+1) RETURN FROM THIS SECTION TO RTIOC. 
*   BEFORE JUMPING TO THE LIBRARY RESIDENT #C.50, SECURITY CODE IS CHECKED. 
* IF VIOLATED, AND A REQUEST WAS IN PROGRESS, THEN RETURN TO RTIOC WITH 
* <A>=1 (MALFUNCTION). IF NO REQUEST, $UPIO (IN RTIOC) HANDLES THE EXIT.
*   #C.50 MAKES A P+1 RETURN TO DVR50, IF NO REQUEST WAS IN PROGRESS
* ($IOUP IN RTIOC HANDLES THE DRIVER'S EXIT); #C.50 MAKES A (P+2) RETURN
* TO DVR50, IF A REQUEST WAS COMPLETED (RETURN TO RTIOC IS VIA C.50); 
* #C.50 RETURNS TO DVR50 AT (P+3) FOR REQUEST COMPLETION (RETURN TO 
* RTIOC IS VIA (C.50+1).
* 
C.50  NOP 
TIMAD EQU C.50      TEMPORARY STORAGE: INITIALIZATION.
      CLF 0         TURN OFF INTERRUPT SYSTEM 
      LDA EQT4,I
      AND MTBIT     CLEAR TIME-OUT BIT
      STA EQT4,I
      LDA EQT15,I   GET CLOCK VALUE 
      SZA           IS EQT15=0 ?
      JMP CEXIT     NO, ILLEGAL INTERRUPT, DO P+2 RETURN
* 
MAP2  JMP CLRTO     BYPASS DMS STATUS (NOP: SAVE STATUS)
      RSB 
      STB TOSTS     SAVE DMS STATUS 
      BLF,SLB 
      JMP CLRTO     ALREADY IN USER MAP, JUMP 
* 
*  UNDER SYSTEM MAP, GET RJE USER MAP 
      LDB BUF3A 
      USB           SAVE CURRENT USER MAP CONTENTS
      LDB BUF1B 
      USB           SET RJE MAP 
      UJP *+2       NOW RUNNING UNDER RJE MAP 
* 
CLRTO JSB CLC$      PROHIBIT INTERRUPT ON BOARDS
      STF 0         TURN ON INTERRUPT SYSTEM
      CPA ABTFG     TEST ABORT FLAG SET BY P.50 
      JSB EXIST     NO ABORT, CHECK SEC CODE & DORMANCY 
      JMP VIOLA 
* 
      JSB #C.50,I   CALL #BSC TIMEOUT SECTION 
      JMP IOUP      REQUEST NOT BEING PROCESSED 
      JMP CP1       RETURN VIA C.50: REQUEST COMPLETED. 
      ISZ C.50      RETURN VIA C.50+1: REQUEST CONTINUATION.
      STB SAVB
TSMAP JSB MAPIT     DO POSSIBLE MAP RESTORE 
      LDB SAVB
      JMP C.50,I    RETURN
* 
      SKP 
* 
*  SUBROUTINE TO RESTORE ORIGINAL MAP STATUS
* 
MAPIT NOP 
MAP3  JMP MAPIT,I  RETURN IMMEDIATELY (NOP: PROCESS MAPS) 
      LDB TOSTS 
      BLF,SLB 
      JMP MAPIT,I   JUMP IF DVR50 DIDN'T SWITCH USER MAP
      CLF 0 
      SJP *+2       ENABLE SYSTEM MAP 
      LDB BUF3B 
      USB           RESTORE ORIGINAL USER MAP 
      STF 0 
      JMP MAPIT,I 
* 
* 
CEXIT ISZ C.50      P+2 RETURN
      STF 0 
      JMP C.50,I
* 
VIOLA JSB SVIOL     RECORD SECURITY VIOLATION 
      JSB OFBRD     TURN OFF BOARDS 
      CLA,INA            EXIT IN PROPER DIRECTION.
      LDB FLG       GET DIRECTION FLAG
      SZB           REQUEST BEING PROCESSED 
      JMP C.50,I    YES. RETURN WITH A=1 AND B=1
      JMP $IOUP+1   EXIT VIA $UPIO [$IOUP+1=$UPIO: RTE-C].
* 
CP1   STB SAVB      SAVE REG-B TEMPORARILY
      CLB           NO REQUEST BEING SERVICED SO
      STB FLG       CLEAR THE FLAG WORD.
      JMP TSMAP 
* 
IOUP  JSB MAPIT     RESTORE MAP IF SWITCHED 
      JMP $IOUP     'UP' THE DEVICE & AWAIT NEXT REQUEST. 
* 
* 
SAVB  NOP           B-REGISTER TEMPORARY STORAGE. 
TOSTS NOP           DMS STATUS TEMPORARY STORAGE. 
* 
      SKP 
* 
*  DISABLE I/O BOARDS 
* 
CLC$  NOP 
CLC1  NOP           DISABLE RECEIVE INTERRUPTS. 
CLC2  NOP           DISABLE TRANSMIT INTERRUPTS.
      JMP CLC$,I
* 
*  DISABLE MODEM
* 
OFBRD NOP 
      LDA OFCOD      GET CONTROL WORD TO OFF BOARDS 
OTA1  NOP            OUTPUT ON RECEIVE BOARD
OTA2  NOP            OUTPUT ON TRANSMIT BOARD 
      LDA CLMSK      GET MASK=OCT177400 
      AND EQT5,I     CLEAR STANDARD STATUS
      STA EQT5,I     SET UP NEW STATUS
      CLB 
      STB ABTFG      CLEAR ABORT FLAG 
      STB SPTR       CLEAR SECURITY CODE POINTER
      STB EQT15,I    PREVENT TIME-OUT ENTRY 
      JMP OFBRD,I    RETURN 
* 
*  CHECK IF SECURITY CODE IS INTACT AND CALLING 
*  PROGRAM IS NOT DORMANT. IF SO, RETURN (P+1)
*  AND IF NO VIOLATION THEN (P+2).
* 
EXIST NOP 
      LDA SPTR,I     GET SEC CODE FROM LIBRARY DVR
      CPA SECD       SECURITY VIOLATED ?
      JMP *+2        NO 
      JMP EXIST,I    YES, RETURN (P+1). 
      LDA STPNT,I    GET STATUS WORD OF PROGRAM 
      AND P15        MASK IN STATUS 
      SZA            BUMP RETURN IF 
      ISZ EXIST        PROGRAM NOT DORMANT. 
      JMP EXIST,I    RETURN 
* 
* 
      SKP 
*        **  PRIVILEDGED ROUTINE ** 
* 
*  AN I/O INTERRUPT CAUSES ENTRY HERE. BEFORE ENTRY 
*  INTO #P.50 , THIS ROUTINE CHECKS THE SECURITY
*  CODE. IF VIOLATED (LIB DVR ABSENT) THEN A 10 MSEC
*  INTERRUPT TO C.50 IS SET, WHICH WILL CAUSE A PROPER
*  EXIT FROM THE DRIVER, AFTER RESETTING ITSELF (DEVICE WILL BE SET 'DOWN').
* 
P.50  NOP           PRIVILEGED INTERRUPT ENTRY/EXIT 
      CLF 0         TURN OF ALL INTERRUPTS IMMEDIATELY! 
MAP6  JMP CLDMA     BYPASS DMS STATUS (NOP: SAVE IT)
      SSM SAVST     SAVE DMS STATUS 
CLDMA CLC 6         TURN OFF
      CLC 7          DMA INTERRUPTS 
      STA ASV       S 
      STB BSV        A
      ERA,ALS         V 
      SOC              E
      INA 
      STA EOSV        REGISTERS 
      LDA MPTFL     SAVE MEMORY 
      STA MPFSV      PROTECT FLAG 
      CLA,INA       TURN OFF
      STA MPTFL      MEMORY PROTECT FLAG
* 
      LDA SYNCM     GET THE SYNC-HUNT COMMAND (OR 0). 
      SZA,RSS       IF SYNC ALREADY OBTAINED, 
      JMP MAP4       NO NEED TO SUPPLY A NEW REFERENCE; 
      LIB 4           ELSE, GET THE LAST INTERRUPT S.C. 
      CPB SCODE        IF LAST INTERRUPT WAS FROM RECV.,
OTSYN OTA 0              THEN SEND IT A NEW SYNC-REFERENCE. 
* 
*  SWITCH USER MAPS--IF NECESSARY.
* 
MAP4  JMP INTON     BYPASS MAP SWITCH (NOP: SWITCH) 
      LDA BUF2A 
      USA           SAVE CURRENT USER MAP 
* 
      LDA BUF1B 
      USA           LOAD RJE/#BSC MAP 
* 
      UJP INTON     ENABLE USER MAP.
INTON STF 0         ENABLE INTERRUPTS.
      JSB EXIST     CHECK SECURITY CODE.
      CCA,RSS       VIOLATION OCCURRED
      JMP PENTR     ENTER #P.50 
* 
* SECURITY VIOLATION
* 
      JSB CLC$      CLC XX,C  ON I/O BOARDS 
      STA ABTFG     SET ABORT FLAG FOR C.50 
      STA EQT15,I   SET 10 MSEC ENTRY AT C.50 
      CLA           CLEAR SYNC-HUNT COMMAND.
      JMP PEXIT 
      SKP 
* 
PENTR JSB #P.50,I   GO TO #BSC INTERRUPT SECTION
* 
PEXIT CLF 0 
      STA SYNCM     SAVE SYNC-REFERENCE CMD. OR ZERO. 
MAP5  JMP MPT?      BYPASS MAP SWITCH (NOP: SWITCH) 
      SJP *+2       NOW UNDER SYSTEM MAP
      LDA BUF2B 
      USA           RESTORE USER MAP
* 
MPT?  LDA MPFSV 
      SZA           WAS MEMORY PROTECT ON ? 
      JMP E&O       NO, FORGET DMA'S
      LDB INTBA     TURN
      LDA B,I        DMA'S
      SSA             BACK
      STC 6            ON 
      INB               IF
      LDA B,I            THEY 
      SSA                 WERE
      STC 7                ON.
* 
E&O   LDA EOSV      RESTORE 
      CLO            E
      SLA,ELA         O 
      STO            AND
      LDB BSV        B REGISTERS
      LDA MPFSV     RESTORE MEMORY
      STA MPTFL      PROTECT FLAG IN THE SYSTEM 
MAP7  JMP NODMS    FOR DMS, A NOP IS PLACED HERE DURING INIT
      SZA           MEMORY PROTECT ON ? 
      JMP NOSTC     NO
      LDA ASV       YES, RESTORE A
      STF 0         TURN ON INTERRUPTS
      STC 5         SET MEMORY PROTECT
      JRS SAVST P.50,I
* 
NOSTC LDA ASV       RESTORE A 
      STF 0         TURN ON INTERRUPTS
      JRS SAVST P.50,I
* 
NODMS SZA 
      JMP NOST1 
      LDA ASV 
      STF 0 
      STC 5 
      JMP P.50,I
* 
NOST1 LDA ASV 
      STF 0 
      JMP P.50,I
* 
* 
* 
      SKP 
*           *** DATA / CONSTANTS ***
* 
A     EQU 0 
B     EQU 1 
EQT1  EQU 1660B 
EQT4  EQU 1663B 
EQT5  EQU 1664B 
EQT6  EQU 1665B 
EQT7  EQU 1666B 
EQT12 EQU 1771B 
EQT15 EQU 1774B 
MPTFL EQU 1770B 
INTBA EQU 1654B 
EOSV  NOP 
ASV   NOP 
BSV   NOP 
SCODE NOP 
SYNCM NOP           SYNC-HUNT REFERENCE--OR ZERO. 
STPNT NOP 
ABTFG NOP 
SAVST NOP 
MPFSV NOP 
EQP15 NOP 
#I.50 NOP 
#C.50 NOP 
#P.50 NOP 
SPTR  NOP 
FLG   NOP 
CLC   CLC 0,C 
OTA   OTA 0 
P2    DEC 2 
P4    DEC 4 
P15   DEC 15
OFCOD OCT 140000
SECD  OCT 150003
MTBIT OCT 173777
M3    OCT 3 
M3777 OCT 3777
M3703 OCT 3703
M3403 OCT 3403
M3303 OCT 3303
M3003 OCT 3003
CLMSK OCT 177400     MASK OFF LOW 8 BITS
BUF1A DEF BUF1,I
BUF1B DEF BUF1
BUF2A DEF BUF2,I
BUF2B DEF BUF2
BUF3A DEF BUF3,I
BUF3B DEF BUF3
* 
BUF1  BSS 32        MAP FOR RJE/#BSC
BUF2  BSS 32        MAP FOR INTERRUPTED USER AREA 
BUF3  BSS 32        USER-AREA MAP (SAVED ON TIMEOUT ENTRY)
* 
      BSS 0         **** SIZE OF DVR50 **** 
      END 
                                                                                                                                                                                                                                                    