; ; SUBROUTINE TO SPAWN A TASK USING IAS SPAWN DIRECTIVE ; OR USE THE MC: HANDLER FOR RSX11D V6.2 ; ; BASIC CALL: ; CALL "SPAWNB"(C$ [,S]) ; WHERE: ; C$ IS MCR COMMAND LINE ; S IS OPTIONAL STATUS RETURN ; IF S IS SPECIFIED, THEN BASIC EXECUTION ; WAITS FOR SPAWNED TASK EXECUTION TO FINISH (IAS), ; OTHERWISE IT GOES AHEAD WITHOUT WAITING. ; ; FOR RSX11D V6.2, IF STATUS IS SPECIFIED, THE STATUS ; RETURN FROM THE QIO TO MC: IS RETURNED. IN NO CASE ; IS IT POSSIBLE TO DETECT THE END OF TASK EXECUTION. ; ; FOLLOWING SYMBOL DETERMINES IAS V3.0 OR RSX11D V6.2 IAS =0 ;DEFINE FOR IAS .IF DF IAS .MCALL STSE$S .IFF .MCALL ALUN$S QIOW$S .ENDC ; ; DEFINE MACRO USED INTERNALLY .MACRO SKIP JSR PC,SKIP00 .ENDM ; DEFINE FLOATING POINT REGISTERS ; AC0 =%0 AC1 =%1 AC2 =%2 AC3 =%3 AC4 =%4 AC5 =%5 ; .GLOBL SPAWNB .PSECT BASIC4,RW,I,GBL,REL,CON ;MAKE SURE THIS CODE FOLLOWS TRAP00 IN ;BASIC INTERPRETER (ELSE PROBLEMS) SPAWNB: JSR R4,GTRGPI ;GET LEN AND ADD OF MCR COMMAND LINE .BYTE 3,0 ;ON STACK SKIP ;NEXT CHAR -> R2 DEC R1 ;BACK UP OVER THAT CHAR CMPB R2,#', ;ANOTHER ARGUMENT? BNE 1$ ;IF NOT, BRANCH JSR R4,GTRGPI ;IF SO, GET 5 WORDS ON STACK .BYTE 2,0 LDCIF (SP)+,AC2 ;VAR HEADER ADD -> AC2 LDF (SP)+,AC1 ;OFFSET -> AC1 ADD #4,SP ;GET RID OF VARIABLE VALUE BR 2$ 1$: CLRF AC2 ;INDICATE NO OUTPUT 2$: JSR PC,PARCHK ;CHECK FINAL PAREN MOV (SP)+,R4 ;POP LEN AND MOV (SP)+,R3 ;ADDRESS OF COMMAND STRING MOV R4,R2 ;COPY LEN INC R2 ;AND ROUND IT UP BIC #1,R2 ;TO NEAREST WORD SUB R2,SP ;MAKE ROOM ON STACK (EVEN BOUNDARY!) MOV SP,R5 ;COPY NEW ADDRESS MOV SP,R0 ;TWICE MOV R2,-(SP) ;AND SAVE ITS LENGTH BEQ 10$ ;IF ZERO LENGTH, WHY DID WE TRY? 3$: MOVB (R3)+,(R0)+ ;MOVE IN THE COMMAND STRING SOB R2,3$ SUB #20,SP ;MAKE ROOM FOR RETURNED STATUS MOV SP,R3 ;AND COPY ITS ADDRESS ; .IF DF IAS CLR -(SP) ;VTUN MOV R4,-(SP) ;CMDLEN MOV R5,-(SP) ;CMDLIN TSTF AC2 ;DO WE HAVE RETURNED VARIABLE? CFCC BNE 5$ ;IF SO, BRANCH CLR R3 ;ELSE SET NO EXIT STATUS BLOCK 5$: MOV R3,-(SP) ;ESB ADD (OR LACK OF) -> STACK CLR -(SP) ;EAST (NO AST) MOV #3,R4 ;SET EVENT FLAG NUMBER CFCC ;CHECK ON WHETHER WE'RE WAITING BNE 6$ ;IF YES, BRANCH CLR R4 ;ELSE CLEAR EVENT FLAG 6$: MOV R4,-(SP) ;EFN MOV UICSTO,-(SP) ;UIC WE'RE UNDER CLR -(SP) ;PRI CLR -(SP) ;PARTITION CLR -(SP) ;NAME LDCIF R1,AC3 ;SAVE TEXT PTR ; ; DO RAD50 CONVERSION OF FIRST 3 CHARS IN COMMAND LINE ; MOV R5,R0 ;ADDRESS OF COMMAND LINE MOV #1,R1 ;JUST IN CASE ...AT. JSR PC,$CAT5 ;DO CONVERSION ; ; GO CHECK FOR MFT FUNCTIONS OR MAS FUNCTIONS ; JSR PC,CHKMFT ; MOV R1,-(SP) ;2ND HALF OF TASK NAME STCFI AC3,R1 ;RESTORE R1 (TEXT PTR) MOV (PC)+,-(SP) ;NOW FIRST HALF OF NAME .RAD50 /.../ MOV (PC)+,-(SP) ;AND DIRECTIVE CODE AND LEN .BYTE 11.,13. EMT 377 BCC 7$ ;IF DIRECTIVE GOOD, BRANCH LDCIF @#$DSW,AC0 ;ELSE RETURN ERROR CODE BR 8$ ;AND GO STORE 7$: TSTF AC2 ;ARE WE WAITING? CFCC BEQ 9$ ;IF NOT, BRANCH JSR PC,DETACH ;DETACH THE TERMINAL FOR THE DURATION STSE$S #3 ;WAIT FOR EVENT FLAG LDCIF (SP),AC0 ;RETURNED EXIT STATUS -> AC0 JSR PC,ATTACH ;NOW RE-ATTACH TERMINAL ; ; NOW CODE FOR RSX11D V6.2 ; .IFF ALUN$S #2,#"MC,#0 ;ASSIGN TERMINAL LUN TO MC QIOW$S #IO.WVB,#2,#1,,R3,, BCC 5$ ;IF OK, BRANCH LDCIF @#$DSW,AC0 ;RETURN BAD DIRECTIVE STATUS BR 6$ ;AND GO TO COMMON FINISH CODE 5$: LDCIF (R3),AC0 ;STORE RETURNED STATUS CODE 6$: ALUN$S #2,#"TI,#0 ;AND REASSIGN TERMINAL LUN .ENDC ; 8$: STCFI AC2,R3 ;HEADER ADD -> R3 BEQ 9$ ;IF NONE, BRANCH JSR PC,STONUM ;STORE THE RESULT 9$: ADD #20,SP ;WIPE EXIT STATUS BLOCK 10$: MOV (SP)+,R0 ;GET EVEN LENGTH OF COMMAND LINE ADD R0,SP ;AND ADJUST STACK RTS PC ;AND RETURN ;SUB TO CHANGE REQUESTED TASK NAME TO ...MFT OR ...MAS ;IF IT IS NECESSARY ; ;ENTRY WITH R1 CONTAINING 2ND HALF OF MCR TASK NAME IN RAD50 ; CHKMFT:: MOV R4,-(SP) MOV R5,-(SP) MOV #10,R5 ;SET TO CHECK FOR 8. MFT NAMES MOV #MFTNAM,R4 ;SET TO START OF MFT NAME TABLE 6$: CMP R1,(R4)+ ;COMPARE REQ'D TASK WITH MFT TASK BEQ 7$ ;BR IF WE MATCH SOB R5,6$ ;LOOP TILL 8. NAMES CHECKED MOV #7,R5 ;SET LOOP COUNT FOR 7 MASSAGE NAMES MOV #MASNAM,R4 ;SET TO START OF MASSAGE NAME TABLE 66$: CMP R1,(R4)+ ;COMPARE REQ'D TASK NAME WITH MASSAGE NAME BEQ 77$ ;BR IF WE MATCH SOB R5,66$ ;ELSE TRY 7 MASSAGE NAMES BR 88$ ;NO MATCH, RETURN WITH SAME NAME IN R1 7$: MOV #^RMFT,R1 ;CHANGE REQUESTED TASK NAME TO "MFT" BR 88$ 77$: MOV #^RMAS,R1 ;CHANGE REQUESTED TASK NAME TO "MAS" 88$: MOV (SP)+,R5 MOV (SP)+,R4 RTS PC ; MFTNAM: ;TABLE OF POSSIBLE MFT TASK NAMES .RAD50 /ABOALTCANDISENAFIXRESUNF/ MASNAM: ;TABLE OF POSSIBLE MASSAGE TASK NAMES .RAD50 /PRITYPPURDIRBLORECFRE/ .END