1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-01-17 08:32:07 +00:00

Commit DCMCP transcription as of 2012-11-11.

This commit is contained in:
Paul Kimpel 2012-11-01 14:28:43 +00:00
parent 39bdc08f0c
commit 120acc672f

View File

@ -15097,3 +15097,94 @@ ERROR: 19787000
XYT:: IF CALLEDORCONT AND NOT ERR THEN COMPLEXSLEEP((TSKA[7] AND 1) 19799060
OR (TERMSET(P1MIX))); 19799070
END TISKTASK; 19800000
PROCEDURE PICKTHELOCK; 19900000
BEGIN COMMENT THIS PROCEDURE HANDLES LOCKING/UNLOCKING OF 19900010
LOCK-ITEMS FOR TASKING. IT ALSO HANDLES THE MAINTENANCE 19900020
OF A WAIT QUEUE AND PASSING CONTROL OF THE LOCK TO THE 19900030
FIRST PROCESS IN THE WAIT QUEUE. AFTER IT HAS BEEN 19900040
RELEASED BY ANOTHER PROCESS, THE HEAD OF THE QUEUE IS 19900050
THE LOCK-ITEM OF THE PROCESS CURRENTLY IN CONTROL AND 19900060
ENTRIES ARE MADE AT THE END OF THE QUEUE. LOCK-ITEMS 19900070
ARE IN THE PRT AND HAVE THE FOLLOWING FORMAT: 19900080
[1:1]=1, MEANS LOCKED(LOCK BIT,ORIGINAL ONLY) 19900090
[2:1]=1, IN CONTROL(CONTROL BIT) 19900100
[3:1]=1, ORIGINAL LOCK-ITEM(ORIGINAL BIT) 19900110
=0, A COPY 19900120
[4:1]= QUEUE INTERLOCK(ORIGINAL ONLY) 19900130
[8:10]=MIX INDEX OF PROGRAM IN CONTROL(ORIGINAL) 19900140
=RELATIVE PRT ADDRESS USED TO LINK ALL LOCK-ITEMS 19900150
IN CONTROL OR IN WAIT QUEUES(COPY) 19900160
[18:15]=POINTER TO NEXT PROCESS IN WAIT QUEUE, ELSE 0 19900170
[33:15]=POINTER TO HEAD OF QUEUE(ORIGINAL) 19900180
=POINTER TO ORIGINAL LOCK-ITEM(COPY) 19900190
"LOCKPTR" IS THE PARAMETER PASSED AND HAS THE FORMAT: 19900200
[1:1]=0, MEANS LOCK, ELSE UNLOCK 19900210
[2:1]=1, " TEST LOCK BIT, LOCK IF UNLOCKED AND 19900220
RETURN A 0, ELSE RETURN 1 19900230
[33:15]=RELATIVE PRT ADDRESS OF LOCK-ITEM; 19900240
REAL LOCKPTR=-4;%PARAMETER 19900250
REAL Q,R,S,T,U,V; 19900260
ARRAY A[*]; 19900270
DEFINE DSED=TERMSET(P1MIX)#, IMASK=@200000000000000#; 19900280
SUBROUTINE LINKIT; 19900290
BEGIN IF(V:=A[5])=0 THEN A[5]:=LOCKPTR INX 0 19900300
ELSE BEGIN WHILE PRT[P1MIX,V].[8:10] NEQ 0 DO 19900310
V:=PRT[P1MIX,V].[8:10]; 19900320
PRT[P1MIX,V].[8:10]:=LOCKPTR INX 0; 19900330
END; 19900340
END; 19900360
Q:=[PRT[P1MIX,LOCKPTR INX 0]] INX 0; 19900370
R~NFLAG(M[U+Q]); 19900380
S~IF R.[3:1] THEN Q ELSE (R INX 0); %ADDR OF ORIGINAL 19900390
A:=PRT[P1MIX,TSX];%TASK ARRAY 19900395
IF NOT M[S].[4:1] THEN SLEEP([M[S]],IMASK); 19900400
M[S].[4:1]:=0; 19900410
IF LOCKPTR.[2:1] THEN %TEST & LOCK 19900420
BEGIN IF NOT M[S].[1:1] THEN %UNLOCKED 19900430
BEGIN M[S]:=NABS(M[S])&U[CTC]&P1MIX[8:38:10]; 19900440
M[U]:=(M[U] OR M)&0[CTF]; 19900450
IF U!S THEN BEGIN M[U].[8:10]~0; 19900455
LINKIT; 19900460
END; 19900465
LOCKPTR:=0; 19900470
END ELSE LOCKPTR:=1; 19900480
M[S]:=(*P(DUP)) OR IMASK; 19900490
P(XIT); 19900500
END; 19900510
IF LOCKPTR GTR 0 THEN%LOCK 19900520
IF NOT M[U].[2:1] THEN%NOT IN CONTROL 19900530
BEGIN IF NOT M[S].[1:1] THEN 19900540
BEGIN M[S]:=NABS(M[S])&U[CTC]&P1MIX[8:38:10]; 19900550
M[U]:=((*P(DUP)) OR M)&0[CTF]; 19900560
IF U!S THEN BEGIN M[U].[8:10]~0; 19900565
LINKIT; 19900570
END; 19900575
END ELSE 19900580
BEGIN 19900590
T:=M[S] INX 0; 19900600
WHILE M[T].[FF] NEQ 0 DO T:=M[T].[FF]; 19900610
M[T].[FF]:=U; 19900620
M[U].[FF]:=0; 19900630
IF U!S THEN BEGIN M[U].[8:10]~0; LINKIT END; 19900650
M[S]:=(*P(DUP)) OR IMASK; 19900660
COMPLEXSLEEP(DSED OR M[U].[2:1]); 19900670
IF M[U].[2:1] THEN 19900675
M[S]~((*P(DUP))&P1MIX[8:38:10]) OR IMASK; 19900680
P(XIT); 19900690
END; 19900700
END ELSE ELSE %UNLOCK 19900710
BEGIN IF M[S].[1:1] THEN%LOCKED 19900720
BEGIN M[T:=M[S] INX 0].[2:1]:=0;%TURN OFF CONTROL 19900730
IF T!S THEN 19900735
BEGIN 19900740
A:=PRT[V:=M[S].[8:10],TSKX]; 19900745
R:=A[5]; 19900750
IF T NEQ ([PRT[V,R]] INX 0) THEN 19900755
BEGIN 19900758
WHILE M[S].[CF] NEQ ([PRT[V,R]] INX 0) DO 19900760
BEGIN U:=R; 19900770
R:=PRT[V,R].[8:10]; 19900780
END; 19900790
PRT[V,U].[8:10]:=PRT[V,R].[8:10];%DELINK 19900800
END ELSE A[5]:=M[T].[8:10; 19900805
END; 19900810