ASMB,R,C,L
      HED HP6940A/B RTE MPG DVA72 - LOCAL/REMOTE REV 1826 
      NAM DVA72,0  09611-16005  780403 REV 1826 
      ENT IA72,CA72 
      EXT $LIST,.MVW
* 
******************PROGRAM DESCRIPTION***********************
* 
*     RELOC. TAPE: 09611-16005 REV 1826 
*     SOURCE TAPE: 09611-18005 REV 1826 
* 
************************************************************
* 
A     EQU 0 
B     EQU 1 
SC    EQU 0 
* 
********* 
*CAUTION* 
********* 
* 
*  IF INSTRUCTION SPEEDS CHANGE IN FUTURE GENERATIONS 
*  OF 2100 SERIES COMPUTERS, THE TIMING LOOPS OF THIS 
*  DRIVER SHOULD BE VERIFIED FOR PROPER OPERATION.
* 
*     THERE ARE TIMING LOOPS IN THE FOLLOWING ROUTINES: 
*     CPOLL,OUTWT,DELAY,TIME
* 
*  SYSTEM COMMUNICATION AREA
* 
EQT1  EQU 1660B   SHOWS I/O IN PROGRESS FOR CONTIN. 
EQT2  EQU 1661B   DRIVER INITIATOR ADDRESS
EQT3  EQU 1662B   DRIVER CONTINUATOR ADDRESS
EQT4  EQU 1663B   SPECIAL BITS
EQT5  EQU 1664B   STATUS BITS 
EQT6  EQU 1665B   REQUEST CODE, READ COUNT
EQT7  EQU 1666B   BUFFER ADDRESS
EQT8  EQU 1667B   BUFFER LENGTH 
EQT9  EQU 1670B   FUNCTION TYPE CODE (PARAM.1) &
*                                 WRITE BEFORE READ COUNT 
EQT10 EQU 1671B   RUNNING COUNTER 
EQT11 EQU 1672B   SLOT# OF 1ST SENSE MODE INTERRUPTER 
EQT12 EQU 1771B   DATA FROM THE INTERRUPTER 
EQT13 EQU 1772B   SCHEDULE FLAG 
EQT14 EQU 1773B   TIME OUT VALUE
EQT15 EQU 1774B   TIMEOUT CLOCK 
INTBA EQU 1654B   INTERRUPT TABLE BASE ADDRESS
      SKP 
* 
IA72  NOP          ENTRY POINT
      JSB SETIO    "A" REG. CONTAINS CHANNEL # OF 
*                          DESIRED DEVICE ON ENTRY. SETIO USES
*                          IT TO CONFIGURE DVA72'S I/O COMMANDS 
* 
      LDA EQT5,I    GET STATUS BITS 
      AND MASKS     RESET BITS 2,5,&7 
      STA EQT5,I    RESTORE STATUS
      LDA RTNAD   PUT (RETURN ADDRESS)
      STA CA72    INTO CONT. ENTRY
      LDA EQT13,I GET SCHEDULE FLAG 
      SZA         FLAG DEFINED YET? 
      JMP CONT    YES, SKIP DEFINITION SECTION
* 
*  THIS SECTION PLACES EITHER THE POSITIVE ADDRESS OF AN 'ALARM'
*  PROGRAM OR A MINUS 1 IF THERE IS NO SUCH PROGRAM INTO EQT13,I. 
*  IT ALSO SETS BIT 12 OF EQT4,I TO INDICATE THE DRIVER WILL
*  HANDLE TIMEOUTS ITSELF.
* 
      LDA CHAN    A_I/O CHANNEL, SET UP INDEX 
      ADA N6      INTO THE INTERRUPT TABLE
      ADA INTBA   TO GET THE SCHEDULE WORD
      LDB A,I     B _ WORD (ITS ADDR. IN A) 
      CMB,SSB,INB IF WORD POSITIVE SEZ EQT
      CCB         THEN SET -1(NO PROG) ELSE 
      STB TEMP    +ADDR OF PROG INTO EQT13,I
      LDB EQT1    SET THE EQT ADDRESS INTO
      STB A,I     THE INTERRUPT TABLE 
      LDA EQT4,I  SET THE 'I WILL HANDLE TIMEOUT' 
      IOR BIT12   BIT IN EQT4,I 
      STA EQT4,I  RESTORE 
* 
*   SETUP DATA BUFFER 
* 
      LDA COUNT   BUFFER POINTER
      CPA .8        BUFFER FULL?? 
      JMP ERBUF   NO MORE ROOM IN BUFFER
      LDA ADRS    GET ADDR OF FIRST WORD OF BUFFER
      STA EQT13,I 
      ADA .11 
      STA ADRS    INCREMENT TABLE ADDR BY 11
      ISZ COUNT   INCREMENT BUFFER POINTER
      LDB EQT13,I GET NEW ADDR OF EQT13 
      LDA TEMP    STORE 
      STA B,I      ID SEGMENT ADDR
* 
CONT  LDA EQT6,I   GET CONTROL WORD OF REQUEST
      AND .3       ISOLATE BITS 1 & 0, REQ.OPERATION
      CPA .3      IS IT A FUNCTION REQ.?
      JMP FUNCT   YES, THEN PROCESS FURTHER 
      SKP 
* 
*  REQUEST WAS READ OR WRITE. IS IT LEGAL?
* 
      LDA EQT6,I   NO, GET REQ. CONTROL WORD AGAIN
      AND M700     ISOLATE K,V,& M BITS, MUST MATCH 
      CPA KVM      NO KEYBOARD,BINARY,FIXED LENGTH. 
      RSS          IT DOES, SKIP
      JMP RCER
      LDA EQT8,I   GET BUFFER LENGTH
      CMA,SSA,INA,SZA   BUFFER>0
      CLA,RSS             O.K. ZERO COUNTER 
      JMP RCER     BUFFER<OR=0,GO TO ERROR
      STA EQT10,I  WILL ALWAYS BE POSITIVE
      LDA EQT9,I   LOOK AT EXTRA PARAMETER TO 
      SZA          DECIDE FUNCTION, 0=NORMAL R/W
      JMP CONTL    YES, A CONTROL REQUEST 
