.TITLE CA .IDENT /MB003/ .SBTTL ABSTRACT ;+ ; SECCOND MCR COMMAND DISPATCHER ; ****************************** ; IF THE TASK IS NOT INSTALLED IN RSX11M V3.2, THIS ...CA. TASK ; WILL BE CALLED, TO DO A SECCOND SCAN ON THE COMMAND LINE ; AND INSTALL THE TASK IF FOUND IN AN INTERNAL CA TABLE (CATAB), ; EXECUTE THE COMMAND, AND MARK THE TASK FOR REMOVE AFTER EXECUTION. ; THIS MIGHT BE A SOLUTION FOR THE POOL PROBLEM THAT EXISTS ; WHEN MANY TASKS ARE PERMANENTLY INSTALLED. ; TASKS THAT ARE NOT FREQUENTLY USED, OR USED FOR A SHORT TIME, ; CAN BE INSTALLED BY THIS VERSION OF ...CA. ; ; MODIFIED VERSION OF THIS TASK ALLOWS EXPLICITELY SPECIFY PRIORITY ; AND DIRECTORY ON LB1: DISC, FROM WHICH THE TASK WILL BE LOADED. ; ; CONDITIONALLY (IND SYMBOL DEFINED), IDIRECT FILES PROCESSOR (...AT.) ; MAY BE CALLED WITH FILENAME FORMED BY FIRST THREE COMMAND'S LETTERS. ; ; CONDITIONALLY (SCP SYMBOL DEFINED), SUBSTITUTION COMMAND PARSER ; MAY BE CALLED TO CONTINUE SCAN IF NO PREVIOUS COMMAND MATCHED. ; NOTE, SUBSTITUTION PARSER MAY CALL INDIRECT FILES PROCESSOR[S] ; BETTER WAY THEN CA. DOES. ; ; CONDITIONALLY (CCL SYMBOL DEFINED), UNKNOWN COMMANDS MAY BE PASSED ; TO THIRD COMMAND DISPATCHER (...CCL), TO CONTINUE SCANNING. ; COMMANDS ARE PASSED VIA MCR... T.E. PRECEEDED BY CCL NAME: ; >CCL ORIGINAL COMMAND ; THIS REDUCES AVAILABLE COMMAND LENGTH TO 76. BYTE, BUT ONLY ; ONE COPY OF ...CCL NEED TO BE INSTALLED. ; ; NOTES: ; BYE AND DMO NOW MAY BE INSTALLED BY THIS TASK, BECAUSE ; ...CA. RESTORES TERMINAL STATUS WORD U.CW2 FOR INSTALL ONLY. ; MOU MUST BE INSTALLED DURING SYSTEM START-UP, LATER MAY BE ; REMOVED AND ISTALLED BY CA. (BUT NEVER DISMOUNT LB1: DISK!). ; ; ...CA. M U S T BE INSTALLED WITH PRIORITY GREATER MCR... ; (INS MCRMU/PRI=160. INS CA/PRI=161.) TO ACHIEVE CORRECT ; SYNCHRONIZATION. LOWER PRIORITY MAY RESULT IN AT LEAST ; "TASK ACTIVE" MESSAGES, BUT ALSO TO NON-REMOVED TEMPORRARY ; INSTALLED TASKS, WHEN MORE USERS TRY TO USE THE SAME ONE. ; ; THIS TASK IS INTENDED TO ALLOW MULTIPLE CALLS FROM MCR..., ; AT. OR CCL. THEREFORE IT SHOULD WORK IN SIMPLE, STRAIGHT ; WAY WITHOUT WAITING - SO DON'T INCLUDE ANY INTERNALLY PARSED ; COMMANDS WHICH LEFT ...CA. ACTIVE AND UNUSABLE FOR LONGER TIME. ; ; THE CODE IN CHTSK,CHMCR MAY BE SIMPLIFIED USING MODIFIED ; SPAWN DIRECTIVE WITH EFN=-1, BUT CURRENT CODE IS WRITTEN ; FOR UNMODIFIED SYSTEMS. ; IF SPWN$ IS NOT AVAILABLE, CA. MAY BE BUILT TO WAIT FOR INS ; USING ALTP$ AND AT LEAST 1/4 SEC WAIT (U2.AT. OF U.CW2 USED) ;- .PAGE ;+ ; IDEA: ; PIM INGENEGEREN 02-JUN-80 ; LAB V. EXP. FYSICA, UTTRECHT, THE NETHERLANDS ; MODIFIED: ; ; MB005 25-JAN-81 - MODIFY TO USE TASK-TABLE INCLUDING PRIORITY ; AND FILE DIRECTORY, FIX TO USE ...TTT NAMES. ; ; MB006 18-FEB-81 - USE MARK-FOR-REMOVE AND EXIT CA INSTEAD OF ; WAITING FOR TASK TO COMPLETE. ; PASS CA'S OCB TO CALLED TASK. ; ; MB017 18-JUN-81 - PASS ALL UNKNOWN COMMANDS TO ...CCL ; (CONDITIONALLY COMPILED .IF DF CCL) ; ADD SUPPORT FOR INDIRECT-FILES COMMANDS ; (CONDITIONALLY COMPILED .IF DF IND) ; ; MB017 18-OCT-81 ADD SUPPORT FOR SUBSTITUTION COMMAND PARSER ; (CONDITIONALLY COMPILED .IF DF SCP) ;- .PAGE .SBTTL PROGRAMM DATA ; ; PROGRAM CONFIGURATION CONDITIONALS ; ;IND = 1 ;ENABLE COMMANDS PROVIDED VIA ...AT. PROCESSOR SCP = 1 ;ENABLE SUBSTITUTED COMMANDS PARSING (SCP MODULE) CCL = 1 ;PASS UNKNOWN COMMANDS TO THIRD DISPATCHER SPW = 1 ;SPAWN DIRECTIVE AVAILABLE ; .MCALL DIR$,QIOW$S,WTSE$S,EXIT$S,WSIG$S .IF DF SPW .MCALL SPWN$S,EXST$S ;SPAWN DIRECTIVES AVAILABLE .IFF .MCALL ALTP$S,MRKT$S ;SPAWN NOT AVAILABLE, USE DIRTY WAY .MACRO EXST$S,X ;REPLACE EXIT WITH STATUT EXIT$S .ENDM EX$SEV = 04. ;SEVERE EXIT STATUT, UNUSED WTPRI = 90. ;PRIORITY TO WAIT FOR ...INS .ENDC ;SHOULD BE LOWER THAN IT'S ONE. .NLIST BEX ; ; LOCAL DEFINITIONS ; CAE = 001 ;CA LOGIC ERROR ACT = 010 ;INSTALLED TASK WAS ACTIVATED BY OTHER TT NOD = 100 ;NO DYNAMIC MEMMORY AVAILABLE ; ; LOCAL DATA ; CLINAM: .RAD50 /MCR.../ ;CLI TASK NAME RADIX-50 R50TSK: .RAD50 /...XXX/ ;EXECUTED TASK NAME RADIX-50 CCLNAM: .ASCII /CCL / ;THIRD MCR COMMAND DISPATCHER NAME CCLR50: .RAD50 /CCL/ ;4 CHAR ASCII AND RADIX-50 ERR: .WORD 0 ;ERROR FLAG ESB: .BLKW 8. ;EXIT STATUS BLOCK TGTCB: .WORD 0 ;TARGET TASK TCB ADDR SAVE CMDBF: .WORD 0 ;MCR COMMAND BUFFER ADDR TIUCB: .WORD 0 ;TEMP. TI: UCB ADR STORAGE CW2: .WORD 0 ;TEMP. TI: STATUS STORAGE ; INSCMD: .ASCII %INS LB1:[% ;INSTALL BUFFER INSGGG: .ASCII %001,% ;FILE UIC GROUP-NUMBER INSMMM: .ASCII %001]% ;FILE UIC MEMBER-NUMBER INSFIL: .ASCII %XXX/TASK=...% ;SPACE FOR FILENAME INSTSK: .ASCII %XXX/CKP=YES/PRI=% ;SPACE FOR TASKNAME INSPRI: .ASCII %050% ;SPACE FOR PRIORITY .BYTE 33 ;END OF COMMAND FLAG .EVEN INSLEN =.-INSCMD GGG: .WORD 0 ;TASK FILE UFD GROUP CODE MMM: .WORD 0 ;TASK FILE UFD MEMB. CODE ; MCRL:: .WORD 0 ;MCR COMMAND LENGTH .WORD 0 ;TWO WORDS MUST PRECEED MCR! MCR:: .BLKW 40. ;MCR COMMAND BUFFER .WORD 0 ;SENTINEL ; NOTMSG: .ASCIZ /MCR -- UNKNOWN COMMAND/ .EVEN NOTLEN =.-NOTMSG ; CAEMSG: .ASCIZ /MCR -- CA. INTERNAL ERROR/ .EVEN CAELEN =.-CAEMSG ; .PAGE .SBTTL MAIN PROGRAMM ; CA:: MOV $TKTCB,R4 ;GET OUR TCB ADDRESS MOV T.UCB(R4),R4 ;GET OUR UCB ADDRESS MOV R4,TIUCB ;SAVE IT MOV U.CW2(R4),CW2 ;STORE INITIAL STATUS MOV (PC)+,R1 ;PREPARE GMCR$ DPB .BYTE 127.,41. ;USING MCR COMMAND BUFFER MOV R1,MCR-2 ;STARTING AT MCR: DIR$ #MCR-2 ;GET CMD LINE BCS UNKNOWN ;CS = NO CMD LINE, ERR MOV @#$DSW,MCRL ;SAVE COMMAND LENGTH CMP MCRL,#3 ;IS COMMAND LONGER 3 LETTERS? BLT NOTIN ;LT - NOT IN OUR TABLES MOV #MCR,R0 ;GET CMD NAME ADDR MOV #1,R1 ;ALLOW PERIOD CONVERSION CALL $CAT5 ;CONVERT ASCII TO RAD50 MOV R1,R50TSK+2 ;SAVE IT TO TSKNAM CMP R1,CCLR50 ;IS IT CCL REQUEST (CCL NOT INSTALLED?) BEQ UNKNOWN ;EQ - YES, SO UNKNOWN COMMAND ; ; SCAN INSTALLABLE TASKS TABLE ; MOV #TSKLST,R5 ;GET FIRST ITEM ADDR 10$: CMP (R5),R1 ;DOES IT MATCH OUR CMD? BEQ INSSTA ;EQ - YES, INTALL THE TASK ADD ITEML,R5 ;POINT TO NEXT ITEM TST (R5) ;TEST END OF TABLE BNE 10$ ;NE - NO, VALID ITEM ; ; SCAN INDIRECT COMMANDS TABLE ; .IF DF IND MOV #CMDLST,R5 ;GET FIRST COMMAND ADDR 20$: MOV (R5)+,R0 ;GET TABLE ITEM RAD50 BEQ 40$ ;EQ - END OF TABLE CMP R0,R1 ;DOES IT MATCH OUR CMD? BNE 20$ ;NE - NO, TRY NEXT ITEM MOV #MCR,R5 ;PICK UP COMMAND ADDR 30$: CMPB (R5)+,#'A ;ONLY LETTERS ALLOWED FOR IND.CMD BGE 30$ ;GE = LETTER, FIND THE LAST ONE DEC R5 ;RETURN TO NON-ALPHA CHARACTER MOVB MCR+2,-(R5) ;MOVE THREE LETTER OF COMMAND NAME MOVB MCR+1,-(R5) ;JUST BEFORE SWITCHES, TABS... MOVB MCR+0,-(R5) ;(CMD.FILE NAME USES 3 LETTERS) MOVB #'$,-(R5) ;FILL COMMAND FILES LIBRARY REF. MOVB #'@,-(R5) ;AND INDIRECT COMMAND PREFIX JMP CHMCR ;CHAIN MCR WITH THE COMMAND .ENDC ;IND 40$: .PAGE ; THE THREE LETTER COMMAND NOT FOUND IN OUR TABLES ; .IF DF SCP CALL SCPAR ;CALL SUBSTITUTION PARSER .ENDC ;SCP ; NOTIN:: .IF DF CCL MOV #MCR,R5 ;GET COMMAND ADDR MOV CCLNAM+2,-(R5) ;PRECEED COMMAND WITH THE MOV CCLNAM+0,-(R5) ;"CCL " PREFIX JMP CHMCR ;CHAIN MCR WITH THE MODIFIED CMD .ENDC ;CCL ; ; UNKNOWN COMMAND FINISHES HERE ; UNKNOWN:: ;TELL THE USER "UNKNOWN CMD" QIOW$S #IO.WVB,#1,#1,,,,<#NOTMSG,#NOTLEN,#40> BR EXIT ;EXIT WITH SEVERE ERROR ; QEXIT: CALL $SWSTK,EXIT ;SWITCH TO SYSTEM STACK MOV $TKTCB,R0 ;POINT TO OUR TCB BIC #T3.MCR,T.ST3(R0) ;REMOVE MCR PROMPT REQUEST RETURN EXIT: EXST$S #EX$SEV ;EXIT WITH SEVERE ERR ; .PAGE .SBTTL INSTALL THE APPROPRIET TASK ; ; INSTALL THE APPROPRIET TASK AND FALL THROUGH CHTSK TO CHAIN IT ; INSSTA: MOV #INSFIL,R0 ;GET FILENAME POSITION MOV #INSTSK,R1 ;GET TASKNAME POSITION MOV #MCR,R2 ;GET COMMAND NAME POSITION MOV #3,R3 ;SET-UP CHARACTER COUNT 05$: MOVB (R2),(R0)+ ;TRANSFER THE NAME TO MOVB (R2)+,(R1)+ ; FILENAME AND TASKNAME SOB R3,05$ ;REPEAT TST (R5)+ ;POINT TO PRIORITY MOV #15010,R2 ;SET-UP FOR 3CHAR OCTAL CONVERSION MOVB (R5)+,R1 ;GET PRIORITY BIC #177400,R1 ;CLEAR UPPER BYTE MOV #INSPRI,R0 ;GET IT'S PLACE IN BUFFER CALL $CBTA ;CONVERT IT TO ASCII .IF DF SPW MOVB #33,(R0) ;ADD LINE FINISHING ESCAPE .IFF MOVB #15,(R0) ;FORCE MCR TO PROMPT .ENDC MOV #15010,R2 ;SET-UP FOR 3CHAR OCTAL CONVERSION MOVB (R5)+,GGG ;GET GROUP CODE BNE 10$ ;NE = VALID VALUE MOVB $SYUIC+1,GGG ;USE DEFAULT - SYSUIC 10$: MOV GGG,R1 ;GET RESULTING VALUE MOV #INSGGG,R0 ;GET IT'S PLACE IN BUFFER CALL $CBTA ;CONVERT IT MOV #15010,R2 ;SET-UP FOR 3CHAR OCTAL CONVERSION MOVB (R5)+,MMM ;GET MEMBER CODE BNE 20$ ;NE = VALID VALUE MOVB $SYUIC+0,MMM ;USE DEFAULT - SYSUIC 20$: MOV MMM,R1 ;GET RESULTING VALUE MOV #INSMMM,R0 ;GET IT'S PLACE IN BUFFER CALL $CBTA ;CONVERT IT MOV #INSCMD,R5 ;GET INSTALL CMD MOV #INSLEN,R2 ;AND LENGTH BIS #U2.SLV!U2.PRV,U.CW2(R4);SLAVE AND PRV THE TERMINAL .IF DF SPW SPWN$S #CLINAM,,,#GGG,#MMM,#5,,#ESB,R5,R2 BCS 30$ ;CS = SPAWN REJECTED WTSE$S #5 ;WAIT FOR SPAWNED INS TO COMPLETE .IFF CALL CHMCR0 ;CALL MCR WITH INSTALL CMD ALTP$S ,#WTPRI ;ALTER PRIORITY BELOW INS MOV $TKPS,R2 ;GET TICKS PER SECCOND ASR R2 ;DIVIDE TO 1/2 SEC ASR R2 ;DIVIDE TO 1/4 SEC MOV TIUCB,R4 ;GET TI: UCB ADDR BIS #U2.AT.,U.CW2(R4) ;SET TO SYNCHRONIZE WITH MCR 25$: MRKT$S #5,R2,#1 ;MARK THE 1/2 SEC WAIT WTSE$S #5 ;WAIT... BIT #U2.AT.,U.CW2(R4) ;IS MCR DONE? BNE 25$ ;NE = WAIT SOME MORE ALTP$S ;RESTORE PRIORITY MOV #EX$SUC,ESB ;SIMULATE SUCCESS .ENDC ;SPW 30$: MOV CW2,U.CW2(R4) ;RESTORE INITIAL STATUS CMP #EX$SUC,ESB ;DID INSTALL SUCCEEDED? BNE QEXIT ;NE=NO, QUIET EXIT ;FALL THROUGH CHTSK TO CHAIN ;THE JUST INSTALLED TASK ; .PAGE .SBTTL TEMPORRARY TASK CHAINING ROUTINE ; CHTSK: CLR ERR ;CLEAR ERROR FLAG WORD CALL $SWSTK,50$ ;;SWITCH TO SYSTEM STACK MOV #R50TSK,R3 ;;GET TASKNAME RAD-50 CALL $SRSTD ;;SEARCH FOR TASK BCC 5$ ;;CC = O.K., TASK FOUND MOV #CAE,ERR ;;CS = SET TASK NOT FOUND FLAG BR 45$ ;;RETURN 5$: TST T.STAT(R0) ;;TASK ACTIVE? BLE 8$ ;;LE = O.K., TASK NOT ACTIVE MOV #ACT,ERR ;;PL = SET TASK ACTIVE FLAG BR 45$ ;;RETURN 8$: MOV R0,TGTCB ;;SAVE TARGET TASK TCB MOV TIUCB,R2 ;;GET OUR UCB ADDR MOV U.UIC(R2),R1 ;;SET-UP DEFAULT UIC MOV R1,R3 ;;COPY IT BIT #FE.MUP,$FMASK ;;MULTI-USER PROTECTION? BEQ 10$ ;;NE=NO BIT #U2.PRV,CW2 ;;PRIVILEGED USER? BNE 10$ ;;NE=YES,USE R1 AS PROTECTION UIC MOV U.LUIC(R2),R1 ;;NO, GET PROTECTION UIC 10$: CALL $TSKRP ;;START TASK WITH PROTECTION BCC 15$ ;;CC = NO ERROR MOV #CAE,ERR ;;FLAG CA SYSTEM ERROR BR 45$ ;;RETURN 15$: BIT #FE.OFF,$FMASK ;;PARRENT-OFFSPRING TASKING? BEQ 20$ ;;EQ = NOT SUPPORTED MOV $TKTCB,R0 ;;POINT TO OUR TCB ADD #T.OCBH,R0 ;;POINT TO OUR OCB LIST CALL $QRMVF ;;GET THE OCB, IF ANY BCS 20$ ;;CS=NO OCB IN QUEUE MOV TGTCB,R0 ;;RESTORE TARGET TCB ADDR. ADD #T.OCBH,R0 ;;POINT TO ITS OCB LIST CALL $QINSF ;;PASS THE OCB TO IT 20$: MOV TGTCB,R0 ;;RESTORE TARGET TASKS TCB BIS #T3.REM,T.ST3(R0) ;;SET-UP TO REMOVE ON EXIT BIS #T3.MCR,T.ST3(R0) ;;SET-UP TO PROMPT ON EXIT MOV #84.,R1 ;;SET BUFFER TO GET CALL $ALOCB ;;TRY TO GET IT BCC 25$ ;;CC = O.K. MOV #NOD,ERR ;;CS = SET UP NO DYN.MEMMORY FLAG BR 45$ ;;RETURN 25$: MOV R0,R1 ;;COPY BUFFER ADDR TST (R1)+ ;;SKIP OVER FIRST WORD MOV TGTCB,(R1)+ ;;STORE TARGET TCB ADDR MOV #MCR,R2 ;;GET COMMAND ADDR 30$: CMPB #15,(R2) ;;IS CURRENT BYTE CR? BEQ 42$ ;;EQ=YES, FINISH UP CMPB #33,(R2) ;;IS CURRENT BYTE ESCAPE? BNE 40$ ;;NE=NO MOV TGTCB,R3 ;;YES,GET TARGET TCB ADDR BIC #T3.MCR,T.ST3(R3) ;;REMOVE THE MCR PROMPT REQUEST BR 42$ ;;FINISH TRANSFER 40$: MOVB (R2)+,(R1)+ ;;TRANSFER A BYTE CMP #MCR+79.,R2 ;;END OF BUFFER? BGT 30$ ;;IF GT LOOP MOVB #15,(R2) ;;FORCE END OF COMMAND 42$: MOVB (R2),(R1) ;;ADD FINISHING CHAR. MOV $MCRCB,(R0) ;;LINK THE COMMAND MOV R0,$MCRCB ;;INTO GMCR LIST MOV $TKTCB,R0 ;;REMOVE MCR PROMPT REQUEST BIC #T3.MCR,T.ST3(R0) ;;FROM OUR TCB 45$: RETURN ;;RETURN TO USER STACK 50$: TST ERR ;TEST IF ANY ERROR BEQ 70$ ;EQ = NO ERROR BIT #NOD,ERR ;NO DYNAMIC MEMMORY? BEQ 60$ ;EQ = NO WSIG$S ;SIGN. EVENT MAY RELEASE POOL BR CHTSK ;REPEAT REQUEST 60$: MOV #MCR,R5 ;POINT TO COMMAND BUFFER BIT #ACT,ERR ;TASK WAS ACTIVE? BNE CHMCR ;NE = YES, CHAIN MCR ONCE MORE ; JUST INSTALLED TASK NOT IN STD. THIS MAY OCCURE ONLY ; IF PARRENT-OFFSPRING NOT PRESENT (INSTALL REJECTED OR ; NOT YET COMPLETED), OR DUE ANY ERROR OF MY CODE. QIOW$S #IO.WVB,#1,#1,,,,<#CAEMSG,#CAELEN,#40> JMP EXIT ;TELL THE USER AND EXIT 70$: EXIT$S ;EXIT WHEN ALL O.K. ; .PAGE .SBTTL MCR CHAINING ROUTINE ; ; THIS ROUTINE CHAINS MCR WITH COMMAND POINTED TO BY R5 ; AND FINISHED BY ZERO BYTE (OTHERWISE END FORCED ADDING CR). ; CHMCR:: CALL CHMCR0 ;ENTRY TO PASS THROUGH AND EXIT EXIT$S ;IMMEDIATELLY ; CHMCR0: MOV R5,R0 ;COPY THE COMMAND ADDR. ADD #79.,R0 ;POINT TO THE LAST BYTE MOVB #15,(R0)+ ;FORCE THE END INSERTING CLRB (R0) ;SET-UP THE SENTINEL 05$: CLR ERR ;CLEAR ERROR FLAG WORD CALL $SWSTK,60$ ;;SWITCH TO SYSTEM STACK MOV $TKTCB,R0 ;;POINT TO OUR TCB BIC #T3.MCR,T.ST3(R0) ;;REMOVE MCR PROMPT REQUEST MOV #84.,R1 ;;SET LENGTH OF MCR BUFFER CALL $ALOCB ;;GET IT BCC 10$ ;;CC = O.K. BIS #NOD,ERR ;;SET UP NO DYN.MEMMORY FLAG BR 50$ ;;RETURN 10$: MOV R0,R1 ;;COPY BUFFER ADR MOV R0,CMDBF ;;AND ONCE MORE FOR OCB CLR (R0)+ ;;CLEAR LINK WORD MOV TIUCB,(R0)+ ;;COPY TI UCB ADDRESS 30$: MOVB (R5)+,(R0)+ ;;MOVE ORIGINAL CMD TO BUFFER BNE 30$ ;;REPEAT TILL SENTINEL MOV $MCRPT,R0 ;;POINT TO MCR TCB CALL $QCLIL ;;QUE CMD LINE TO MCR ; ; PASS OFFSPRING CONTROLL BLOCK, IF ANY ; BIT #FE.OFF,$FMASK ;;PARRENT-OFFSPRING TASKING? BEQ 50$ ;;EQ = NOT SUPPORTED MOV $TKTCB,R0 ;;POINT TO OUR TCB ADD #T.OCBH,R0 ;;POINT TO OCB LIST CALL $QRMVF ;;GET THE OCB, IF ANY BCS 50$ ;;CS = NO OCB MOV CMDBF,O.MCRL(R1) ;;INSERT MCR CMD BUF.ADR MOV $MCRPT,R0 ;;POINT TO MCR TCB ADD #T.OCBH,R0 ;;POINT TO MCR OCB LIST CALL $QINSF ;;PASS THE MARKED OCB TO IT 50$: RETURN ;;RETURN TO USER STACK 60$: BIT #NOD,ERR ;NO DYNAMIC MEMMORY ? BEQ 70$ ;EQ = NO ERROR, DONE WSIG$S ;SIG. EVENT MAY RELEASE D.M. BR 05$ ;TRY IT ONCE MORE 70$: RETURN ;RETURN TO CALLER ; .END CA