ASMB,R
* 
*     NAME:   ID.52 
*     SOURCE: 92071-18365 
*     RELOC:  92071-16365 
*     PGMR:   C.H.W.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  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.        * 
*  **************************************************************** 
* 
* 
      NAM ID.52,0  92071-16365  REV.2041  800808
* 
* 
      SKP 
* 
*    ID.52 IS THE PARALLEL INTERFACE INTER-PROCESSOR COMMUNICATIONS 
*    DRIVER.  IT ALLOWS PROGRAMS ON CONNECTED PROCESSORS TO SEND
*    AND RECEIVE DATA.  IT ALSO SCHEDULES PROGRAMS BY ASYNCHRONOUS
*    INTERRUPT FROM OTHER SIDE WHEN THE REMOTE PROCESSOR RECEIVES A 
*    READ, WRITE, OR WRITE/READ REQUEST.
* 
*    ID.52 IS DESIGNED TO MAXIMIZE THROUGHPUT INCLUDING WAITING 
*    WITH A "SFS" WHEN AN INITIATED TRANSFER WILL COMPLETE IN 
*    APPROXIMATELY 1 MSEC OR LESS.
* 
*    ID.52 INCLUDES CAPABILITIES TO PROVIDE A REMOTE TERMINAL-LIKE
*    INTERFACE OVER THE COMM LINK SO THAT INTERACTIVE PROGRAMS
*    (SUCH AS FMGR) CAN BE CONTROLLED BY A REMOTE PROGRAM.
* 
*    IFT EXTENSION USAGE: 
*       IFTX + 0,1,2 = NAME OF PROGRAM TO SCHED ON ASYNC INTERRUPT
*       IFTX + 3     = PARAMETER TO PASS SCHEDULED PROGRAM
*       IFTX + 4     = ADDR OF RESIDUE ON READ
*       IFTX + 5     = TEMP SAVE OF ORIGINAL DMA WORD COUNT 
*       IFTX + 6-9   = AREA FOR 1ST QUAD
*       IFTX + 10-13 = AREA FOR 2ND QUAD
*       IFTX + 14-17 = AREA FOR 3RD QUAD
*       IFTX + 18-21 = AREA FOR 4TH QUAD
*       IFTX + 22-25 = AREA FOR 5TH QUAD
* 
* 
*  SUPPORTED EXEC CALLS ARE:
*   1  CALL EXEC(1,LU,BUF,LEN)            -  READ DATA
*   2  CALL EXEC(2,LU,BUF,LEN(,PRAM))     -  WRITE DATA (WITH OPT PRAM) 
*   3  CALL EXEC(1,10000B+LU,BUF,LEN,CBUF,CLEN) - WRITE CTL INFO, READ DATA 
*   4  CALL EXEC(3,LU)                    -  CLEAR
*   5  CALL EXEC(3,100B+LU)               -  SEND EOF 
*   6  CALL EXEC(3,600B+LU)               -  GET STATUS 
*   7  CALL EXEC(3,2000B+LU,PN,AM,E,PRAM) -  ENABLE ASYNC PGM SCHEDULE
*   8  CALL EXEC(3,2100B+LU)[OR 2300B+LU] -  DISABLE PGM SCHEDULE 
*   9  CALL EXEC(3,2200B+LU)              -  SET TIMEOUT
* 
      SKP 
      GEN 10,EID.52,TX:26,IT:52B
* 
      ENT ID.52 
* 
      EXT $DMPR,$DVLU,$XQSB,.MVW,$DIOC
      EXT $DV6,$DV13
      EXT $DV15,$DV16,$DV17,$DV18,$DV19 
      EXT $IF2,$IF5,$IF6,$IF7,$IFTX,$ATTN 
      EXT $SELR,$IF1
* 
DMA   EQU 20B       1ST SELECT CODE FOR DMA SELF-CONFIG 
CARD  EQU 30B       CARD S.C. W/ GLOBAL REG ENABLED 
AIE   EQU 1         FORCE INTERRUPT BIT 
EDT   EQU 2         EARLY DMA TERMINATOR CTL BIT
RTR   EQU 4         READY TO RECEIVE CTL BIT
RTS   EQU 10B       READY TO SEND CTL BIT 
CCON  EQU 2540B     CARD CONTROL FOR DMA, SRM=1 
PLV   EQU 2000B     PLV 
LBY   EQU 1000B     LBYEN TO ALLOW DMA TERM 
IRQ   EQU 400B      ENABLE INTERRUPT FROM ST0 
      SPC 4 
