.PSECT FORMCR .TITLE FORMCR .IDENT /V1.6/ .MCALL DIR$,SPWN$,STSE$,DRERR$ ; ;------------------------------------------------------------------------ ; FORMCRSUB.MAC ALLOWS THE USER TO INVOKE MCR FUNCTIONS FROM WITHIN ; AN EXECUTING PROGRAM BY SPAWNING THE APPROPRAITE TASK. ONLY THOSE ; TASKS INSTALLED IN THE FORM ...NNN (WHERE NNN IS THE THREE-LETTER ; TASK NAME) MAY BE INVOKED. ; ; PHIL HOFFMAN ; DEPT. OF CHEMISTRY ; MICHIGAN STATE UNIVERSITY ; EAST LANSING, MI 48824 ; 13-MAY-81 ;------------------------------------------------------------------------ ; ; MODIFICATION HISTORY ; ; 1.1 IF $DSW RETURNS -2 (TASK NOT INSTALLED) TRY THE COMMAND ; LINE AGAIN, PASSED DIRECTLY TO MCR... ; ; 1.2 TASK NAME IN THE SPWN$ DPB SAVED ON THE STACK TO PREVENT ; MODIFICATION THROUGH MULTIPLE CALLS AND PERVERSION OF ; THE DPB ; ; 1.3 IF $DSW RETURNS -7 (TASK NOT ACTIVE), ALSO TRY THE COMMAND ; LINE AGAIN, PASSED DIRECTLY TO MCR... ; ; 1.4 $DSW RETURN CODE DEFINITIONAL MACRO DRERR$ ADDED ; ; 1.5 LENGTH OF COMMAND LINE NOW IN CALL ; ; 1.6 Changed WTSE$ to STSE$ - don't let the issuing task compete for ; memory, causing lots of checkpointing, etc. - hg. ; ;------------------------------------------------------------------------ ; FORTRAN CALLING SEQUENCE ; ; CALL FORMCR(ISTR,IERR,ISYNCH,LSTR) ; ; ISTR => BYTE(72) ASCII COMMAND STRING ; IERR => INTEGER ERROR CODE ; ISYNCH => INTEGER SYNCHRONIZATION FLAG, WITH LEGAL VALUES OF: ; 1 => SUSPEND CALLING PROGRAM UNTIL FORMCR ; HAS COMPLETED ITS TASK ; 0 => SPAWN THE DESIRED TASK AND EXECUTE IT ; ASYNCHRONOUSLY FROM THE CALLING PROGRAM ; LSTR => INTEGER LENGTH OF COMMAND STRING ;------------------------------------------------------------------------ ; ;------------------------------------------------------------------------ ; MACRO-11 CALLING SEQUENCE ; ; MOV #N$,R5 ; JSR PC,FORMCR ; N$: BR M$ ; .WORD ISTR ; .WORD IERR ; .WORD ISYNCH ; M$: ;------------------------------------------------------------------------ ; ;------------------------------------------------------------------------ ; ERROR CODES ; ; WHEN FORMCR RETURNS TO THE CALLING PROGRAM, IERR CONTAINS THE STANDARD ; RSX-11M V 3.2 DSW ERROR CODES APPROPRIATE TO THE (UN)SUCCESSFUL SPAWNING ; OF THE DESIRED TASK. THE ERROR CODES DO NOT REFLECT THE SUCCESS OF ; THE OPERATION THAT THE TASK WAS TO PERFORM (E.G.: IF FORMCR SPAWNS ; PIP IN ORDER TO DELETE A FILE, THE ERROR CODE DOES NOT REFLECT THE ; SUCCESS OR FAILURE OF THE DELETION.) THE USER SHOULD ALSO NOTE THAT ; SUCCESSFUL OR NEUTRAL ERROR CODES RETURNED AS A RESULT OF ASYNCHRONOUS ; OPERATION ARE MEANINGLESS -- HOWEVER, ERROR CODES INDICATING THE ; NON-ACCEPTANCE OF THE SPAWN DIRECTIVE ARE VALID IN THIS MODE ; ;------------------------------------------------------------------------ ; ;------------------------------------------------------------------------ ; ; DPB'S AND DIRECT ASSIGNMENTS ; ;------------------------------------------------------------------------ ; EFN1 = 1 ;USE EVENT FLAG 1 FOR SYNCH. PROCESSING LEN = 72. ;MAXIMUM LENGTH FOR COMMAND SPNDPB: SPWN$ ...XXX,,,,,EFN1,,ESB,,LEN,, WTDPB: STSE$ EFN1 ESB: .BLKW 8. MCRSTR: .ASCII /MCR/ .EVEN ; .MACRO PUSH REGS ;STACK.MAC .IRP X, MOV X,-(SP) .ENDM .ENDM PUSH .MACRO POP REGS ;STACK.MAC .IRP X, MOV (SP)+,X .ENDM .ENDM POP DRERR$ ;DEFINE THE DSW RETURN CODES ; ;------------------------------------------------------------------------ ; ; ENTRY POINT ; ;------------------------------------------------------------------------ ; FORMCR:: PUSH ;SAVE THE REGISTERS PUSH ;SAVE THE RAD50 DUMMY TASK ;NAME ; CONVERT THE TASK NAME TO RAD50 MOV @10(R5),R2 ;GET LENGTH OF COMMAND LINE CMP #LEN,R2 ;TRUNCATE TO LEN IF NEEDED BGT 1$ ;BRANCH IF LSTR .LE. LEN MOV #LEN,R2 1$: MOV R2,SPNDPB+S.PWCL ;SET LENGTH IN DIRECTIVE MOV 2(R5),R0 ;USE R0 TO POINT TO THE ASCII STRING MOV R1,#1 ;SET FLAG TO ALLOW "." AS VALID CHAR CALL $CAT5 ;CONVERT ASCII TO RAD50 MOV R1,SPNDPB+S.PWTN+2 ;MOVE THE RAD50 NAME INTO THE DPB MOV 2(R5),SPNDPB+S.PWCA ;MOVE THE CMD STR ADDR INTO THE DPB DIR$ #SPNDPB ;SPAWN THE DESIRED TASK BCS ERR ;ERROR IF DIRECTIVE NOT ACCEPTED CMP @6(R5),#0 ;CHECK THE SYNCH/ASYNCH FLAG BEQ OUT ;GO HOME IF ASYNCH DIR$ #WTDPB ;WAIT FOR SPAWNED TASK TO COMPLETE BR OUT ;GO HOME ERR: MOV $DSW,ESB ;SET THE DIRECTIVE ERROR CODE CMP ESB,#IE.INS ;SEE IF ITS ERROR -2 (NOT INSTALLED) BEQ TRY2 ;YES, LET'S TRY AGAIN CMP ESB,#IE.ACT ;SEE IF ITS ERROR -7 (TSK NOT ACT) BEQ TRY2 ;YES, LET'S TRY AGAIN BR OUT ;NO -- GO HOME TRY2: MOV #0,ESB ;CLEAR THE ESB MOV #MCRSTR,R0 ;POINT TO THE MCR STRING MOV R1,#1 ;SET UP FOR RAD50 CONVERSION AGAIN CALL $CAT5 ;CONVERT TO RAD50 MOV SPNDPB+S.PWTN,SPNDPB+S.PWTN+2 ;REARRANGE THE DPB MOV R1,SPNDPB+S.PWTN ;MOVE THE RAD50 MCR NAME INTO THE DPB DIR$ #SPNDPB ;TRY SPAWNING AGAIN BCS ERR2 ;ERROR IF DIRECTIVE NOT ACCEPTED CMP @6(R5),#0 ;CHECK THE SYNCH/ASYNCH FLAG BEQ OUT ;GO HOME DIR$ #WTDPB ;WAIT FOR THE SPAWNED TASK TO COMPLETE BR OUT ;GO HOME ERR2: MOV $DSW,ESB ;SET THE DIRECTIVE ERROR CODE OUT: MOV ESB,@4(R5) ;RETURN THE ERROR CODE POP ;RESTORE THE DUMMY RAD50 ;TASK NAME POP ;RESTORE THE REGISTERS RTS PC ;AND GO HOME .END