.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 R0,R1 ;R1 -> TPD ADD #T.RF,R1 ;R1 -> MRL LISTHEAD MOV R1,MRLLHA ;SAVE MRL LISTHEAD ADDR MOV R0,R1 ;R1 -> TPD ADD #T.CF,R1 ;R1 -> CTL LISTHEAD MOV R1,CTLLHA ;SAVE CTL LISTHEAD 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 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 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.SIZ,STDSIZ ;SET UP TO A NORMAL STD BIT #SF.24,S.FW(R2) ;IS THIS A 24. WORD STD ? BEQ 2$ ;NO MOV #48.,STDSIZ ;YES, ACCOUNT FOR IT 2$: ADD STDSIZ,R1 ;R1 -> START OF NEXT STD ENTRY ADD #S.GC,R2 ;BUMP R2 TO FIRST GCD ENTRY CKENT: MOV (R2)+,R3 ;GET IST POSSIBLE GCD NODE ADDR ->R3 TST R3 ;IS THERE A NODE ADDRESS ? BEQ PUSHM1 ;NO, NO GCD'S USED CMP G.BN(R3),#3100 ;ITS A GCD ENTRY, CHECK NAME BHIS RETEST ;NAME IS VALID, ITS A REAL COMMON BUT THERE ;COULD BE ANOTHER POINTER ;THIS IS A TRUE PURE AREA TSTB G.GS(R3) ;IS PURE AREA BEING USED ? BEQ RETEST ;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 ; ; RETEST: ;HERE IF PREV GCD WAS A COMMON BUT COULD BE ANOTHER GCD ENTRY ;SEE IF WE'RE THROUGH THE STD YET CMP R2,R1 ;ARE WE POINTING AT NEXT STD ? BGE PUSHM1 ;YES WE ARE, NO PURE CODE AREAS BR CKENT ;NO CHECK NEXT ENTRY ; ; 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 GETMRL ;YES - GET MRL 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 GETMRL : FIND TASKS IN MRL ; GETMRL: CLR MRLCNT ;ZERO MRL-TASK COUNT MOV MRLLHA,R0 ;R0 -> MRL LISTHEAD ; ; GET NEXT MRL NODE & ASSOCIATED STD ENTRY ; NXTMRL: CMP (R0),MRLLHA ;END OF LIST? BNE 1$ ;NO - SKIP NEXT INSTR. JMP GETCTL ;YES - GO GET CTL DATA ; 1$: INC MRLCNT ;INCREMENT MRL COUNTER MOV (R0),R0 ;R0 -> NEXT MRL NODE 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 CLR -(SP) ;PUSH ZERO ADDRESS MOV S.TZ(R1),-(SP) ;PUSH TASK SIZE ; CMP SP,#30. ;POSSIBLE STACK OVFL? BGT NXTMRL ;NO - GET NEXT MRL NODE JMP STKERR ;YES - TAKE ERROR EXIT .PAGE .SBTTL GETCTL : FIND TASKS IN CTL ; GETCTL: CLR CTLCNT ;ZERO CTL-TASK COUNT MOV CTLLHA,R0 ;R0 -> CTL LISTHEAD ; ; GET NEXT CTL NODE AND ASSOCIATED STD ENTRY ; NXTCTL: CMP (R0),CTLLHA ;END OF LIST? BNE 1$ ;NO - SKIP NEXT INSTR. BR GETCOM ;YES LOOK FOR COMMON AREAS ; 1$: INC CTLCNT ;INCREMENT CTL COUNTER MOV (R0),R0 ;R0 -> NEXT CTL NODE MOV K.TD(R0),R1 ;R1 -> STD ENTRY ; MOV S.TN+2(R1),-(SP);PUSH TASK NAME MOV S.TN(R1),-(SP) ;(BACKWARDS) MOV K.RP(R0),-(SP) ;PUSH TASK PRIORITY BIC #177400,(SP) ;CLEAR UPPER BYTE (IO COUNT) CLR -(SP) ;PUSH ZERO ADDRESS MOV S.TZ(R1),-(SP) ;PUSH TASK SIZE ; CMP SP,#30. ;POSSIBLE STACK OVFL? BGT NXTCTL ;NO - GET NEXT CTL NODE JMP STKERR ;YES - TAKE 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