* 
* 
ID.52 NOP 
      CLB 
      STB HOLDF     INITIALIZE "HOLD" FLAG
      AND B7        ISOLATE ENTRY TYPE
      ADA JMPTB     POINT TO ADDR OF PROCESSING 
      JMP 0,I        ROUTINE AND JUMP TO IT 
      SKP 
* 
*  THIS SECTION HANDLES A NEW REQUEST (LOGICAL INITIATION)
* 
PI.00 LDA $DV6,I
      AND HIGH8     CLEAR STATUS BITS 
      STA $DV6,I
      LDA $DV15,I   GET REQUEST CONTROL WORD
      RAR 
      CCE,SSA,SLA   CONTROL REQUEST?
      JMP CN.00      YES
      AND MSKRQ     =104001 (RQ+ZBIT) 
      STA TEMP3 
      LDA $DV15 
      LDB $IF1
      JSB $SELR     GET RELOCATION REG
      STA MAPV      SAVE FOR DMA CONWDS 
      LDB TEMP3     RELOAD CONWD
      CPB READZ     WRITE/READ REQUEST? 
* 
PI.05 INB           SET WRITE BIT 
      LDA $IFTX     ADDR OF IFT EXTENSION 
      ADA B4
      STA TEMP3     ADDR FOR RESIDUE ADDR 
      INA 
      STA TEMP2     ADDR FOR WORD COUNT SAVE
      INA 
      STA QUADA     SAVE 1ST QUAD ADDRESS 
      STA PNTX      USE AS RUNNING POINTER FOR
*  SET UP DMA WORD COUNT
PI.10 LDA $DV17,I   GET REQUEST LENGTH
      SSB,SLB       DOING WRITE OF WRITE/READ?
      LDA $DV19,I    YES, USE Z-BUF LENGTH
      SSA,RSS       GIVEN IN WORDS? 
      CMA,INA,RSS    YES, NEGATE
      ARS            BYTES, DIV BY ROUND 2 & ROUND UP 
      SZA,RSS       ZERO LENGTH?
      JMP SETEX      YES, DO IMMEDIATE COMPLETION 
      STA TEMP2,I   SAVE NEG WORD LEN IN IFTX WORD 4
      SZB,RSS       IS THIS A READ AFTER WRITE QUAD?
      JMP PI.40      YES, BUILD READ QUAD NOW 
      CLE,INA       SET E IF LENGTH = 1 
      LIA CARD+2    GET CARD STATUS 
      AND RDWR      TEST SEND/RCV FLAGS 
      SZA           ACTIVE ON OTHER END?
      JMP PI.30      YES, DON'T SEND INRUP SIGNAL 
*  NO ACTIVE REQUEST ON OTHER END, SO SEND INTERRUPT
      LDA .RTRI     READY TO RCV + INRUP
      SLB           DOING A WRITE?
      LDA .RTSI      YES, READY TO SEND + INRUP 
      OTA CARD+1    SET CARD CONTROL
      ERA,CLE,ELA   NOW CLEAR IT
      OTA CARD+1
      LIA CARD+2
      AND RDWR      LINE STAT MAY HAVE JUST CHANGED 
* 
PI.30 SLB,RSS       DOING READ? 
      JMP READ       YES
      CPA .RTS      REMOTE ATTEMPTING TO SEND?
      JMP BZYER      YES, IMMEDIATE COMPLETE  BUSY
      LDA DMAW      DMA WRITE CONWD 
      SEZ           IS IT A ONE WORD WRITE? 
      JMP PI.60      YES, DO ONE QUAD WITH "EDT"
      IOR MAPV       + MAP REG SELECT OR ZERO 
      STA PNTX,I    STORE IN QUAD 
      LDA SND       SET "READY TO SEND" + CCON
      JMP PI.50 
* 
READ  CPA .RTR      REMOTE ATTEMPTING TO RECEIVE? 
      JMP BZYER      YES, IMMEDIATE COMPLETE  BUSY
PI.40 LDA DMAR      DMA CONWD 
      IOR MAPV       + MAP REG SELECT OR ZERO 
      STA PNTX,I    STORE IN QUAD 
      LDA RCV       SET "READY TO RECEIVE" +CCON