* 
*  WE SHOULD NOW HAVE A LEGAL READ OR WRITE REQUEST 
* 
      LDB EQT6,I
      SLB          IS BIT 0 = 0 
      JMP READ     NO, THEN = 1, I.E. READ OPERATION
      CLA          FOR NORMAL WRITE,CLEAR 
      STA EQT9,I   WRITE BEFORE READ COUNT
      INA,RSS      SKIP NEXT INSTRUCTION
READ  JSB CHEK     IF READ GO TO CHECK ROUTINE
      STA EQT6,I   SET FLAG TO SAY WRITE
      JSB CLEAR 
      JMP INITX   GO OPERATE CONTINUATOR
RTNAD DEF *+1       ADDRESS FOR INITIATOR RETURNS 
      JMP ICOMP     COMPLETION RETURN FOR INITATOR
RTN   CLA          CLEAR A, OPERATION INITIATED 
      JMP IA72,I   RETURN TO EXEC 
* 
*     DATA BUFFER FULL
* 
ERBUF LDA .2
      JMP IA72,I
* 
.3    OCT 3 
.8    OCT 10
.11   DEC 11
KVM   OCT 100 
M700  OCT 700 
N6    OCT -6
MASKS OCT 177533
      SKP 
* 
*     DATA BUFFER IS USED DURING REMOTE OPERATION FOR STORING 
*     THE 2ND I/O WORD (DATA WORD), THE DRIVER RETURN 
*     ADDRESSES'S, AND DRIVER VARIABLES WHICH ARE REQUIRED
*     UPON RETURNING FROM AN I/O INTERRUPT. 
*     THE BUFFER SIZE OF 88 WORDS IS SET UP FOR A MAXIMUM OF
*     8 REMOTES. EACH REMOTE REQUIRES 11 WORDS IN THE ORDER 
*     SHOWN BELOW.
* 
COUNT NOP 
ADRS  DEF *+1 
      BSS 88
* 
*     EQT13 (ADDR)
*     RETURN ADDR IMMEDIATE 
*     RETURN ADDR FINAL 
*     BOX 
*     SELBX 
*     CURBX 
*     EXDAT 
*     SAVAX 
*     TEMP
*     T.O.
*     SWTCH 
      SKP 
*  DETERMINE TYPE OF FUNCTION TO PERFORM
* 
CONTL CPA .1       IS IT 1 ?
      JMP OUTHS    YES, GO TO OUTPUT & HANDSHAKE
      CPA .2       NO, IS IT 2 ?
      JMP RDDIR    YES, GO READ DIRECT(NO GATE) 
      CPA .3       NO, IS IT 3 ?
      JMP RDOP     YES, GO READ OPERATOR DATA 
      CPA .4       NO, IS IT 4 ?
      JMP POLL1    YES, GO POLL TO 1ST HIT
      CPA .5       NO, IS IT 5 ?
      JMP POLLA    YES, GO POLL ALL 
      CPA .6       NO, IS IT 6 ?
      JMP RDGAT    YES, GO READ DIRECT(WITH GATE) 
      CPA .7      NO, IS IT 7 ? 
      JMP EPOL1   YES, EVENT SENSE POLL TO 1ST HIT
      CPA .8      NO, IS IT 8 ? 
      JMP EPOLA   YES, EVENT SENSE POLL ALL 
      JMP RCER
* 
.6    OCT 6 
.7    OCT 7 
* 
*  DETERMINE WHICH FUNCTION 
* 
FUNCT LDA EQT6,I  GET SAVED CONWORD 
      AND M3700   ISOLATE FUNCTION CODE 
      CPA M2000   IS IT 20? 
      JMP SETSB   YES, SET SENSE BIT (SB) 
      CPA M2100   IS IT 21? 
      JMP CLRSB   YES, CLEAR SB 
      CPA M2500   IS IT 25? 
      JMP CLRAP   YES, CLEAR ALARM-PENDING BIT (APB)
      SZA           CLEAR REQUEST?? (RTE-II,REV D)
      JMP RCER      NO, REJECT IT 
      JMP TRNOF     YES,PROCESS 
* 
*  FUNCTION CODE WAS UNDEFINED
* 
RCER  CLA,INA     GIVE 'READ/WRITE ILLEGAL' ERROR 
      JMP IA72,I  EXIT INITIATOR
* 
M3700 OCT 3700
M2000 OCT 2000
M2100 OCT 2100
M2500 OCT 2500
      SKP 
* 
*  SET SENSE MODE 
* 
SETSB LDA EQT13,I GET EQT13 ADDR
      LDA A,I     CHECK SCHEDULE FLAG 
      SSA         IF NO PROGRAM ATTACHED
      JMP RCER    REJECT CALL 
      LDA .1      SET SB (BIT 0)
      IOR EQT5,I  COMBINE WITH EQT5,I 
RESTO STA EQT5,I  UPDATE EQT5,I 
TRNOF JSB ENABL   ENABLE EVENT SENSING IF SB ON 
ICOMP LDA .4       IMMEDIATE COMPLETION CODE
      LDB EQT10,I  GET LOG
      JMP IA72,I   EXIT 
* 
*  RESET SENSE MODE 
* 
CLRSB LDA B43     RESET SB (BIT 0) & APB (BIT 1)
      JMP CLRAP+1 
* 
*  RESET ALARM PENDING
* 
CLRAP LDA B42     RESET APB (BIT 1) 
      CMA 
      AND EQT5,I  RESET DESIRED BIT 
      JMP RESTO   IN EQT5,I 
* 
.1    OCT 1 
.2    OCT 2 
.4    OCT 4 
.5    OCT 5 
B42   OCT 42
B43   OCT 43
      SKP 
