ASMB,R,L,C
      HED L65 91703-16107 * (C) HEWLETT-PACKARD CO. 1976 *
      NAM L65 91703-16107 REV A 760311
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 1 
      ENT L65 
      EXT .ENTR,.IOC.,TMOUT 
* 
*     SUBROUTINE TO MAKE IOC CALLS TO D.65 FORTRAN
*     CALLABLE
* 
*     MAY ALSO BE CALLED AS A FUNCTION, IN WHICH
*     CASE (EXCEPT FOR STATUS OR CLEAR CALLS) AN
*     ERROR CODE IS RETURNED WHEN THE OPERATION 
*     HAS BEEN COMPLETED. (L65 OPERATIONS ARE NOW 
*     DONE "WITH WAIT", SO OPERATIONS ARE COMPLETED 
*     BEFORE RETURNING TO THE USER.)
* 
*     ERROR CODE           MEANING
*     ----------     ---------------------
* 
*       -3           COMMUNICATIONS I/O ERROR 
*       -1           REQUEST COMPLETED, NO ERRORS 
*       +1           ILLEGAL PARAMETER IN L65 CALL
*       +2           LINE DOWN OR TIMEOUT 
*       +4           BUFFER LENGTH ERROR
*      +61 (75B)     MODE NOT COMPATIBLE
*      +62 (76B)     TRANSMISSION NOT INITIATED 
*      +63 (77B)     SIMULTANEOUS REQUEST 
* 
* 
*     MODIFIED BY DAN GIBBONS 
*     HEWLETT PACKARD 
*     FEBRUARY 11,1976
* 
      SPC 2 