*  BUILD QUADS FOR DATA TRANSFER
PI.50 ISZ PNTX
      STA PNTX,I    STORE CARD CONTROL WORD 
      ISZ PNTX
      LDA $DV16,I   GET BUFFER ADDRESS
      SSB,SLB       DOING WRITE OF WRITE/READ?
      LDA $DV18,I    YES, USE Z-BUF ADDRESS 
      STA PNTX,I    STORE IN IFT EXTENSION
      ISZ PNTX
      LDA TEMP2,I   WD CNT FOR THIS QUAD
      SLB           WRITE?
      INA            YES, DO ONE LESS (LAST WD IN NXT QUAD) 
      STA PNTX,I
      SLB,RSS       READ? 
      JMP READQ      YES
      ISZ PNTX
      LDA DMAWA     DMA CONWD WITH AUTO BIT 
*  BUILD QUAD FOR LAST WORD OF WRITE DATA WITH "EDT" SET
PI.60 IOR MAPV       + MAP REG SELECT OR ZERO 
      STA PNTX,I    STORE DMA CONWD 
      ISZ PNTX
      LDA SDEND     SET "EDT" + "SND" 
      STA PNTX,I    STORE CARD CONWD
      LDA $DV16,I   BUFFER ADDRESS
      SSB,SLB       DOING Z BUFFER? 
      LDA $DV18,I    YES
      CMA,INA 
      ADA TEMP2,I   - (BUFFER ADDRESS + LENGTH) 
      CMA           BUFFER ADDRESS + LENGTH -1
PI.70 ISZ PNTX
      STA PNTX,I    SET ADDR FOR 1 WORD WRITE 
      ISZ PNTX
      CCA           -1
      STA PNTX,I    SET WORD LEN = -1 
      ISZ PNTX
      SZB,RSS       JUST FINISHED WRITE OF W/R? 
      JMP PI.10      YES, NOW DO READ QUAD
      SSB,SLB,RSS   DOING WRITE OF WRITE/READ?
      JMP LQUAD       NO, BUILD FINAL QUAD
      LDA DMAWA      YES, NOW SEND EXTRA HANDSHAKE
      STA PNTX,I     TO COMPLETE THE REMOTE READER
      ISZ PNTX
      LDA SND 
      LDB $DV19,I   Z-BUFFER LENGTH 
      SSB,SLB       DOING ODD BYTES?
      IOR .EDT       YES, SET EDT TO FLAG FOR REMOTE
      STA PNTX,I    SET CARD CONWD FOR WR 
      CLB           INDICATE DONE WITH WRITE OF W/R 
      LDA DEFZE     USE A ZERO FOR HANDSHAKE
      JMP PI.70     GO COMPLETE QUAD
* 
READQ LDA PNTX      ADDR OF RESIDUE 
      STA TEMP3,I   SAVE IN IFTX+3
      ISZ PNTX
*  BUILD FINAL QUAD TO CLEAR CARD CONWD & SEND PRAM 
LQUAD LDA DMAX      =41400
      SLB,RSS       READ? 
      IOR B200       YES, SET INPUT 
      STA PNTX,I    SET DMA CONWD 
      ISZ PNTX
      LDA $DV17,I   ORIGINAL REQUEST LEN
      CLE,SSA,SLA   SKIP UNLESS ODD BYTES 
      CCE 
      LDA CCONV 
      SEZ,SLB       SKIP UNLESS WRITING ODD BYTES 
      IOR .EDT      SET EDT TO INDICATE ODD BYTES TO RCVR 
      STA PNTX,I    CLEAR CARD CONTROL BITS 
      ISZ PNTX
      LDA $DV18     ADDR OF DVT WORD 18 
      SLB,RSS       DOING READ? 
      INA            YES, RCV WORD IN DVT19 
      STA PNTX,I    SAVE QUAD BUF ADDR
      ISZ PNTX
      CCA,CLE       LEN=1 
      STA PNTX,I    SET QUAD LEN
      LDA TEMP2,I   GET TRANSFER LENGTH 
      SZB           LEAVE E=0 IF DOING WRITE/READ 
      ADA .256      SET E IF LEN < 257
* 
*  INITIATE DMA SELF-CONFIGURED OPERATION(S)
      LDA B3        NOW ENABLE INRUPS WITHOUT A DEVCOM
      OTA 2         SET DIAGNOSE MODE 3 
      STC CARD      ENABLE CARD INTERRUPTS
      CLA            TO PERMIT ABEND OF DMA 
      OTA 2         TURNOFF DIAGNOSE MODE 3 
DODMA LDB DMAWA     DMA WRITE CONWD WITH AUTO 
      ADB MAPV      INCLUDE MAP SELECT
      LDA QUADA     ADDRESS OF 1ST QUAD 
      OTA DMA       SET SELF-CONFIG ADDR