* 
*   ROUTINE TO CHECK IF BUFFER IS WELL-FORMED 
* 
CHEK  NOP          ENTRY POINT
      LDA EQT7,I   GET FIRST BUFFER WORD
      LDA A,I      INTO A, THE OUTPUT WORD COUNT
      LDB A        SAVE IN B
      SSA          REJECT NEGATIVE COUNT
      JMP RCER
      ADA EQT7,I   A POINTS AT LAST OUTPUT WORD 
      INA          NOW POINT AT INPUT WORD COUNT
      LDA A,I      GET INPUT WORD COUNT 
      SZA,RSS      REJECT ZERO INPUT WORD COUNT 
      JMP RCER
      SSA          REJECT NEGATIVE COUNT
      JMP RCER
      ADA B        ADD TO OUTPUT WORD COUNT 
      ADA .2       ADD 2
      CPA EQT8,I   SHOULD EQUAL BUFFER LENGTH 
      SZB,RSS      REJECT ZERO OUTPUT WORD COUNT
      JMP RCER     NOT EQUAL, REJECT
      CMB,INB      MAKE OUTPUT WORD COUNT NEG.
      STB EQT9,I     SAVE IT. 
      ISZ EQT7,I   PUT POINTER AT 1ST WORD TO 
*                                  ACTUALLY BE SENT OUT.
      JMP CHEK,I   RETURN 
      SKP 
* 
*  DIRECT READ SUBROUTINE 
* 
RDDIR LDA RSSIN    YES, GET TF INSTRUCTION
      RSS          NO, SKIP 
RDGAT CLA          GET GATE INSTRUCTION INTO A
      STA SWTCH    STORE INSTRUCTION AT LOOP2 
      JSB CHEK     GO TO CHECK ROUTINE
      JSB CLEAR 
LOOP1 JSB GET      LOAD A FROM BUFFER 
      JSB OUT      PUT A ON OUT-LINES 
      ISZ EQT7,I    INCREMENT BUFFER ADDRESS
      ISZ EQT10,I    AND COUNT
      ISZ EQT9,I   INDEX & CHECK WRITE COUNT
      RSS          SKIP IF NOT YET DONE 
      JMP LAST     DON'T GATE LAST OUTPUT YET 
      JSB GATE     GATE WHAT'S ON OUT-LINES 
      JMP LOOP1    LOOP 
LAST  JSB GET      GET INPUT WORD COUNT IN A
      CMA,INA      MAKE NEGATIVE
      STA EQT6,I   STORE IT AS RUNNING COUNT. 
      ISZ EQT7,I BUMP THE BUFFER ADDRESS
      CCB           WAIT 8 MORE USEC FOR THE
      JSB TIME       READ WITHOUT GATE
LOOP2 CLA           CHECK FOR 
      CPA SWTCH      PROGRAMMED SWITCH
      JMP *+3       NO, GATE THE DATA 
      JSB OUTTF     YES, NO GATE
RSSIN RSS 
      JSB GATE
* 
      JSB IN       GET DATA FROM IN-LINES 
      JSB PUT      PUT IT IN USER'S BUFFER
      ISZ EQT6,I   STEP COUNTER 
      JMP LOOP2    IF NOT DONE, LOOP
      JMP TRNOF    DONE, TURN MULTI OFF & EXIT
* 
*   OUTPUT WITH HANDSHAKE FLAG
* 
OUTHS JSB CLEAR 
      JSB OUTP     OUTPUT NEXT WORD 
      LDB EQT10,I   GET RUNNING COUNT 
      CPB EQT8,I   COUNT = BUFFER LENGTH? 
      JMP TRNOF    DONE, TURN FLAG OFF & EXIT 
      JMP OUTHS+1  NO, LOOP 
      SKP 
* 
*   READ OPERATOR DATA (LOCAL ONLY) 
* 
RDOP  LDB REMOT     REMOTE? 
      SLB 
      JMP RCER      YES, REJECT REQUEST 
      JSB CLEAR 
      JSB OUTP     GET OUTPUT WORD AND GATE IT
      CCA          A=-1 
      STA EQT6,I     SET READ COUNT TO -1 
SC1   CLF SC       CLEAR SC FLAG
      JMP RTN      EXIT VIA RTN 
      SKP 
* 
*   POLL ALL
* 
POLLA LDA RSSIN   GET SKIP INSTRUCTION
      STA SWTCH   PUT INTO ROUTINE
      JSB COMON    CHECK FOR WELL-FORMED BUFFER 
      CMA,INA 
      ADA .2
      STA SAVAX    SAVE NEG. ADDR. OF END OF BUFR 
      STB TEMP     SAVE ADDR. OF FIRST P.S. WORD
      CLA          ZERO COUNT 
      LDB TEMP,I   GET FIRST P.S. WORD
      CPB STOPR    CHECK FOR P.S. WORD
      JMP RCER     POINTING AT STOPPER
LOOP  CPB STOPR    IS IT STOPPER? 
      JMP L1       YES.CHECK FOR CORRECT BUFR SIZE
      ISZ TEMP     INCREMENT TO NEXT WORD 
      INA          INCREMENT COUNT
      LDB TEMP     CHECK TO 
      ADB SAVAX     INSURE THAT 
      SSB,RSS        STOPPER HASN'T BEEN
      JMP RCER        PASSED UP.
      LDB TEMP,I   GET THE WORD 
      JMP LOOP      AND GO AGAIN
L1    ADA TEMP     IS BUFFER
      ADA SAVAX     BIG 
      SZA,RSS        ENOUGH?
      JMP L2       YES
      SSA,RSS      BUFR SIZE LARGER THAN REQ. BUT OK
      JMP RCER     BUFR SIZE TOO SMALL
L2    LDA TEMP     GET ADDR OF STOPPER
      INA           AND BUMP FOR READ IN AREA 
      STA SAVAX    STORE IN SAVAX 
      JSB CLEAR 
