ASMB,R,L,C
      HED @INTR-COMM. LINE INTERRUPT MODULE.*(C) HEWLETT-PACKARD CO. 1976*
      NAM @INTR,1,1 91705-16106 REV A 760206
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 1 
* 
* @INTR 
* SOURCE: 91705-18106 REV.A 
* BINARY: 91705-16106 REV.A 
* JIM HARTSELL
* JULY 30, 1974 
* MODIFIED BY: CHW (01-06-76) [DERIVED FROM: 91705-18006 REV.B] 
* 
* CORE RESIDENT RTE-C SATELLITE PROGRAM SCHEDULED BY
* DVR65 UPON RECEIPT OF AN INTERRUPT CAUSED BY A "TRANSMIT
* REQUEST" CALL AT THE CENTRAL STATION. 
* @INTR READS THE REQUEST AND SCHEDULES THE APPROPRIATE 
* PROCESSOR. IF THE REQUEST IS A REPLY TO A PARMB, @INTR
* DISPATCHES THE NEXT PARMB REQUEST.
* 
      ENT @INTR 
* 
      EXT EXEC,@DEQ,@DISP,%LU,$LIBR,$LIBX 
      EXT @PTPQ,%RQUE,%CSID,%CSNM,%MFLG 
      EXT %LIST,$WORK,$LINK 
* 
A     EQU 0 
B     EQU 1 
* 
* READ THE REQUEST BUFFER.
* 
@INTR JSB EXEC      RECEIVE REQUEST ONLY. 
      DEF *+7 
      DEF B1
      DEF %LU 
      DEF IRBUF 
      DEF IRBFL 
      DEF DUMMY 
      DEF DUMMY 
* 
* CHECK FOR TRANSMISSION ERRORS.
* 
      SLA,RSS 
* 
      SKP 
* THE REQUEST ARRIVING FROM CENTRAL COULD NOT BE READ.
* CASE 1: REPLY TO A REMOTE REQUEST:
*         USER WILL COME OUT OF OP SUSP LIST, WILL
*         GET A "DS51 SUSPEND", AND CAN TRY AGAIN.
* CASE 2: REQUEST FROM CENTRAL: 
*         CENTRAL WILL DETECT ERROR AND RE-TRY. 
* 
      JMP EXIT      IGNORE REQUEST. 
      STB EQT12     SAVE EQT12 STATUS 
* 
* CHECK FOR REPLY OR PARMB. 
* 
      LDA IRBUF     CHECK FOR REPLY BUFFR.
      RAL            (BIT 14 SET IF REPLY)
      SSA 
      JMP REPLY     REPLY. DON'T CARE WHAT TYPE.
* 
      RAR           PARMB. DETERMINE TYPE.
      AND B377      ISOLATE THE STREAM TYPE,
      STA IRBUF       AND RESTORE IT. 
      CPA B4
      JMP PTOPC     PTOPC.
* 
* MOVE PARMB TO HOLDING BUFFER FOR @RQPR. 
* 
      JSB $LIBR     DISABLE INTERRUPTS. 
      NOP 
      LDA RBUFD     ADDR OF PARMB.
      STA TEMP1 
      LDA %RQUE     ADDR OF HOLDING BUFFER. 
      STA TEMP2 
      LDB MD35
LOOP  LDA TEMP1,I   MOVE PARMB. 
      STA TEMP2,I 
      ISZ TEMP1 
      ISZ TEMP2 
      INB,SZB 
      JMP LOOP
      JSB $LIBX     ENABLE INTERRUPTS.
      DEF *+1 
      DEF *+1 
* 
      JSB EXEC      SCHEDULE @RQPR PROCESSOR FOR
      DEF *+3       DEXEC/REMOTE CONTROL/FORCE LOAD.
      DEF SD10      WITHOUT WAIT. 
      DEF D@RQP 
* 
* IF PROCESSOR DOES NOT EXIST, OR ALREADY SCHEDULED,
* THE REQUEST WILL BE REJECTED. 
* 
      NOP           IGNORE ERROR RETURN.
      CLB           PRIME IERR TO 0.
      CPA AS.SC 
      JMP REJR
      SZA,RSS 
      JMP EXIT
* 
REJR  LDA AS.RQ     SEND BACK "RQ" ERROR. 
      STA IRBUF+5 
      LDA AS.SP 
      STA IRBUF+6 
      JMP SNREJ 