*TIME CRITICAL SECTION - SET AUTO ON WRITE ONLY IF OTHER SIDE 
*IS DOING AN ACTIVE DMA READ
      LIA CARD+2    GET STATUS RIGHT NOW! 
      AND B17 
      CPA .EDTR     REMOTE DOING AN ACTIVE DMA READ?
      STB QUADA,I    YES, DO WRITE WITH AUTO SET ON 1ST 
      STC DMA,C     DO SELF-CONFIGURATION & GO
      CLF CARD      CLEAR CARD FLAG 
      STA TEMP2     SAVE STAT LINES FROM PRECHECK 
      CLB,SEZ,RSS   SKIP IF LEN <=256 & NOT W/R 
      JMP PCHEK      OTHERWISE, WAIT FOR INTERRUPT
* 
LOOP  LIA DMA+3     GET DMA WORD COUNT
      CPA 1         DMA RUNNING?
      JMP *+3        NO 
      LDB 0 
      JMP LOOP      LOOP AS LONG AS DMA RUNS
      LIA CARD+2    GET STATUS
      SLA           "AIE" SET FROM REMOTE?
      JMP ABEND      YES, REQUEST TERMINATED
      SFC DMA+3     DMA COMPLETE? 
      JMP DMEND      YES! IMMEDIATE COMPLETION
*  DMA NOT RUNNING, GO OUT CONTINUE & WAIT, BUT FIRST 
*  MAKE SURE WE'RE NOT LOCKED UP BECAUSE REMOTE RECEIVER
*  STARTED JUST BEFORE US BUT WE SET AUTO THINKING
*  SENDER (US) GOT THERE FIRST
PCHEK LIA CARD+2    GET STATUS
      AND B17 
      CPA TEMP2     ANY CHANGE FROM PRECHECK? 
      JMP PCONT      NO - THIS IS THE NORMAL CASE 
      CPA .EDTR     IS REMOTE NOW DOING DMA READ? 
      JMP RERUN      YES, RESTART DMA IF NO DATA SENT YET 
* 
PCONT ISZ ID.52     GO OUT CONTINUE 
* 
SETTO CLA,INA       REQUEST TIMEOUT ENABLE
      JMP ID.52,I 
      SKP 
* 
*  REQUEST TERMINATED FROM OTHER SIDE, DO RETRY 
ABEND LDB RETRY     DO RETRY
* 
CARDI LDA .AIE      ACKNOWLEDGE WITH AN INTERRUPT 
      OTA CARD+1     IF REMOTE HAS INTERRUPT ENABLED
      JMP RETRN 
      SPC 2 
* 
RERUN CLC DMA+1     SUSPEND DMA 
      LIA DMA+2     GET DMA ADDRESS 
      ELA,CLE,ERA   CLEAR SIGN
      LDB QUADA     ADDR OF 1ST QUAD
      ADB B2        POINT TO BUF ADDR 
      CPA 1,I       HAS DMA ADDRESS CHANGED?
      JMP RECON      NO, RESTART REQUEST
      STC DMA+1      YES, JUST LET DMA CONTINUE 
      JMP PCONT      AND GET OUT
* 
RECON CLC DMA+3,C   ABORT DMA 
      JMP DODMA      & GO RESTART IT
      SKP 
* 
*  THIS SECTION HANDLES CONTROL REQUESTS
* 
CN.00 EQU * 
      AND B3740     ISOLATE SUBFUNCTION 
      CPA REQ1      SEND EOF? 
      JMP CN.01      YES
      CPA REQ11     TOF?
      JMP CN.01      YES, SAME AS EOF 
      CPA REQ20     SCHEDULE PROGRAM ON ASYNC INTERRUPT?
      JMP CN.20      YES
      CPA REQ21     DISABLE (PRIMARY) SCHED?
      JMP CN.23      YES
      CPA REQ22     SET TIMEOUT?
      JMP CN.22      YES
      CPA REQ23     DISABLE ALL SCHED?
      JMP CN.23      YES
      SZA           CLEAR REQUEST?
      JMP STTUS      NO 
      OTA CARD+2     YES, CLEAR REG 32
      CLC CARD,C
      JMP SETEX 
* 
CN.01 LDA $DV18     ADDR OF -1
      STA $DV16,I   SET AS BUF ADDR 
      CCA 
      STA $DV17,I   LENGTH = 1
      STA $DV18,I   PRAM = -1 
      STB MAPV      NO MAPPING
      JMP PI.05     NOW TREAT AS 1 WORD WRITE 