ALOOP LDA EQT7,I   GET P.S. WORD
      LDA A,I      INTO A 
      CPA STOPR    IS IT STOPR? 
      JMP TRNOF    DONE, TURN MULTI OFF & EXIT
      JSB CPOLL    READ DATA IN 
      CLA 
      CPA SWTCH     PROGRAMMED SWITCH 
      JMP EPA     IF NOPED, THEN EVENT SENSE
PUTAW STB SAVAX,I  CPOLL RETURNS DATA IN B, 
      ISZ SAVAX    DO NEXT ONE
      JMP ALOOP 
* 
*   EVENT SENSE POLL ALL
* 
EPOLA CLA         MAKE NOP
      JMP POLLA+1 BEGIN ROUTINE 
* 
EPA   SSB         WAS IRQ ON? 
      JSB REARM   YES,REARM EVENT SENSE CARD
      JMP PUTAW   AND CONTINUE
 SKP
*   COMMON ROUTINES TO BOTH TYPES OF POLL 
* 
COMON NOP          ENTRY POINT
      CCA         FORCE USE OF USERS CONTROL
      STA BOX     WORD AT LEAST ONCE
      JSB GET      GET THE CONTROL WORD 
      ISZ EQT7,I    BUMP BUFFER ADDRESS AND 
      ISZ EQT10,I    COUNT
      AND UNIT0    MAKE BOX NUMBER=0
      STA SELBX    SAVE IT
      LDA  EQT7,I   GET BUFFER ADDRESS
      ADA EQT8,I   (A)=ADDR.OF END OF BUFFER+2
      LDB  EQT7,I  GET P.S. INDEX 
      LDB B,I      NEXT 
      SSB,RSS      REJECT IF
      SZB,RSS      LESS THAN OR = ZERO
      JMP RCER
      ADB  EQT7,I   (B)=ADDR. FIRST P.S. WORD 
      STB  EQT7,I   STORE IN  EQT7,I
      JMP COMON,I  RETURN 
* 
M1    OCT -1
STOPR EQU M1       177777B
UNIT0 OCT 177760
* 
CPOLL NOP          ENTRY POINT
      STA TEMP
      LDA CPOLL 
      STA FINAL    SAVE FINAL ADDR
      LDA TEMP
      AND B17      ISOLATE BOX #
      CPA BOX      SAME BOX # AS BEFORE?
      JMP SLSLT    YES, OUTPUT NEW SLOT# ONLY 
      STA BOX      NO SAVE NEW BOX # IN BOX 
      XOR SELBX    SET TO CONTROL WORD
       STA CURBX     SAVE CURRENT BOX FOR REARM 
      JSB OUTWT     OUTPUT NEW BOX#,GATE,AND WAIT 
SLSLT JSB GET      LOAD P.S. WORD AGAIN 
      AND MHIGH    CLEAR LOW ORDER BITS 
      JSB OUT      SAVE OUTPUT WORD 
      JSB OUTTF    OUTPUT 
      ISZ EQT7,I    BUMP BUFFER ADDRESS 
      ISZ EQT10,I    AND COUNT
      SKP 
* 
*   WAIT A VARYING AMOUNT OF TIME BETWEEN ADDRESSING & DATA READ
*   BACK TO ACCOMMODATE POSSIBLE LONG CABLES. A FULL CHAIN IS 
*   BROKEN INTO 4 GROUPS: 
* 
*     BOXES          WAIT TIME
*     0,1,2,3,4       16 USEC 
*     5,6,7,8         24 USEC 
*     9,10,11,12      32 USEC 
*     13,14,15        40 USEC 
* 
*     TIMING LOOP 
* 
      LDA BOX 
      ADA M4
      NOP 
      SSA,RSS 
      JMP *-3 
      JSB IN       READ SLOT DATA 
      JMP FINAL,I  RETURN 
* 
* THIS SUBROUTINE OUTPUTS A WORD TO SC,WAITS
* 15 USEC, AND SETS GATE (GATE WAITS UP TO 500 USEC FOR FLAG- 
* LOCAL ONLY) 
* 
*     TIMING LOOP 
* 
OUTWT NOP 
      JSB OUT    PUT THE DATA ON THE OUTPUT LINES 
      LDA OUTWT 
      STA GATE
      JMP GATE+1
* 
MHIGH OCT 170000
* 
B17   OCT 17
M4    OCT -4
      SKP 
* 
*  REARM OUTPUTS THE LATEST EXTERNAL WORD TO AN EVENT 
*  SENSE CARD AS THE NEW REFERENCE WORD.
*  CONTROL WORDS ARE SENT TO TURN ISL OFF & ON. 
* 
REARM NOP         ENTRY 
      STB TEMP    SAVE DATA IN TEMP 
      LDA REARM 
      STA FINAL   SAVE FINAL ADDR 
      LDB TEMP
      LDA B       CPOLL LEAVES DATA IN B
      AND M7777   KILL ISL BIT
      STA EXDAT   SAVE REFERENCE WORD ONLY
      LDA CURBX   GET GOOD CONWORD
      AND M7OFF   CLEAR BIT 7(ISL)
      JSB OUTWT   OUTPUT,WAIT,& GATE
      LDA EQT7,I  GET BUFFER POINTER
      ADA M1      STEP IT BACKWARDS 1 WORD
      LDA A,I     GET THE LAST PST WORD 
      AND MHIGH   ISOLATE THE SLOT #
      STA B         SAVE THE SLOT#
      IOR EXDAT   MERGE IN THE EXTERNAL DATA
      STB EXDAT     SAVE THE SLOT FOR LATER 
      JSB OUTWT   SEND THE NEW REFERENCE WORD 
      LDA CURBX   GET LAST CONWORD
      JSB OUTWT   RESEND, TURNING ISL ON
      LDA EXDAT   GET THE SLOT# TO GATE CARD
      JSB OUTWT   WITH ISL ON, REACTIVATING IT
      LDB TEMP    GET DATA
      JMP FINAL,I EXIT (DATA STILL IN B)
