ASMB,R,L,C
*     NAME:   ID.37 
*     SOURCE: 92071-18095 
*     RELOC:  92071-16095 
*     PGMR:   C.H.W.,D.L.M
* 
*  **************************************************************** 
*  * (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.37,0  92071-16095  REV.2041 800722 
* 
* 
* 
      GEN 13,EID.37,QU:PR,TX:124,IT:37B 
* 
      ENT ID.37 
* 
      EXT $IF2,$IF3,$IF5,$IF6,$IF7,$IFTX
      EXT $DV1,$DV13,$DV15,$DV16
      EXT $DV17,$DV18,$DV19,$DV20,$DVTP 
      EXT $LIST,$NAME,$RUN#,$DIOC,$IDSZ,$IDA
      EXT .MVW,$DVLU,$SYMG,$CVT1,$DMPR
      EXT $ONER,$ONEW,$SETR,$SELR,$IF1
* 
      SUP 
**  DEFINE SELECT CODES - ALWAYS ENTERED WITH GLOBAL REG ENABLED ** 
DMA   EQU 20B       DMA SELECT CODE 
PHI   EQU 30B       PHI DATA
CARD  EQU 31B       CARD CONTROL DATA 
* 
* ENTRY CODE        MEANING 
* A REGISTER
* 
* 0                 ABORT 
* 1                 INITIATE
* 2                 CONTINUE
* 3                 TIME OUT
* 4                 POWERFAIL 
* 
      SKP 
ID.37 NOP 
      LDB $IFTX 
      STB DMNXT     ADDR FOR BUILDING QUADS 
      ADB B60 
      STB BUFST     ADDR FOR BUILDING CMD BUFFERS 
      ADB B34       SKIP TO 76TH WORD OF IFT EXT
      CPB IFX1      ARE EXTENSION ADDRS SET?
      JMP BEGIN      YES
* 
      STA TEMP2 
      LDA N9        SET-UP 9 EXT POINTERS (16 WORDS)
      STA TEMP1 
      LDA IFX 
      STB 0,I       SET NEXT
      INA 
      INB 
      ISZ TEMP1 
      JMP *-4 
      ADB B37       POINT TO SERIAL POLL
      STB 0,I        ENTRY
*  NOW DETERMINE # OF ENTRIES IN SERIAL POLL TABLE
      LDA $IF7,I
      AND B777      9-BIT FIELD 
      ADA N116      REST OF EXT. = 116 WORDS
      ARS,ARS 
      CMA,INA       # OF WORDS FOR SRQ TABLE / -4 
      STA SRQ#      NEG # OF ENTRIES (NONE IF +)
      LDA TEMP2 
* 
BEGIN AND B7        REQ CODE IN BITS 0-2
      STA CACON     INITIALIZE CACON 15=0 
      CPA B2
      JMP CONT      --CONTINUE--
      CPA B1
      JMP INIT      --INITIATE--
      SZA,RSS 
      JMP ABORT     --ABORT-- 
      SLA 
      JMP TIMOT     --TIMEOUT-- 
      SPC 2 
*  POWER FAILURE - RESET CARD, SEND IFC FOR 10 MSECS, AND 
*                  FORCE REISSUE OF CURRENT REQUEST 
      JSB DOIFC     RESET ALL 
      LDB $IF6,I    GET IFT STATUS
      SSB,RSS       BUSY? 
      JMP PCONT      NO, DO A CONTINUE EXIT 
      LDA BN2       =100077B - DON'T DOWN, FLUSH, OR LOG
      JMP ERSET 
      HED 92070-18056  HPIB DRIVER - REQUEST INITIATION SECTION 
* 
INIT  LDA $IF7,I    -INITIATE A NEW REQUEST- CHECK FOR FIRST ENTRY
      AND NOT10     TEST BIT 10 
      CPA $IF7,I    FIRST TIME? 
      JMP NEWRQ      NO 
      STA $IF7,I     YES, CLEAR FIRST-TIME FLAG 
      LDA BN6       INITIAL INTERRUPT MASK (PHI 3)
      STA IFX3,I     ENABLES PPOLL BUT NOT SRQ
      LDA .04       =40000B - INITIALIZE PPOLL MASK 
      STA IFX4,I     FOR NO LINES ENABLED 
      LDA .05       INITIALIZE PARALLEL POLL
      STA IFX5,I     NORMALIZATION MASK 
      LDA BN8       =60040 - PHI 6, 
      STA IFX6,I     SET REN
      JSB DOIFC     INITIALIZE CARD 
* 
NEWRQ LDB IFX1,I    LAST PROCESSING STATE 
      LDA B3
      SZB           DID LAST REQUEST CLEAN-UP?
      JMP ABORX      NO! TRY AGAIN & DOWN IF IT FAILS 
* 
      STB IFX7,I    INITIALIZE RESIDUE POINTER
      AND $DV15,I   GET CONWD 
      SZA,RSS       CHECK FOR MULTI BUFFER REQUEST
      JMP MUBUF     --MULTIBUFFER-- 
      LDB 0 
      LDA IFX6,I    CURRENT REN STATE 
      IOR B3        SET TO OUTPUT FIFO, & CLEAR IT
      JSB SDPHI     SET INITIAL CONDITION 
      CPB B3
      JMP CNTRL     --CONTROL-- 
* 
**************************************************
* THIS IS A READ OR WRITE REQUEST                  *
****************************************************
* 
      LDB $DV15,I   SET  "CONWD"
      STB CONWD 
* 
      LDA $DVTP,I    GET HPIB ADDRESS 
      ADA N30 
      SZA           CHECK FOR CONTROLLER ADDRESS
      JMP ATOAD     --DEVICE LU-- 
      HED 92070-18056  HPIB - REQ INITIATION - READ/WRITE 
      SKP 
* 
********************************************* 
* THIS IS DIRECT IO. NO AUTO-ADDRESSING TO HPIB LU
**************************************************
* 
      CPA $DV19,I   CHECK FOR EMPTY CONTROL BUFFER
      JMP OVR10     --NO CONTROL BUFFER-- 
* 
*********************************************** 
* THIS REQUEST HAS A CONTROL BUFFER TO OUTPUT * 
*********************************************** 
* 
      JSB SENDZ     SEND CMD (Z) BUFFER 
      JMP REJ1      ERROR IF Z-BIT NOT-SET
      CLA 
      CPA $DV17,I   DATA BUFFER SPECIFIED?
      JMP BUFEM      NO, DO ADDRESSING ONLY 
* 
OVR10 CPA $DV17,I   CHECK XLOG OF DATA BUFFER 
      JMP PDONE     REQUEST COMPLETE
* 
********************************************
* THIS REQUEST HAS A DATA BUFFER. EITHER READ OR WRITE
********************************************
* 
      LDA $DV15,I   GET CONWD FOR DATA BUFFER 
      SLA,RSS       IS THIS A WRITE?
      JMP OVR25      YES, NO XFER COUNT QUAD NEEDED 
      LDB $DV17,I   XFER DATA LENGTH
      STB LEN 
      LDA .1410     DMA CONWD=CONT,STC,FOUR 
      CLB 
      JSB PUT2
      LDA BUFST 
      JSB PUT       SET BUFFER ADDR 
      LDA $DV15,I   CONWD=READ
      JSB PHIST     SET PHI 0 & PHI 6 FOR INPUT 
      JMP OVR25 
      SKP 
************************************* 
* AUTOADDRESS REQUEST FOR DEVICE LU  AUTOADDRESSING ONLY *
* A SINGLE DATA BUFFER IS ALLOWED 
************************************* 
* 
ATOAD BLF,SLB       IS Z-BIT SET? 
      JMP REJ1       YES, REQ ERROR 
      LDA $DV17,I 
      STA LEN       SAVE LENGTH FOR "PHIST" 
      LDA $DV18,I   GET SECONDARY ADDR
      SZA           WAS ONE SPECIFIED?
      IOR B140       YES, ENSURE A VALID SECONDARY
      JSB BDADS     BUILD ADDRESS QUAD. 
      LDA $DV17,I 
      SZA,RSS       $DV17 IS XLOG 
      JMP OVR30     DATA BUFFER XLOG =0 
* 
OVR25 JSB BWRDS     GO BUILD CARD AND DMA CONTROL WORDS 
      LDA $DV16,I   GET BUFFER ADD. 
      JSB PUT 
      LDA DMNXT     ADDR WHERE RESIDUE WILL BE LEFT 
      STA IFX7,I     IS SAVED FOR LATER 
      LDA $DV17,I   GET DATA BUFFER LENGTH
      CMA,SSA,INA,RSS  SKIP IF WORDS
      CMA,INA,RSS   LEAVE IT AS NEG BYTES 
      CLE,ELA       CONVERT WORD TO NEG BYTE COUNT
      JSB PUT       STORE IN QUAD 
* 
OVR30 LDA $DV15,I   CHECK FOR TERMINATOR (ASCII OR BINARY)
      AND B2101     BIT10=TRANSPARENCY,BIT6=ASCII/BINARY
      LDB $DV17,I   GET REQ LENGTH
      SZA 
      JMP BINRY     NOT A NON-TRANSPARENT ASCII WRITE 
      SZB,RSS       NO DATA?
      JMP OVR32 
      CPB N1         JUST 1 BYTE? 
      JMP OVR31       YES, DON'T CK FOR BACK ARROW
*  CHECK IF LAST CHARACTER IS A BACK ARROW, & DONT ADD CR,LF IF IT IS 
      CCE,SSB,RSS   SKIP IF GIVEN IN BYTES
      CMB,CLE,INB,RSS  NEG.WORD COUNT 
      ERB           -(# BYTES+1)/2
      CMB           WORDS-1 OR (BYTES+1) 2-1
      ADB $DV16,I   POINT TO LAST WD IN BUFFER
      LDA $IF5,I    (*)GET THE LAST DVT ADDRESS 
      STA DVT1      (*)STORE IN LINE
      JSB $ONER     (*)READ IT
       DEF $DV15,I  (*) 
DVT1   NOP          (*) 
      CCB,SEZ       IN LHW? 
      ALF,ALF        YES
      AND B377      ISOLATE RHW 
OVR31 ADB DMNXT     QUAD POINTER -1 
      CPA B137      IS IT A BACK ARROW? 
      JMP ARROW      YES, DONT SEND "CR,LF" 
* 
      ADB N2        POINT TO CARD CONWD OF
      LDA B2000      PREVIOUS QUAD &
      STA 1,I         CLEAR "EOI" BIT 
* 
*  BUILD THE DMA QUADRUPLET FOR THE CRLF TERMINATOR 
* 
OVR32 LDA .1610     DMA CONWD=CONT,STC,BYTE,FOUR
      LDB B3000     CARD CONWD=BYTE,EOI,OUT 
      JSB PUT2      STORE 2 DMA QUAD WORDS
      LDA #CRLF     ADDR OF CRLF
* 
OVR50 LDB N2        LEN=2 CHARS 
OVR51 JSB PUT2      STORE 2 DMA QUAD WORDS
      RSS           SKIP BACKARROW REMOVAL
      SPC 3 
ARROW ISZ 1,I       SUB 1 FROM NEG BYTE COUNT 
      SPC 5 
*  HERE WHEN LAST DMA QUAD IS A WRITE.  THIS BUILDS AN ADDITIONAL 
*  QUAD TO ENABLE THE "BUFFER EMPTY" INTERRUPT.  WHEN THIS QUAD 
*  HAS COMPLETED, AND THE OUTBOUND FIFO IS EMPTY, THE CARD WILL 
*  INTERRUPT TO SIGNIFY THE ENTIRE OPERATION IS COMPLETE. 
*  NOTE THAT "CINT" IS 1 SO THAT THE DMA COMPLETION INTERRUPT 
*  WILL NOT OCCUR.
* 
BUFEM LDA .03       CLEAR ALL CARD INTERRUPTING 
      JSB SDPHI      CONDITIONS IN PHI REG 3
      LDA .0450      STC,WORD,CINT,FOUR,OUT 
      LDB B4        CARD CONTROL IS INTERRUPT ENABLE
      JSB PUT2      STORE 2 DMA QUAD WORDS
      LDA #P3BE     SEND A "30002" = ENABLE BUFFER EMPTY
      CCB            INTERRUPT, LENGTH= 1 WORD
      DST DMNXT,I   STORE 2 DMA QUAD WORDS
      SPC 2 
***************************************************** 
* START THE DMA SELF CONFIGURATION OPERATION
* $$$SRQ AND PPOLL ARE NOT ENABLED$$$ 
***************************************************** 
* 
      LDA $IFTX     GET DMA QUAD START ADDR 
      OTA DMA       SET DMA STARTING ADDRESS
B2400 CLA 
      OTA CARD      CLEAR CARD
      CLF PHI       CLEAR FLAG
      STC DMA,C     START DMA SELF CONFIGURATION
      CLA,INA       "T" BIT 
* 
EXITC ISZ ID.37     RTN+2 = PHYSICAL WAIT 
      JMP ID.37,I   EXIT
      SPC 3 
* 
BINRY SZB           SKIP IF NO DATA 
STRTX SLA,RSS       SKIP IF LAST QUAD WAS A READ
      JMP BUFEM     GO SET BUFFER EMPTY INTERRUPT 
      SPC 3 
* 
*  HERE WHEN LAST DATA TRANSFER WAS A READ.  "CLRIN" IS CALLED
*  TO EMPTY THE INBOUND FIFO BY BUILDING A QUAD TO SET PHI REG 3
*  TO UNMASK THE "INBOUND FIFO NOT EMPTY" INTERRUPT, AND TO 
*  BUILD A 2ND QUAD TO READ 8 BYTES FROM THE INBOUND FIFO WITH
*  DMA COMPLETION INTERRUPT ENABLED ("CINT"=0) AND THE CARD CONTROL 
*  SET TO CAUSE THE DMA INTERRUPT WHEN THE "INBOUND FIFO NOT EMPTY" 
*  INTERRUPT IS NO LONGER PRESENT.  (THE CARD INTERRUPT IS DISABLED). 
*  THE ABOVE EFFECTIVELY CAUSES THE DMA COMPLETION INTERRUPT AS SOON
*  AS THE "INBOUND FIFO NOT EMPTY" INTERRUPT FLAG GOES TO ZERO, I.E.
*  THE INBOUND FIFO IS EMPTIED. 
* 
      JSB CLRIN     CLEAR INBOUND FIFO
      OCT 61200     DMA CONWD: STC,BYTE,FOUR,IN 
* 
      JMP BUFEM 
      SPC 2 
* 
#P3BE DEF EMPTY 
.03   OCT 30000 
.05   OCT 50000 
.102  OCT 102000
B37   OCT 37
B7    OCT 7 
B777  OCT 777 
BN2   OCT 100077
BN8   OCT 60040 
N116  DEC -116
N30   DEC -30 
NOT10 OCT 175777
      HED 92070-18056  HPIB - REQ INITIATION - MULTI-BUFFERED REQ 
**************************************************************
* MULTIBUFFER REQUESTS LOOK LIKE THIS:
* $DV               FUNCTION
* 15                RQ=0
* 16                ADD. OF FIRST SUBREQ. #IFX# 
* 17                NEGATIVE # OF SUBREQUESTS 
* 18                NOT USED
* 
* DVTX             CONWD AND RQ 
* DVTX+1           SUBREQUEST BUFFER ADD. 
* DVTX+2              "         "    LENGTH 
* DVTX+3           CARD CONTROL "CACON" 
* DVTX+4           OPTIONAL SECONDARY 
* 
* CACON BIT         MEANING 
* 1                 XLOG FROM THIS DATA GOES INTO DVT17 
* 13                COMPLETE ON XLOG XFER, DO A PP RESUME TO LOG DVR
* 15                AWAIT PPOLL BEFORE STARTING THIS OP.
****************************************************************
* "MUBUF" BUILDS THE DMA QUADRUPLETS FROM LOGICAL 
* DRIVER MULTIPLE BUFFER REQUESTS 
*********************************************************** 
MUBUF LDB $DV16,I   GET ADDRESS OF FIRST QUINT
* 
MUB1  STB REQAD     SAVE ADDR OF NEXT MUBUF QUINT 
      LDA 1,I       SET HPIB ADDRESS DIRECTION PER RQ 
      STA CONWD 
      ADB B2
      DLD 1,I       3RD & 4TH WORDS OF QUINTUPLET 
      STA LEN       SAVE XFER LEN 
      STB CACON     SAVE CACON
      SSB,RSS       BIT 15 OF CACON SET?
      JMP MUB2       NO 
*   BUILD QUAD TO ENABLE PPOLL INTERRUPT
      LDA $DVTP,I   DEVICE ADDR 
      CMA,INA 
      ADA B10       8-ADDR = DIO LINE # 
      JSB VLINE     GET PPOLL LINE MASK 
      LDA .1410     DMA CONWD=CONT,STC,FOUR 
      CLB           CARD CONTROL =0 
      JSB PUT2
      LDA BUFST 
      LDB N3        3 WORD CMD BUFFER 
      JSB PUT2
      LDA .04       PHI REG 4 
      IOR TEMP1     SET BIT FOR DIO LINE
      JSB PUTB      STORE IN CMD BUFFER 
      LDA .05       PHI REG 5 
      JSB PUTB      NO NORMALIZATION
      LDA BN6       ENABLE PHI PPOLL INTERRUPT
      JSB PUTB
* 
MUB2  LDB REQAD 
      ADB B4        POINT TO SECONDARY IN QUINT 
      LDA 1,I       GET SECONDARY ADDR
* 
      JSB BDADS     GO BUILD AUTO-ADDRESS QUAD & BUFR 
* 
      JSB BWRDS 
* 
      ISZ REQAD     ADDRESS OF BUFR ADDR IN QUINT 
      LDA REQAD,I   GET BUFFER ADDRESS
      JSB PUT 
      LDB CACON     GET CACON 
      LDA LEN       GET BUFFER LENGTH 
      RBR,SLB       CACON BIT 1 SET?
      STA FUNCT      YES, SAVE REQ LEN
      CPA =B100000  IS IT 32768?
      CLA 
      CMA,SSA,INA,RSS   SKIP IF IN WORDS
      CMA,INA,RSS      ELSE LEAVE BYTE CNT ALONE
      CLE,ELA       CONVERT WORD TO NEG BYTE CNT
      STA DMNXT,I   STORE IN QUAD 
      LDA DMNXT     ADDR OF THIS QUADS LENGTH WORD
      SLB,BLF       WAS CACON BIT 1 SET?
      STA IFX7,I     YES, SAVE ADDR OF RESIDUE
      ISZ DMNXT     BUMP QUAD POINTER 
* 
      SLB           CACON BIT 13 SET? 
      JMP MUB9       YES, COMPLETE NOW (& RESUME ON PPOLL)
      LDA CONWD 
      ISZ $DV17,I   MORE QUINTUPLETS? 
      JMP MUB6       YES
* 
MUB5  LDB FUNCT     DATA XFER REQ LEN 
      STB $DV17,I   STORE FOR LATER XLOG UPDATE 
      JMP STRTX     GO WRAP IT UP 
* 
MUB6  SLA,RSS       IS LAST SUBREQUEST A READ?
      JMP *+3        NO 
      JSB CLRIN     POSSIBLE IN-FIFO CLEAR
      OCT 165200    DMA CONWD:CONT,STC,BYTE,CINT,FOUR,IN
      LDB REQAD 
      ADB B4        POINT TO NEXT SUBREQUEST
      JMP MUB1      GO PROCESS NEXT SUBREQUEST
* 
MUB9  LDA $DVTP,I   GET DEVICE ADDR 
      CMA,INA 
      ADA B10        8 - ADDR = DIO LINE #
      JSB PPENT     GET A PPOLL ENTRY 
      LDA $DV1      THIS DVT'S ADDR 
      CLB           LOGICAL RESUME ON PPOLL 
      DST *         BUILD PPOLL ENTRY 
TEMP5 EQU *-1 
      LDA CONWD 
      JMP MUB5
      HED 92070-18056  HPIB - REQ INITIATION - CONTROL REQUESTS 
* 
*********************************************** 
* THIS IS A CONTROL REQUEST                   * 
*********************************************** 
CNTRL LDA $DV15,I 
      LSR 6 
      AND B77 
      STA FUNCT     SAVE CONTROL SUBFUNCTION
      LDB $DVTP,I   GET HPIB ADDRESS
      CPB B36 
      JMP HPCNT     THIS IS AN HPIB LU CONTROL
* THIS IS A DEVICE LU CONTROL REQUEST 
* 
      LDB $DV15,I 
      BLF,SLB       TEST "Z"-BIT
      JMP REJ1      ERROR IF SET
* 
      CLE,SZA,RSS 
      JMP CLRLU     CLEAR 
      CPA B6
      JMP SRQST     SERIAL POLL (DYNAMIC STATUS)
      CPA B16 
      JMP RENDV     REN ENABLE FOR DEVICE 
      CPA B17 
      JMP LOCDV     REN DISABLE FOR DEVICE
      CPA B20 
      JMP SRENB     SET PROGRAM TO SCHEDULE PROG. 
      CPA B21 
      JMP SRDIS     REMOVE SCHEDULE PROGRAM 
      CPA B22 
      JMP NEWTO     SET NEW TIMEOUT 
      CPA B23 
      JMP INTEX     INTERRUPT EXPECTED
      CPA B24 
      JMP PRAM1     CHANGE DEVICE ADDR
      CPA B27 
      JMP TRIGR     GROUP EXECUTE TRIGGER 
CNPP  CPA B40 
      JMP PENAB     PARALLEL POLL ENABLE
      CPA B41 
      JMP PDSAB     PARALLEL POLL DISABLE 
      JMP PDONE     NOT RECOGNIZED, IGNORE
      SPC 3 
*  SET PHYSICAL TIMEOUT FOR DEVICE
NEWTO LDA $DV16,I   PASSED TIMEOUT VALUE
      SZA,RSS       DISABLE TIMEOUT?
      JMP *+3        YES
      CMA,SSA,RSS   NEGATE, WAS IT POSITIVE?
      JMP REJ1       NO ,ERROR
      STA $DV13,I   NEW PHYSICAL T.O. 
      JMP PDONE 
      SPC 3 
*  CHANGE DEVICE ADDR 
PRAM1 LDA $DV16,I   GET NEW ADDR
      LDB 0 
      ADB N30 
      SSB           LESS THAN 30
      SSA            & POSITIVE?
      JMP REJ1       NO, ERROR
      STA $DVTP,I   OK, SET NEW ADDR
      JMP PDONE 
      SPC 3 
* 
*  DEVICE LU CLEAR (0)
* 
CLRLU LDA B4        SDC 
      RSS 
      SPC 3 
* 
*  GROUP EXECUTE TRIGGER
* 
TRIGR LDA B10 
* 
*  HERE TO SEND ADDRESSED HPIB COMMAND IN A REGISTER
SDCMD CLB 
      STB CONWD     ENSURE FUNCTION IS WRITE
      JSB BDADS     BUILD AUTO-ADDRESS BUFFER WITH CMD
      JMP BUFEM     TERMINATE WITH "BUFFER EMPTY" INTERRUPT 
* 
* 
* THIS IS A HPIB LU CONTROL REQUEST 
* 
HPCNT SZA,RSS 
      JMP CLEAR     CLEAR HPIB
      CPA B6
      JMP PSTAT     DYNAMIC STATUS
      CPA B16       JMP REN 
      JMP RENBU     REMOTE
      CPA B17 
      JMP LOCBU     LOCAL 
      CPA B23 
      JMP INTBU     INTERRUPT EXPECTED
      CPA B25 
      JMP LLOCK     LOCAL LOCKOUT 
      CPA B27 
      JMP TRGBU     UNIVERSAL G.E.T.
      CPA B51 
      JMP ABTBU     ABORT 
      JMP CNPP      CHK FOR PPOLL ENABLE/DISABLE
      SPC 3 
* 
*  SEND UNIVERSAL LOCAL LOCKOUT COMMAND 
* 
LLOCK LDA B421      LOCAL LOCKOUT CMD 
* 
* 
SDNOW JSB SDPHI     SEND HPIB CMD 
      JMP BUFEM     WAIT FOR WORD TO LEAVE FIFO 
      SPC 3 
*  ABORT (BUS LU) - SEND IFC FOR 10MSECS
ABTBU LDA IFX6,I
      IOR B20       SET "IFC" 
      JSB SDPHI     SET PHI 6 
      CCB 
      JSB EXIT3     WAIT FOR 10 MSECS WITH HOLD SET 
*  HERE AFTER TICK
      LDA IFX6,I    PHI 6, NO IFC 
      JMP SDEND     PROGRAM PHI 6 
      SPC 3 
* 
*  BUS LU CLEAR REQUEST 
* 
CLEAR LDA B404      SDC 
      LDB $DV16,I   PRAM 1
      SZB,RSS       ZERO? 
      JMP ADCMD      YES, SEND ADDRESSED SDC
      JSB DOIFC     DO INTERFACE CLEAR
      JMP PDONE 
      SPC 2 
* 
RENDV LDA BN8       =60040 - PHI 6 "REN"
      STA IFX6,I
      JSB SDPHI     PROGRAM PHI 6 
      CLA           NO SECONDARY
      JMP SDCMD     GO ADDRESS THE DEVICE 
* 
LOCDV CLA,INA       GO TO LOCAL CMD 
      JMP SDCMD     SEND WITH AUTOADDRESSING BUFFER 
* 
* 
RENBU LDA BN8       =60040 - REN
      STA IFX6,I
      IOR B2        SET OUTPUT
      JSB SDPHI     PROGRAM PHI 6 (NO REN)
* 
      JSB SENDZ     SEND POSSIBLE ADDR BUFFER 
      JMP PDONE     DONE IF NONE SPECIFIED
      JMP BUFEM     APPEND A BUFFER EMPTY INT. QUAD 
* 
* 
LOCBU LDA B401      "GTL" 
      LDB $DV16,I   PRAM 1
      SZB 
      JMP ADCMD     ADDRESSING REQUIRED 
      LDA .06       CLEAR "REN" 
      STA IFX6,I
SDEND JSB SDPHI     PROGRAM PHI 6 
      JMP PDONE     IMMEDIATE COMPLETION
      SPC 3 
*  HERE FOR GROUP EXECUTE TRIGGER 
TRGBU LDA B410      G.E.T.
* 
ADCMD STA BUFST,I   SAVE CMD
      JSB SENDZ     CHECK FOR ADDRESS BUFFER
      JMP SDNOW      NONE, SO SEND CMD NON-DMA
      LDA .1410     DMA CONWD=CONT,STC,FOUR 
      CLB           CARD CONTROL=0
      JSB PUT2
      LDA BUFST 
      CCB 
      ISZ BUFST 
      JMP OVR51     GO BUILD BUFR EMPTY INT. QUAD 
      SPC 2 
* 
.06   OCT 60000 
.1610 OCT 161000
.1710 OCT 171000
B140  OCT 140 
B200  OCT 200 
B2000 OCT 2000
B21   OCT 21
B2101 OCT 2101
B22   OCT 22
B23   OCT 23
B24   OCT 24
B25   OCT 25
B27   OCT 27
B36   OCT 36
B377  OCT 377 
B4    OCT 4 
B401  OCT 401 
B404  OCT 404 
B41   OCT 41
B410  OCT 410 
B421  OCT 421 
B51   OCT 51
B6    OCT 6 
FUNCT NOP 
REQAD NOP 
N5    DEC -5
      HED 92070-18056  HPIB - REQUEST INITIATION - SUBROUTINES
* 
*********************************************** 
* BDADS BUILDS THE AUTOADDRESSING QUAD
* BUFFER IS PHI WRITE+REN,UNTK,UNL,CONTROL TLK/LSN
* DEVICE TLK/LSN,(DEVICE SECONDARY,(PHI REG 6 IF INPUT) 
* 
* IT ALSO SETS UP PHI REG 6 FOR THE DATA XFER(IN\OUT) 
* PHI REG 0 IS SET FOR ASCII OR BINARY IF A READ. 
* 
* PASS REQAD =ADDRESS OF FIRST REQUEST WORD 
* PASS DIR =R\W= 0\40 
* 
* THIS QUADRUPLET IS OF THE BELOW CONSTRUCTION: 
*  DMA CONTROL (141400) 
*  CARD CONTROL (0) OR (10 IF WAIT ON INT.) 
*  BUFFA
*  BUFFL (4 MINIMUM)
* 
*  BUFFA
*     PHI WRITE (PHI REG 6 W/ REN)
*     UNT 
*     UNL 
*     MTA\MLA 
*     YTA\YLA 
*     (OPTIONAL SECONDARY)
*     (PHI 0 FOR READ ONLY. ASCII OR BINARY)
*     (PHI 6 FOR READ ONLY - INPUT + REN) 
*       ON ENTRY:  A=SECONDARY ADDR OR COMMAND
**********************************************
*********************************************** 
BDADS NOP 
      STA TEMP1     SECONDARY ADDR
      LDA B2
      JSB UNTLK     BUILD UNTALK,UNLISTEN 
      ERA,CLE,ELA   A=476 = CONTROLLER LSN ADDR 
      LDB CONWD 
      SLB,RSS       SKIP IF A READ
      XOR B140      A=536 = CNTRLLER TALK ADDR IF WRITE 
      JSB PUTB
      LDA $DVTP,I    GET DEVICE ADDR
      IOR B500      A=500+ADDR FOR DEVICE TALK
      SLB,RSS       SKIP IF A READ
      XOR B140      A=440+ADDR FOR DEVICE LSN 
      JSB PUTB
* 
      LDB N5        CMD BUFFER LENGTH SO FAR
* 
      LDA TEMP1     GET OPTIONAL SECONDARY ADDR 
      SZA,RSS       SECONDARY SPECIFIED?
      JMP BDAD8     NO SECONDARY
      CPA B405      PPC?
      JMP BDAD9      YES, SEND 2 CMDS 
BDAD7 IOR B400      SET ATN 
      JSB PUTB      STORE CMD/SEC-ADDR IN BUFFER
      ADB N1        INCEMENT WORD COUNT FOR SECONDARY 
BDAD8 LDA CONWD 
      JSB PHIST     SET PHI 6 AND PHI 0 
      JMP BDADS,I   RETURN
* 
BDAD9 JSB PUTB      STORE PPC 
      ADB N1        BUMP WORD COUNT 
      LDA TEMP2     PPD OR PPE
      JMP BDAD7 
      SPC 5 
* 
********************************************************
* "BWRDS" BUILDS THE DMA CONTROL AND HPIB CARD
*  CONTROL WORD FOR THE USER REQUEST
*  EOI IS RECOGNIZED ON ALL INPUTS EXCEPT BINARY TRANSPARENT
*  EOI IS ONLY SET ON LAST CHAR OF NON-TRANSPARENT WRITES 
*  NOTE THAT ON DEVICE ASCII WRITES, EOI IS SENT WITH CR,LF 
* 
* NO PHI PROGRAMMING IS DONE HERE 
********************************************************
* 
BWRDS NOP 
      LDA CONWD     GET FIRST WORD TO SET DMA CONTROL 
      AND B2101 
      CPA B2001     ASCII TRANSPARENT READ? 
      CLA,INA        YES, REQUIRES EOI
      AND B2001     IF BIT 10=1, NO EOI 
      RAR           BIT15=1 IF READ, BIT9=1 IF NO EOI 
      XOR B3000     SET "BYTE", REVERSE "EOI" 
      STA BW1       (*)SAVE THIS VALUE
      LDB $IF1      (*)SET NUMBER OF
      LDA ACNWD     (*)  OF THE REGISTER
      JSB $SELR     (*)GET THE RELOCATION REGISTER NUMBER 
      LDB BW1       (*)GET CONTROL WORD AGAIN 
      IOR .1710     (*)DMA CONTROL WORD 
      SSB           READ? 
      ADA B200       YES, SET INPUT IN DMA CONWD
      JSB PUT2      STORE 1ST 2 QUAD WORDS
      JMP BWRDS,I   --THIS IS A STANDARD REQUEST -- 
* 
BW1   NOP 
      SKP 
* 
************************************************
* "CLRIN" CLEARS THE INBOUND PHI FIFO UNDER DMA CONTROL 
*  CALLED FROM "ABORT" & "MUBUF"
************************************************
CLRIN NOP 
      ISZ XCNFG     WAS IT UNCOUNTED RCV? 
      JMP CLRI9      NO, DO IMMEDIATE RTN 
      LDA B3
      JSB UNTLK     BUILD UNTALK,UNLISTEN 
      LDA N3        LENGTH OF CMD BUFFER = 3
      JSB PUT 
      LDA CLRIN,I   GET DMA CONWD FOR READ
      LDB .102      =102000  CARD CONTROL 
      JSB PUT2       TO STOP ON NON-INTERRUPTS
      LDA GARBG     GET GARBAGE BUFFER
      LDB N8        SET FOR MAX 8 BYTES 
      JSB PUT2
CLRI9 ISZ CLRIN 
      JMP CLRIN,I 
      SPC 4 
****************************************************************
*  "DOIFC" SETS "IFC" IN THE PHI 6 REGISTER FOR 10 MILLISECS
*  & IS REENTERED ON THE TICK (IFC MUST BE ASSERTED FOR A 
*  MINIMUM OF 100 USECS).  A DEVICE CLEAR ("DCL") IS THEN 
*  SENT AND RETURN IS PASSED TO THE "DOIFC" CALLER. 
****************************************************************
* 
DOIFC NOP 
      CLC DMA+1     SUSPEND DMA & 
      CLC DMA+3,C   CLEAR CARD
      LDA .0700 
      JSB SDPHI     OFF-LINE
      LDA .0702 
      JSB SDPHI     ON-LINE 
      CLA,INA 
      OTA CARD      RESET CARD
      LDA B23       DO OUT-FIFO FLUSH, IFC
      IOR IFX6,I    INCLUDE REN STATE 
      JSB SDPHI     PROGRAM PHI 6 
      LDB DOIFC     SAVE DOIFC RTN ADDR 
      STB IFX8,I    SAVE CONTINUATION ADDR
      CCB           SINGLE TICK 
      JSB EXIT3     DO A PHY CONTINUE & AWAIT TIMEOUT 
* 
*  ENTER HERE AFTER NEXT TIME TICK
      LDA IFX6,I
      JSB SDPHI     CLEAR IFC 
      LDB IFX8,I
      JMP 1,I       RETURN TO "DOIFC" CALLER
      SKP 
* 
*************************************************** 
*  "PHIST" STORES QUAD LENGTH.  IF A READ IT SETS 
*  PHI 6 FOR INPUT AND SETS ASCII\BINARY TERM.
*   IT IS CALLED FROM ROUTINES "BDADS" & "OVR10"
*************************************************************** 
* 
PHIST NOP 
      STB DMNXT,I   STORE CMD BUFR LEN
      SLA,RSS       READ? 
      JMP PHIS9      NO, EXIT 
      LDB LEN       GET DATA LENGTH 
      SZB,RSS       ANY DATA? 
      JMP PHIS9      NO 
      SSB           SKIP IF WORDS 
      CMB,INB,RSS   POSITIVE BYTE CNT & SKIP
      RBL           CONVERT WORD TO BYTE CNT
      CPB B400      LEN=256?
      CLB            YES, CNTED XFER OK 
      AND B100      ISOLATE BINARY FLAG 
      ALF,CLE,RAR   MOVE TO BIT 9 
      IOR 1         FORM BYTE XFER CMD
      ADB .1774 
      SEZ           WAS LEN > 255?
      LDA B1400      YES, DO UNCOUNTED XFER 
      CLB,SEZ 
      CCB           SET UNCOUNTED XFER FLAG 
      STB XCNFG     SAVE FOR CLRIN'S CHECK
      JSB PUTB      STORE BYTE XFER CMD 
      LDA IFX6,I    PHI 6 FOR INPUT 
      JSB PUTB      PROGRAM PHI 6 
      LDB DMNXT,I 
      ADB N2        ALLOW FOR 2 MORE CMD WORDS
      STB DMNXT,I 
* 
PHIS9 ISZ DMNXT 
      JMP PHIST,I   RETURN
      SKP 
* 
**************************************************
* PUT STORES A REG. CONTENTS IN DMA QUADRUPLET
* WHICH RESIDE IN EXTENSION. PUT2 STORES A&B. 
* "DMNXT" IS A RUNNING ADDRESS POINTER FOR DMA QUAD LIST
* 
* PUTB STORES  A REG. CONTENTS IN DATA BUFFERS WHICH RESIDE 
* IN EXTENSION. 
************************************************
PUT   NOP 
      STA DMNXT,I 
      ISZ DMNXT 
      JMP PUT,I 
* 
PUT2  NOP 
DMNXT EQU *+1       DMA QUAD POINTER
      DST *         STORE 2 DMA QUAD WORDS
      ISZ DMNXT 
      ISZ DMNXT 
      JMP PUT2,I
* 
* 
PUTB  NOP           STORES CONTENTS OF AUTO ADDRESSING BUFFERS
      STA BUFST,I 
      ISZ BUFST 
      JMP PUTB,I
      SPC 4 
**************************************************
*  THIS ROUTINE SETS-UP QUAD FOR USER SUPPLIED
*  ADDRESS BUFFER IF Z-BIT WAS SET. 
**************************************************
SENDZ NOP 
      LDB $DV15,I   GET CONWD 
      BLF,SLB       CHECK Z-BIT OF CONWD
      RSS           SKIP IF SET 
      JMP SENDZ,I   NO Z-BIT, RETURN+1
* 
      LDB $IF1      (*)GET THE IFT ADDRESS
      LDA $DV15     (*) AND THE ADDRESS OF PARAMTERS
      JSB $SELR     (*) SET IT
      IOR .1410     (*)DMA CONWD=CONT,STC,FOUR
      LDB $DV19,I   GET LENGTH
      RBL,SLB,ERB   GIVEN IN BYTES? 
      IOR .1610     (*) YES, ALSO SET "BYTE"
      LDB B400      SET CARD CONTROL. OUT,ATN 
      SEZ           BYTES?
      LDB B2400      YES
      JSB PUT2      SET 2 DMA QUAD WORDS
* 
      LDA $DV18,I   SET CONTROL BUFF ADD. 
      LDB $DV19,I   SET CONTROL BUFF LENGTH 
      SSB,RSS 
      CMB,INB       NEGATE WORD COUNT 
      JSB PUT2
      ISZ SENDZ     RETURN+2
      JMP SENDZ,I 
      SPC 3 
******************************
*  BUILD QUAD TO SEND:
*     1. PHI 6 (REN) + OUTPUT 
*     2. UNTALK 
*     3. UNLISTEN 
*  QUAD LENGTH NOT SET HERE 
******************************
* 
UNTLK NOP 
      IOR IFX6,I    FORM PHI 6 WORD 
      STA BUFST,I   STORE IN CMD BUFFER 
      CLB 
      LDA CACON 
      SSA           IS THIS A MUBUF "CONT ON INT" 
      LDB B10        YES, CARD CONTROL WD = 10
      LDA .1410     DMA CONWD=CONT,STC,FOUR 
      JSB PUT2      STORE 2 DMA QUAD WORDS
      LDA BUFST     CMD BUFFER ADDR 
      JSB PUT       STORE AS DMA QUAD DATA ADDR 
      ISZ BUFST     BUMP CMD BUFFER POINTER 
      LDA B537      UNTALK
      JSB PUTB
      LDA B477      UNLISTEN
      JSB PUTB
      JMP UNTLK,I 
      SPC 2 
* 
#CRLF DEF CRLF
GARBG DEF GARB
.04   OCT 40000 
.0700 OCT 70000 
.0702 OCT 70200 
.1    OCT 100000
.14   OCT 140000
.1774 OCT 177400
B1400 OCT 1400
B2001 OCT 2001
B3000 OCT 3000
B17   OCT 17
B20   OCT 20
N100  DEC -100
ACNWD DEF CONWD 
CONWD NOP           CONTROL WORD
CACON NOP 
LEN   NOP 
XCNFG NOP           =-1 IF UNCOUNTED INPUT
      HED 92070-18056 HPIB - ABORT, & TIMEOUT SECTIONS
* 
************************************************
* "ABORT" HANDLES ABORT 
*   (CAN'T GET HERE WHILE SERIAL POLLING BECAUSE "HOLD" IS SET) 
*************************************************************** 
ABORT LDA B4        INDICATE NORMAL ABORT IS IN PROGRESS
* 
ABORX STA IFX1,I    SET CURRENT OPERATIONAL STATE 
      JSB RESET     CLEAR CARD
      CCB 
      STB XCNFG 
      JSB CLRIN     CLEAR IN-FIFO 
      OCT 165200
      LDB N100      1 SEC OF TICKS
      LDA $IF2,I    GET TIMEOUT 
      SZA,RSS       ANY SPECIFIED (FROM DVT)
      STB $IF2,I     NO, THEN USE 1 SECOND
      LDB IFX1      GET PROCESSING STATE INDICATOR
      LDA SPD         AND THE SERIAL POLL BYTE
      CPB B3        IS THIS CLEANUP?? 
      JSB SDPHI     YES - SEND TO PHI 
      JMP BUFEM     TERM ON "BUFFER EMPTY" INTERRUPT
      SPC 4 
* 
RESET NOP 
      CLC DMA+1     SUSPEND DMA 
      CLC DMA+3,C    THEN CLEAR IT
      CLA,INA 
      OTA CARD      RESET CARD
      LDA B3        CLR OUT-FIFO
      IOR IFX6,I    INCLUDE REN STATE 
      JSB SDPHI     PROGRAM PHI 6 
      JMP RESET,I 
      SKP 
* 
******************************* 
* "TIMOT" HANDLES TIMEOUT 
******************************
TIMOT LDB IFX1,I    GET CURRENT OPERATIONAL STATE 
      LDA B2
      SZB,RSS       OPERATION STATE=0?
      JMP ABORX      YES, SET STATE FOR TIMEOUT CLR & DO IT 
      CPB B1        CONTINUATION ADDR?
      JMP TIMO2      YES
      SSB           TIMEOUT EXPECTED? 
      JMP CONTT      YES, GO TO SPECIFIED ADDR
* 
*  THINGS ARE REALLY SOUR IF WE GET HERE
      CLC DMA+1     SUSPEND THEN
      CLC DMA+3,C   CLEAR DMA 
*  NOTE: IFX1,I IS LEFT NON-ZERO SO WE CAN RETRY TO INITIALIZE
*        WHEN THE NEXT REQUEST IS INITIATED 
      SPC 3 
* 
TIMEX LDA B3        DOWN, DON'T FLUSH, TIMEOUT ERROR
      CPB B4        IN THE MIDDLE OF AN ABORT?
      IOR .04        YES, FORCE A FLUSH 
* 
ERROR LDB $IF5,I    GET DVT ADDRESS 
      ADB B23       POINT TO WORD 20
      LDB 1,I       GET THE WORD
      RBL            FROM BIT 14 OF DVT 20
      SSB           USER HANDLING OWN ERRORS? 
      IOR .14        YES, FORCE FLUSH, DON'T DOWN 
      JMP ERSET     DO PHYSICAL DONE
* 
* 
TIMO2 LDB $IF6,I    GET IFT "AV" FIELD
      CCE,SSB       BUSY? 
      JMP ABORX      YES, CLEAR INTERFACE 
      STA IFX1,I    SAVE
      JSB EMSG      GIVE ERROR MSG "NO RESP"
      ASC 2,RESP
      JSB RESET     CLEAR CARD
      JMP SRQ4      REGARD IT AS A NEG POLL RESPONSE
      HED 92070-18056 HPIB DRIVER - CONTINUATION (INTERRUPT) SECTION
********************************************************* 
* ALL CONTINUE INTERRUPTS ARRIVE HERE * 
*   NOTE: $DV ADDRS MAY NOT BE SET ON CONTINUATION OR 
*      TIMEOUT INTERRUPTS.  ID.37 IS WRITTEN SO THEY ARE NOT
*      USED IN THESE CASES (UNLESS A CONTINUATION ADDR WAS
*      SPECIFIED IN IFX2 IN WHICH CASE $DIOC IS CALLED).
*      THIS SAVES CONSIDERABLE SETUP OVERHEAD.
********************************************************* 
CONT  SFC DMA+2     DMA PARITY RCVD?
      JMP $DMPR      YES! GO TO SYSTEM
      SFS DMA+1     DMA COMPLETION? 
      SFC PHI        OR CARD FLAG INTERRUPT?
      JMP INFLG       YES 
      JSB ILLIN       NO, REPORT ILLEGAL INTERRUPT
* 
INFLG CLC DMA+1     SUSPEND DMA 
      CLC DMA+3,C   TURN-OFF DMA
      LDA IFX1,I    GET CURRENT STATE 
      CLB 
      STB IFX1,I    CLEAR PROCESSING STATE INDICATOR
      CPA B1        CONTINUE ADDR?
      JMP CONTX+1    YES
      LDB $IF6,I    IFT BUSY? 
      SSB,RSS 
      JMP NOBZY      NO 
      CPA B2        WAS IT TIMEOUT CLEANUP? 
      JMP TIMEX      YES, NOW RETURN ERROR
      CPA B3        CLEAN-UP PRIOR TO NEW REQ?
      JMP DVSET      YES, OK TO START IT NOW
      SPC 3 
* 
****************************************************
*  SUCCESSFUL REQUEST COMPLETION - POST XMISSION LOG
****************************************************
      LDB $IF5,I    DVT ADDR
      ADB B16       POINT TO DVT15
      STB TEMP1     SAVE IT 
      STB MPCNT     (*) TWICE 
      ADB B2        POINT TO DVT17
      STB TEMP2     SAVE IT 
      LDA 1,I       GET ORIGINAL REQ LENGTH 
      SSA           GIVEN IN WORDS? 
      CMA,INA,RSS    NO, GET POSITIVE BYTES, SKIP 
      RAL           CONVERT WORD TO BYTE COUNT
      LDB IFX7,I    SAVED ADDR OF RESIDUE (IN QUAD AREA)
      SZB,RSS       WAS IT SPECIFIED? 
      JMP DONE5      NO, RETURN XLOG=0
      ADA 1,I       XLOG = ORIGINAL LEN - RESIDUE 
      STA LEN       SAVE XLOG (IN BYTES)
      LDB TEMP1,I   GET CONWD 
      SLB,RBR       IF READ, E=1, BIT0=0
      SLB,BLF       MOVE ASCII FLAG TO BIT9, SKIP 
      JMP DONE3     NO BUFFER POST-PROCESSING 
      SKP 
*********************************************** 
*   INPUT - PERFORM BUFFER POST-PROCESSING
*********************************************** 
      SZA,RSS 
      JMP DONE3     NOTHING RECEIVED
      ADA N1        # OF BYTES -1 
      CLE,ERA       A= # OF WORDS RCVD -1 
      BLF,ELB       BIT14=0 IF ASCII; BIT0=1 IF EVEN BYTES
      ISZ TEMP1     POINT TO DVT16
      ADA TEMP1,I   POINT TO LAST WD IN BUFR
      STA TEMP1     SAVE POINTER
      ADA N1        NEXT TO LAST WORD 
      STA TEMP4     SAVE IT ALSO
      STB BTEMP     (*)SAVE B TEMPORARILY 
      LDB TEMP1     (*)GET THE ADDRESS
      LDA $IF5,I    (*)AND THE IFT ADDRESS
      STA DVT2      (*)SAVE 
      JSB $ONER     (*)READ ONE WORD
       DEF MPCNT    (*)CONTROL WORD 
DVT2   NOP          (*)ADDRESS OF DVT 
      LDB BTEMP     (*)GET B AGAIN
      CLE,SLB,RBL   EVEN # OF BYTES?
      JMP DONE1      YES, NO FILL NEEDED
*  PAD RHW WITH FILL CHARACTER
      AND .1774     CLEAR RHW 
      CCE,SSB,RSS   ASCII?
      IOR B40        YES, FILL WITH A SPACE 
      STB BTEMP     (*)SAVE B AGAIN 
      LDB TEMP1     (*)GET THE ADDRESS
      JSB $ONEW     (*)SAVE THE DATA
       DEF MPCNT    (*)CONTROL WORD 
       DEF DVT2,I   (*)DVT
      LDB BTEMP     (*)RESTORE B
* 
DONE1 SSB           BINARY OR ASCII?
      JMP DONE3      BINARY, NO CRLF REMOVAL
*  REMOVE CR,LF IF LAST TWO CHARACTERS
      STA BTEMP     (*)SAVE A TEMPORARILY 
      LDB TEMP4     (*)GET ADDRESS
      JSB $ONER     (*)GET THE DATA 
       DEF MPCNT    (*)DRIVER PARAMTER
       DEF DVT2,I   (*)DVT
      LDB 0         (*)PUT IN B 
      LDA BTEMP     (*)  AND RESTORE A
      SEZ           SKIP IF EVEN # OF BYTES 
      RRR 8         ENSURE A HAS LAST 2 CHARS 
      LDB N2
      ADB LEN       B=XLOG-2
      CPA #CRLF,I   "CR,LF"?
      SSB            YES, SKIP IF XLOG >1 
      JMP DONE3      ELSE NO CHARACTER REMOVAL
      STB BTEMP     (*)STORE B TEMPORARILY
      LDB TEMP4     (*)GET ADDRESS
      JSB $ONER     (*)GET THE DATA 
       DEF MPCNT    (*)CONTROL
       DEF DVT2,I   (*)ADDRESS
      LDB BTEMP     (*)GET B BACK AGAIN 
      XOR B55       TURN "CR" INTO A BLANK
      SLB,RSS       (*)UNLESS EVEN # OF BYTES 
      JMP DN3       (*)JUMP AHEAD 
      STB BTEMP     (*)SAVE B TEMP. 
      LDB TEMP4     (*)GET ADDRESS
      JSB $ONEW     (*)WRITE THE DATA 
       DEF MPCNT    (*) CONTROL WORD
       DEF DVT2,I   (*) DVT 
      LDB BTEMP     (*) 
*****************   REMOVE CR & ADD BLANK 
      RSS           USE XL0G-2
* 
DONE3 LDB LEN       GET XLOG
DN3   LDA TEMP2,I   (*)ORIGINAL REQ LENGTH
      SSA           GIVEN IN WORDS? 
      JMP DONE5      NO 
      CLE,SLB,ERB   WORDS=(BYTES+1)/2 
      INB            ROUND ODD BYTE UP
DONE5 STB TEMP2,I   RETURN TRANSMISSION LOG 
      SKP 
**********************************
*  HERE TO TAKE PHYSICAL DONE EXIT
**********************************
* 
PDONE CLA 
* 
ERSET LDB $IF3,I    DVT ADDR
      ELB,CLE,ERB   CLEAR SIGN
      SZB,RSS       ANY DVT?
      JMP SETRG      NO 
      STB $IF5,I    ENSURE IFT5 IS CORRECT
      ADB B17       DVT16 ADDR
      STA 1,I       RETURN COMPLETION CODE
* 
SETRG LDA IFX4,I    CURRENT PHI 4 SETTING 
      JSB SDPHI     SET PPOLL MASK
      LDA IFX5,I    CURRENT PHI 5 SETTING 
      JSB SDPHI     SET PPOLL NORMALIZATION MASK
      JSB STAT2     GET INTERRUPT STATE 
      LDB IFX3,I    CURRENT PHI 3 SETTING 
      OTB PHI       SET PHI REG 3: PPOLL,(SRQ)
      STC PHI,C 
      AND 1         ISOLATE POSSIBLE PPOLL & SRQ
      SZA           EITHER WAITING? 
      LDA B2         YES, SET HOLD SO INTERRUPT IS SERVICED 
      JMP ID.37,I   EXIT VIA PHYSICAL DONE
      SPC 5 
*  HERE UPON EXPECTED TIMEOUT 
CONTT CLB 
      STB IFX1,I    CLEAR PROCESSING STATE
* 
CONTX CLA,INA 
      LDB $IF5,I    GET DVT ADDR
      JSB $DIOC     SET-UP DVT ADDRS
      LDB IFX2,I
      JMP 1,I       GO TO CONTINUATION ADDR 
* 
DVSET LDB $IF5,I    DVT ADDR
      CLA,INA 
      JSB $DIOC     SET-UP DVT ADDRS
      JMP NEWRQ     NOW START REQUEST 
      SKP 
* 
* "NOBZY" HANDLES ASYNCHRONOUS INTERRUPTS WHEN IFT IS 
* AVAILABLE.  INTERRUPT MUST BE A PARALLEL POLL OR SRQ. 
* 
* 
NOBZY JSB STAT2     GET PHI 2 STAT
      AND IFX3,I
      ASR 4 
      SLA,ERA       WAS SRQ SET?
      JMP SRQIN      YES, GO PROCESS IT 
      SLA,RSS       WAS PPOLL INTERRUPT SET?
      JSB ILLIN      NO, ILLEGAL INTERRUPT
* PARALLEL POLL INTERRUPT RECEIVED
      LDA .1
      JSB RDPHI     READ PHI REG 0 (P.POLL) 
      AND IFX4,I    TEST ONLY THOSE ENABLED 
      LDB N8
      STB TEMP1 
      STB TEMP2 
      CLB,INB 
* 
PPOL1 SLA,RAR       SEARCH FOR RAISED LINE
      JMP PPOL2      FOUND IT 
      RBL 
      ISZ TEMP2 
      JMP PPOL1     KEEP LOOKING
      JSB ILLIN     ILLEGAL INTERRUPT 
* 
PPOL2 JSB PPCLR     DISABLE THIS PPOLL LINE 
      ASR 16
      CMA           A HAS POLL LINE MASK, B=-1
      ADB IFXPP     PPOLL TABLE ADDR
PPOL3 ADB B4        POINT TO 4TH WORD 
      CPA 1,I       IS THIS ENTRY FOR THIS LINE 
      JMP RESUM      YES
      ISZ TEMP1     ALL EXAMINED? 
      JMP PPOL3      NO 
PCONT ISZ ID.37      YES, NOT FOUND, IGNORE INTERRUPT 
      JMP SETRG     SET PHI, GO OUT PHY CONTINUE
* 
BTEMP NOP           (*) 
MPCNT NOP           (*) 
.0450 OCT 45000 
.11   OCT 110000
.12   OCT 120000
.1410 OCT 141000
B1    OCT 1 
B10   OCT 10
B100  OCT 100 
B137  OCT 137 
B16   OCT 16
B2    OCT 2 
B3    OCT 3 
B34   OCT 34
B40   OCT 40
B400  OCT 400 
B405  OCT 405 
B425  OCT 425 
B500  OCT 500 
B55   OCT 55
B77   OCT 77
BN6   OCT 31040     ENABLE PPOLL INT ONLY 
.4ALL OCT 40377 
N1    DEC -1
N2    DEC -2
N3    DEC -3
N4    DEC -4
N8    DEC -8
N9    DEC -9
      HED 92070-18056 HPIB DRIVER - PARALLEL POLL HANDLING
* 
***************************************************** 
* "PSTAT" READS THE HPIB PARALLEL POLL STATUS  (SUBFUNCTION 6)
***************************************************** 
PSTAT CLA,INA       FLUSH 
      IOR IFX6,I    INCLUDE REN STATE 
      JSB SDPHI     PHI CONDUCTS PPOLL WHEN FIFOS EMPTY 
      LDA .4ALL     ENABLE ALL POLL LINES 
      JSB SDPHI      (PHI 4)
      LDA .05       NO NORMALIZATION
      JSB SDPHI      (PHI 5)
      LDA .1
      JSB RDPHI     READ PHI REG 0
*     MIA CARD      INCLUDE HPIB CARD STATUS
      LDB 0         (*)SAVE A 
      LIA CARD+1    (*)GET CARD STATUS
      AND .1774     (*)ONLY UPPER HALF
      IOR 1         (*)MERGE WITH B 
      STA $DV18,I   STORE PP RESPONSE IN $DV18
* 
      LDA .12 
      JSB RDPHI     READ PHI REGISTER 2 
      ALF,ALF 
      LDB 0         SAVE IN BITS 15-8 OF B
      LDA .11       ADDRESS PHI REG 1 
      JSB RDPHI     READ PHI STATUS REG. 1
      IOR 1         MERGE WITH REG 2 STATE
      STA $DV19,I 
      JMP PDONE     COMPLETE REQUEST
      SPC 3 
* 
*  ENTER HERE FOR A PARALLEL POLL ENABLE CONTROL REQUEST (FUNCTION 40)
* 
PENAB LDA N8
      LDB IFXPP     ADDR OF PPOLL TABLE 
      JSB PTBLE     BUILD ENTRY IN TABLE
      JMP PDONE     EXIT
      SPC 3 
* 
*  HERE FOR PARALLEL POLL DISABLE CONTROL REQUEST (FUNCTION 41) 
* 
PDSAB LDA N8
      LDB IFXPP     ADDR OF PPOLL TABLE 
      JSB SERCH     FIND ENTRY
      CLA 
      STA 1,I       CLEAR IT
      INB           POINT TO ID SEG # 
      STA 1,I       CLEAR IT
      ADB B2
      STB TEMP4 
      LDB 1,I       GET DIO LINE
      STA TEMP4,I   CLEAR TABLE 
      JSB PPCLR     CLEAR MASKS FOR PHI 4,5 
      JMP PDONE     EXIT
      SKP 
* 
*  HERE FOR PPOLL INTERRUPT ENABLE CONTROL REQUEST (FUNCTION 23)
* 
INTBU LDB $DV16,I   BUS LU - GET PRAM1
      LDA B425      PPU (WITH ATN)
      CPB B2        PRAM1=2?
      JMP SDNOW      YES, SEND UNIVERSAL PPU
* 
      JSB SENDZ     SEND CALLER-SPECIFIED ADDRS 
      NOP           OK IF NO Z-BUFFER 
* 
INTEX LDB $DV16,I 
      CPB B1        IS IT A DISABLE?
      JMP INTOF      YES
*  PROCESS PPOLL INTERRUPT ENABLE 
      LDA $DV17,I   GET DIO LINE # (1-8)
      SSA 
      CMA,INA       ABS VALUE OF DIO LINE 
      JSB PPENT     VERIFY IT & GET MASK
      LDA $DV1      GET THE DVT ADDRESS 
      CPA TEMP5,I 
      JMP INTE3 
      CLB 
      DST TEMP5,I 
INTE3 LDB $DV17,I   GET DIO LINE PARAMETER
      SSB,RSS       WAS SENSE REVERSED? 
      JMP INTE5      NO 
      LDA TEMP1      YES
      IOR IFX5,I      SET NORMALIZE MASK
      STA IFX5,I       FOR PHI 5 PROGRAMMING
      CMB,INB       GET POSITIVE DIO LINE # 
      ADB B10       SET "S"=1, INTERRUPT WITH A 0 
INTE5 ADB B537      BUILD PPE: DIO RANGE= 0-7, ATN
      JMP INTO9     GO SET-UP TO BUILD CMD BUFFER 
* 
*  DISABLE PPOLL INTERRUPT FOR THIS DIO LINE
INTOF LDA N8
      LDB IFXPP 
      JSB SERCH     FIND PPOLL TABLE ENTRY
      ADB B3         YES, POINT TO DIO LINE 
      LDB 1,I       GET MASK (MAY BE ZERO)
      JSB PPCLR     CLEAR PHI4 & PHI5 MASK BITS 
      LDB B560      GET A "PPD" - PARALLEL P0LL DISABLE 
INTO9 LDA $DVTP,I   GET DEVICE ADDR 
      CPA B36       IS THIS THE BUS LU? 
      JMP PPLBU      YES
      STB TEMP2     SAVE 2ND CMD WORD FOR "BDADS" 
      LDA B405      "PPC" 
      JMP SDCMD     SEND ADDRESSED CMDS 
* 
PPLBU LDA B405      PPC + ATN 
      DST * 
BUFST EQU *-1       DEFINE CMD BUFFER PNTR
      LDA .1410     DMA CONWD=CONT,STC,FOUR 
      CLB 
      JSB PUT2      STORE 1ST 2 QUAD WORDS
      LDA BUFST     SEND 2 (PPC,PPD) OR (PPC,PPE) 
      JMP OVR50     COMPLETE WITH B.E. INTERRUPT
      SKP 
* 
*  THIS SUBROUTINE CLEARS PARALLEL POLL MASK BITS PASSED
*  IN THE A REGISTER.  THE PHI REG 4 & 5 MASKS SAVED IN THE IFT 
*  EXTENSION ARE UPDATED & THE WORDS ARE OUTPUT IMMEDIATELY TO
*  PROGRAM PHI REGS 4 & 5 TO DISABLE THE PPOLL INTERRUPT. 
* 
PPCLR NOP 
      CMB 
      LDA IFX4,I    CLEAR THE BIT IN THE MASK WD
      AND 1 
      STA IFX4,I
      LDA IFX5,I
      AND 1         CLEAR NORMALIZE BIT 
      STA IFX5,I    NORMALIZE MASK WORD 
      JMP PPCLR,I 
      SPC 2 
* 
*  SUBROUTINE TO VERIFY A PASSED PARALLEL POLL LINE # 
*  FIND A PPOLL TABLE ENTRY, & SET THE PHI 4 MASK WORD
* 
PPENT NOP 
      JSB VLINE     GET DIO LINE MASK 
      LDA N8
      LDB IFXPP 
      JSB SERCH     FIND PPOLL ENTRY
      STB TEMP5     SAVE ITS ADDR 
      ADB B3
      LDA TEMP1     BIT MASK
      STA 1,I       STORE IN 4TH WD OF TABLE
      IOR IFX4,I    UPDATE PHI 4 MASK 
      STA IFX4,I
      JMP PPENT,I   RETURN
      SPC 2 
* 
*  SUBROUTINE TO COMPUTE MASK FOR DIO LINE
* 
VLINE NOP 
      ADA N1        RANGE FROM 0-7
      SSA           WAS IT LESS THAN 1? 
      JMP REJ1       YES, ERROR 
      ADA N8
      CMA,SSA,INA   WAS IT > 8? 
      JMP REJ1       YES, ERROR 
      ADA ASR0
      STA TEMP1     FORMED ASR INSTRUCTION
      LDB B400
TEMP1 NOP           SHIFT BIT INTO POSITION 
      STB TEMP1     SAVE MASK 
      JMP VLINE,I   RETURN
ASR0  OCT 101020    ASR 0 
      HED 92070-18056  HPIB - SERIAL POLL PROCESSING
* 
*  ENABLE SERIAL POLL (FUNCTION=20) 
*    IF DVT16-18 NOT ZERO, IT CONTAINS NAME OF PROGRAM TO 
*    SCHEDULE UPON POSITIVE RESPONSE TO A SERIAL POLL.  IN
*    THIS CASE, THE PARAMETER IN DVT19 WILL BE PASSED TO THE
*    PGM IN ITS 2ND SCHEDULING PARAMETER. 
* 
SRENB LDA SRQ#      NEG # OF SPOLL TABLE ENTRIES
      LDB IFXSP     ADDR OF SPOLL TABLE 
      JSB PTBLE     BUILD ENTRY 
      LDA BN3       ENSURE SRQ INTERRUPT IS ENABLED 
      JMP SRDI8     GO OUT PHYSICAL DONE
      SPC 3 
* 
*  PROCESS DISABLE SERIAL POLL CONTROL REQUEST (FUNCTION = 21)
* 
SRDIS LDA SRQ#
      STA TEMP4 
      LDB IFXSP     ADDR OF SPOLL TABLE 
      JSB SERCH     FIND ENTRY FOR THIS DEVICE
      CLA 
      CPA 1,I       IS THIS ENTRY BUILT?
      JMP PDONE      NO, FINISHED 
      STA 1,I       CLEAR SPOLL TABLE ENTRY 
      LDB IFXSP 
*  SEE IF ANY ENTRIES ARE LEFT IN SPOLL TABLE, IF NOT, DISABLE SRQ
SRDI4 CPA 1,I       IS THIS ONE EMPTY?
      RSS            YES
      JMP PDONE      NO, LEAVE SRQ ENABLED
      ADB B4
      ISZ TEMP4     MORE? 
      JMP SRDI4      YES
      LDA BN6       =31040 - PHI 3 - ENABLE PPOLL 
* 
SRDI8 STA IFX3,I    SET INTERRUPT MASK
      JMP PDONE 
      SPC 5 
* 
*  CONDUCT A SERIAL POLL (FUNCTION = 6) 
* 
SRQST LDA SRQ#
      LDB IFXSP     ADDR OF SPOLL TABLE 
      JSB SERCH     FIND ENTRY
      CLA 
      CPA 1,I       WAS THERE AN ENTRY? 
      JMP SRQS5      NO, POLL IT NOW
      ADB B3         YES, POINT TO POSSIBLE STATUS WD 
* NOW SEE IF A POSITIVE SERIAL POLL RESPONSE WAS RECEIVED IN WHICH
* THE REQUIRED PROGRAM COULD NOT BE SCHEDULED BECAUSE IT WAS NON- 
* DORMANT (AFTER 2 TRIES) 
      CPA 1,I       IS THERE ONE? 
      JMP SRQS5      NO, SO POLL NOW
      LDA 1,I        YES, GET THAT STATUS BYTE
      STA $DV18,I     & RETURN IT NOW 
      JMP POLEX     GO CLEAR BYTE FROM TABLE
* 
SRQS5 LDA $DVTP,I   GET DEVICE ADDR 
      JSB SPOLL     SET-UP POLL QUAD & DO IT
*  HERE AFTER POLL IS COMPLETED 
      LDA .1        NOW READ INBOUND FIFO TO
      JSB RDPHI      GET RETURNED STATUS BYTE 
      STA $DV18,I     & RETURN IT IN DVT18
      JMP PDONE     PHY DONE
      SKP 
************************************************************* 
*  THIS SECTION IS ENTERED TO CONDUCT SERIAL POLLS OF ALL 
*  DEVICES IN THE SERIAL POLL TABLE WHEN AN SRQ INTERRUPT IS
*  RECEIVED.  WHEN A POSITIVE RESPONSE IS RECEIVED, EITHER
*  A DESIGNATED PGM WILL BE SCHEDULED OR THE LOGICAL DRIVER 
*  WILL BE RESUMED.  THE ENTIRE POLL IS CONDUCTED WITH PHY. 
*  HOLD SET SO THAT NO NEW REQUESTS WILL BE INITIATED.
************************************************************* 
* 
SRQIN LDB SRQ#      SIZE OF S.POLL TABLE
      INB 
      CMB,INB       GET POS #-1 
      BLS,BLS       *4 TO INDEX TO LAST 
      ADB IFXSP     POINT TO LAST ENTRY IN TABLE
* 
SRQ2  LDA 1,I 
      RAL,CLE,SLA,ERA  IS THIS ENTRY EMPTY? 
      JMP SRQ6       NO 
* 
SRQ4  CPB IFXSP     ALL ENTRIES EXAMINED? 
      JMP *+3        YES
      ADB N4
      JMP SRQ2      GO CHECK NEXT 
*  NO DEVICE GAVE A POSITIVE SERIAL POLL RESPONSE 
      LDA BN6       SET PHI 3 INTERRUPT ENABLE MASK 
      STA IFX3,I     TO NOT ENABLE SRQ
      JSB SDPHI 
      LDA B4        BIT2= ENABLE CARD INTERRUPT 
      OTA CARD      SET IT
      CLF PHI       CLEAR CARD FLAG 
      JSB ILLIN     SERIAL POLL FAILURE, GIVE ILLEGAL INT 
* 
SRQ6  STB IFX8,I    SAVE SPOLL ENTRY'S ADDR 
      ADA B14       POINT TO DVT13
      LDB 0,I       GET DEVICES T.O.
      STB $IF2,I    MOVE PHY T.O. 
      ADA B12       POINT TO DVTP (HP-IB ADDR)
      LDA 0,I       GET DEVICE ADDR 
      JSB SPOLL     PERFORM A SERIAL POLL OF THE DEVICE 
      LDA .1        ADDRESS INBOUND FIFO
      JSB RDPHI     READ THE STATUS BYTE
      STA TEMP1     SAVE STATUS BYTE
      AND B100      TEST BIT 6
      LDB IFX8,I    GET SPOLL ENTRY ADDR
      SZA,RSS       IS THIS A POSITIVE RESPONSE?
      JMP SRQ4       NO 
      ADB B3        POINT TO SPOLL WORD 4 
      LDA TEMP1     STATUS BYTE 
      STA 1,I 
      SKP 
******************************************************************
*  THIS SECTION IS ENTERED WHEN A PARALLEL POLL OR POSITIVE 
*  RESPONSE TO A SERIAL POLL IS RECEIVED.  THE ADDRESS OF 
*  THE POLL TABLE ENTRY IS IN THE B REGISTER. 
***************************************************************** 
* 
RESUM ADB N3        POINT TO 1ST WORD OF POLL TABLE 
      STB IFX8,I      ENTRY & SAVE IN IFT EXT.
      CCA 
      STA IFX7,I    SET 1ST TRY FLAG
* 
RESU2 INB           2ND WORD OF TABLE 
      LDA 1,I 
      SZA,RSS       IS LOGICAL DRIVER RESUME REQUIRED?
      JMP LGRES      YES
      STB TEMP2 
      AND B377      ISOLATE ID SEGMENT #
      ADA N1
      MPY $IDSZ 
      ADA $IDA      A= ID SEG ADDR
      STA DMNXT     SAVE IT 
      ADA B34       POINT TO WORD 29
      LDA 0,I       GET SCHEDULING SEQ #
      XOR TEMP2,I 
      AND .17       ISOLATE BITS 15-12
      CCE,SZA       HAS ID SEGMENT BEEN RERUN?
      JMP PGERR      YES, CLEAR TABLE ENTRY & GIVE MSG
* 
      LDA DMNXT     ID SEGMENT ADDR 
      ADA B17 
      LDA 0,I       GET ID SEG STATUS 
      AND B77        BITS 5-0 
      SZA           DORMANT?
      JMP BZPGM      NO 
*  WE CAN NOW GO AHEAD & SCHEDULE THE PROGRAM 
      LDB DMNXT     B = ID SEG ADDR 
      JSB $LIST     PUT PGM IN SCHEDULED LIST 
B60   OCT 60
      LDB IFX8,I    GET DVT ADDR
      LDB 1,I 
      ELB,CLE,ERB   CLEAR SIGN
      JSB $DVLU     COMPUTE LU
      ISZ DMNXT 
      JSB PUT       STORE 1ST PARAMETER 
      LDB IFX8,I    ADDR OF TABLE ENTRY 
      ADB B2        POINT TO 3RD WORD OF ENTRY
      LDA 1,I       GET OPT PARAMETER 
      JSB PUT       RETURN AS 2ND USER PARAMETER
      INB 
      LDA 1,I       4TH WORD OF SPOLL ENTRY HAS SERIAL
      STA DMNXT,I    POLL STATUS, RTN IN PGMS TEMP3 
* 
POLEX CLA 
      STA 1,I       ZERO OUT POLL TABLE WORD
      JMP PCONT 
* 
PGERR JSB EMSG      PRINT "NO PROG" 
      ASC 2,PROG
      JMP POLEX 
      SPC 4 
* 
*  HERE WHEN UNABLE TO SCHEDULE PGM BECAUSE IT'S BUSY 
* 
BZPGM ISZ IFX7,I    1ST TRY?
      JMP PDONE      NO, LEAVE STATUS BYTE IN SPOLL WD 4
      LDB N10       100 MSEC DELAY
      JSB EXIT3     EXIT WITH HOLD SET
*  RETURN HERE AFTER DELAY
      LDB IFX8,I    GET ADDR OF POLL TABLE ENTRY
      JMP RESU2      AND TRY SCHEDULE ONE MORE TIME 
      SPC 3 
* 
*  HERE WHEN LOGICAL DRIVER RESUME IS REQUIRED
LGRES ADB B2        POINT TO POLL TABLE WORD 4
      CLA 
      STA 1,I       CLEAR DIO LINE
      ADB N3        POINT TO POLL TABLE WORD 1
      STB TEMP2 
      LDB 1,I       GET DVT ADDR
      STA TEMP2,I   CLEAR FROM TABLE
      ISZ ID.37     SET TO GO OUT LOGICAL RESUME EXIT 
      ISZ ID.37 
      JMP ERSET+1 
      SKP 
*************************************************** 
*  THIS SUBROUTINE BUILDS A SERIAL POLL QUAD, MOVES 
*  THE COMMAND BUFFER TO THE IFT EXTENSION AND
*  INITIATES DMA TO PERFORM THE POLL
*    A REG HAS HPIB DEVICE ADDRESS ON ENTRY 
*************************************************** 
* 
SPOLL NOP 
      IOR B500      FORM DEVICE TALK CMD
      STA DEVLN     STORE IN CMD BUFFER 
      LDA .03       DISABLE ALL CARD INTERRUPTING 
      JSB SDPHI      CONDITIONS (PHI 3) 
      LDA B3        SET OUT,FLUSH 
      IOR IFX6,I     & CURRENT STATE OF REN 
      JSB SDPHI       & SEND IT 
      LDB $IFTX     IFT EXTENSION ADDR
      STB DMNXT     ADDR OF QUAD
      LDA .0450     STC,CINT,FOUR 
      JSB PUT       STORE DMA QUAD CONWD
      LDA B4        ENABLE CARD INTERRUPT 
      OTB DMA       SET DMA SELF-CONFIG. ADDR 
      ADB B60       COMPUTE ADDR OF CMD BUFFER
      JSB PUT2      STORE 2ND & 3RD QUAD WDS
      LDA N8        8 WORDS IN CMD BUFFER 
      JSB PUT       PUT 4TH QUAD WD 
      LDA #SPOL     LOCAL CMD BUFFER ADDR 
      JSB .MVW      MOVE 8 WORDS TO IFTX
      DEF B10 
      NOP 
      CLA 
      OTA CARD      CLEAR CARD
      CLF PHI        & ITS FLAG 
      STC DMA,C     START DMA 
      LDB SPOLL     RTN ADDR FOLLOWING INTERRUPT
      STB IFX2,I    SAVE CONTINUATION ADDR
      CLB,INB       PROCESSING STATE = 1
      JMP EXIT4     EXIT
      SPC 2 
********************************************************
*  SEARCH FOR A TABLE ENTRY FOR THIS DVT
********************************************************
SERCH NOP 
      SSA,RSS 
      JMP ER20      NO ENTRIES IN TABLE 
      STA TEMP4     NEG # OF ENTRIES
      CLA 
      STA TEMP2     CONTAINS ADDR OF AVAILABLE TABLE ENTRY
* 
SERC2 LDA 1,I       GET 1ST WORD
      ELA,CLE,ERA   CLEAR SIGN
      CPA $DV1      ENTRY ALREADY IN TABLE? 
      JMP SERCH,I    YES
      CPA TEMP2     IS THIS 1ST ENTRY AVAILABLE?
      STB TEMP2      YES, SAVE ITS ADDR 
      ADB B4        POINT TO NEXT TBL ENTRY 
      ISZ TEMP4     MORE? 
      JMP SERC2      YES
      LDB TEMP2 
      SZB           WAS THERE AN AVAILABLE ENTRY? 
      JMP SERCH,I    YES, RETURN ADDR OF AVAILABLE ENTRY
* 
ER20  LDA BN5       =40024 - NO TABLE SPACE 
      JMP ERROR 
      SPC 4 
* 
.17   OCT 170000
B12   OCT 12
B14   OCT 14
B560  OCT 560 
BN3   OCT 31060 
BN5   OCT 140024    SPOLL TABLE FULL ERROR
N10   DEC -10 
***************************************************************** 
*  THIS SUBROUTINE IS USED TO SET UP TABLE ENTRIES FOR
*  BOTH THE SERIAL POLL AND PARALLEL POLL TABLE 
*  THE FORMAT OF A POLL TABLE ENTRY IS: 
*       WORD 1 - BIT 15    = 1(SERIAL POLL) OR 0(PARALLEL POLL) 
*                BITS 14-0 = DVT ADDRESS
*                (ALL ZERO IF ENTRY NOT IN USE) 
*       WORD 2 - BITS 15-12= ID SEGMENT SCHEDULING SEQUENCE # 
*              - BITS 7-0  = ID SEGMENT # (1-255) 
*                (ALL ZERO IF LOGICAL DRIVER RESUME REQUIRED) 
*       WORD 3 - OPTIONAL PARAMETER TO BE RETURNED TO PGM TO
*                BE SCHEDULED 
*       WORD 4 - STATUS BYTE RETURNED FROM SERIAL POLL IF UNABLE
*                TO SCHEDULE DESIGNATED PGM ON POSITIVE RESPONSE
***************************************************************** 
PTBLE NOP 
      JSB SERCH     FIND POLL TABLE ENTRY 
      STB TEMP4     SAVE ENTRY ADDRESS
      LDA $DV16,I   GET 1ST 2 CHARS OF PGM NAME 
      CLE,SZA,RSS   SPECIFIED?
      JMP PTBL2      NO, THEN LOGICAL RESUME
      LDB $DV16     ADDR OF 16-18TH DVT WORDS 
      STB *+2       POINTS TO PGM NAME
      JSB $NAME     CONVERT NAME TO ID SEG ADDR 
TEMP2 NOP 
      SZB,RSS       DOES PGM EXIST? 
      JMP REJ1       NO, RETURN ILLEGAL REQUEST ERROR 
      JSB $RUN#     GET SEQ#/ID # 
PTBL2 LDB FUNCT 
      CPB B20       SERIAL POLL ENTRY?
      CCE            YES
      LDB 0         VALUE FOR 2ND TABLE WD
      LDA $DV1
      RAL,ERA       SET SIGN IF SPOLL 
      DST *         STORE 1ST 2 WORDS 
TEMP4 EQU *-1 
      ISZ TEMP4 
      ISZ TEMP4 
      LDA $DV19,I   CALLERS OPT PARAMETER 
      CLB           STATUS/DIO LINE = 0 
      DST TEMP4,I   STORE WORD 3 & 4 OF POLL ENTRY
      JMP PTBLE,I   RETURN
      SPC 4 
****************************************
*  PRINT MESSAGE FOR SERIAL POLL FAILURE
****************************************
EMSG  NOP 
      DLD EMSG,I
      DST MTYP
      ISZ EMSG
      ISZ EMSG      BUMP RTN ADDR 
      LDB IFX8,I    GET PPOLL ENTRY ADDR
      LDB 1,I       GET DVT ADDR
      ELB,CLE,ERB 
      JSB $DVLU     COMPUTE LU
      JSB $CVT1     CONVERT TO ASCII
      STA MLU 
      JSB $SYMG     LOG MSG ON CONSOLE
      DEF SPMSG 
      LDB IFX8,I    GET POLL TABLES ADDR
      JMP EMSG,I
      HED 92070-18056 HPIB DRIVER - GENERAL SUBROUTINES 
******************************************************************* 
* "EXIT1" IS USED WHENEVER A CONTINUATION INTERRUPT IS EXPECTED 
* THE RETURN ADDRESS IS AT IFX8 
******************************************************************* 
EXIT3 NOP 
      STB $IF2,I    SET TIMEOUT VALUE 
      LDA EXIT3     RTN ADDR
      STA IFX2,I    CONTINUE ADDR ON TIMEOUT
EXIT4 LDA B3        SET HOLD AND TIMEOUT FLAGS
      STB IFX1,I    STORE PROCESSING STATE
      JMP EXITC     GO OUT PHYSICAL WAIT
      SPC 2 
******************************************* 
*  ILLEGAL REQUEST ERROR
******************************************* 
REJ1  LDA BN7       =140001 - DON'T DOWN,FLUSH
      JMP ERSET     TAKE DONE EXIT
      SPC 2 
************************************************
*  ILLEGAL INTERRUPT DETECTED 
************************************************
ILLIN NOP           **TEMP
      JSB RESET 
      LDA B4
      JMP EXITC     GO OUT PHY CONTINUE 
      SPC 2 
******************************************************
*  "STAT2" READS PHI REG STATUS 
******************************************************
STAT2 NOP 
      CLB 
      OTB DMA+1     CLR DMA CONWORD SO IN WORD MODE 
      LDA BN4       =30377 ENABLE ALL INT FLAGS 
      JSB SDPHI 
      LDA BN9       =120004 - ENABLE CARD INT 
      JSB RDPHI     READ PHI REG 2 (INTERRUPTS) 
      JMP STAT2,I 
      SPC 2 
******************************************************
*  "SDPHI" SENDS WORD IN A REGISTER TO PHI
******************************************************
SDPHI NOP 
      OTA PHI 
      STC PHI,C 
      JMP SDPHI,I 
      SPC 2 
****************************************************
*  READ A PHI REGISTER
****************************************************
RDPHI NOP 
      OTA CARD      SELECT PHI VIA CARD S.C.
      STC PHI,C 
      LIA PHI       READ SELECTED PHI REGISTER
      AND B377      BITS 15-8 ALWAYS ZERO 
      JMP RDPHI,I   RETURN
* 
BN4   OCT 30377 
BN7   OCT 140001    REQ ERROR, FLUSH, DON'T DOWN
BN9   OCT 120004
* 
SRQ#  NOP 
* 
CRLF  OCT 6412      CARRAIGE RTN, LINE FEED 
#SPOL DEF *+1 
B537  OCT 537       UNTALK
B477  OCT 477       UNLISTEN
      OCT 430       SPE 
DEVLN NOP 
      OCT 476       CONTROLLER LISTENS
      OCT 1001      COUNTED RCV ONE 
EMPTY OCT 31002     PHI OUT FIFO EMPTY INT
SPD   OCT 431       SPD 
* 
SPMSG OCT 40001 
      DEC -22 
      ASC 6,*POLL ER:NO 
MTYP  BSS 2 
      ASC 2, LU 
MLU   NOP 
* EXTENSION FOR MISC STORAGE
IFX  DEF IFX1 
*  IFX1 - 0=NORMAL PROCESSING, 1=CONTINUE ON INTERRUPT, 2=TIMEOUT 
*      CLEANUP IN PROGRESS, 3=CLEANUP PRIOR TO STARTING NEW,
*      REQUEST, 4=ABORT IN PROGRESS, NEGATIVE=TIMEOUT EXPECTED
IFX1  NOP           CURRENT PROCESSING STATE
IFX2  NOP           CONTINUATION ADDR (IF NON-ZERO) 
IFX3  NOP           CURRENT PHI 3 INTERRUPT MASK
IFX4  NOP           CURRENT PHI 4 PPOLL MASK
IFX5  NOP           CURRENT PHI 5 PPOLL NORMALIZE MASK
IFX6  NOP           CURRENT PHI 6 REN STATE 
IFX7  NOP           RESIDUE LOC OR SPOLL 1ST PGM SCHED FLAG 
IFX8  NOP           "DOIFC" RTN ADDR OR POLL TABLE ADDR 
IFXPP NOP           32 WORD PPOLL TABLE ADDR
IFXSP NOP           4*N WORD SPOLL TABLE
* 
GARB  BSS 4         GARBAGE BUFFER FOR INPUT FIFO CLEANOUT
* 
      END 
                                                                                                                                                                                              