* 
CN.20 LDA $DV16     ADDR OF NAME IN DVT PRAMS 
      LDB $IFTX     SAVE NAME IN IFT EXT 1ST 3 WORDS
      JSB .MVW      MOVE 4
      DEF B4
      NOP 
STTUS CLA 
      JMP SETEX     GO OUT PHYSICAL DONE
* 
CN.22 LDA $DV16,I   GET PARAMETER 
      SZA,RSS       IF ZERO,
      JMP *+3        SET FOR NO TIMEOUT 
      CMA,SSA,RSS   NEW TIMEOUT = -(PRAM+1) 
      JMP REJ1      ILLEGAL REQUEST IF GIVEN AS NEGATIVE
      STA $DV13,I   SET PHYSICAL TIMEOUT VALUE IN DVT 
      JMP STTUS 
* 
CN.23 STB $IFTX,I   DISABLE ASYNC PROGRAM SCHEDULING
      JMP STTUS 
      SPC 2 
REJ1  LDA RQERR     RETURN REQUEST ERROR & FLUSH IT 
      JMP SETEX 
      SPC 3 
      SKP 
      SPC 3 
* 
*  ENTER HERE ON INTERRUPTS FROM EITHER DMA OR CARD 
* 
PR.00 LDA $IF6,I    GET IFT STATUS
      SSA,RSS       BUSY? 
      JMP ASYNC      NO 
      LIA CARD+2    GET STATUS AT TIME OF INRUP 
      SLA           PREMATURE TERMINATION FROM REMOTE?
      JMP ABEND      YES
      SFS DMA+3     DMA COMPLETION? 
      JMP ILLIN      NO, WHAT THEN? 
*  AN ACTIVE DMA TRANSFER HAS COMPLETED 
DMEND SFC DMA+2     PARITY? 
      JMP $DMPR      YES
      CLB           NO ERROR
* 
*  ENTER HERE ALSO ON TIMEOUT, POWER-FAIL, ABORT, OR REMOTE 
*  ABEND TO RETURN THE ACTUAL NUMBER OF WORDS(BYTES) TRANSFERRED
*  UP TO TIME WE CANNED IT IF A READ.  ALWAYS RETURN ORIGNAL
*  REQUEST LENGTH IF A WRITE
RETRN CLC DMA+1     SUSPEND DMA THEN
      CLC DMA+3,C    CLEAR THE CARD'S DMA 
      STB TEMP2     SAVE ERROR CODE 
      CLA,INA 
      LDB $IF5,I    GET DVT ADDR
      JSB $DIOC     ENSURE DVT ADDRS ARE SET
      LDB $DV15,I   GET CONWD 
      RBR,SLB       DOING WRITE OR CONTROL? 
      JMP SETEN      YES, RTN ORIGINAL LENGTH 
      LDB $IFTX     IFT EXT ADDRESS 
      ADB B4
      LDA 1,I       GET ADDR
      LDA 0,I       GET RESIDUE 
      CMA,INA 
      INB           POINT TO SAVE OF ORIGINAL LEN (NEQ WORDS) 
      ADA 1,I       A=NEG. XMISSION COUNT 
      LIB CARD+2    GET LATCHED CARD STATUS 
      RBR,ERB       E=EDT (ODD BYTE INDICATOR)
      CPA N1        LENGTH=1? 
      JMP EOFCK      YES, POSSIBLE EOF
DLOG2 LDB $DV17,I   GET USER SPECIFIED LENGTH 
      SSB           GIVEN IN BYTES? 
      ELA            YES, WORD COUNT TO BYTE COUNT
      CMA,INA       RETURN POSITIVE WORD/BYTE COUNT 
DOLOG STA $DV17,I   RETURN XLOG 
SETEN LDA .PLV      SAVE ONLY PLV 
      OTA CARD+1    CLEAR RD/WR/SRM/IRQEN 
      CLC CARD,C    CLEAR CARD & FLAG 
      LDA TEMP2     ERROR CODE
SETEX STA $DV16,I   POST EXIT CODE
      LIA CARD+2    READ CARD STATUS FOR DVT18
      STA $DV18,I   RETURN STAT IN PRAM 3 
      SKP 
