From the Wizzards Book of RSX MAGIC D. B. Curtis SCIENCE APPLICATIONS, INC. Oak Brook, IL This article describes how to send non-standard ASTs to tasks. More articles in this vein will occur as I have time to write them up. Help from other wizards would be appreciated. These articles are dangerous to use: Incorrect usage will result in system crashes and other inconsistent system operation. However, there are times when the only way that RSX is able to satisfy your needs is to use these tricks. Only use them when you need to. This article describes how to send non-standard ASTs to tasks. This can be used in a variety of ways. One is for full duplex drivers that need to wake up a task when unsolicited input occurs. Another is as a variable send data. The routine and test program are listed later. The routine SNDAST may be called only from system state. You are in system state after a SWSTK$ or FORK. The routine will send an AST of a specified size to a specified task. If the task is out of memory, it will be brought into memory and scheduled to run. .TITLE NSTAST .IDENT /V1/ ; ; ; WRITTEN BY D.B.CURTIS ; SCIENCE APPLICATIONS, INC. ; 28-SEP-81 ; ARGONNE NATIONAL LAB ; ; ; VERSION 01 ; EDIT NUMBER = 0001 ; FILE = NSTAST.MAC ; EDITED BY: D.B.CURTIS 28-SEP-81 14:51:11 ; ; ; MODIFICATIONS: ; ;+ ; FILE DESCRIPTION ; ; THIS ROUTINE SENDS AN AST TO A SPECIFIED TASK. ; THE ROUTINE MUST BE CALLED FROM SYSTEM STATE. ;- ; ; .PAGE ;+ ; **-SNDAST-SEND AST TO TASK ; ; THIS ROUTINE SENDS AN AST TO A SPECIFIED TASK ; NOTE! IT DOES NOT CHECK THAT THE PARAMETERS ARE CORRECT. ; INCORRECT CALLS TO THIS ROUTINE WILL CRASH YOUR SYSTEM! ; ; YOU MUST BE IN SYSTEM STATE BEFORE CALLING THIS ROUTINE. ; ; THE AST BLOCK MUST BE LESS THEN 200 AS THE SIZE BYTE IS USED BY THE ; SYSTEM TO INDICATE TYPE OF AST. ; ; THE AST THAT IS SENT HAS THE NUMBER OF BYTES THAT MUST BE REMOVED ; FROM THE USER STACK AS THE FIRST PARAMETER ON THE STACK. ; THE MAXIMUN NUMBER OF PARAMETERS THAT YOU CAN SEND IS 125(10) ; ; INPUTS: ; R5 = TCB ADDRESS OF TASK TO SEND AST TO ; R0 = NUMBER OF USER PARAMITERS TO PUT IN AST ; R1 = POINTER TO USER PARAMITERS ; R2 = AST ADDRESS IN RECIEVER TASK ; ; OUTPUTS: ; CARRY CLEAR IF NO PROBLEMS, SET IF ERROR ; ; ; ; STANDARD REGISTER USAGE ; ;- ; ; ROUTINES CALLED ; .GLOBL $QASTT ; QUEUE AST TO TASK .GLOBL $ALOCB ; ALLOCATE CORE BLOCK .PAGE SNDAST:: JSR R5,$SAVRG ;; SAVE REGISTERS R3-R5 INC R0 ;; ADD OUR PARAMETER MOV R0,R4 ;; SAVE SIZE MOV R1,R3 ;; AND POINTER TO USER DATA MOV R2,-(SP) ;; SAVE R2 AS ALOCB MODIFIES IT ASL R0 ;; MAKE NUMBER OF BYTES FOR USER PARAMS ADD #5*2,R0 ;; ADD ON THE SYSTEM PARAMS MOV R0,R1 ;; COPY SIZE TO R1 CMP #177,R1 ;; CHECK SIZE IS LEGAL BHIS 4$ ;; 200 AND MORE IS ILLEGAL SEE ;; CRASH DUMP ANALYZER MANUAL PAGE B-39 SEC ;; CARRY IS ALREADY SET BUT FOR CLARITY... BR 5$ 4$: CALL $ALOCB ;; ALLOCATE A CORE BLOCK, SEE ;; EXEC MODULE CORAL ;; R0 = ADDRESS, R1= SIZE, R2 = WIPED 5$: MOV (SP)+,R2 ;; RESTORE R2 BCC 10$ RETURN ;; ERROR RETURN 10$: MOV R0,-(SP) ;; SAVE ADDRESS OF AST BLOCK CLR (R0)+ ;; CLEAR THE LINK MOV R1,(R0)+ ;; SAVE THE SIZE MOV R4,R1 ;; GET NUMBER OF USER PARAMS ADD #7,R1 ;; ADD NUMBER OF SYSTEM PARAMS ;; LOOK AT EXEC MODULE DRATX FOR MAGIC 7 ASL R1 ;; TIMES 2 TO MAKE BYTES ON USER STACK MOV R1,(R0)+ ;; SAVE NUMBER OF BYTES ON USER STACK MOV R2,(R0)+ ;; SET AST ADDRESS MOV R4,(R0)+ ;; SAVE NUMBER OF USER PARAMITERS MOV R4,R1 ;; GET NUMBER OF USER PARAMITERS ASL R4 ;; MAKE SIZE AS BYTES MOV R4,(R0)+ ;; AND MAKE FIRST ARGUMENT ON STACK DEC R1 ;; HAVE ALREADY SAVED SIZE 11$: MOV (R3)+,(R0)+ ;; SAVE USER PARAMITERS SOB R1,11$ MOV (SP)+,R1 ;; GET AST BLOCK ADDRESS MOV R5,R0 ;; GET RECIEVER TASK TCB CALLR $QASTT ;; SEND AST AND RETURN, SEE REQSB .END .TITLE TSTAST .IDENT /V1/ ; ; ; WRITTEN BY D.B.CURTIS ; SCIENCE APPLICATIONS, INC. ; 29-SEP-81 ; ARGONNE NATIONAL LAB ; ; ; VERSION 01 ; EDIT NUMBER = 0001 ; FILE = TSTASTA.MAC ; EDITED BY: D.B.CURTIS 29-SEP-81 16:28:05 ; ; ; MODIFICATIONS: ; ;+ ; FILE DESCRIPTION ; ; THIS FILE IS USED TO TEST THE SNDAST ROUTINE. ; IT IS A PRIVALIGED PROGRAM (TO ALLOW A SWSTK$) WHICH CALLS ; THE SNDAST ROUTINE WITH A LINE OF TEXT AS THE PARAMETERS. ; THE AST ROUTINE ATTEMPTS TO PRINT THE LINE WHEN THIS TASK FROM THE ; STACK. THIS TEST PROGRAM SENDS AN AST TO ITSSELF AND PRINTS THE ; AST DATA FROM OFF OF ITS STACK. ; ; REMEMBER, THE SNDAST ROUTINE CAN SEND AN AST TO ANY TASK. ;- ; ; .MCALL QIOW$S,EXIT$S,ASTX$S .PAGE ; ; IMPORTAINT GLOBALS ; .GLOBL SNDAST ; ROUTINE TO SEND ASTS ; ; LOCAL DATA ; SAVSP: .BLKW 1 ; VALUE OF STACK AT STARTUP PRAMS: .ASCII /THIS IS A TEST OF THE AST CODE/ ; TEST MESSAGE BLKSZ=.-PRAMS .PAGE START: MOV SP,SAVSP ; SAVE STARTUP TIME SP 1$: SWSTK$ 15$ ;; GO TO SYSTEM STATE MOV $TKTCB,R5 ;; GET OUR TCB ADDRESS MOV #/2,R0 ;; GENERATE NUMBER OF PARAMETERS MOV #PRAMS,R1 ;; GET POINTER TO USER PARAMETERS MOV #ASTAD,R2 ;; AND AST ADDRESS CALL SNDAST ;; SEND AST AND RETURN RETURN 15$: CMP SP,SAVSP ; CHECK THAT SP OK BEQ 1$ ; AND IF SO, CONTINUE FOREVER IOT ; ELSE CRASH ASTAD: ;-- AST ENTRY POINT .IRPC REG,<012345> ; SAVE REGISTERS MOV R'REG,-(SP) .ENDM MOV SP,R0 ; GENERATE POINTER ADD #14,R0 ; TO LINE MOV (R0)+,R1 ; GET SIZE QIOW$S #IO.WVB,#5,#1,,,, ; WRITE LINE .IRPC REG,<543210> ; RESTORE REGISTERS MOV (SP)+,R'REG .ENDM ADD (SP),SP ; CLEAN STACK ASTX$S ; EXIT AST .END START