ASMB,L,R,C
      HED %INTR 91704-16103 REV A * (C) HEWLETT-PACKARD CO. 1976
      NAM %INTR,1,3 91704-16103 REV A 760212
      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 2 
      SPC 1 
********************************************* 
* 
*%INTR              PROGRAM TO HANDLE DISTRIBUTED SYSTEM INTERUPTS
* 
*SOURCE PART #      91704-18103 REV A 
* 
*REL PART #         91704-16103 REV A 
* 
*WRITTEN BY:        LARRY POMATTO 
* 
*DATE WRITTEN:      11-21-74
* 
*MODIFIED BY:       JEAN-PIERRE BAUDOUIN
* 
*DATE MODIFIED:     DEC 1975
* 
**********************************************
      SPC 1 
* 
*     PROGRAM SCHEDULED BY DVR65 ON AN INTERUPT 
*     WILL BRANCH TO CORRECT ROUTINE DEPENDING ON 
*     STREAM TYPE 
* 
*     DEFINE EXTERNALS
* 
      EXT  REPLA,EXEC,FRPLY 
      EXT FINDT,TRFLG,MSTFL,MSTB
      EXT %MOVE,DBSY
      SPC 2 
* 
*     DEFINE ENTRIES
* 
      ENT %BUF
* 
*     DEFINE LISTING OPTIONS
* 
      SUP 
* 
*     DEFINE A AND B REGS 
* 
A     EQU 0 
B     EQU 1 
* 
      SPC 3 
START ISZ DBSY      SET INTERUPT PROG BUSY
      JSB EQLU      GET LU
      SZA,RSS       LU DEFINED? 
      JMP RPERR     NO...IGNORE INTERUPT
      STA LU
      JSB RREQ      READ REQUEST
      LDA %BUF      GET STREAM TYPE 
      AND BIT14     GET REQ/REPLY FLAG
      STA TEMP      SAVE FOR LATTER 
      LDA %BUF      GET STREAM AGAIN
      AND B377      AND KEEP ONLY THE STREAM TYPE 
      STA %BUF      SAVE WITH BIT 14 OFF
      STA B         CHECK LIMITS
      ADB M10       CAN'T BE LARGER THAN 9
      SSB 
      SSA 
      LDA D10       SET FOR STREAM ERROR
      LDB A         GET STREAM AGAIN
      ADA BRNTA 
      ADB BRNTB 
      STB TEMP1 
      LDB TEMP
      SZB,RSS       REPLY?
      LDA TEMP1     NO...REQUEST
      LDA A,I 
      JMP A,I       AND GO TO THE ROUTINE 
      SPC 2 
* 
*     REPLY 
* 
BRNTA DEF *+1 
      DEF RFAR      GET LU
      DEF RFAR      DLIST 
      DEF RFAR      PROGRAM LOAD SAVE 
      DEF RPERR     PROGL...ERROR 
      DEF PTPR      PROGRAM TO PROGRAM REPLY
      DEF RFAR      REMOTE EXEC REPLY 
      DEF RFAR      REMOTE RFA REPLY
      DEF RPERR     OPERATOR COMMANDS...ERROR 
      DEF RPERR     FORCED DOWN LOAD...ERROR
      DEF RPERR     UNDEFINED...ERROR 
      DEF RPERR     UNDEFINED...ERROR 
      SPC 2 
* 
*     REQUEST 
* 
BRNTB DEF *+1 
      DEF GETLU     GET LU
      DEF RERR      DLIST 
      DEF RERR      PROGRAM LOAD SAVE 
      DEF RERR      PROGL 
      DEF PTPR      PROGRAM TO PROGRAM..REQUEST 
      DEF REXEC     REMOTE EXEC REQUEST 
      DEF RERR      FMGR REQUEST
      DEF RERR      OPERATOR COMMANDS 
      DEF RERR      FORCED DOWN LOAD
      DEF RERR      UNDEFINED 
      DEF RERR      UNDEFINED 
      SPC 2 
* 
*     HERE ON RFA REPLY 
* 
RFAR  LDA REPLA     GET REPLY BUFFER ADDRESS
      STA REPLY     SAVE ADDRESS
      LDA RREQ1     GET SOURCE ADDRESS
      LDB D35       GET LENGTH
      JSB %MOVE     MOVE TO REPLY BUFFER AREA 