* 
*  EXIT WITH CARD INTERRUPTS ENABLED IF WE ARE AWAITING 
*  AN ACKNOWLEDGEMENT TO ABNORMAL TERMINATION OR IF ASYNCHRONOUS
* 
EXIT  LDA HOLDF 
      SZA           ARE WE ALARMING REMOTE? 
      JMP ENABL      YES, ENABLE ACK INRUP, SET HOLD,TO 
      CPA $IFTX,I   ASYNC ENABLE? 
      JMP ID.52,I     NO
* 
      LIA CARD+2    SEE IF REMOTE HAS ACTIVE REQUEST
      AND RDWR
      SZA           ANY REQUEST?
      JMP PSKD2      YES, SCHEDULE PROGRAM
* 
ENABL LDB .ENAB     SET IRQEN + PLV 
      OTB CARD+1     IN CARD CONWD
      LDB B3        NOW ENABLE INRUP WITHOUT A DEVCOM 
      OTB 2         SET DIAGNOSE MODE 3 
      STC CARD      ENABLE INTERRUPT
      CLB 
      OTB 2         TURNOFF DIAGNOSE MODE 3 
      JMP ID.52,I 
      SPC 4 
*  POSSIBLE EOF HAS BEEN RECEIVED 
EOFCK CPA $DV19,I   WAS EXTRA PARAM = -1? 
      SEZ,RSS        YES, WAS IT 1 BYTE?
      JMP DLOG2      NO 
*  EOF HAS BEEN DETECTED
      LDA $DV6,I
      IOR B200      SET EOF FLAG IN STATUS
      STA $DV6,I     RETURNED IN CALLERS A REG
      CLA           RETURN XLOG OF ZERO 
      JMP DOLOG 
      SPC 3 
* OTHER SIDE ALREADY IS CONTROLLING LINE, DONT AFFECT CURRENT STATE 
BZYER LDA BUSYF     BUSY ERR, DON'T DOWN, FLUSH 
      STA $DV16,I   RETURN ERROR CODE 
      LIA CARD+2    GET CARD STATUS 
      STA $DV18,I   RETURN IN PRAM3 
      LDA .PLV
      OTA CARD+1    CLEAR POSSIBLE RD/WR FLAG 
      LDA $IF7,I    GET SYSTEM FLAGS
      AND BIT11     ISOLATE PREVIOUS "T"
      SZA           TIMEOUT ENABLED?(WHILE NOT BUSY)
      JMP PSKED      YES, SEE IF PGM SCHED TO DO
      JMP ID.52,I   GO OUT PHY DONE 
      SKP 
*  ENTER HERE ON CARD INTERRUPTS WHEN THE INTERFACE IS
*  NOT BUSY.  THE NON-HARDWARE-FAILURE CAUSES OF A CARD 
*  INTERRUPT ARE: 
*    1. THE CARD WAS ENABLED BECAUSE A PROGRAM IS TO BE 
*       SCHEDULED ON ASYNC INTERRUPT AND THE REMOTE COMPUTER
*       SET THE ST0 LINE TO ALERT US TO A NEW REQUEST.
*    2. THIS COMPUTER HAD ABNORMALLY TERMINATED A PREVIOUS
*       REQUEST DUE TO TIMEOUT, POWER-FAIL, OR ABORT AND
*       THIS INTERRUPT IS AN ACKNOWLEDGEMENT FROM REMOTE. 
*    3. REMOTE IS ALERTING US TO A REQUEST WHICH IT IS
*       ABNORMALLY TERMINATING BUT FOR WHICH WE ARE NOT 
*       CURRENTLY BUSY. 
*  NOTE THAT DUE TO INTERRUPT SERVICING DELAYS, THE "READY
*  TO SEND" / "READY TO RECEIVE" LINES MAY HAVE CHANGED 
*  SINCE THE INTERRUPT WAS ORIGINALLY FORCED.  FOR THIS 
*  REASON, THIS CODE CHECKS THE CURRENT STATE OF THE RTS/RTR
*  LINES TO MAKE THE DECISIONS FOR PROGRAM SCHEDULING OR
*  CARD REENABLING/DISABLING. 
* 
ASYNC SFS CARD      CARD INTERRUPT? 
      JMP ILLIN      NO, WHAT THEN? 
* 
*  HERE ON ASYNCHRONOUS CARD INTERRUPT OR TIMEOUT WHEN NOT BUSY 
SCRET ISZ ID.52     BE SURE TO GO OUT CONTINUE
      LIA CARD+2    GET CARD STATUS 
      AND RDWR
      CLC CARD,C    DISABLE CARD, CLEAR FLAG
      SZA,RSS       DOES OTHER SIDE HAVE A REQUEST? 
      JMP EXIT       NO, IGNORE INTERRUPT OR TIMEOUT
      SKP 