* 
*     CALLING SEQUENCES 
* 
*     (NOTE THAT "SEND-REQUEST" AND "SEND-REQUEST-AND-
*     SEND/RECEIVE-DATA" CALLS ARE NO LONGER LEGAL.)
* 
*     SEND OR RECEIVE DATA
      SPC 1 
*     CALL L65(IRW,IDVN,IMODE,IDBUF,IDBFL)
*     WHERE:
*              IRW  =1 FOR READ  2 FOR WRITE
*              IDVN =DEVICE REFERENCE 
*              IDBUF=BUFFER FOR DATA STORAGE
*              IDBFL=DATA BUFFER LENGTH..POSITIVE WORDS ONLY
*              IRBUF=BUFFER FOR REQUEST STORAGE 
*              IRBFL=BUFFER LENGTH
*              IMODE=1 FOR DATA, 2 FOR REQUEST
* 
      SKP 
*     RECEIVE REQUEST 
      SPC 1 
*     CALL L65(IRW,IDVN,IMODE,IRBUF,IRBFL)
      SPC 2 
*     SEND STOP 
      SPC 1 
*     CALL L65(IRW,IDVN)
*     WHERE: IRW=6
      SPC 2 
*     CLEAR REQUEST 
      SPC 1 
*     CALL L65(IRW,IDVN)
*     WHERE: IRW=0
      SPC 2 
*     STATUS REQUEST
      SPC 1 
*     CALL L65(IRW,IDVN,ISTAT,ITRLG)
*     WHERE:
*                   IRW=3 
*                   ISTAT=EQT WORD 2
*                   ITRLG=EQT WORD 3
      SPC 2 
* 
*     THE POLLING CALL (IRW=4) AND LISTEN MODE CALL (IRW=5) 
*     ARE NO LONGER SUPPORTED BY THIS VERSION OF THE DRIVER 
*     REVISION C OR LATER. THESE CALLS HAVE BEEN BOTH CONVERTED 
*     INTO CLEAR REQUEST CALLS... 
* 
*     FOR STATUS CALLS, A AND B REG WILL CONTAIN
*     CONTENTS OF EQT WORDS 2 & 3 RESPECTIVELY (STATUS
*     AND TRANSMISSION LOG).
* 
*     FOR CLEAR CALLS, CONTENTS OF A AND B REG ARE MEANINGLESS. 
* 
      SKP 
* 
* 
IRW   NOP           ADDRESS OF REQUEST CODE 
IDVN  NOP           ADDRESS OF UNIT REFERENCE # 
IMODE NOP           ADDRESS OF READ/WRITE SUBMODE 
IDBUF NOP           ADDRESS OF DATA BUFFER
IDBFL NOP           ADDRESS OF DATA BUFFER LENGTH 
IRBUF NOP           ADDRESS OF REQUEST BUFFER 
IRBFL NOP           ADDRESS OF REQUEST BUFFER LENGTH
* 
L65   NOP 
      JSB .ENTR     FETCH PARAMETER ADDRESSES 
      DEF IRW 
* 
      LDA IRW,I     GET REQ CODE
      AND B7        CHECK FOR LEGAL RANGE (0-6) 
      LDB A 
      CPB IRW,I 
      CPB B7
      JMP ERR       ILLEGAL PARAMETER 
      ADB REQC      INDEX INTO FUNCTION CODE TABLE
      LDB B,I       GET IOC FUNCTION CODE 
      LDA IDVN,I    GET DEVICE UNIT REFERENCE # 
      AND B77       CHECK FOR LEGAL RANGE 
      CPA IDVN,I
      RSS 
      JMP ERR       ILLEGAL PARAMETER 
      IOR B         MERGE UNIT REFERENCE #
      RBL           STATUS
      SSB,RSS         OR
      SZB,RSS            CLEAR? 
      JMP CS        YES.
      RBL,RBL       CONTROL 
      SSB,SLB,RSS     REQUEST?
      RSS           NO. 
      JMP CON       YES.
* 
      STA REQ       SAVE REQUEST CODE 
      LDA IMODE,I   GET MODE WORD 
      CPA D1        CHECK FOR LEGAL VALUES (1,2)
      JMP OK
      CPA D2
      RSS 
      JMP ERR       ILLEGAL PARAMETER 
      LDB IRW,I     CHECK FOR SEND-REQ OR SEND-REQ- 
      CPB D2          SEND/RCV-DATA (ILLEGAL) 
      JMP ERR       ILLEGAL PARAMETER 
OK    ALF,ALF 
      RAR,RAR       SET TO ADD TO SUBMODE 
      ADA REQ       SET FOR 1,2,3 FOR SUBMODE 
      STA REQ       SAVE LU,SUBMODE AND PRIVLEGE STATUS 
      LDA IDBUF     GET DATA BUFFER ADDRESS 
      LDB IDBFL,I   GET DATA BUFFER LENGTH
      STA BUFA      SAVE AS BUFFER ADDRESS OF CALL
      STB LEN       SAVE AS LENGTH
* 
      JSB .IOC.     CALL DRIVER 
REQ   NOP 
      JMP *-2 
BUFA  NOP 
LEN   NOP 
* 
WAIT  LDA IDVN,I    WAIT HERE UNTIL DONE
      IOR STATR     SET UP STATUS 
      STA REQ3        REQUEST 
      LDA TMOUT     SET UP TIME-
      STA DELAY       OUT COUNTER 
      CLA 
      STA DEL 
* 
IOC0  JSB .IOC.     STATUS CALL 
REQ3  NOP 
      SSA,RSS       COMPLETE? 
      JMP STCHK     YES, GO CHECK RETURNED STATUS 
      ISZ DEL       COUNT TIME
      JMP IOC0
      ISZ DELAY     TIMED OUT?
      JMP IOC0      NO, CHECK STATUS AGAIN
      LDA IDVN,I    YES, SET UP 
      STA REQ4        CLEAR REQUEST 
      JSB .IOC.     CLEAR DRIVER
REQ4  NOP 
      LDA B200      YES, SIMULATE TIMEOUT STATUS
* 
STCHK AND B377      MASK OFF ALL BUT STATUS 
      CPA D8        SEE IF STOP SENT
      INB,SZB       IF SO,WAS LENGTH=-1 
      RSS           NO..NO STOP, OR LENGTH NOT -1 
      CLA,INA       YES,LEGAL STOP. TREAT SAME AS NO ERRORS 
      SLA           BIT 0 
      CCB           NO ERRORS.  REQUEST COMPLETED 
      RAR,SLA       BIT 1 
      LDB D4        REQ NOT ACCEPTED...LENGTH ERROR 
      RAR,SLA       BIT 2 
      LDB B75       NO DATA...DATA CALL WITHOUT REQ 
      RAR,SLA       BIT 3 
      LDB B76       ILLEGAL STOP SENT 
      RAR,SLA       BIT 4 
      LDB B77       SIMULTANEOUS REQUEST. 
      RAR,SLA       BIT 5 
      LDB MD3       PARITY ERROR. 
      RAR,SLA       BIT 6 
      LDB B74       NO REQUEST RECEIVED.
      RAR,SLA       BIT 7 
      LDB D2        BROKEN LINE.
      LDA B         A = ERROR CODE
* 
      JMP L65,I     RETURN WITH ERROR CODE IN <A> 
* 
CS    STA REQ1      STORE IOC FUNCTION WORD 
      LDA IDBFA     GET AN ADDRESS OF A TEMP LOCATION 
      SZB           STATUS REQ? 
      JMP IOC1      YES 
      STA IMODE     SET IMODE TO POINT TO IDBUF 
      STA IDBUF     DITTO 
IOC1  JSB .IOC.     CALL DRIVER 
REQ1  NOP 
      STA IMODE,I   RETURN STATUS WORD
      STB IDBUF,I   RETURN TRANSMISSION LOG 
      JMP L65,I     RETURN TO CALLER
* 
* 
CON   STA REQ2      STORE IOC FUNCTION WORD 
      JSB .IOC.     CALL DRIVER 
REQ2  NOP 
      JMP *-2 
      JMP WAIT      GO WAIT FOR COMPLETION
* 
* 
ERR   CLA,INA       RETURN WITH <A>=1 TO
      JMP L65,I       INDICATE ILLEGAL PARAMETER
* 
* 
* 
REQC  DEF RQ
RQ    OCT 0         CLEAR REQUEST 
      OCT 10100     READ REQUEST
      OCT 21100     WRITE REQUEST 
STATR OCT 40000     STATUS REQUEST
      OCT 0         WAS POLLING...NOW CLEAR REQ.
      OCT 0         WAS LISTEN MODE...NOW CLEAR REQ.
      OCT 31400     STOP REQUEST
DEL   OCT 0         TIMEOUT 
DELAY OCT 0           COUNTERS
MD3   DEC -3
IDBFA DEF IDBUF 
D1    DEC 1 
D2    DEC 2 
D4    DEC 4 
B7    OCT 7 
D8    DEC 8 
B74   OCT 74
B75   OCT 75
B76   OCT 76
B77   OCT 77
B200  OCT 200 
B377  OCT 377 
A     EQU 0 
B     EQU 1 
      END 
                                                                                                                  