ASMB,R * NAME: ID.37 * SOURCE: 92070-18095 * RELOC: 92070-16095 * PGMR: C.H.W. * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. 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 92070-16095 REV.2040 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 * 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 ANY DATA? JMP OVR32 NO, NO BACKARROW CHECK CPB N1 ONE BYTE OF DATA? JMP OVR31 YES, NO BACKARROW, CLEAR EOI ON DATA * 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 1,I GET IT 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 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" LDB 0 LDA .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 -- 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 * LDA .1410 DMA CONWD=CONT,STC,FOUR LDB $DV19,I GET LENGTH RBL,SLB,ERB GIVEN IN BYTES? LDA .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 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,I PROCESSING STATE LDA SPD SERIAL POLL DISABLE CPB B3 CLEAN-UP FROM PRIOR OP? JSB SDPHI YES, ENSURE SERIAL POLLING DISABLED 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 ADDR OF DVT ADB B23 POINT TO DVT20 LDB 1,I GET "CNFG" BIT 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 ENSURE CLEANUP IF THIS IS LAST POLL 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 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 LDA TEMP1,I GET LAST WD IN BUFFER 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 STA TEMP1,I LAST WD WITH FILL CHAR * DONE1 SSB BINARY OR ASCII? JMP DONE3 BINARY, NO CRLF REMOVAL * REMOVE CR,LF IF LAST TWO CHARACTERS LDB TEMP4,I GET NEXT TO LAST WD 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 LDA TEMP4,I GET NEXT TO LAST WD XOR B55 TURN "CR" INTO A BLANK SLB UNLESS EVEN # OF BYTES STA TEMP4,I REMOVE CR & ADD BLANK RSS USE XL0G-2 * DONE3 LDB LEN GET XLOG 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 * .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 LDB 0 LIA CARD+1 READ CARD STATUS REG AND .1774 RTN HI BITS ONLY IOR 1 INCLUDE PHI REG 0 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 DVT ADDRESS CPA TEMP5,I SETTING UP NEW ENTRY? JMP INTE3 NO CLB YES DST TEMP5,I SET DVT ADDR, NO PGM 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 DONE 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