.TITLE GETPTN : FIND NEEDED DATA FOR PARTITION ; ; .MCALL QIOW$C IOEFN=1 ;I/O WAITS ON FLAG #1 COLUN=2 ;OUTPUT ON UNIT #2 CLLUN=3 ;ERRORS ON UNIT #3 ; GETPTN:: MOV .TPDBA,R0 ;R0 -> TPD MOV .TPDEA,R1 ;R1 -> END OF TPD ; 1$: CMP R0,R1 ;END OF TPD? BHIS TPDERR ;YES - NAME IS INVALID CMP T.PN(R0),PNAME ;COMPARE PARTITION NAMES BNE 2$ ;BRANCH ON NO-MATCH CMP T.PN+2(R0),PNAME+2 BNE 2$ ;BRANCH IF NO-MATCH JMP SAVTPD ;ELSE GO SAVE TPD INFO ; 2$: ;NO MATCH ADD #T.SZ,R0 ;R0 -> NEXT TPD ENTRY BR 1$ ;AND TRY AGAIN ; ; ERROR TRAP FOR PARTITION NAMES NOT IN TPD ; SET NAME INTO ERROR MESSAGE, PRINT IT, AND EXIT ; TPDERR: MOV #6,R1 ;R1 = CHAR COUNT MOV #PNAME,R2 ;R2 -> RAD50 PTN NAME MOV #PENAME,R3 ;R3 -> NAME IN MSG JSR PC,..RDTA ;CONVERT TO ASCII ; QIOW$C IO.WVB,COLUN,IOEFN,,,, CLR PNAME ;ZERO PARTITION NAME AS ERROR IND. RTS PC .PAGE ; ; CONSTANTS AND WORK AREAS ; PEMSG: .ASCII 'MAP: ' ;INVALID NAME ERROR MSG PENAME: .ASCII /XXXXXX/ .ASCII ' PARTITION NOT IN SYSTEM' PEMSGL= .-PEMSG .EVEN .PAGE .SBTTL SAVTPD : SAVE TPD INFORMATION ; SAVTPD: MOV R0,TPDPTR ;SAVE TPD ADDRESS MOV T.BA(R0),R1 ;R1 = 1/64TH BASE ADDR MOV R1,PTNBA ;SAVE PTN BASE ADDR ADD T.PZ(R0),R1 ;R1 = 1/64TH END ADDR MOV R1,PTNEA ;SAVE PTN END ADDR MOV SP,SPSAVE ;SAVE STACK PTR SUB #100,SP ;BUMP STACK BACK 100 TO CLEAR LINKS JMP GETATL ;GO GET ATL INFO .PAGE .SBTTL GETATL : FIND ACTIVE TASKS ; GETATL: CLR ATLCNT ;ZERO ACTIVE-TASK COUNT ; MOV #.ATLLH,R0 ;R0 -> ATL LISTHEAD POINTER ; NXTATL: MOV (R0),R0 ;GET NEXT (OR FIRST) ATL ENTRY CMP (R0),.ATLLH ;END OF ATL? BNE 1$ ;NO - SKIP NEXT INSTR JMP GETSTD ;YES - GO GET STD DATA ; ; 1$: CMP A.PD(R0),TPDPTR ;IN THIS PARTITION? BNE NXTATL ;NO - IGNORE TST A.TD(R0) ;MAKE SURE NOT .T1ATL,.T2ATL OR .TNATL BEQ NXTATL ;GO FOR NEXT IF YES BIT #AF.CP,A.TF(R0) ;IS THIS REAL-TIME TASK CHECKPOINTED ? BNE NXTATL CMP A.TS(R0),#TS.MRL ;OR TIME-SHARING TASK ON MRL BEQ NXTATL CMP A.TS(R0),#TS.MRE BEQ NXTATL INC ATLCNT ;YES - INCMT ACTIVE CNT ; MOV A.TD(R0),R1 ;R1 -> STD ENTRY MOV S.TN+2(R1),-(SP);PUSH TASK NAME MOV S.TN(R1),-(SP) ;(BACKWARDS) MOVB A.RP(R0),R2 ;R2 = TASK PRIORITY MOV R2,-(SP) ;PUSH TASK PRIORITY MOVB #1,1(SP) ;TYPE FLAG TO UPPER BYTE MOV A.HA(R0),-(SP) ;PUSH TASK ADDRESS BIT #AF.CP,A.TF(R0) ;A CHECK-POINTED REAL-TIME TASK ? BEQ 2$ ;BR IF NOT CLR (SP) ;IF SO, SAY HE'S SWAPPED OUT 2$: MOV S.TZ(R1),-(SP) ;PUSH TASK SIZE ; ;CHECK FOR POSSIBLE LINK TO A PURE CODE AREA MOV R1,R2 ;START OF STD TO R2 MOV S.PA(R2),R3 ;GET POSSIBLE PURE AREA LINK TST R3 ;IS THERE A NODE ADDRESS ? BEQ PUSHM1 ;NO, NO PURE AREA USED BIT #GF.PA,G.FW(R3) ;MAKE SURE IT'S A PURE AREA BEQ PUSHM1 ;IF NOT, FLAG AS NO PURE AREA ;THIS IS A PURE AREA TSTB G.GS(R3) ;IS PURE AREA BEING USED ? BEQ PUSHM1 ;NO FORGET IT MOV G.BA(R3),-(SP) ;BASE ADDR -> STACK MOV G.CZ(R3),-(SP) ;SIZE ->STACK MOV #2,-(SP) ;TYPE FLAG TO STACK JMP CSTACK ;FINISHED WITH THIS TASK ; ; PUSHM1: ;NO PURE AREAS FOUND, PUSH -1 AS A FLAG MOV #-1,-(SP) ;-1 TO STACK CSTACK: CMP SP,#30. ;POSSIBLE STACK OVFL? BGT NXTATL ;NO - GET NEXT ATL JMP STKERR ;YES - TAKE ERROR EXIT .PAGE .SBTTL GETSTD : FIND FIXED TASKS ; GETSTD: CLR STDCNT ;ZERO FIXED-TASK COUNT MOV #.FTLLH,R0 ;R0 -> ADDR OF FIXED TASK LISTHEAD NXTSTD: MOV (R0),R0 ;GET FIRST (OR NEXT) FIXED TASK ; CMP R0,#.FTLLH ;END OF FTL ? BNE 1$ ;NO - BRANCH JMP GETCOM ;YES - GET COMMON AREAS DATA ; 1$: CMP A.HA(R0),PTNBA ;CMP TASK START ADDR C BOT OF PART. BLO NXTSTD ;TASK TOO LOW, IGNORE CMP A.HA(R0),PTNEA ;COMP WITH END OF PARTITION BHIS NXTSTD ;TASK TOO HIGH IGNORE ALSO ; ; TASK IS IN PARTITION BEING MAPPED ; INC STDCNT ;INCMT FIXED-TASK CTR MOV A.TD(R0),R3 ;GET STD ADDRESS IN R3 MOV S.TN+2(R3),-(SP);PUSH TASK NAME MOV S.TN(R3),-(SP) ;(BACKWARDS) MOVB S.DP(R3),R4 ;R4 = DEFAULT PRIORITY MOV R4,-(SP) ;PUSH DEFAULT PRIORITY MOVB #3,1(SP) ;TYPE FLAG TO UPPER BYTE MOV A.HA(R0),-(SP) ;PUSH BASE ADDRESS MOV S.TZ(R3),-(SP) ;PUSH TASK SIZE ; CMP SP,30. ;POSSIBLE STACK OVFL? BGT NXTSTD ;NO - GET NEXT STD JMP STKERR ;YES - ERROR EXIT .PAGE .SBTTL GETCOM ;LIST CURRENT COMMONS IN USE ; GETCOM: CLR COMCNT ;ZERO COUNT TO BE SURE MOV .GCDLH,R0 ;GET START OF GCD NXTCOM: CMP R0,#.GCDLH ;END OF GCD ? BNE 1$ ;NO CHECK A GCD ENTRY BR GOMAIN ;YES RETURN TO ROOT 1$: CMP G.BA(R0),PTNBA ;CHECK AGAINST START OF PARTITION BLO 2$ ;NOT IN THIS PARTITON CMP G.BA(R0),PTNEA ;COMP WITH PART END BHIS 2$ ;PAST THIS PARTITION TSTB G.AC(R0) ;IS COMMON ACTIVE BEQ 2$ ;NO DON'T REPORT CMP G.BN(R0),#3100 ;CHECK FOR VALID RAD 50 NAME BLO 2$ ;NO ITS A PURE CODE AREA FOR A MULTI USER TASK INC COMCNT ;COUNT AN ACTIVE COMMON REGION MOV G.BN+2(R0),-(SP) ;SAVE COM NAME MOV G.BN(R0),-(SP) ;(TWO WORDS RAD50) CLR -(SP) ;PRIORITY MEANINGLESS MOVB #4,1(SP) ;TYPE FLAG TO UPPER BYTE MOV G.BA(R0),-(SP) ;SAVE BASE ADDRESS MOV G.CZ(R0),-(SP) ;SAVE COMMON SIZE 2$: MOV (R0),R0 ;GET NEXT COMMON DIRECTORY POINTER BR NXTCOM ;AND LOOP .PAGE .SBTTL STKERR : STACK OVERFLOW TRAP ; STKERR: MOV SPSAVE,SP ;CLEAN UP STACK ;PRINT ERROR MESSAGE QIOW$C IO.WVB,COLUN,IOEFN,,,, BR RET ;AND RETURN ; ; HERE FOR NORMAL EXIT ; GOMAIN: MOV SPSAVE,SP ;RESTORE STACK POINTER FOR LINKAGE RET: RTS PC ;AND EXIT ; ; CONSTANTS AND WORK AREAS STDSIZ: .WORD 0 ;SIZE OF CURRENT STD ENTRY ; SEMSG: .ASCII 'MAP: ' .ASCII 'FATAL STACK OVERFLOW' SEMSGL= .-SEMSG .EVEN .END