* 
M7OFF OCT 177577  CLEARS BIT 7
* 
*   OUTPUT A WORD EXPECTING HANDSHAKE FLAG
* 
OUTP  NOP          ENTRY POINT
      JSB GET      GET NEXT OUTPUT WORD 
      JSB OUT      OUTPUT (A) 
      ISZ EQT7,I   BUMP ADDRESS AND 
      ISZ EQT10,I  COUNT AND WAIT 
      LDA OUTP      GATE
      STA GATE       THE
      JMP GATE+1      WORD
      SKP 
* 
*   SET CONTROL, CLEAR FLAG 
* 
GATE  NOP 
      LDB REMOT    GET REMOTE/LOCAL FLAG
      SLB,RSS      REMOTE?
      JMP SC2      NO 
      LDA GATE
      STA IMMD     SAVE IMMEDIATE ADDR
      LDA .2        SET UP
      STA FIRST      THE FIRST WORD 
      JMP .I/O. 
* 
M82   DEC -82 
SC2   STC SC,C     SET CONTROL CLEAR FLAG 
      LDB M82       500 MICROSECOND COUNTER 
      JSB DELAY 
      JMP GATE,I
* 
STCSC NOP 
      LDB REMOT    GET REMOTE/LOCAL FLAG
      SLB,RSS      REMOTE?
      JMP SC3      NO 
      LDA STCSC     SET UP
      STA GATE       CORRECT RETURN 
      JMP GATE+1      GATE IT 
SC3   STC SC,C     SET CONTROL, CLEAR FLAG
      JMP STCSC,I  RETURN 
      SKP 
*   POLL TO FIRST INTERRUPT 
* 
POLL1 LDA RSSIN   GET SKIP
      STA SWTCH   PLACE IN ROUTINE
      JSB COMON    CHECK FOR WELL-FORMED BUFFER 
      ADA M4       (A)=ADDR. STOPR
      LDB A,I      GET THE WORD 
      CPB STOPR    IS IT STOPPER? 
      INA,RSS     YES, MAKE READ IN AREA ADDR, SKIP 
      JMP RCER     NO, REJECT 
      STA SAVAX    SAVE READIN AREA ADDRESS 
      CMA,INA      CHECK FOR
      ADA EQT7,I    P.S. WORD 
      INA            POINTING AT
      SSA,RSS         OR
      JMP RCER         AFTER STOPPER
      JSB CLEAR 
PLOOP LDA EQT7,I   GET P.S. WORD
      LDA A,I      INTO A.
      CPA STOPR    IS IT STOPPER? 
      JMP NOTFD    YES, NO INTERRUPT FOUND
      JSB CPOLL    NO, READ DATA FROM SLOT
      SSB,RSS      CPOLL RETURNS DATA IN B
      JMP PLOOP 
      CLA 
      CPA SWTCH     PROGRAMMED SWITCH 
      JMP EP1     IF NOPED, THEN EVENT SENSE
GETIN LDA EQT7,I   GET INDEXED BUFFER ADDR. 
      ADA M1       SUBTRACT 1 
      LDA A,I      GET THE PST ENTRY AGAIN. 
PUTAB STA SAVAX,I  STORE IN I.D. AREA 
      ISZ SAVAX    MAKE DATA AREA ADDRESS 
      STB SAVAX,I  STORE DATA 
      JMP TRNOF    DONE, TURN MULTI OFF & EXIT
NOTFD LDA STOPR    NONE INTERRUPT,STORE STOPPER 
      CLB          AND ZERO 
      JMP PUTAB   IN ID & DATA WORDS RESPECTIVELY 
* 
*   EVENT SENSE POLL TO FIRST INTERRUPT 
* 
EPOL1 CLA         MAKE NOP
      JMP POLL1+1 BEGIN ROUTINE 
* 
EP1    JSB REARM  REARM WITH NEW EXTERNAL WORD
      JMP GETIN   RESUME PLAIN POLL1
      SKP 
.I/O. LDA SECND   GET 2ND WORD (DATA) 
      CLB           CLEAR JMP INSTRUCTION 
      CPA IENWD     EVSNS CONTROL WORD??
      LDB RSSIN     PUT RSS INSTEAD OF NOP
      STB IORTN 
      CLB         CLEAR 1ST WORD
      SSA         CHECK BIT 15 OF 2ND WORD FOR DATA 
      INB         YES, MOVE TO BIT 0 OF 1ST WORD
      IOR BIT15 
      STA SECND   SAVE AS 2ND WORD
      LDA FIRST 
      IOR B 
* 
*     SEND FIRST WORD 
* 
      JSB CLEAN   INITIALIZE CARD 
SC4   CLC SC      PUT CARD IN XMIT MODE, DISABLE INT. 
      LDB M4      20 USEC COUNTER 
      JSB DELAY      WAIT FOR FLAG
SC5   OTA SC      OUTPUT WORD 1 
      LDB M15       80 USECOND COUNTERP 
      JSB DELAY      WAIT FOR FLAG
* 
*     SEND SECOND WORD
* 
SC6  STC SC,C    PUT CARD IN RECEIVE MODE, ENABLE INT.
      JSB PERR       CHECK FOR TRANSMISSION ERRORS
      LDA SECND       GET SECOND WORD 
SC7   OTA SC           OUTPUT IT
      JSB DATAS     SAVE BUFFER WORDS 
IORTN NOP           NOP OR RSS
      JMP CONTE     CONTINUE
      LDA EQT1,I    EVENT SENSE ONLY
      SZA           I/O IN PROGRSS??
      JMP COMPE     YES, COMPLETE EVSNS CONTROL REQUEST 
NOTO  JSB .EQ15 
      JMP CONTE     NO,CONTINUE OPERATION 