* 
*  THE BELOW CODE IS ENTERED WHEN REMOTE HAS AN ACTIVE REQUEST
PSKED LDA $IFTX,I 
      SZA,RSS       ANY PROG TO SCHEDULE? 
      JMP ID.52,I    NO, EXIT (CARD IS LEFT DISABLED) 
* 
*  NOW ATTEMPT TO SCHEDULE THE INTERRUPT HANDLING PROGRAM 
*  THE PROGRAM IS PASSED THE FOLLOWING PARAMETERS:
*     PARAM 1 = LU
*     PARAM 2 = PARAMETER PASSED IN EXEC(3,2000B+LU) REQUEST
*     PARAM 5 = CARD STATUS FROM REG 32 
* 
PSKD2 LDB $IF5,I    GET DVT ADDR
      JSB $DVLU     COMPUTE LU
      STA WORK      PASS LU IN FIRST PARAM
      STA TEMP3      & ALSO CONLU IN ID SEG 
      LDB $IFTX 
      ADB B3
      LDA 1,I       GET OPTIONAL PASSED PRAM
      STA WORK+1    PASS AS 2ND TO PGM
      LIA CARD+2    GET CARD STATUS 
      STA WORK+4    PASS AS PARAM 5 
* 
      JSB $XQSB     SCHEDULE PROGRAM
      DEF $IFTX,I 
      DEF WORK
TEMP3 NOP 
      SZA,RSS       SCHEDULE SUCCESSFUL?
      JMP ID.52,I    YES, EXIT, NO T.O., CARD DISABLED
      SSA           DOES PROGRAM EXIST? 
      JMP NOPGM      NO, CLEAR IFTX & GIVE ILLEGAL INRUP
      LDA $IFTX,I   GET 1ST TWO CHARS OF NAME 
      CPA ASCFM     ="FM"?
      JMP ATTN       YES, USE SYSTEM PROMPT AS ALTERNATE
*  WAIT UNTIL 100 MSECS UNTIL PROGRAM IS SCHEDULABLE OR 
*  OTHER SIDE DUMPS REQUEST OR WE GET A NEW REQUEST 
      LDA N10 
      STA $IF2,I    100 MSEC CLOCK
      JMP SETTO     EXIT WITH TO ENABLED, CARD DISABLED 
* 
ATTN  LDA TEMP3     GET LU
      STA $ATTN     SET SYSTEM ATTENTION
      CLA 
      JMP ID.52,I   GO OUT CONTINUE, NO INTERRUPT 
* 
NOPGM CLA 
      STA $IFTX,I   CLEAR PGM TO SCHED INDICATOR
      JMP ILLIN+1 
      SKP 
* 
*  ENTER HERE ON PHYSICAL TIMEOUT.   TIMEOUT IS ENABLED IN 3 CASES: 
*     1.  AN ACTIVE DMA REQUEST IS IN PROGRESS
*     2.  WE WERE UNABLE TO SUCCESSFULLY SCHEDULE A PROGRAM ON
*         AN ASYNC INTERRUPT AND ARE RETRYING EVERY 100 MSECS 
*     3.  WE ABNORMALLY TERMINATED A REQUEST AND ARE AWAITING 
*         ACKNOWLEDGEMENT FROM REMOTE WITH "HOLD" SET 
TO.00 LDA $IF6,I    GET IFT STATUS
      SSA,RSS       BUSY? 
      JMP SCRET      NO, SEE IF PGM TO SCHED
      LDB TMERR     ERROR CODE 3, FLUSH, DON'T DOWN 
      JMP ABREQ      YES, TIMEOUT ERROR 
      SPC 3 
* 
*  ENTER HERE ON A POWER-FAIL 
* 
PF.00 LDB RETRY     SET TO RESTART ANY CURRENTLY
* 
*  HERE ALSO ON ABORT (B=0) 
ABREQ LDA .PLV
      OTA CARD+1    TURN-OFF "SRM" SO WE GET
      LIA CARD+2     CARD STATUS RIGHT NOW
      AND RDWR
      SZA,RSS       OTHER SIDE HAVE A REQUEST?
      JMP RETRN      NO, GO OUT DONE