* 
* REQUEST IS A REPLY TO A PARMB.
* SET QUEUE ENTRY FLAG WORD = "REPLY RECEIVED". 
* 
REPLY LDB IRBUF+1   CHECK IF A REPLY IS EXPECTED. 
      STB QENT
      INB 
      LDA B,I 
      CPA B2
      RSS 
      JMP DISP      NO. IGNORE AND DISPATCH NEXT. 
* 
      ADB D9        POINT TO THE TIME-TAG WORDS.
      DLD B,I       GET THE TIME-TAGS.
      CPA IRBUF+33  IF THE FIRST TAG COMPARES,
      RSS            SKIP TO CHECK SECOND  ELSE,
      JMP DISP        NOT THE EXPECTED REPLY--IGNORE! 
      CPB IRBUF+34  IF THE SECOND TAG COMPARES, 
      RSS            THEN THIS IS OUR REPLY  ELSE,
      JMP DISP        NOT THE EXPECTED REPLY--IGNORE! 
* 
* 
      JSB $LIBR     DISABLE INTERRUPT SYSTEM. 
      NOP 
* 
      LDA QENT      QUEUE ENTRY ADDRESS.
      INA 
      LDB B3
      STB A,I       SET FLAG WORD.
* 
      JSB $LIBX     ENABLE INTERRUPT SYSTEM.
      DEF *+1 
      DEF *+1 
* 
* FIND STATUS OF CORRESPONDING PROGRAM. 
* 
* NOTE: SUBROUTINE "ALIVE" DISABLES THE INTERRUPT 
*       SYSTEM WHILE CHECKING STATUS. 
* 
      JSB ALIVE 
      JMP ABORT     USER DEAD.
      JMP MOVE      USER OP SUSPENDED.
* 
      SKP 
* USER PROGAM HAS BEEN ABORTED. CANCEL THE
* REQUEST FROM THE PARMB REQUEST QUEUE, AND 
* DISPATCH THE NEXT PARMB.
* 
ABORT JSB @DEQ
QENT  NOP 
B1    OCT 1 
* 
      NOP           ERROR = NORMAL RETURN.
      JMP DISP
* 
* USER PROGRAM IS SCHEDULED AND IN CORE.
* MOVE REPLY TO USER'S REPLY BUFFER AREA. 
* 
MOVE  JSB $LIBR 
      NOP 
      LDA RBUFD     SET SOURCE POINTER. 
      STA TEMP2 
* 
      LDA IRBUF+1   SET DESTINATION POINTER.
      ADA D9
      LDA A,I 
      STA TEMP1 
* 
      LDB MD35      SET WORD COUNTER. 
* 
MLOOP LDA TEMP2,I   MOVE. 
      STA TEMP1,I 
      ISZ TEMP2 
      ISZ TEMP1 
      INB,SZB 
      JMP MLOOP 
* 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
* 
      JSB CLOCK     SET UP FOR RESTART. 
      JMP ENQUE 
* 
* 
*  SEND A STOP IF LINE IS IN "DATA PENDING" CONDITION 
* 
DISP  LDA EQT12 
      ALF,ALF       BIT 8 = DATA PENDING FLAG 
      SLA,RSS 
      JMP ENQUE     JUMP IF NOT PENDING DATA XFER 
*  SEND A STOP
      JSB EXEC
      DEF *+3 
      DEF B3
      DEF %LU 
* 
* NOW THAT A REPLY HAS BEEN RECEIVED, THE NEXT PARMB
* CAN NOW BE TRANSMITTED. CHECK IF ONE IS WAITING.
* 
ENQUE JSB @DISP 
      SZA,RSS       (A)= QUE ENTRY ADDR, OR ZERO. 
      JMP EXIT      NONE WAITING. TERMINATE.
* 
      STA QENT      A PARMB WAITING. CHECK STATUS.
      JSB ALIVE 
      JMP ABORT     USER DEAD.
      JSB CLOCK     SET UP FOR RESTART. 
* 
EXIT  JSB EXEC      TERMINATE.
      DEF *+2 
      DEF B6
* 
      SKP 
* 
* SUBROUTINE TO TEST WHETHER USER PROGRAM IS IN OPERATOR SUSPEND LIST.
* 
* CALLING SEQUENCE: 
*         (QENT) = ADDR OF QUEUE ENTRY. 
*         JSB ALIVE 
*          RETURN 1: USER NOT OP SUSPENDED (DEAD).
*          RETURN 2: USER IN OPERATOR SUSPEND LIST. 
* 
ALIVE NOP 
      JSB $LIBR     DISABLE INTERRUPT SYSTEM. 
      NOP 