* 
*     DELAY WAITS FOR THE FLAG
*      APPROXIMATELY 8 MICROSECONDS PER LOOP
*       (B)= - # OF LOOPS 
* 
DELAY NOP 
SC8   SFC SC
      JMP DELAY,I   GOT FLAG
      NOP 
      ISZ B         BUMP COUNT
      JMP *-4        TRY AGAIN
      JMP ER4       TIMEOUT 
* 
FIRST NOP           FIRST WORD
SECND NOP         DATA WORD 
BIT15 OCT 100000
M15   DEC -120
      SKP 
* 
SETIO NOP           (A) = SELECT CODE 
      STA CHAN
      IOR B1077     CLC SC,C = 1077XX 
      STA SC9 
      XOR BIT7      LIB SC,C = 1075XX 
      STA SC11
      STA SC15
      XOR B1000     LIB SC = 1065XX 
      STA SC10
      STA SC13
      XOR B4700     SFC SC = 1022XX 
      STA SC8 
      XOR B400      OTA SC = 1026XX 
      STA SC5 
      STA SC7 
      STA SC12
      XOR B1100     STC SC,C = 1037XX 
      STA SC6 
      STA SC2 
      STA SC3 
      XOR B600      CLF SC = 1031XX 
      STA SC1 
      XOR B5600     CLC SC = 1067XX 
      STA SC4 
      XOR B4200     LIA SC = 1025XX 
      STA SC14
* 
      LDA EQT4,I  GET SUBCHANNEL
      ASR 6       SHIFT TO LSB
      STA REMOT     SAVE REMOTE FLAG
      JMP SETIO,I   RETURN
* 
B1077 OCT 107700
B600  OCT 600 
B1000 OCT 1000
B4700 OCT 4700
B5600 OCT 5600
B4200 OCT 4200
B400  OCT 400 
B1100 OCT 1100
* 
CHAN  NOP 
REMOT NOP         REMOTE/LOCAL FLAG 
* 
CLEAN NOP           INITIALIZE CARD 
SC9   CLC SC,C
SC10  LIB SC
SC11  LIB SC,C
      JMP CLEAN,I 
      SKP 
* 
*     SAVE  8 BUFFER WORDS
* 
DATAS NOP 
      LDB EQT13,I GET BUFFER ADDR 
      INB 
      LDA TABLE 
      JSB .MVW
      DEF .10 
      NOP 
      JMP DATAS,I RETURN
* 
*     GET  8 BUFFER WORDS 
* 
DATAR NOP 
      LDA EQT13,I GET BUFFER ADDR 
      INA 
      LDB TABLE 
      JSB .MVW
      DEF .10 
      NOP 
      JMP DATAR,I RETURN
* 
*     TABLE FOR WORDS SAVED 
* 
TABLE DEF *+1 
IMMD  NOP 
FINAL NOP 
BOX   NOP 
SELBX NOP 
CURBX NOP 
EXDAT NOP 
SAVAX NOP 
TEMP  NOP 
T.O.  NOP 
SWTCH NOP 
* 
.10   DEC 10
      SKP 
* 
*     SOME SUBROUTINES
* 
CLEAR NOP 
      LDA CLEAR 
      STA FINAL   SAVE FINAL ADDRESS
      LDA REMOT   GET REMOTE/LOCAL FLAG 
      SLA,RSS     REMOTE? 
      JMP CLR     NO
      LDA .CLR
      STA IMMD    SAVE IMMEDIATE ADDR 
      LDA .4
      STA FIRST 
      CLA 
      JSB OUT      CLEAR DATA WORD
      JMP .I/O.    DO IT
CLR   JSB CLEAN     CLEAR DEVICE
      CLA 
      JSB OUT 
      JMP FINAL,I  RETURN 
* 
.CLR  DEF CLR 
* 
OUT   NOP          ENTRY POINT
      LDB REMOT    GET REMOTE/LOCAL FLAG
      SLB,RSS      REMOTE?
      JMP SC12     NO 
      STA SECND    SAVE DATA WORD 
      JMP OUT,I 
* 
SC12  OTA SC       OUTPUT DATA WORD 
      JMP OUT,I    RETURN 
* 
OUTTF NOP         ENTRY POINT 
      LDB REMOT   GET REMOTE/LOCAL FLAG 
      SLB,RSS     REMOTE? 
      JMP OUTTF,I NO, RETURN
      LDA OUTTF 
      STA IMMD    SAVE IMMEDIATE ADDR 
      LDA .4
      STA FIRST 
      JMP .I/O. 
* 
IN    NOP          ENTRY POINT
      LDB REMOT 
      SLB,RSS 
      JMP SC13
      LDB .IN 
      JMP IN,I
SC13  LIB SC       GET RECEIVED WORD
      JMP IN,I     RETURN 
* 
.IN   NOP 
* 
*     TIME WAITS FOR LINES TO SETTLE
*      APPROXIMATELY 8 USEC PER LOOP
*       (B)= - # OF LOOPS 
* 
TIME  NOP 
      NOP 
      NOP 
      ISZ 1 
      JMP TIME+1
      JMP TIME,I
      SKP 
* 
*     MORE SUBROUTINES
* 
GET   NOP 
      LDA EQT7,I  GET THE BUFFER ADDRESS
      LDA A,I     GET THE WORD
      JMP GET,I 
* 
PUT   NOP 
      LDA EQT7,I
      STB A,I     STORE THE WORD
      ISZ EQT7,I  INCREMENT THE ADDRESS 
      ISZ EQT10,I  INCREMENT THE COUNT
      JMP PUT,I 
* 
ENABL NOP 
      LDA ENABL 
      STA FINAL   SAVE FINAL ADDR 
      LDA .3      GET MASK FOR BITS 1 & 0 
      JSB EXAM5 
      RSS 
      JMP EN1       RETURN
      CPA .1      SB ON & APB OFF TO ENABLE 
      JMP ENMP      SC INTERRUPT ENABLE MODE
      LDA M1       ALARM PENDING SO 
      JSB .EQ15 
      JMP FINAL,I 
