5 * Revision 1.2 1996/04/18 16:12:04 mclareni
6 * Incorporate changes from J.Zoll for version 3.77
8 * Revision 1.1.1.1 1996/03/06 10:47:19 mclareni
12 #include "zebra/pilot.h"
13 SUBROUTINE MZREPL (IXDIV,LIXP,CHOPT)
15 C- Link replacement banks and relocate, user called
17 #include "zebra/zstate.inc"
18 #include "zebra/zunit.inc"
19 #include "zebra/zvfaut.inc"
20 #include "zebra/mqsys.inc"
21 #include "zebra/eqlqmst.inc"
22 #include "zebra/mzcl.inc"
23 #include "zebra/mzcn.inc"
24 #include "zebra/mzct.inc"
25 C-------------- End CDE --------------
26 DIMENSION IXDIV(9),LIXP(9)
28 #if (defined(CERNLIB_QTRHOLL))&&(!defined(CERNLIB_A6M))
30 DATA NAMESR / 4HMZRE, 4HPL /
32 #if (defined(CERNLIB_QTRHOLL))&&(defined(CERNLIB_A6M))
33 DATA NAMESR / 6HMZREPL /
35 #if !defined(CERNLIB_QTRHOLL)
37 PARAMETER (NAMESR = 'MZREPL ')
40 #include "zebra/q_sbit1.inc"
41 #include "zebra/q_locf.inc"
43 #include "zebra/qtrace.inc"
47 CALL UOPTC (CHOPT,'KI',IQUEST)
51 C- IFLAG = 0 drop old and index
52 C- 1 keep old and index
56 #if defined(CERNLIB_QDEBPRI)
57 IF (NQLOGL.LT.2) GO TO 12
58 WRITE (IQLOG,9001) JQSTOR,JQDIVI,LIXO,CHOPT
59 9001 FORMAT (1X/' MZREPL- Store/Div/Lix/CHOPT :',2I3,I8,1X,A)
62 #if defined(CERNLIB_QDEBUG)
63 IF (IQVSTA.NE.0) CALL ZVAUTX
65 #if defined(CERNLIB_QDEVZE)
66 IF (NQDEVZ.LT.3) GO TO 12
68 9811 FORMAT (1X/20X,'Lix link 1 link 2')
69 9824 FORMAT (5X,3I9,1X,A4,I9,1X,A4)
72 12 IF (LIXO.EQ.0) GO TO 999
77 JQDIVI = MZFDIV (-7, LQ(KQS+LIXO-1))
78 IF (JQDIVI.EQ.0) GO TO 91
81 LIMDLO = LQSTA(KQT+JQDIVI)
82 LIMDUP = LQEND(KQT+JQDIVI)
84 C-- Get the number of index banks
89 #if defined(CERNLIB_QDEBUG)
91 C-- check index bank valid
93 IF (IQFOUL.NE.0) GO TO 93
97 IF (IQ(KQS+LIX-3).LT.2) GO TO 94
99 IF (IQ(KQS+LIX-1).EQ.0) GO TO 94
102 C-- check old/new all in same division
103 IF (LOLD.LT.LIMDLO) GO TO 95
104 IF (LOLD.GE.LIMDUP) GO TO 95
105 IF (LNEW.LT.LIMDLO) GO TO 95
106 IF (LNEW.GE.LIMDUP) GO TO 95
108 C-- check old/new valid banks
109 CALL MZCHLS (-7,LOLD)
110 IF (IQFOUL.NE.0) GO TO 96
112 CALL MZCHLS (-7,LNEW)
113 IF (IQFOUL.NE.0) GO TO 97
115 C-- check origin-link consistent
118 IF (LQ(KQS+K).NE.LOLD) GO TO 98
121 C-- check next-link consistent
124 IF (LQ(KQS+L+2).NE.LOLD) GO TO 99
128 #if defined(CERNLIB_QDEVZE)
129 IF (NQDEVZ.GE.3) WRITE (IQLOG,9824) NIX,LIX,
130 + LOLD,IQ(KQS+LOLD-4),LNEW,IQ(KQS+LNEW-4)
133 IF (LIX.NE.0) GO TO 24
134 IF (ISOLA.NE.0) GO TO 61
136 C-- Re-link the index structure to MZ working link
139 LQSYSR(KQT+1) = LQ(KQS+LIXO+1)
140 LQSYSR(KQT+2) = LQ(KQS+LIXO+2)
142 LQ(KQS+LIXO+2) = LOCF (LQMST(KQT+1)) - LQSTOR
143 IF (NIX.EQ.1) GO TO 31
145 C-- Sort the index banks for increasing LOLD
148 IF (LQ(KQS+LIXN-1).LT.LQ(KQS+LIXO-1)) THEN
149 CALL ZTOPSY (IXDIV,LIXO)
153 CALL ZSORTI (IXDIV,LIXO,-9)
155 #if defined(CERNLIB_QDEVZE)
156 IF (NQDEVZ.LT.3) GO TO 31
160 27 LOLD = LQ(KQS+LIX-1)
162 WRITE (IQLOG,9824) JIX,LIX,
163 + LOLD,IQ(KQS+LOLD-4),LNEW,IQ(KQS+LNEW-4)
166 IF (LIX.NE.0) GO TO 27
179 IF (LQ(LMT).NE.JQDIVI) GO TO 34
185 C-- construct the link relocation table
189 37 LOLD = LQ(KQS+LIX-1)
192 #if !defined(CERNLIB_QDEBUG)
193 IF (LOLD.LT.LIMDLO) GO TO 95
194 IF (LOLD.GE.LIMDUP) GO TO 95
195 IF (LNEW.LT.LIMDLO) GO TO 95
196 IF (LNEW.GE.LIMDUP) GO TO 95
200 NLC = MIN (IQ(KQS+LNEW-3), NL)
201 NDC = MIN (IQ(KQS+LNEW-1), ND)
203 IF (IFIRST.NE.0) THEN
204 LQ(LQTA-1) = LOLD - NLC
208 LQ(LQTE) = LQ(LQTE-3)
209 LQ(LQTE+1) = LOLD - NLC
215 LQ(LQTE) = LOLD - NLC
216 LQ(LQTE+1) = LOLD + NDC + 9
217 LQ(LQTE+2) = LNEW - LOLD
221 IF (LQTE.GE.LQRTE) THEN
223 IF (IQPART.NE.0) GO TO 51
226 IF (LIX.NE.0) GO TO 37
228 LQ(LQTE) = LQ(LQTE-3)
230 C-- Structural replacement of old by new
233 42 LOLD = LQ(KQS+LIX-1)
235 LQ(KQS+LNEW) = LQ(KQS+LOLD)
236 LQ(KQS+LNEW+1) = LQ(KQS+LOLD+1)
237 LQ(KQS+LNEW+2) = LQ(KQS+LOLD+2)
240 LQ(KQS+LOLD+2) = LIX - 1
244 C-- the old banks to remain accessible
245 IQ(KQS+LIX+1) = LQ(KQS+LIX-1)
247 IQ(KQS+LOLD) = MSBIT1(IQ(KQS+LOLD),IQDROP)
251 IF (LIX.NE.0) GO TO 42
257 C------ Finished, reset LIX
260 LQ(KQS+LIXO+1) = LQSYSR(KQT+1)
261 LQ(KQS+LIXO+2) = LQSYSR(KQT+2)
265 CALL MZDROP (IXDIV, LIXO, 'L')
269 C-- restore LOLD's in the index structure
271 #if defined(CERNLIB_QDEVZE)
272 IF (NQDEVZ.GE.3) THEN
278 47 LOLD = IQ(KQS+LIX+1)
280 #if defined(CERNLIB_QDEVZE)
281 IF (NQDEVZ.GE.3) THEN
283 WRITE (IQLOG,9824) JIX,LIX,
284 + LOLD,IQ(KQS+LOLD-4),LNEW,IQ(KQS+LNEW-4)
289 IF (LIX.NE.0) GO TO 47
290 #include "zebra/qtrace99.inc"
293 C---- Not enough table space, collect garbage
295 51 IF (IXGARB.NE.0) GO TO 92
299 IXGARB = MZIXCO (IXDIV, 21, 22, 24)
300 CALL MZGARB (IXGARB, 0)
304 #if !defined(CERNLIB_QDEBUG)
305 LIMDLO = LQSTA(KQT+JQDIVI)
306 LIMDUP = LQEND(KQT+JQDIVI)
310 C-------- Isolated case, update structural links ---------
313 62 LOLD = LQ(KQS+LIX-1)
315 LQ(KQS+LNEW) = LQ(KQS+LOLD)
316 LQ(KQS+LNEW+1) = LQ(KQS+LOLD+1)
317 LQ(KQS+LNEW+2) = LQ(KQS+LOLD+2)
319 C---- Update according to origin-link
322 IF (K.NE.0) LQ(KQS+K) = LNEW
324 C---- Update according to next-link
327 IF (L.NE.0) LQ(KQS+L+2) = LNEW
329 C---- Update k- and up-link in vertically dependent banks
331 JBIAS = IQ(KQS+LNEW-2) + 1
333 IF (JBIAS.LE.0) GO TO 68
338 IF (LQ(KQS+L+2).NE.KO) GO TO 64
341 C-- and its linear structure
344 67 LQ(KQS+L+1) = LNEW
346 IF (L.EQ.LF) GO TO 64
355 LQ(KQS+LOLD+2) = LIX - 1
359 IQ(KQS+LOLD) = MSBIT1(IQ(KQS+LOLD),IQDROP)
363 IF (LIX.NE.0) GO TO 62
365 IF (IFLAG.EQ.0) CALL MZDROP (IXDIV, LIXO, 'L')
368 C----------- Error conditions
371 98 NQCASE = NQCASE + 5
375 IQUEST(17) = LQ(KQS+LOLD+2)
376 IQUEST(18) = LQ(KQS+LOLD)
380 96 NQCASE = NQCASE + 1
381 95 NQCASE = NQCASE + 1
382 94 NQCASE = NQCASE + 1
384 IQUEST(15) = IQ(KQS+LIX-3)
385 IQUEST(16) = IQ(KQS+LIX-2)
386 IQUEST(17) = IQ(KQS+LIX-1)
390 93 NQCASE = NQCASE + 1
396 92 NQCASE = NQCASE + 1
397 91 NQCASE = NQCASE + 1
400 #include "zebra/qtofatal.inc"
402 * ==================================================
403 #include "zebra/qcardl.inc"