* 
      LDA QENT      GET ADDR OF PROGRAM NAME
      ADA B2        IN USER'S ID SEGMENT. 
      LDB A,I 
      ADB D12 
      ADA B2        GET ADDR OF PROGRAM NAME
      STA NAME
* 
      JSB CMPAR     COMPARE THE NAMES.
      JMP DEAD      MISMATCH. 
* 
      LDA TEMP2,I   MATCH. GET USER STATUS. 
      AND B17 
      CPA B6
* 
      ISZ ALIVE     PROGRAM IS OP SUSPENDED.
DEAD  JSB $LIBX     PROGRAM IS DEAD.
      DEF ALIVE 
* 
* FIND ENTRY IN WAIT-LIST, SET CLOCK TIME FOR 
* IMMEDIATE EXECUTION, AND SCHEDULE @CLCK.
* 
CLOCK NOP 
      JSB $LIBR 
      NOP 
* 
      LDA %LIST     ADDR OF WAIT-LIST.
      LDB A,I 
      STB TEMP      NEGATIVE # ENTRIES. 
      ADA B2
      STA TEMP2     ADDR OF 1ST PROGRAM NAME. 
* 
      SKP 
CLCK1 LDA MD3 
      STA TEMP3     COUNTER FOR COMPARE.
      LDA QENT
      ADA B4
      STA TEMP1     ADDR OF PROG NAME IN QUE ENT. 
      LDB TEMP2     ADDR OF PROG NAME IN WAIT-LIST. 
* 
CLCK2 LDA TEMP1,I   COMPARE NAMES.
      CPA B,I 
      INB,RSS 
      JMP MISS      MISMATCH. 
      ISZ TEMP1 
      ISZ TEMP3 
      JMP CLCK2 
* 
      LDB TEMP2     MATCH.
      ADB MD1 
      CCA           SET CLOCK TIME TO -1. 
      STA B,I 
CLCK3 JSB $LIBX 
      DEF CLOCK 
* 
MISS  LDA TEMP2     GO TO NEXT ENTRY IN WAIT-LIST.
      ADA B5
      STA TEMP2 
      ISZ TEMP
      JMP CLCK1 
      JMP CLCK3     IGNORE IF NOT FOUND.
* 
* MASTER PTOPC PARMB RECEIVED.
* 
PTOPC LDA RBUFD     GET ADDR OF PROG NAME.
      ADA B5
      STA NAME
* 
      LDA IRBUF+2   GET FUNCTION CODE.
      AND B7
      CPA B1
      RSS 
      JMP PSTAT     PREAD/PWRIT/PCONT.
* 
* POPEN PARMB. SCHEDULE THE SLAVE PROGRAM.
* 
      LDB %CSID     ANY SLAVE PROG ACTIVE?
      SZB,RSS 
      JMP PSCHD     NO. 
* 
      ADB D15       YES. ALIVE? 
      LDA B,I       STATUS WORD OF ID SEG.
      AND B17 
      SZA 
      JMP SAME      CURRENTLY ALIVE.
* 
      SKP 
      JSB $LIBR     PREVIOUS SLAVE PROG WAS ABORTED:
      NOP           CLEAR MAILBOX FLAG. 
      CLA 
      STA %MFLG 
      JSB $LIBX 
      DEF *+1 
      DEF PSCHD     GO SCHEDULE NEW SLAVE.
* 
SAME  LDA RBUFD     CHECK IF POPEN IS FOR CURRENTLY 
      ADA B5        RUNNING SLAVE PROGRAM.
      LDB %CSNM 
      JSB CMPAR     COMPARE NAMES 
      JMP FLGUP     MISMATCH. ERROR.
      JMP PTPQ      MATCH.
* 
PSCHD JSB EXEC      ATTEMPT TO SCHEDULE.
      DEF *+3 
      DEF SD10      WITHOUT WAIT. 
NAME  NOP           NAME OF SLAVE PROGRAM 
* 
      NOP           IGNORE ERROR RETURN.
      LDB MD41
      CPA AS.SC     CHECK SCHEDULE STATUS.
      JMP REJRQ     NO SUCH PROGRAM.
      JMP PTPQ      NOW (OR WAS) SCHEDULED. 