REPLY NOP           REPLY BUFFER ADDRESS
      LDA LINST     GET STATUS OF REQUEST 
      STA FRPLY     SET FOR COMPLETION...AND LENGTH 
      JMP TERM      TERMINATE ,INTR 
      SPC 3 
* 
*     HERE ON GET LU REQUEST
* 
GETLU LDA LU        GET LU OF SERIAL INTERFACE
      STA REFCD     SAVE FOR REPLY
      JSB SRPLY     SEND REPLY
      JMP TERM      AND TERMINATE 
      SPC 3 
* 
*     HERE FOR PROGRAM TO PROGRAM COMUNICATION
* 
PTPR  LDA RREQ1     GET REPLY BUFFER ADDRESS
      ADA C2        GET TO FUNCTION CODE WORD 
      LDA A,I       GET FUNCTION CODE 
      ALF,ALF       WANT TO CHECK BIT 7 
      SSA           IS IT A REPLY?
      JMP RFAR      YES...TREAT LIKE RFA
      SPC 2 
* 
*     HERE FOR SLAVE PROGRAM TO PROGRAM ROUTINES
*     THIS ROUTINE USES FINDT TO GET THE TRAP # 
*     AS SPECIFIED BY CENTRAL. THE TRAP IS THEN SET 
*     AND THE PARMB IS MOVED INTO CORE RESIDENT LIBRARY 
*     FOR LATTER AXCESS BY BASIC ROUTINES THAT HANDLE 
*     SLAVE CALLS.
* 
      LDB RREQ1     GET BUFFER ADDRESS
      ADB C7        GET TO TRAP#
      LDA B,I       GET TRAP# 
      ALF,ALF       GET 10'S DIGIT
      AND B17       MASK OFF THE ASC 60 
      STB TEMP      SAVE ADDRESS OF LU
      MPY D10       MULTIPY BY 10 
      STA TEMP1 
      LDA TEMP,I    GET TRAP # AGAIN
      AND B17       MASK OFF TO BINARY #
      ADA TEMP1 
      ALF,ALF       GET IN CORRECT POSITON FOR FINDT
      JSB FINDT     SEE IF TRAP ASSIGNED
      JMP TRPNT     TRAP NOT THERE
      LDA B,I       B REG POINTS TO TRAP ACTIVE WORD
      IOR BIT15     SET TRAP ACTIVE 
      STA B,I       SAVE TRAP ACTIVE
      STA TRFLG     SET TRAP PENDING FLAG 
      LDA MSTBA     GET MASTER PARMB BUFFER ADDRESS 
      JSB INDCK 
      STA MSTBA     CLEAR OFF INDIRECTS 
      LDA RREQ1     GET SOURCE BUFFER ADDRESS 
      LDB D35       GET PARMB LENGTH
      STB MSTFL     SET LENGTH OF TRANSFER
      JSB %MOVE     MOVE PARMB TO CORE RESIDENT LIB 
MSTBA DEF MSTB      BUFFER ADDRESS OF MASTER PARMB AREA 
      JMP TERM      ALL DONE, TERMINATE 
      SPC 1 
* 
*     HERE IF TRAP NOT SET...SEND A -41 ERROR 
*     TO CENTRAL
* 
TRPNT LDB RREQ1     GET TO STATUS WORD
      ADB C2
      LDA B,I       GET STATUS WORD 
      IOR NTERR     NOT THERE ERROR... BITS 15,7,2
      STA B,I       SAVE ERROR STATUS 
      INB           GET TO ERROR WORD 
      LDA M41       GET -41 ERROR 
      STA B,I       SAVE ERROR
      JSB ENLIN     CLEAR LINE IF REQUIRED
      JSB SRPLY     AND SEND REPLY
      JMP TERM      DONE...TERMINATE
      SPC 1 
M41   DEC -41 
      SPC 4 
* 
*     HERE ON REMOTE EXEC CALLS 
* 
REXEC LDA RCOD      GET REQUEST CODE
      XOR C3        REVERSE DIRECTION IF READ OR WRITE
      STA DDIR      SAVE DIRECTION FLAG 
      XOR C3        GET IT BACK TO NORMAL 
      IOR BIT15     SET FOR SPECIAL EXEC REQ CODE 
      STA RCOD      SAVE REQUEST CODE 
      XOR BIT15     STIP OFF BIT 15 FOR CHECK 
      CPA C1        IS IT A READ? 
      JMP REQ1      YES 
      CPA C2        IS IT A WRITE?
      JMP REQ2      YES 
      CPA C3        IS IT A CONTROL REQUEST?
      JMP REQ3      YES 
      CPA D13       IS IT A STATUS REQUEST? 
      JMP REQ13     YES 
      CPA D10       IS IT A TRAP CALL?
      JMP REQ10     YES 
