.title jjmar .. Marco library functions , .IDENT /01/  .PSECT CRTQIO ; X; CRTQIO CONTAINS THREE ENTRY POINTS: ASSCRT, CHROUT AND CHROST. ALL ARE ; CALLED FROM FORTRAN TO PROVIDE DEVICE ASSIGNMENT AND TO OUTPUT CHARACTERS TO ; A TERMINAL WITHOUT INTERPRETATION OR FORMAT. ; THE FORMATS OF THE CALLS ARE: ; L; CALL ASSCRT ( CHAN, NAMNUM , NAME ) ; ; CALL CHROUT ( CHAN , NUMCH , CH1 , CH2 , ... , CHN ) x; ; CALL CHROBF ( CHAN , NUMCH , BUFFER ) @; ; CALL CHROST ( CHAN , STRING ) ; l; WHERE - ; 4; CHAN THE CHANNEL NUMBER ASSIGNED TO THE TERMINAL ; NAMNUM NUMBER OF CHARACTERS IN THE TERMINAL NAME ; NAME CHARACTER STRING CONTAINING THE TERMINAL NAME ` ; NUMCH NUMBER OF CHARACTERS TO OUTPUT ; CH1,CH2 ADDRESSES OF SINGLE CHARACTERS ( ; BUFADR ADDRESS OF CHARACTER BUFFER CONTAINING MULTIPLE CHARACTERS ; STRING IS A STANDARD FORTRAN CHARACTER STRING ; T ; DEFINE I/O FUNCTION CODES ;  $IODEF ; ; QIO ARGUMENT LIST H ; QIOARG: $QIO EFN=1,FUNC=IO$_WRITEVBLK!IO$M_NOFORMAT,-  P1=0,P2=0 t; ; TERMINAL NAME STRING STORAGE AREA <; TERMCHN:.LONG 0 ;TEMP FOR CHANNEL NUMBER TERMNAM: h .LONG 0 ;LENGTH OF NAME STRING  .LONG 0 ;ADDRESS OF NAME STRING 0NADDRS: .LONG NAME ; DEVDESC: ;DEVICE NAME DESCRIPTOR NLEN: .LONG 63 ;BUFFER LENGTH \NADDR: .LONG NAME ;BUFFER ADDRESS NAME: .BLKB 64 ;DEVICE NAME BUFFER $; ; A S S C R T ; P .ENTRY ASSCRT,^M  MOVL NADDRS,NADDR ;RESET NADDR  MOVL (AP)+,R0 ;GET NUMBER OF ARGUMENTS | MOVL (AP)+,R2 ;GET ADDRESS FOR CHANNEL  MOVL @(AP)+,TERMNAM ;SET LENGTH OF NAME D MOVL (AP),TERMNAM+4 ;SET ADDRESS OF NAME  $TRNLOG_S LOGNAM=TERMNAM,- ;TRANSLATE TERMINAL NAME  RSLLEN=NLEN,RSLBUF=DEVDESC ; p CMPB NAME,#^X1B ;DOES NAME BEGIN WITH ESCAPE?  BNEQ 10$ ;NO, SKIP 8 SUBL #4,NLEN ;OTHERWISE, SUBTRACT 4 FROM LENGTH  ADDL #4,NADDR ;ADD 4 TO ADDRESS 10$: $ASSIGN_S DEVNAM=DEVDESC,- ;ASSIGN CHANNEL d CHAN=TERMCHN ;CHANNEL NUMBER  MOVL TERMCHN,(R2) ;RETURN CHANNEL TO CALLER , RET ;RETURN TO CALLER ; ; C H R O U T X;  .ENTRY CHROUT,^M ;CHROUT ENTRY MASK  MOVL (AP)+,R2 ;GET NUMBER OF PARAMS  SUBL #2,R2 ;  BLEQ 20$ ;QUIT IF 2 OR LESS L MOVL @(AP)+,QIOARG+QIO$_CHAN ;SET CHANNEL NUMBER  MOVL #1,QIOARG+QIO$_P2 ;SET LENGTH OF WRITE  MOVL @(AP)+,R2 ;GET NUMBER OF CHARS x10$: MOVL (AP)+,QIOARG+QIO$_P1 ;SET CHARACTER ADDRESS  $QIO_G QIOARG ;OUTPUT THE CHARACTER @ SOBGTR R2,10$ ;NEXT CHAR IF NOT DONE 20$: RET ;ALL DONE, RETURN  ; l ; C H R O B F ; 4! .ENTRY CHROBF,^M ! MOVL (AP)+,R2 ;NUMBER OF ARGS ! MOVL @(AP)+,QIOARG+QIO$_CHAN ;SET CHANNEL NUMBER `" MOVL @(AP)+,QIOARG+QIO$_P2 ;SET LENGTH OF WRITE " MOVL (AP)+,QIOARG+QIO$_P1 ;SET WRITE BUFFER ADDRESS (# $QIO_G QIOARG ;WRITE THE BUFFER # RET #; T$; C H R O S T $; % .ENTRY CHROST,^M % MOVL (AP)+,R2 ;NUMBER OF ARGS % MOVL @(AP)+,QIOARG+QIO$_CHAN ;SET CHANNEL NUMBER H& MOVL (AP),R2 ;GET ADDR OF STRING DESCR & CLRL QIOARG+QIO$_P2 ;ZERO LENGTH OF WRITE ' MOVW (R2),QIOARG+QIO$_P2 ;SET LENGTH OF WRITE t' MOVL 4(R2),QIOARG+QIO$_P1 ;SET BUFFER ADDRESS ' $QIO_G QIOARG ;WRITE THE BUFFER <( RET ); ); 0*; iaddr = jjargs( nargs ) .. Find callers arguments *; iaddr <= Address of callers arguments *; nargs <= Number of parms in callers call \+; +; -end.of.info- $,; , .psect jjargs P-; - .entry jjargs,^m . movl 8(fp),r0 ; iaddr << AP address |. movl (r0),@4(ap) ; nargs << number of params . ret D/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0; p0; call jjterm( term, ipid, imgp ) 0; 81;.inp. term == 4 character terminal string 1;.out. ipid == i*4 process id 2;.out. imgp == i*4(2) Member, Group d2; 2 $dibdef ,3 $jpidef 3 .psect jjterm,quad 3 .entry jjterm,^m X4; 4 movl 4(ap),r2 ;;Pick up term name 5 movl 4(r2),r2 5 movl (r2),tname 5 $getdev_s devnam=tdisc,pribuf=ddisc L6 movl dbuff+dib$l_pid,@8(ap) ;;Move pid 6 bnequ okdev 7 movl dbuff+dib$l_pid,@12(ap) ;;zero mem,grp x7 ret 7okdev: @8 $getjpi_s pidadr=dbuff+dib$l_pid,itmlst=jdisc 8 movl jbuff,@12(ap) ;;Pick up mem,grp 9 ret 9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 4:; :tdisc: .word 4,0 : .long tname `;tname: .quad 0 ;; ( .long jbuff,0,0 >jbuff: .quad 0 > .end