ENMP  LDA IENWD    GET CON WORD WITH IEN,ETC. 
      JSB OUT      PUT ON OUT LINES 
      JSB STCSC    SET CONTROL,CLEAR FLAG 
      JMP FINAL,I 
* 
EN1   JMP CLEAR+3 
      JMP FINAL,I 
* 
IENWD OCT 170660
M7777 OCT 7777
BIT5  OCT 40
BIT7  OCT 200 
BIT12 OCT 10000 
M4000 OCT 4000
* 
*  SUBROUTINE TO ALLOW EXAMINATION OF EQT5,I
* 
EXAM5 NOP 
      AND EQT5,I
      SZA,RSS 
      ISZ EXAM5   P+1 RETURN IF BIT ON
      JMP EXAM5,I P+2 RETURN IF BIT OFF 
* 
      SKP 
* 
*     CONTINUATOR 
* 
CA72  NOP         ENTER FROM MULTI INT. OR TIMEOUT
      JSB SETIO     SET I/O INSTRUCTIONS
      LDA CRTN      TRAP INITATOR RETURNS 
      STA IA72
      LDA M4000     LOOK AT BIT 11
      AND EQT4,I     SYSTEM TIMEOUT BIT 
      SZA           TIMEOUT?? 
      JMP TOON      YES, GO PROCESS 
      LDA REMOT   GET REMOTE/LOCAL FLAG 
      SLA         REMOTE? 
      JSB DATAR   GET 8 BUFFER WORDS
      LDB EQT1,I  GET I/O-IN-PROGRESS INDICATION
      SZB         WAS I/O IN PROGRESS?
      JMP CON     YES, THEN CONTINUE
* 
* NOT TIMEOUT NOR NORMAL CONTINUATION, MUST BE ABNORMAL CONTINUATION
* 
      LDA BIT5
      JSB EXAM5   ALARM IN PROCESS? 
      JMP CON     YES, POLL I/O IN PROCESS
      LDA .2      EXAMINE APB 
      JSB EXAM5 
      JMP *+4     APB WAS ON, BAD NEWS
      LDA .1      SET BIT 0 
      JSB EXAM5   EXAMINE SB
      JMP ALARM   ON, SET APB(NORMAL PATH FOR ALARM)
      JSB CLEAN   CLEAR 
      CLA 
      JMP NOTO      PREVENT TIMEOUTS
* 
*   CHECK STATUS AND CONTINUE REMOTE OPERATION
* 
CON   JSB PERR      PARITY? 
      LDA REMOT     REMOTE??
      SLA 
      JMP IMMD,I   CONTINUE REMOTE OPERATION
* 
*   CHECK FOR READ/WRITE INTERRUPT, OR TERMINATION
* 
CONN  LDA EQT10,I  GET RUNNING COUNT
      CPA EQT8,I   SAME AS BUFFER LENGTH? 
      JMP ALMOS    YES, GO TO TERMINATION 
INITX LDA EQT6,I   LOAD READ/WRITE FLAG 
      SSA,RSS      IF NEGATIVE, IT'S READ 
      JMP WRITE    IF NONZERO GO TO WRITE 
*   READ IN FROM SC 
* 
      JSB IN       INPUT
      JSB PUT      STORE INPUT WORD 
      ISZ EQT6,I     UPDATE READ COUNT
      JMP EXIT     NOT DONE YET, RETURN TO EXEC 
      SKP 
* 
*  COMPLETION EXIT
* 
ALMOS JSB ENABL   ENABLE EVENT SENSING IF SB ON 
COMPE LDB EQT10,I  GET THE COUNT
      CLA         SEZ SUCCESSFUL COMPLETION 
      JMP CA72,I   TO SYSTEM
* 
*     JUST IN CASE
* 
CRTN  DEF *+1 
      SZA,RSS 
      JMP CONTE 
      JMP COMPE 
* 
*   WRITE INTERRUPT 
* 
WRITE JSB GET      GET OUTPUT WORD
      JSB OUT      OUTPUT 
      ISZ EQT7,I     BUMP ADDRESS AND 
      ISZ EQT10,I     COUNT 
      ISZ EQT9,I     DONE WRITE?
      JMP EXIT     NO, GO TO EXIT 
      JSB GET       GET READ COUNT
      ISZ EQT7,I    BUMP BUFFER ADDRESS 
      CMA,INA      MAKE NEGATIVE
      STA EQT6,I     SAVE IN READ COUNT 
* 
*  CONTINUATION EXIT
* 
EXIT  JSB STCSC   SET DEVICE CONTROL
      LDA REMOT   GET REMOTE/LOCAL FLAG 
      SLA         REMOTE? 
      JMP CONN    YES 
CONTE ISZ CA72     INCREMENT RETURN ADDRESS 
      JMP CA72,I     FOR CONTINUATION RETURN
* 
* SYSTEM TIMEOUT DETECTED 
* 
TOON  XOR EQT4,I    RESET TIMEOUT 
      STA EQT4,I     BIT IN EQT4
      LDA .2      EXAMINE APB 
      JSB EXAM5 
      JMP TMORE   APB WAS ON, LOOK AT EQT1
      LDA .4      APB OFF, SET ERROR BIT
      JSB TSUB      PROCESS TIMEOUT 
      CLA 
      JSB .EQ15 
      JSB ENABL 
      JMP CONTE 
* 
*     HARDWARE FAILURE DETECTED 
* 
ER4   LDA .4
      JSB TSUB      PROCESS TIMEOUT 
      JMP CONTE     NO, CONTINUE AND ASK FOR TIMEOUT