* 
*     ILLEGAL EXEC CALL FOR THIS TERMINAL 
* 
      JSB ENLIN     CLEAR THE LINE IF REQUIRED
      DLD RQER      "RQ  " REQUEST ERROR
      SPC 1 
* 
*     HERE TO TERMINATE REMOTE EXEC CALLS 
*     A AND B REG CONTAIN CORRECT STATUS
*     AS TO WHAT THE CENTRAL USER RECEIVES
* 
REDN  DST SABRG     SAVE A AND B REG
      JSB SRPLY     SEND REPLY
      JMP TERM      AND TERMINATE 
      SPC 2 
* 
*     HERE ON READ REQUEST
* 
REQ1  LDA DLEN      GET LENGTH OF DATA BUFFER 
      SPC 2 
* 
*     HERE ON WRITE REQUEST 
* 
REQ2  EQU REQ1      SAME AS READ
      LDB DLEN      GET IT AGAIN
      ADA MMDBS     IS IT GREATER THAN MAX DATA BUF SIZE? 
      SZA           OR IS THERE A DATA BUFFER LENGTH
      SSA,RSS 
      RSS           ERROR 
      JMP REQ22     NO ERROR
      JSB ENLIN     CLEAR THE LINE
      DLD BFER      "BF  " BUFFER ERROR 
      JMP REDN      AND TERMINATE REQUEST 
* 
REQ22 LDA DDIR      GET DIRECTION AGAIN 
      CPA C2        IS IT A READ (REMEMBER WE INVERTED...)
      JSB RWEX      YES...READ FROM DEVICE FIRST
      DST ABREG     SAVE A AND B REG
      LDA DDIR      GET DATA DIRECTION
      STA IRW 
      LDA LU        GET LU
      AND B77         KEEP ONLY LOW 6 BITS
      IOR B300          SET DATA ONLY CODE
      STA CNWD      SAVE
      JSB EXEC      READ OR WRITE TO OR FROM CENTRAL
      DEF *+7 
      DEF IRW       REQUEST CODE
      DEF CNWD      COONTROL
      DEF %DBUF 
      DEF DLEN
      DEF %BUF+33   PASS TIME-TAGS
      DEF %BUF+34 
      LDA DDIR      GET DIRECTION 
      CLE,ERA       SET DIRECTION INTO E REG
      DLD ABREG     GET STATUS AGAIN
      SEZ           IS IT A READ? 
      JSB RWEX      NO...WRITE...WRITE TO DEVICE
      JMP REDN      ALL DONE
      SPC 2 
* 
*     HERE ON CONTROL REQUEST 
* 
REQ3  JSB EXEC      ISSUE LOCAL CONTROL REQUEST 
      DEF *+4 
      DEF RCOD
      DEF PRM1
      DEF PRM2
      NOP           ALLOW FOR ERROR CONDITION 
      JMP REDN      AND TERMINATE 
      SPC 2 
* 
*     HERE ON A TRAP CALL 
* 
REQ10 LDA PRM3      GET TRAP #
      ALF,ALF       GET TENS DIGIT
      AND B17 
      MPY D10       GET TO TENS POSITION
      STA TEMP
      LDA PRM3      GET ONES DIGIT
      AND B17 
      IOR TEMP      MERGE TENS AND ONES 
      ALF,ALF       GET IN CORRECT ORDER FOR CHECK
      JSB FINDT     SEE IF TRAP AVAILABLE 
      JMP TRPER     NO...ERROR..NO TRAP...OR NOT IN RUN STATS 
      LDA B,I       B REG POINTS TO TRAP ACTIVE FLAG
      IOR BIT15     SET TRAP ACTIVE 
      STA B,I       SAVE TRAP ACTIVE
      STA TRFLG     SET FOR TRAP PENDING
      CLA           SET FOR ALL OK
      CLB 
      JMP REDN      DONE
      SPC 1 