* 
* PREAD/PWRIT/PCONT:PCLOS:
* FIND CURRENT STATUS OF SLAVE PROGRAM. 
* 
PSTAT LDB IRBUF+5   GET ADDR OF ID SEGMENT
      ADB D12 
      STB NAME      ADDR OF PROG NAME.
      ADB B3
      LDA B,I       STATUS WORD.
      AND B17 
      LDB MD45
      SZA,RSS 
      JMP REJRQ     PROGRAM IS DEAD.
* 
* PLACE PTOPC PARMB IN MAILBOX. 
* 
PTPQ  LDA RBUFD     ADDR OF PARMB.
      JSB @PTPQ 
      JMP FLGUP 
* 
      SKP 
* RESTART USER IF IN OPERATOR SUSPEND LIST. 
* 
      LDA %CSID     GET ID SEGMENT ADDRESS. 
      ADA D15 
      LDA A,I 
      AND B17 
      CPA B6
      JMP *+2 
      JMP EXIT      NOT OP SUSPENDED. 
* 
      JSB $LIBR     RESTART THE PROGRAM.
      NOP 
      LDB $DWRK     ADDR OF "WORK" IN SCHEDULER.
      SSB,RSS 
      JMP *+3 
      ELB,CLE,ERB 
      LDB B,I 
* 
      LDA %CSID     SET-UP FOR $LINK CALL:
      STA B,I        "WORK" 
      INB 
      STA B,I        "WLINK"
      INB 
      ADA B6
      STA B,I        "WPRIO". 
* 
      ADA D9        SET STATUS WORD IN
      CLB,INB        ID SEG = SCHEDULED.
      STB A,I 
* 
      JSB $LINK     REMOVE USER FROM
B6    OCT 6          OP SUSP LIST AND 
      OCT 1          ADD TO SCHEDULE LIST.
* 
      JSB $LIBX     TERMINATE.
      DEF *+1 
      DEF EXIT
* 
FLGUP LDB MD42
* 
      SKP 
* SEND REJECT REPLY BACK TO CENTRAL. USE IRBUF. 
* 
REJRQ STB IRBUF+3   STORE ERROR CODE. 
      LDA IRBUF+2 
      AND B377
      IOR RJBTS 
      STA IRBUF+2   STORE FLAG WORD.
* 
SNREJ LDA IRBUF     SET REPLY BIT,
      IOR RPLFL       AND FRIENDLY-SATELLITE BIT(#11).
      STA IRBUF 
* 
      JSB EXEC      SEND REPLY. 
      DEF *+7 
      DEF B2
      DEF %LU 
      DEF IRBUF 
      DEF IRBFL 
      DEF DUMMY 
      DEF DUMMY 
* 
      JMP EXIT
      SPC 3 
* 
*  COMPARE 3 WORDS
CMPAR NOP 
      DST TEMP1 
      LDB MD3 
LOOP1 LDA TEMP1,I 
      CPA TEMP2,I   MATCH?
      RSS           YES 
      JMP CMPAR,I   NO, RETURN+1
      ISZ TEMP1 
      ISZ TEMP2 
      INB,SZB 
      JMP LOOP1     ITERATE 
      ISZ CMPAR 
      JMP CMPAR,I   RETURN+2
      SKP 
* 
* CONSTANTS AND WORKING STORAGE.
* 
B2    OCT 2 
B3    OCT 3 
B4    OCT 4 
B5    OCT 5 
B7    OCT 7 
B17   OCT 17
B377  OCT 377 
D9    DEC 9 
EQT12 NOP 
DUMMY NOP 
SD10  OCT 100012
D12   DEC 12
D15   DEC 15
MD1   DEC -1
MD3   DEC -3
MD35  DEC -35 
MD41  DEC -41 
MD42  DEC -42 
MD45  DEC -45 
TEMP  NOP 
TEMP1 DEC 0,0 
TEMP2 EQU TEMP1+1 
TEMP3 NOP 
$DWRK DEF $WORK 
RPLFL OCT 44000 
RJBTS OCT 100000
AS.RQ ASC 1,RQ
AS.SP ASC 1,
D@RQP ASC 3,@RQPR 
AS.SC ASC 1,SC
RBUFD DEF IRBUF 
IRBUF BSS 35
IRBFL DEC 35
* 
SIZE  EQU * 
* 
      END @INTR 
                                                    