#CDINFE 08-DEC-83 09:54:17 SUBROUTINE CDINF(INF) INTEGER INF DATA maxmsg /8/ ! Maximum number of messages C C--> procedure statements C IND=INF+2 IF ((ind .LE. 0) .OR. (ind .GT. maxmsg)) GOTO 999 GOTO (10,20,30,40,50,60,70,80) IND GOTO 999 C 10 CONTINUE CALL MSGOUT(0,30,' %INF-Message block not active') GOTO 900 20 CONTINUE CALL MSGOUT(0,30,' %INF-Open connection. No xfer') GOTO 900 30 CONTINUE CALL MSGOUT(0,27,' %INF-Transmission pending') GOTO 900 40 CONTINUE CALL MSGOUT(0,23,' %INF-Receive pending.') GOTO 900 50 CONTINUE CALL MSGOUT(0,30,' %INF-Transmission completed ') GOTO 900 60 CONTINUE CALL MSGOUT(0,24,' %INF-Receive completed') GOTO 900 70 CONTINUE CALL MSGOUT(0,31,' %INF-Pending message;no buffer') GOTO 900 80 CONTINUE CALL MSGOUT(0,24,' %INF-New signal arrived') GOTO 900 900 continue return C 999 CALL msgout (0, 44, ' %INF-BADMSGNUM, bad message number passed') GOTO 900 end #DUPSTR 08-DEC-83 09:54:17 SUBROUTINE dupstr (inpstr, outstr, clen) C++ C FACILITY: EPPACK C C ABSTRACT: Copy one string to another. C C ENVIRONMENT: RT-11 Fortran IV. C DUPLSTR.FTN C C AUTHOR: Thomas H. Nicinski, Creation date: 23-Nov-1983 C C MODIFIED BY: C C V01-000 THN Thomas H. Nicinski 23-Nov-1983 C Initial entry. C-- C C This routine does NOT provide any protection to the caller in terms of C checking array boundaries, etc. C BYTE inpstr (1), outstr (1) INTEGER clen ! Length to copy C DO 10 index = 1, clen outstr (index) = inpstr (index) 10 CONTINUE RETURN END #EPANS 08-DEC-83 09:54:17 FUNCTION EPANS(BUF,BUFLEN) INTEGER EPAFLG,CRSTAT(2) *EPPMSG *EPCOMN *PTCCMN DATA EPAFLG/0/ C C**** PROCEDURE STATEMENTS C C C.. START UP SESSION IF NOT STARTED ALREADY IF(EPFLAG.EQ.1) GOTO 90 IF(EPERR(EPINIT('CD ',0,1,180,anx)).NE.0) GOTO 910 C C... DO INITIAL READ IF NOT ALREADY DONE: 90 CONTINUE IF(EPAFLG.EQ.1) GOTO 100 CALL CDRCV(EPCHAN,ANX,EPRBUF,8,CRSTAT) IF(CRSTAT(1).NE.CDOK) GOTO 910 EPAFLG=1 100 CONTINUE IF(EPWAIT(CRSTAT(2),CRSTAT).NE.CDOK) GOTO 910 C MAXWC=MIN(BUFLEN,EPRBUF(3)) maxwc = min0 (buflen, eprbuf (3)) EPLEN=MAXWC EPPTC=EPRBUF(2) CALL CDRCV(EPCHAN,ANX,EPRBUF,8,CRSTAT) CALL CDXMTW(EPCHAN,EPPTC,BUF,EPLEN,EPSTAT) IF(CRSTAT(1).NE.CDOK) GOTO 910 ! DID WE QIO SUCCESSFULLY? IF(EPSTAT(1).NE.CDOK) GOTO 920 ! DID WE TRANSMIT A BUFFER OK? EPANS=0 GOTO 1100 !EXIT SUCCESSFULLY C C C... ERROR REPORTING AND EXIT C C.. ERROR RECIEVING BUFFER 910 CONTINUE CALL EPINF(CRSTAT, ) EPANS = IADDR (Sanore) GOTO 1100 C C.. ERROR xmitting BUFFER 920 CONTINUE CALL EPINF(EPSTAT, ) EPANS = IADDR (Sanoxm) GOTO 1100 1100 CONTINUE RETURN END #EPBNWT 08-DEC-83 09:54:17 FUNCTION EPBNWT(BUF,LEN,BUFLEN,PFLAG) INTEGER CRSTAT(2),ESTATE,ISSUE,SWAIT *EPPMSG *EPCOMN *PTCCMN data EPflag,ESTATE/0,1/,ISSUE,SWAIT/1,2/ LOGICAL*1 PFLAG C C.. PARSE THE ESTATE (STATUS OF EPBNWT) GOTO (50,200) ESTATE EPBNWT = IADDR (Sbdst) GOTO 995 C C.. ESTATE = ISSUE (request for a buffer) 50 CONTINUE IF(EPFLAG.EQ.1) GOTO 100 IF( EPERR(EPINIT('CD ',0,0,180, )).NE.0) GOTO 910 EPflag=1 C C.. PREPARE TO RECEIVE MESSAGE 100 CONTINUE CALL CDRCV(EPCHAN,EPPTC,BUF,BUFLEN,CRSTAT) IF(CRSTAT(1).NE.CDOK) GOTO 900 C C.. SEND REQUEST TO OTHER SIDE EPRBUF(2)=EPPTC EPRBUF(3)=BUFLEN EPRBUF(4)=EPETYP CALL CDXMTW(EPCHAN,ANX,EPRBUF,8,EPSTAT) IF(EPSTAT(1).NE.CDOK) GOTO 905 C C.. ESTATE=SWAIT &CHECK IF THE LAST REQUEST WAS ANSWERED 200 ESTATE=SWAIT !DON'T PUT A CONTINUE HERE! STATUS=EPNWT(CRSTAT(2),CRSTAT) IF(STATUS.EQ.CDOK) GOTO 600 IF(STATUS.EQ.WAIT) GOTO 990 C C.. OTHERWISE DROP THROUGH TO ERROR REPORTING CALL EPINF(CRSTAT(1), ) CALL LSIGNL (IADDR (Sretry)) ESTATE=ISSUE GOTO 100 C C... ACK OR NACK OF EVENTS? 600 CONTINUE ESTATE=ISSUE IF(CRSTAT(2).EQ.2) GOTO 100 LEN=CRSTAT(2) !SET THE LENGTH GOTO 990 !OTHERWISE ITS A SUCCESS C C.. GENERAL LINK ERROR 900 CONTINUE ICODE=EPINF(CRSTAT, ) EPBNWT = IADDR (Sbnore) GOTO 995 905 CONTINUE ICODE=EPINF(EPSTAT, ) EPBNWT = IADDR (Sbnoxm) GOTO 995 C C.. INIT ERROR 910 CONTINUE EPBNWT = IADDR (Sinier) C CALL MSGOUT(0,11,' INIT ERROR') ICODE=EPINF(EPSTAT, ) GOTO 995 C C... SUCCESS EXIT 990 CONTINUE EPBNWT=0 995 CONTINUE IF(ESTATE.EQ.ISSUE) PFLAG=.FALSE. IF(ESTATE.EQ.SWAIT) PFLAG=.TRUE. RETURN END #EPBSTA 08-DEC-83 09:54:17 FUNCTION EPBSTA() *EPPMSG *EPCOMN *PTCCMN CALL CDSTAT(EPMBN,INF,EPSTAT) EPBSTA=EPSTAT(1) 995 CONTINUE RETURN END #EPBUFF 08-DEC-83 09:54:17 FUNCTION EPBUFF(BUF,LEN,BUFLEN) INTEGER CRSTAT(2) *EPPMSG *EPCOMN *PTCCMN data EPflag/0/ IF(EPFLAG.EQ.1) GOTO 100 IF( EPERR(EPINIT('CD ',0,0,180, )).NE.0) GOTO 910 EPflag=1 C C.. PREPARE TO RECEIVE MESSAGE 100 CONTINUE CALL CDRCV(EPCHAN,EPPTC,BUF,BUFLEN,CRSTAT) IF(CRSTAT(1).NE.CDOK) GOTO 900 C C.. SEND REQUEST TO OTHER SIDE EPRBUF(2)=EPPTC EPRBUF(3)=BUFLEN EPRBUF(4)=EPETYP CALL CDXMTW(EPCHAN,ANX,EPRBUF,8,EPSTAT) IF(EPSTAT(1).NE.CDOK) GOTO 905 C C.. WAIT FOR THIS LAST REQUEST TO BE ANSWERED IF(EPWAIT(CRSTAT(2),CRSTAT).EQ.CDOK) GOTO 600 CALL EPINF(CRSTAT(1), ) CALL LSIGNL (IADDR (Sretry)) GOTO 100 C C... ACK OR NACK OF EVENTS? 600 CONTINUE IF(CRSTAT(2).EQ.2) GOTO 100 LEN=CRSTAT(2) !SET THE LENGTH GOTO 990 !OTHERWISE ITS A SUCCESS C C.. GENERAL LINK ERROR 900 CONTINUE ICODE=EPINF(CRSTAT, ) EPBUFF = IADDR (Sbnore) GOTO 995 905 CONTINUE ICODE=EPINF(EPSTAT, ) EPBUFF = IADDR (Sbnoxm) GOTO 995 C C.. INIT ERROR 910 CONTINUE EPBUFF = IADDR (Sinier) C CALL MSGOUT(0,11,' INIT ERROR') ICODE=EPINF(EPSTAT, ) GOTO 995 C C... SUCCESS EXIT 990 CONTINUE EPBUFF=0 995 CONTINUE RETURN END #EPERR 08-DEC-83 09:54:17 C C THIS ROUTINE CALLS LSIGNL IFF THE ARGUMENT .NE. 0 C FUNCTION EPERR(IPAS) INTEGER EPERR,IPAS EPERR=0 IF(IPAS.EQ.0) RETURN EPERR=IPAS CALL LSIGNL (IPAS) RETURN END #EPEV 08-DEC-83 09:54:17 FUNCTION EPEV(BUF,LEN,INDEX,EVLEN) *EPPMSG *EPCOMN *PTCCMN IF(LASTEV.NE.0) GOTO 500 IF(EPERR(EPBUFF(BUF,LEN,BUFLEN)).NE.0) GOTO 900 IF(LEN.EQ.0) GOTO 950 LASTEV=1 INDEX=1 EVLEN=BUF(1) IF(EVLEN.GT.LEN) GOTO 960 ! UNPACKING OVERRUN GOTO 990 C C C.. SIMPLE EVENT UNPACKING CODE 500 CONTINUE INDEX=LASTEV+BUF(LASTEV)-1 !INCLUSIVE BYTE COUNT EVLEN=BUF(INDEX) IF(EVLEN.GT.LEN) GOTO 960 GOTO 990 C C... GENERAL LINK ERROR 900 CONTINUE CALL CDINF(EPERR) EPEV = IADDR (Slkerr) GOTO 995 C C.. PENDING REQUEST 950 CONTINUE EPEV=0 GOTO 995 C C... UNPACKING OVERRUN 960 CONTINUE EPEV = IADDR (Sunpov) GOTO 995 C C.. SUCCESSFUL REQUEST 990 CONTINUE EPEV=0 995 CONTINUE RETURN END #EPINF 08-DEC-83 09:54:17 FUNCTION EPINF(CSTAT,INF) INTEGER CSTAT(2),INF,LTEXT,LENGTH LOGICAL*1 TBUF(256) *EPEXTN *EPPMSG *CCOMN *EPCOMN *PTCCMN C NRGS=NARGS() ! HOW MANY ARGUMENTS CALLED WITH? CALL CDERRT(CSTAT,TBUF,76,LENGTH) LENGTH=LENGTH+2 TYPE 22,(TBUF(I),I=1,LENGTH) 22 FORMAT(' ',80A1) ENCODE(80,23,COTEXT)CSTAT 23 FORMAT(' EPSTAT(1)=',I8,'. EPSTAT(2)=',I8,'.') CALL MSGOUT(NETPTY,55,COTEXT) C IF(NRGS.GT.1) CALL CDINF(INF) IF (.NOT. nularg (inf)) CALL cdinf (inf) 995 CONTINUE RETURN END #EPINIT 08-DEC-83 09:54:17 C EPINIT- INITIALIZE EPPACK C C Author: Peter Heinicke C c Revised: October 19, 1983 (DEFAULTS) C c c c*>>> FUNCTION EPINIT(DEVNAM,UNIT,ETYP,TIMOUT,PTC) C CHARACTER*(*) DEVNAM BYTE DEVNAM (1) INTEGER EPGPTC *EPEXTN *EPPMSG *EPCOMN *PTCCMN IF(EPFLAG.EQ.1) GOTO 960 C C TRY TO TELL IF THE PTCCMN WAS PROPERLY DATA STATEMENTED IF(ITRCMP.NE.3) CALL LSIGNL (IADDR (Sbdptc)) EPCHAN=102 EPFLAG=1 C NAR=NARGS()-1 nar=5-1 ! Fool it for now IF(NAR .LE. 4) goto 100 CALL LSIGNL (IADDR (Sinvna)) RETURN 100 CONTINUE C C Determine how many arguments were passed by going backwards through the C argument list. The scan stops at the first non-null argument. C IF (.NOT. nularg (ptc)) GOTO 101 nar = nar - 1 IF (.NOT. nularg (timout)) GOTO 101 nar = nar - 1 IF (.NOT. nularg (etyp)) GOTO 101 nar = nar - 1 IF (.NOT. nularg (unit)) GOTO 101 nar = nar - 1 IF (.NOT. nularg (devnam)) GOTO 101 nar = nar - 1 101 CONTINUE C C EPDEVN=DEVNAM call dupstr (devnam, epdevn, epdvln) ! We have to know length EPUNIT=UNIT EPINIT=EPSETD(DEVNAM,UNIT) IF(EPINIT.NE.0) GOTO 910 IF(NAR.LE.1)EPETYP=1 IF(NAR.GT.1)EPETYP=ETYP IF(NAR.LE.2)EPTIMO=180 IF(NAR.GT.2)EPTIMO=TIMOUT IF(NAR.LE.3)EPPTC=EPGPTC(149) !GET FIRST AVAIL PTC STARTING @149 IF(NAR.GT.3)EPPTC=PTC EPINIT=EPSETP(EPPTC)+EPSETE(EPETYP)+EPSETT(EPTIMO) IF(EPINIT.EQ.0) GOTO 995 C C.. ERROR EXIT 910 CONTINUE EPINIT = IADDR (Sinier) GOTO 995 C C... PRE INITED 960 CONTINUE EPINIT = IADDR (Salrdy) 995 CONTINUE RETURN END C* C C EPGPTC- GET FIRST AVAILABLE PTC STARTING WITH ARGUMENT C C AUTHOR: Peter Heinicke C DATE: OCT-14-1983 C C*** FUNCTION EPGPTC(ISTPTC) *EPCOMN *EPPMSG *PTCCMN INTEGER EPGPTC,ISTPTC EPGPTC=ISTPTC 100 IF(EPGPTC.GE.255) GOTO 990 CALL CDOPEN(EPCHAN,EPGPTC,EPSTAT) IF(EPSTAT(1).EQ.CDOK) GOTO 995 EPGPTC=EPGPTC+1 D TYPE *,' EPGPTC' ,EPGPTC D CALL EPINF(EPSTAT, ) GOTO 100 990 CONTINUE CALL LSIGNL (IADDR (Snoptc)) GOTO 1000 995 CONTINUE CALL CDCLOS(EPCHAN,EPGPTC,EPSTAT) 1000 CONTINUE RETURN END #EPNWT 08-DEC-83 09:54:17 C** C C FUNCTION epnwt IS TO PROVIDE AN EFFICIENT INTERFACE C TO THE CDPACK ROUTINES. C USAGE: C IF(epnwt(MBN,STAT).EQ.CDOK) GOTO GOT_A_MESSAGE c IF(EPNWT(MBN,STAT).EQ.WAIT) GOTO WAITING C ELSE REPORT ERRORS C C** FUNCTION epnwt(MBN,STAT) INTEGER STAT(2),INF,MBN,TMBN *EPCOMN *PTCCMN C C EXECUTABLE STATEMENTS C TMBN=MBN !in case mbn=stat(2) CALL CDSTAT(TMBN,INF,STAT) IF(INF.EQ.IRCPND.OR.INF.EQ.ITRPND) GOTO 20 IF(INF.EQ.IRCCMP.OR.INF.EQ.ITRCMP) GOTO 30 CALL CDINF(INF) !REPORT INF ERROR STAT(1)=INF !INF CAN'T BE CDOK IF WE GET HERE GOTO 30 C C... WAIT CASE 20 CONTINUE STAT(1)=WAIT 30 CONTINUE epnwt=STAT(1) RETURN END #EPPMSG 08-DEC-83 09:54:17 .TITLE EPPMSG ;Error and warning mesages ; .FACILITY EPPACK, 1 /PREFIX= EPPACK_ .IDENT /V3.10/ ; ; This file is a conversion of the VMS Message Utility format message file. ; The comment shows the original IDENT portion of the message and the text. ; The "S" prefix for the global symbols denotes "signal". Each message MUST ; have a sequential number, starting at 1. ; .MACRO msgnum ident msg = msg + 1 IDENT == msg .ENDM msgnum ; msg = 0 ; Show no messages yet ; ; .SEVERITY ERROR ; msgnum Slkerr ;GENLKERR msgnum Sanore ;ANSUNABRE msgnum Sanoxm ;ANSUNABXM msgnum Snoptc ;NOPTCAVAIL msgnum Sbnoxm ;BUFUNABXM msgnum Sbnore ;BUFUNABRE msgnum Sunpov ;UNPACKOVRUN msgnum Sbdptc ;BADPTCDAT msgnum Sinvna ;INVNUMARGS ; ; .SEVERITY WARNING ; ; .BASE 10 ; msgnum Sinier ;INITERROR msgnum Salrdy ;ALREADY msgnum Sretry ;RETRY ; .END #EPSETD 08-DEC-83 09:54:17 FUNCTION EPSETD(DEVNAM,UNIT) external dupstr ! To copy strings C CHARACTER*(*) DEVNAM BYTE DEVNAM (1) *EPCOMN *EPPMSG *PTCCMN CALL CDASGN(EPCHAN,DEVNAM,UNIT,EPSTAT) IF(EPSTAT(1).EQ.CDOK) GOTO 990 CALL EPINF(EPSTAT, ) EPSETD=1 GOTO 995 C C.. SUCCESS EXIT 990 CONTINUE C EPDEVN=DEVNAM call dupstr (devnam, epdevn, epdvln) ! We have to know length EPSETD=0 995 CONTINUE RETURN END #EPSETE 08-DEC-83 09:54:17 FUNCTION EPSETE(ETYP) *EPPMSG *EPCOMN *PTCCMN EPETYP=ETYP EPSETE=0 995 CONTINUE RETURN END #EPSETP 08-DEC-83 09:54:17 FUNCTION EPSETP(PTC) *EPPMSG *EPCOMN *PTCCMN C C.. TRY TO CLOSE CURRENT SESSION EPSETP=1 C CALL CDCLOS(EPCHAN,EPPTC,EPSTAT) C IF(EPSTAT(1).NE.CDOK) GOTO 995 EPPTC=PTC CALL CDOPEN(EPCHAN,EPPTC,EPSTAT) IF(EPSTAT(1).EQ.CDOK) GOTO 990 ICODE=EPINF(EPSTAT, ) GOTO 995 C C.. SUCCESS EXIT 990 CONTINUE EPMBN=EPSTAT(2) ! STORE THE SESSION MBN EPSETP=0 995 CONTINUE RETURN END #EPSETT 08-DEC-83 09:54:17 FUNCTION EPSETT(TIMOUT) *EPPMSG *EPCOMN *PTCCMN C C... INDICATE SUCCESS CALL CDTMO(TIMOUT,1) ! 1 => TICKS EPTIMO=TIMOUT EPSETT=0 995 CONTINUE RETURN END #EPWAIT 08-DEC-83 09:54:17 C** C C FUNCTION EPWAIT IS TO PROVIDE AN EFFICIENT INTERFACE C TO THE CDPACK ROUTINES. C USAGE: C IF(EPWAIT(MBN,STAT).EQ.CDOK) GOTO GOT_A_MESSAGE C ELSE REPORT ERRORS C C** FUNCTION EPWAIT(MBN,STAT) INTEGER STAT(2),INF,MBN,TMBN *EPCOMN *PTCCMN C C EXECUTABLE STATEMENTS C TMBN=MBN C CALL CDWAIT(TMBN) 10 CONTINUE CALL CDSTAT(TMBN,INF,STAT) IF(INF.EQ.IRCPND.OR.INF.EQ.ITRPND) GOTO 10 IF(INF.EQ.IRCCMP.OR.INF.EQ.ITRCMP) GOTO 30 CALL CDINF(INF) !REPORT INF ERROR STAT(1)=INF !INF CAN'T BE CDOK IF WE GET HERE 30 CONTINUE EPWAIT=STAT(1) RETURN END #LSIGNL 08-DEC-83 09:54:17 SUBROUTINE lsignl (msgnum) C++ C FACILITY: EPPACK C C ABSTRACT: Routine to print out error messages. C C ENVIRONMENT: Fortran IV source. C LSIGNL.FTN C C AUTHOR: Thomas H. Nicinski, Creation date: 17-Nov-1983 C C MODIFIED BY: C C V01-000 THN Thomas H. Nicinski 17-Nov-1983 C Initial entry. C-- C C This is a simple routine to print out a message based on a message number. C Message numbers be greater than 0, but less than MAXMSG. C INTEGER*2 msgnum DATA maxmsg /13/ C IF ((msgnum .LE. 0) .OR. (msgnum .GT. maxmsg)) GOTO 999 GOTO ( 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, + 110, 120, 130) msgnum C 10 CALL print (' ?EPPACK-E, EPEV general link error') GOTO 900 C 20 CALL print (' ?EPPACK-E, EPANS unable to receive') GOTO 900 C 30 CALL print (' ?EPPACK-E, EPANS unable to send') GOTO 900 C 40 CALL print (' ?EPPACK-E, no available PTCs') GOTO 900 C 50 CALL print (' ?EPPACK-E, EPBUFF unable to send') GOTO 900 C 60 CALL print (' ?EPPACK-E, EPBUFF unable to receive') GOTO 900 C 70 CALL print (' ?EPPACK-E, unpacking overrun') GOTO 900 C 80 CALL print (' ?EPPACK-E, PTCCMN was not initialized correctly') GOTO 900 C 90 CALL print (' ?EPPACK-E, invalid number of arguments in EPINIT') GOTO 900 C 100 CALL print (' ?EPPACK-W, initialization error') GOTO 900 C 110 CALL print (' ?EPPACK-W, IN-66 protocol already inited') GOTO 900 C 120 CALL print (' ?EPPACK-W, retrying ...') GOTO 900 C 130 CALL print (' ?EPPACK-W, bad state') GOTO 900 C C Exit. C 900 CONTINUE RETURN C C A bad message number. C 999 CALL print (' ?EPPACK-W-NONAME, non-existant message') GOTO 900 END #MSGEPP 08-DEC-83 09:54:17 SUBROUTINE msgout (prior, length, text) C++ C FACILITY: EPPACK C C ABSTRACT: Routine to fudge MSGOUT. Priority is not used. C C ENVIRONMENT: RT-11 Fortran IV. C MSGOUT.FTN C C AUTHOR: Thomas H. Nicinski, Creation date: 28-Nov-1983 C C MODIFIED BY: C C V01-000 THN Thomas H. Nicinski 28-Nov-1983 C Initial entry. C-- INTEGER prior, length BYTE text (1) ! The message itself C BYTE final (81) ! The size must be MAXLEN DATA maxlen /81/ ! Maximum message length BYTE null DATA null /0/ INTEGER tlen ! Length of text (local copy) C C In order to force a null string terminator, it's necessary to copy the text C into a (hopefully) larger array. C tlen = length IF (tlen .LT. 0) tlen = 0 IF (tlen .GE. maxlen) tlen = maxlen - 1 ! Last char reserved for null IF (text (tlen + 1) .EQ. null) GOTO 35 ! Try to avoid copying IF (tlen .EQ. 0) GOTO 25 ! Nothing to copy over DO 15 i = 1, tlen 15 final (i) = text (i) 25 final (tlen + 1) = null CALL print (final) RETURN C C The original text has the terminating null character, so it wasn't necessary C to duplicate it as above. C 35 CALL print (text) RETURN END #NULARG 08-DEC-83 09:54:17 LOGICAL FUNCTION nularg (arg) C++ C FACILITY: EPPACK C C ABSTRACT: Determine whether a passed argument is null. C C ENVIRONMENT: RT-11 Fortran IV C NULARG.FTN C C AUTHOR: Thomas H. Nicinski, Creation date: 30-Nov-1983 C C MODIFIED BY: C C V01-000 THN Thomas H. Nicinski 30-Nov-1983 C Initial entry. C-- BYTE arg ! Type the argument anyway you like C C Null arguments are denoted by a -1 address in the argument list. C nularg = .FALSE. ! Let's give the arg the benefit of the doubt IF (iaddr (arg) .EQ. -1) nularg = .TRUE. RETURN END