* 
*     HERE IF TRAP ERROR OCCURED
* 
TRPER DLD SC05      SEND ERROR BACK...SCHEDULE ERROR
      JMP REDN      DONE
      SPC 2 
* 
*     HERE ON STATUS REQUEST
* 
REQ13 JSB EXEC      ISSUE LOCAL STATUS CALL 
      DEF *+5 
      DEF RCOD
      DEF PRM1
      DEF PRM1      RETURN STATUS GOES HERE 
      DEF PRM2      OPTION RETURN GOES HERE 
      NOP           ALLOW FOR ERROR RETURN
      JMP REDN      AND TERMINATE CALL
      SPC 3 
* 
*     SUBROUTINE TO READ OR WRITE DATA TO I-O DEVICE
*     CALLING SEQUENCE
*     JSB RWEX
* 
RWEX  NOP 
      JSB EXEC      DO THE EXEC CALL
      DEF *+7 
      DEF RCOD
      DEF PRM1
      DEF %DBUF 
      DEF PRM2
      DEF PRM3
      DEF PRM4
      NOP           INCASE OF ERROR 
      JMP RWEX,I    AND RETURN
      SPC 3 
* 
*     SUBROUTINE TO SEND STOP IF NEEDED AND REENABLE LISTEN 
*     MODE
* 
ENLIN NOP 
      LDA LU        GET LU OF SDI CARD
      AND B77 
      IOR B100      SET IN ENABLE LISTEN MODE BIT 
      STA CNWD      SAVE FOR CALL 
      JSB EXEC      MAKE THE CALL 
      DEF *+3 
      DEF D3        CONTROL 
      DEF CNWD      LSTEN 
      JMP ENLIN,I   AND RETURN
      SPC 1 
ENLN1 NOP 
      SPC 3 
* 
*     SUBROUTINE TO SEND REPLY
* 
SRPLY NOP 
      LDA M10       GET ERROR COUNTER 
      STA ERCNT 
      LDA %BUF      GET STREAM TYPE 
      IOR B1411     SET IN REPLY FLAG & FRIENDLY BIT
      STA %BUF      AND REPLACE IT
* 
      LDA LU
      AND B77 
      STA CNWD
RETRY JSB EXEC
      DEF *+5 
      DEF D2I       WRITE 
      DEF CNWD      REQUEST ONLY
      DEF %BUF
      DEF D35 
      JMP RTR1      ALLOW FOR ERROR RETURN
      JSB STAT      CHECK STATUS
      RSS           ERROR...TRY AGAIN 
      JMP SRPLY,I   AND RETURN
RTR1  ISZ ERCNT     MAX# OF TIMES?
      JMP RETRY     NO
      JMP SRPLY,I   YES 
      SPC 1 
ERCNT NOP 
* 
*     HERE ON UNKNOWN STREAM ERROR
*     FOR REQUEST 
* 
RERR  JSB ENLIN     CLEAR LINE IF DATA
      DLD ILERR     "ILRQ"...ERROR MESSAGE RETURNED 
      DST %BUF+2
      JSB SRPLY     SEND ERROR REPLY
      JMP TERM      AND TERMINATE 
      SPC 2 
* 
*     HERE FOR UNKNOW STREAM ERROR
*     FOR REPLY 
* 
RPERR JSB ENLIN     CLEAR LINE IF DATA
      JMP TERM      IGNORE INTERUPT 
      SPC 3 
* 
*     ROUTINE TO READ A REQUEST 
* 
RREQ  NOP 
      LDA LU
      AND B77 
      STA CNWD
      JSB EXEC
      DEF *+5 
      DEF D1I       READ
      DEF CNWD      REQ. ONLY 
RREQ1 DEF %BUF      READ INTO REQUEST BUFFER
      DEF D35       35 WORDS
      JMP RPERR     ERROR RETURN
      AND B377
      STA LINST     SAVE STATUS 
      JSB STAT      GO CHECK STATUS 
      JMP RPERR     READ ERROR...IGNORE INTERUPT
      JMP RREQ,I    A REG= BUF ADD  B= BUF LEN
* 
*     DO A STATUS CHECK 
* 
STAT  NOP 
      SLA           ALL OK? 
      ISZ STAT      YES 
      JMP STAT,I    YES 
      SPC 3 