* 
*     SUBROUTINE FOR PROCESSING TIMEOUTS
* 
TSUB  NOP 
      IOR EQT5,I    SET STATUS BIT
      AND MASK1 
      STA EQT5,I     IN EQT5
      JSB CLEAN     CLEAR I/O CARD
      LDB EQT1,I    I/O IN PROGRESS 
      SZB 
      JMP MTIME     YES, COMPLETE IT
      JMP TSUB,I    NO,CONTINUE 
* 
MASK1 OCT 177737
      SKP 
* 
*     TIMEOUT WITH ALARM IN PROGRESS
* 
TMORE LDB EQT1,I  I/O TRANSFER IN PROGRESS NOW? 
      SZB,RSS 
      JMP SCHED   NO, TRY TO SCHEDULE 
      LDA T.O.      GET INTERNAL TIMEOUT CLOCK
      SSA,RSS       ZERO??
      JMP START     YES, SET IT UP
BACK  LDA T.O.      BUMP INT TIMEOUT CLOCK
      ADA .3
      STA T.O.
      SSA           IF POSITIVE, TIMEOUT I/O
      JMP SCHED     MORE TIME NEEDED, TRY TO SCHEDULE ALARM 
* 
*     TIMEOUT WITH I/O IN PROGRESS, COMPLETE I/O REQUEST!!
* 
      LDA .4        SET TIMEOUT BIT 
      JSB TSUB
MTIME LDA M1        ASK FOR MORE TIME 
      JSB .EQ15 
      JMP COMPE     COMPLETION RETURN 
* 
START LDA EQT14,I 
      STA T.O.
      JMP BACK
* 
*     PARITY CHECK
* 
PERR  NOP 
      LDA REMOT     REMOTE? 
      SLA,RSS 
      JMP PERR,I    NO,RETURN 
SC14  LIA SC        GET DATA WORD 
SC15  LIB SC,C      GET THE STATUS
      STA .IN 
      SZB,RSS       PARITY? 
      JMP PERR,I    NO. 
      LDA BIT7
      JMP ER4+1     RETURN
* 
*     ROUTINE FOR PLAYING WITH EQT15
* 
.EQ15 NOP 
      STA EQT15,I   STORE (A) IN EQT15
      LDA EQT2,I    PREVENT SYSTEM
      STA EQT15      FROM CHANGING IT 
      JMP .EQ15,I 
* 
CONWD OCT 170240
M2    DEC -2
      SKP 
* 
*  POLL 1ST BOX NOW TO FIND INTERRUPTER BEFORE HE GOES AWAY 
* 
ALARM JSB PERR      PARITY? 
      LDA EQT5,I  GET STATUS
      IOR BIT5    SET ALARM IN PROCESS
      STA EQT5,I  EQT5, BIT 5 
      LDA CONWD   GET 170240 CONWORD
      JSB OUTWT   SELECT BOX 0, SET ISL,SYE 
      CLA 
      STA SAVAX   MAKE SLOT ADDRESS 00
ELOOP JSB OUT     OUTPUT THE SLOT ADDRESS 
      JSB OUTTF 
      LDB M2        16 USEC COUNTER 
      JSB TIME
      JSB IN      READ THE DATA INTO B
      SSB,RSS     IRQ ON? 
      JMP INC     NO, TRY NEXT SLOT 
      LDA SAVAX   GET LAST SLOT#
PUTES ALF         YES, ROTATE SLOT TO LOW A 
      STA EQT11,I  PUT AWAY 
      LDA M7777   GET DATA ONLY MASK
      AND B       KILLING IRQ BIT 
      STA EQT12,I  PUT DATA AWAY
      JMP ALAR1   EXIT ROUTINE
INC   CLB         CLEAR B FOR CASE OF NO IRQ
      LDA SAVAX   GET LAST SLOT#
      ADA BIT12   STEP TO NEXT SLOT#
      CPA M1700   WAS PREVIOUS SLOT LAST SLOT?
      JMP PUTES   YES, 170000 IN A, 0 DATA IN B 
      STA SAVAX   NO, REPLACE SLOT ADDRESS
      JMP ELOOP 
      LDA M1700      SET SENSE MODE FLAG ERROR
      CCB             SLOT=17 
      JMP PUTES       DATA=7777 
ALAR1 JSB CLEAR     CLEAR DEVICE
* 
      LDA .2      SET BIT 1 
      IOR EQT5,I  IN STATUS FIELD (APB) 
      STA EQT5,I  RESTORE 
      SKP 
SCHED LDB EQT13,I GET EQT13 ADDR
      LDB B,I     GET ADDRESS OF ID SEGMENT 
      STB SCH     PUT ADDRESS INTO $LIST CALL 
      JSB $LIST MAKE CALL TO SCHEDULE PROG
      OCT 001 
      DEF RTN1
SCH   NOP 
      DEF EQT11,I  S1 
      DEF EQT12,I  D1 
      DEF DNTCR    DON'T CARE 
      DEF DNTCR    DON'T CARE 
      DEF EQT4,I   CHANNEL NUMBER 
RTN1  NOP 
      SZA 
      JMP NDORM 
* 
* WHEN SYSTEM RETURNS TO US THE PROGRAM HAS BEEN SCHEDULED
* 
      LDA MASK2   GET MASK TO CLEAR BITS 0,1 & 5
      AND EQT5,I  IN EQT5,I. DO IT &
      STA EQT5,I  RESTORE WORD. 
* 
      LDA T.O.      GET INTERNAL TIMEOUT CLOCK
      JSB .EQ15 
      CLA           CLEAR INTERNAL
      STA T.O.       CLOCK
* 
      JMP CONTE     CONTINUATION RETURN 
* 
M1700 OCT 170000
M3    DEC -3
MASK2 OCT 177734
DNTCR NOP 
* 
NDORM LDA M3      ALLOW 30 MSEC TO PASS 
      JSB .EQ15 
      JMP CONTE   TAKE CONTINUATION EXIT
* 
      END 
                                                                                                                                                