* 
*  A POWER-FAIL, ABORT, OR TIMEOUT HAS OCCURRED WHILE REMOTE
*  COMPUTER HAS AN ACTIVE REQUEST.  WE NOW CAUSE AN INTERRUPT 
*  WHICH WILL PREMATURELY TERMINATE HIS DMA, PROVIDED THAT IT 
*  IT IS CURRENTLY RUNNING.  WE THEN COMPLETE THE CURRENT 
*  REQUEST WITH THE APPROPRIATE ERROR CODE BUT EXIT WITH
*  HOLD AND TIMEOUT SET THEREBY PREVENTING INITIATION OF
*  FURTHER REQUESTS UNTIL WE RECEIVE AN INTERRUPT OR TIMEOUT. 
*  WHEN THE REMOTE RECOGNIZES THE CARD INTERRUPT IT WILL IN TURN
*  INTERRUPT OUR CARD, WHICH RESULTS IN CLEARING THE HOLD 
*  CONDITION AND ALLOWING ANY PENDING REQUESTS TO INITIATE. 
* 
      LDA B3        HOLD & TIMEOUT
      STA HOLDF     NO NEW REQUEST UNTIL WE RCV 
      CMA,INA       21-30 MSEC TIMEOUT
      STA $IF2,I
      JMP CARDI      AN INRUP ACK FROM REMOTE (OR T.O.) 
      SPC 3 
*  ILLEGAL INTERRUPT
ILLIN ISZ ID.52     GO OUT CONTINUE 
      LDA B4        SET "I" BIT IN A REG
      JMP ID.52,I   EXIT
      SKP 
* 
*  DATA AREA
* 
HOLDF NOP 
MAPV  NOP 
WORK  DEC 0,0,0,0,0 
TEMP2 EQU WORK
PNTX  EQU WORK+1
QUADA EQU WORK+4
.256  DEC 256 
B2    OCT 2 
B3    OCT 3 
B4    OCT 4 
B7    OCT 7 
B17   OCT 17
B200  OCT 200 
REQ1  OCT 40
REQ11 OCT 440 
REQ20 OCT 1000      SUBFUNCTION=20
REQ21 OCT 1040      SUBFUNCTION=21
REQ22 OCT 1100      SUBFUNCTION=22
REQ23 OCT 1140      SUBFUNCTION=23
B3740 OCT 3740      MASK FOR SUBFUNCTION FIELD
BIT11 OCT 4000
MSKRQ OCT 104001
READZ OCT 104000
DMAR  OCT 151200    DMA FOR READ: AUTO,INPUT,RESID
DMAW  OCT 141000    DMA FOR WRITE: CONT,NO AUTO 
DMAWA OCT 141400    DMA FOR WRITE: CONT, AUTO 
DMAX  OCT 41400     DMA FOR FINAL QUAD: AUTO
RETRY OCT 100077
RQERR OCT 140001
TMERR OCT 140003
BUSYF OCT 140024    DRIVER DEFINED ERROR: LINE BUSY 
HIGH8 OCT 177400
ASCFM ASC 1,FM
N1    DEC -1
N10   DEC -10 
DEFZE DEF ZERO
*  BELOW ARE THE VARIOUS CARD CONTROL PROGRAMMING VALUES
RDWR  ABS RTS+RTR   SEND + RCV
.AIE  ABS AIE+PLV   ASYNC ENABLED 
.EDT  ABS EDT       EARLY DMA TERM/ ODD BYTE
.RTR  ABS RTR       READY TO RECEIVE
.RTS  ABS RTS       READY TO SEND 
CCONV ABS CCON      CARD CONTROL WITH 4 CONTROL LINES 
SND   ABS RTS+CCON  READY TO SEND + CCON
RCV   ABS RTR+CCON+LBY+EDT   READY TO RCV 
SDEND ABS RTS+EDT+CCON   READY TO SEND +EDT +CCON 
.EDTR ABS RTR+EDT 
.RTRI ABS RTR+AIE+PLV 
.RTSI ABS RTS+AIE+PLV 
.PLV  ABS PLV 
.ENAB ABS PLV+IRQ   ENABLE ST0 TO INTERRUPT 
* 
*  BELOW IS JUMP TABLE BASED ON DRIVER ENTRY CODE 
JMPTB DEF *+1,I     JUMP TABLE
      DEF ABREQ     ABORT 
      DEF PI.00     PHYSICAL INITIATE 
      DEF PR.00     PHYSICAL RESUME 
      DEF TO.00     PHYSICAL TIMEOUT
      DEF PF.00     POWER-FAIL
* 
ZERO  DEC 0 
* 
      END 
                                                