* 
*     INDIRECT CHASE DOWN 
* 
INDCK NOP 
      RSS 
      LDA A,I 
      RAL,CLE,SLA,ERA 
      JMP *-2 
      JMP INDCK,I 
      SPC 3 
* 
*     HERE TO TERMINATE PROGRAM 
* 
TERM  CLA           TELL BASIC NOT BUSY 
      STA DBSY
      JSB EXEC      TERMINATE PROGRAM 
      DEF *+2 
      DEF C6
      SKP 
* 
*     ROUTINE TO FIND THE LOGICAL UNIT NUMBER OF A DEVICE 
*     GIVEN THE ADDRESS OF WORD 4 OF ITS EQUIPMENT TABLE
*          CALLED AS FOLLOWS: 
* 
*          LDB EQT4       (PASSED FROM DVR00) 
*          JSB  EQLU
*          A = 0   IF NOT FOUND -OR-
*          A = THE LOGICAL UNIT NUMBER IF FOUND 
      SUP 
EQLU  NOP        ENTRY
      STB EQT4     SAVE B-REG FOR LATER TEST
      CLA 
      STA LUNUM    SET LU POINTER 
NEXT  LDA LUNUM    GET CURRENT LU NUM-1 
      CPA LUMAX    DONE THRU ALL LU'S 
      JMP NTFND    YES, NOT FOUND!! 
      ISZ LUNUM    BUMP TO CURRENT LU 
      ADA DRT      POINT TO TABLE ADDRESS 
      LDA 0,I      GET CONTENTS 
      AND O77      MASK OF SUBCHANNEL BITS
      MPY D15      CALCULATE ADDRESS OF WORD 4
      ADA EQTA     BASE ADDRESS 
      ADA DM12     SUBTRACK ONE EQT & ADD DEC 3 
      CPA EQT4     COMPARE??
      JMP FOUND    YES !! 
      JMP NEXT     NO, TRY NEXT ONE 
      SPC 1 
NTFND STB LUNUM    NOT FOUND RETURN A=0 
FOUND LDA LUNUM    FOUND RETURN A= LU NUMBER
      DIV D10      CONVERT TO ASCII 
      ALF,ALF      POSITION MOST SIG. DIGIT 
      ADB 0        MIRGE IN LEAST 
      ADB ASC00    CONVERT TO ASCII 
      LDA LUNUM    RESTORE BINARY VALUE 
      JMP EQLU,I    RETURN
      SPC 1 
EQT4  NOP 
LUNUM NOP 
O77   OCT 77
ASC00 ASC 1,00
D15   DEC 15
DM12  DEC -12 
EQTA  EQU 1650B 
DRT   EQU 1652B 
LUMAX EQU 1653B 
      SKP 
* 
*     DEFINE CONSTANTS
* 
LINST NOP 
LU    NOP 
B100  OCT 100 
C6    OCT 6 
C2    OCT 2 
C1    OCT 1 
C3    OCT 3 
C7    OCT 7 
D10   DEC 10
D35   DEC 35
D13   DEC 13
B17   OCT 17
B77   OCT 77
B300  OCT 300 
D3   DEC 3
D1I   OCT 100001
D2I   OCT 100002
M10   DEC -10 
BIT14 OCT 40000 
B1411 OCT 44000 
NBT14 OCT 137777
BIT15 OCT 100000
NTERR OCT 100204
B377  OCT 377 
CNWD  NOP 
IRW   NOP 
DUMMY NOP 
ABREG BSS 2 
TEMP  NOP 
TEMP1 NOP 
ILERR ASC 1,ILRQ
RQER  ASC 2,RQ
BFER  ASC 2,BF
SC05  ASC 2,SC05
MDBS  EQU 512       MAX DATA BUFFER SIZE
MMDBS ABS -MDBS-1 
      SPC 1 
.     EQU * 
SID   NOP 
      BSS 1 
REFCD NOP 
      BSS 2 
SABRG NOP 
RCOD  NOP 
PRM1  NOP 
PRM2  NOP 
PRM3  NOP 
PRM4  NOP 
DLEN  NOP 
DDIR  NOP 
      SPC 1 
      ORG .         RESET TO MAKE SURE 35 WORD PRAMB
%BUF  BSS 35
      SPC 1 
%DBUF BSS MDBS      LENGTH OF DATA BUFFER 
* 
END   EQU * 
      END START 
                                                                                                                                                                          