.TITLE RETTID ; ; ; PURPOSE: TO RETURN THE TASK ID TO A REQUESTING TASK ; ; HOW?? : A TASK WHICH WANTS TO KNOW HIS ID, (THE REQUESTOR) SENDS ; A PACKET TO THIS ONE, WHICH WILL CAUSE AN AST HERE. ; "RETTID" WILL BE UNSTOPPED TEMPORARILY TO EXECUTE THE ; AST ROUTINE. THIS ROUTINE UNSTOPS "RETTID" TO BE ABLE ; TO PROCEED ALSO AFTER THE AST EXIT. ; THE FIRST STATEMENT AFTER THE "STOP$S" WILL BE EXECUTED THEN. ; THE REQUESTOR'S TASK NAME IS AVAILABLE IN THE FIRST TWO WORDS ; IF THE PACKET JUST RECEIVED. ; WE HAVE TO SCAN THE SYSTEM TASK DIRECTORY FOR THE TCB ADDRESS ; OF THE REQUESTOR. THIS TCB CONTAINS THE LOGICAL BLOCK NUMBER ; OF THE TASK LOAD IMAGE. ; THE LABEL BLOCK 0 OF THE TASK FILE CONTAINS THE ID (YY,MM,DD) ; AND IS THE FIRST BLOCK OF THE TASK FILE. WE FIND THIS BLOCK ; BY SUBTRACTING 2(= NUM OF LABEL BLOCKS) OF THE LBN OF THE ; TASK LOAD IMAGE. ; ; IF THE DIFFERENCE BETWEEN THE TIME IN THE PACKET AND THE ; CURRENT ONE IS GE 3 SEC.... NO ACTION IS TAKEN, BECAUSE THE ; SENDER DOES NOT EXPECT ANYTHING AFTER 3 SECONDS. ; ERRORS RETURNED TO REQUESTOR (4TH WORD OF SEND BUFFER): ; ; 1 = SUCCESS ; -1 = TASKNAME OF REQUESTOR NOT IN STD ; -2 = ILLEGAL TASK HEADER LENGTH ; (LABEL BLOCK 2,3 PRESENT OR CHECKP. AREA) ; ; ASSEMBLING PROCEDURES: MAC @RETTIDASM ; ; RETTIDASM.CMD: RETTID=[1,1]EXEMC/ML,[11,10]RSXMC,[7,241]RETTID ; ; ; BUILDING PROCEDURES: TKB @RETTIDBLD ; ; RETTIDBLD.CMD: RETTID/PR=RETTID,[1,54]RSX11M.STB/SS ; ; .MCALL SRDA$S,STOP$S,ASTX$S,EXIT$S,RCVX$S,SDAT$S,QIOW$S,USTP$S .MCALL GTIM$S,RCVD$S,ALUN$S,UCBDF$ ; UCBDF$ ; ; .GLOBL RETTID ; ; RETTID: SRDA$S #AST ;SPECIFY RECEIVE DATA AST STOP: STOP$S ;STOP THIS TASK ; ; HERE, IF UNSTOPPED EITHER BY MCR (UNS RETTID) OR BY AST, ; CAUSED BY SENDING A RECEIVE PACKET TO THIS TASK. ; ; IF NO PACKET PRESENT, THE "UNSTOPPER" WAS MCR, SO WE EXIT ; ; RCVX$S ,#SRECBF ;RECEIVE DATA OR EXIT GTIM: GTIM$S #BUF ;GET CURRENT TIME SUB SRECBF+4,BUF+12 ;SUBTR. SEND TIME FROM CURRENT BGE NOAD ;IF GE OK ADD #60.,BUF+12 ;CROSSED MINUTE NOAD: CMP #3,BUF+12 ;IF DIFFERENCE < 3 SEC... BGT SWITCH ;PROCEED RCVD$S ,#SRECBF ;OTHERWISE TRY NEXT PACKET BCS STOP ;IF ERROR, STOP AND WAIT BR GTIM ;SEE IF TIME OUT ON THIS ONE ; ; SWITCH: SWSTK$ USER ;SWITCH TO SYSTEM STATE FOR ;A PROPER ACCESS TO THE STD. CLR BLH ;CLEAR BLOCK NUM (HIGH PART) CLR BLL ;CLEAR BLOCK NUM (LOW PART) MOV $ACTHD,R2 ;GET ACTIVE TASK HEADER LOOP: TST T.ACTL(R2) ;READY? BEQ READY ;IF EQ YES, NO TASK FOUND ;WITH THE NAME OF REQUESTOR CMP T.NAM(R2),SRECBF ;1ST PART OF TASK NAME MATCH? BNE NEXT ;IF NE NO CMP T.NAM+2(R2),SRECBF+2 ;2ND PART OK? BNE NEXT ;IF NE NO MOVB T.LBN(R2),BLH ;GET LOGICAL BLOCK NUMBER OF.. MOV T.LBN+1(R2),BLL ;..TASK LOAD IMAGE (HIGH,LOW) DEC BLL ;GET LOGICAL BLOCK NUMBER OF.. DEC BLL ;..LABEL BLOCK 0 OF TASK FILE MOV T.LDV(R2),R2 ;GET UCB ADDRESS LOAD DEVICE MOV U.UNIT(R2),UNIT ;GET UNIT NUMBER OF LOAD DEV. MOV U.DCB(R2),R2 ;GET DCB OF LOAD DEVICE MOV D.NAM(R2),DEV ;GET LOAD DEVICE NAME READY: RETURN ;RETURN TO USER STATE ; ; NEXT: MOV T.ACTL(R2),R2 ;GET NEXT TCB IN STD BR LOOP ;AND TRY THIS ONE ; ; USER: MOV #-1,SRECBF+12 ;SET UP ERROR CODE TST BLL ;IF TASK NAME NOT IN STD.... BEQ SEND ;READY, SEND DATA PACKET ALUN$S LUN,DEV,UNIT ;ASSIGN LUN TO LOAD DEV. TASK QIOW$S #IO.RLB,LUN,#1,,,,<#BUF,#512.,,BLH,BLL> ;READ LABEL BLOCK 0 MOV #-2,SRECBF+12 ;SET UP ERROR CODE CMP #2,BUF+360 ;IF #LABEL BLOCKS <>2.... BNE SEND ;READY, SEND DATA PACKET MOV BUF+32,SRECBF+4 ;COPY TASK CREATION DATE-YEAR MOV BUF+34,SRECBF+6 ; -MONTH MOV BUF+36,SRECBF+10 ; -DAY MOV #1,SRECBF+12 ;SET SUCCES CODE SEND: SDAT$S #SRECBF,#SRECBF+4 ;SEND DATA PACKET TO REQUESTOR JMP STOP ;AND STOP AGAIN ; ; AST: USTP$S #RETID ;UNSTOP MYSELF ASTX$S ;EXIT FROM AST ; ; ; SRECBF: .BLKW 15. BUF: .BLKB 512. RETID: .RAD50 /RETTID/ BLH: .WORD 0 BLL: .WORD 0 LUN: .WORD 1 DEV: .WORD 0 UNIT: .WORD 0 ; ; .END RETTID