]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/packlib/zebra/fq/fzimtb.F
This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / MINICERN / packlib / zebra / fq / fzimtb.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.2 1996/04/18 16:10:34 mclareni
6* Incorporate changes from J.Zoll for version 3.77
7*
8* Revision 1.1.1.1 1996/03/06 10:47:14 mclareni
9* Zebra
10*
11*
12#include "zebra/pilot.h"
13 SUBROUTINE FZIMTB
14
15C- ready memory occupation table for input
16C- ready space for the relocation table
17C- called from FZIN
18
19#include "zebra/zbcd.inc"
20#include "zebra/zmach.inc"
21#include "zebra/zunit.inc"
22#include "zebra/mqsys.inc"
23#include "zebra/eqlqf.inc"
24#include "zebra/mzcn.inc"
25#include "zebra/mzct.inc"
26#include "zebra/fzci.inc"
27#include "zebra/fzcseg.inc"
28#include "zebra/fzcocc.inc"
29C-------------- End CDE --------------
30
31 DIMENSION ITOSOR(20), ISORDV(20), ISORSP(20)
32 DIMENSION LSTAV(20), LENDV(20)
33 EQUIVALENCE (LSTAV(1),IQUEST(60)), (LENDV(1),IQUEST(80))
34
35#if (defined(CERNLIB_QTRHOLL))&&(!defined(CERNLIB_A6M))
36 DIMENSION NAMESR(2)
37 DATA NAMESR / 4HFZIM, 4HTB /
38#endif
39#if (defined(CERNLIB_QTRHOLL))&&(defined(CERNLIB_A6M))
40 DATA NAMESR / 6HFZIMTB /
41#endif
42#if !defined(CERNLIB_QTRHOLL)
43 CHARACTER NAMESR*8
44 PARAMETER (NAMESR = 'FZIMTB ')
45#endif
46
47#include "zebra/q_shiftl.inc"
48#include "zebra/q_jbyt.inc"
49
50C---- Input information
51
52C- if NQSEG = 0 : read non-segmented
53
54C- if NQSEG > 0 : read segmented according to :
55C- IQSEGD segment selection table set by the user
56C- IQ(LFISEG+1) copy of the segmentation table from the pilot
57
58C---- Output information
59
60C- The memory occupation table at LQ(LQMTA) ready for the material
61C- to be accepted :
62C- skip : LQ(LMT) = 0
63C- LQ(LMT+1) = 0
64C- LQ(LMT+3) = -NW words to be skipped
65
66C- read : LQ(LMT) = JDIV
67C- LQ(LMT+1) = 1
68C- LQ(LMT+3) = LSTA
69C- LQ(LMT+4) = LEND
70
71C- The space at LQ(LQTA) ready (and big enough) to receive
72C- the relocation table.
73
74C- The common /FZOCC/ indicates the amount of space IQOCSP(J)
75C- reserved at the end/start of division IQOCDV(J) for J=1,NQOCC
76C- and blocked by a dummy bank.
77
78
79#include "zebra/qtrace.inc"
80
81 IFLGAR = 0
82 IF (NQSEG.LE.0) THEN
83
84C-- Single segment
85
86 NQSEG = 1
87 NSOR = 1
88 NOCC = 1
89 ITOSOR(1) = 1
90 IQSEGD(1) = JQDIVI
91 ISORDV(1) = JQDIVI
92 IQOCDV(1) = JQDIVI
93 ISORSP(1) = NWBKI
94 IQOCSP(1) = NWBKI
95 GO TO 41
96 ENDIF
97
98C-- Multiple segments, tidy division numbers
99
100#if defined(CERNLIB_QDEBPRI)
101 IF (LOGLVI.GE.3) WRITE (IQLOG,9016) (J,
102 + IQSEGH(1,J),IQSEGH(2,J),IQSEGD(J),J=1,NQSEG)
103 9016 FORMAT (1X/' FZIMTB- Segment Selection Table as set by the user'
104#endif
105#if (defined(CERNLIB_QDEBPRI))&&(!defined(CERNLIB_HEX))
106 F/(10X,I2,1X,2A4,O23))
107#endif
108#if (defined(CERNLIB_QDEBPRI))&&(defined(CERNLIB_HEX))
109 F/(10X,I2,1X,2A4,Z17))
110#endif
111
112 LFISEG = LQFI + JAUSEG
113 IF (3*NQSEG.NE.IQ(KQSP+LFISEG)) GO TO 715
114 LSPACE = KQSP + LFISEG + 2*NQSEG
115
116 DO 27 JS=1,NQSEG
117 IXDIV = IQSEGD(JS)
118 IF (IXDIV) 22, 23, 24
119 22 IF (IXDIV.LT.-7) GO TO 714
120 ITOSOR(JS) = -IQ(LSPACE+JS)
121 GO TO 27
122
123 23 JDIV = JQDIVI
124 GO TO 25
125
126 24 JDIV = JBYT (IXDIV,1,26)
127 IF (JDIV.GT.20) GO TO 714
128 JSTO = JBYT (IXDIV,27,4)
129 IF (JSTO.NE.0) THEN
130 IF (JSTO.NE.JQSTOR) GO TO 714
131 ENDIF
132
133 IF (JDIV.EQ.0) GO TO 23
134 IF (JDIV.GT.JQDVLL) THEN
135 IF (JDIV.LT.JQDVSY) GO TO 714
136 ENDIF
137
138 25 IQSEGD(JS) = JDIV
139 ITOSOR(JS) = 0
140 27 CONTINUE
141
142C---- Construct tables sorted by division number
143
144C- ISOR table : one entry per segment
145C- IQOC table : one entry per target division
146
147 NSOR = 0
148 NOCC = 0
149 JANX = 1
150 JENX = NQSEG
151
152C-- Find largest division number not yet done
153
154 31 JDVBIG = 0
155 JA = JANX
156 JANX = 0
157 JE = JENX
158 JENX = 0
159 DO 35 JS=JA,JE
160 IF (ITOSOR(JS).NE.0) GO TO 35
161 JENX = JS
162 IF (JANX.EQ.0) JANX=JS
163 JDIV = IQSEGD(JS)
164 IF (JDIV.LE.JDVBIG) GO TO 35
165 JDVBIG = JDIV
166 JSBIG = JS
167 35 CONTINUE
168 IF (JDVBIG.EQ.0) GO TO 41
169
170 NSOR = NSOR + 1
171 ITOSOR(JSBIG) = NSOR
172 ISORDV(NSOR) = JDVBIG
173 ISORSP(NSOR) = IQ(LSPACE+JSBIG)
174
175 NOCC = NOCC + 1
176 IQOCDV(NOCC) = JDVBIG
177 IQOCSP(NOCC) = IQ(LSPACE+JSBIG)
178
179C-- Find further segments for the same division
180
181 IF (JSBIG.EQ.JENX) GO TO 31
182 DO 37 JS=JSBIG+1,JENX
183 IF (ITOSOR(JS).NE.0) GO TO 37
184 IF (IQSEGD(JS).NE.JDVBIG) GO TO 37
185 NSOR = NSOR + 1
186 ITOSOR(JS) = NSOR
187 ISORDV(NSOR) = JDVBIG
188 ISORSP(NSOR) = IQ(LSPACE+JS)
189 IQOCSP(NOCC) = IQOCSP(NOCC) + IQ(LSPACE+JS)
190 37 CONTINUE
191 GO TO 31
192
193C---- Reserve space in divisions
194
195 41 IF (NOCC.EQ.0) GO TO 81
196 JOCC = 0
197 42 JOCC = JOCC + 1
198 JQDIVI = IQOCDV(JOCC)
199 NW = IQOCSP(JOCC)
200 CALL MZRESV
201 NQRESV = NQRESV - NW
202 IF (NQRESV.LT.0) CALL MZGAR1
203
204C-- Forward division
205
206 IF (JQMODE.EQ.0) THEN
207 IQLN = LQEND(KQT+JQDIVI)
208 IQNX = IQLN + NW
209 LQEND(KQT+JQDIVI) = IQNX
210
211C-- Reverse division
212
213 ELSE
214 IQNX = LQSTA(KQT+JQDIVI)
215 IQLN = IQNX - NW
216 LQSTA(KQT+JQDIVI) = IQLN
217 ENDIF
218 NQOCC = JOCC
219
220C-- Fill space reserved with dummy bank
221
222 LQ(KQS+IQLN) = 12
223 LQ(KQS+IQLN+1) = 0
224 LQ(KQS+IQLN+2) = 0
225 LQ(KQS+IQLN+3) = 0
226 LQ(KQS+IQLN+5) = IQLETT(1)
227 LQ(KQS+IQLN+6) = 0
228 LQ(KQS+IQLN+7) = 0
229 LQ(KQS+IQLN+8) = NW - 10
230 LQ(KQS+IQLN+9) = 0
231 IF (JOCC.NE.NOCC) GO TO 42
232
233C---- Allocate space for the relocation tables
234
235 46 NWTR = 2*NWTABI + 2
236 NWTM = 8*NQSEG
237 IF (NWTR+NWTM.LT.NQWKTB) THEN
238C-- Both tables in the normal work area
239 LQMTA = LQWKTB
240 LQRTA = LQMTA + NWTM
241 ELSE
242 JQSTMV = -1
243 CALL MZFGAP
244 IF (NQGAPN.EQ.0) GO TO 61
245 IF (IQGAP(1,1).LT.NWTR) THEN
246C-- MO table in the (smaller) gap, LR table in area
247 IF (NQWKTB.LT.NWTR) GO TO 61
248 LQMTA = IQGAP(2,1)
249 LQRTA = LQWKTB
250 ELSE
251C-- MO table in area, LR table in (bigger) gap
252 LQMTA = LQWKTB
253 LQRTA = IQGAP(2,1)
254 ENDIF
255 ENDIF
256
257 LQMTE = LQMTA + NWTM
258 LQTA = LQRTA + 1
259 LQTE = LQTA + 2*NWTABI
260 LQRTE = LQTE
261#if defined(CERNLIB_QDEVZE)
262 IF (LOGLVI.GE.4) WRITE (IQLOG,9141) LQMTA,LQMTE,LQTA,LQTE
263 9141 FORMAT (' FZIMTB- Tables : LQMTA,LQMTE,LQTA,LQTE=',4I9)
264#endif
265
266C---- Calculate start adrs on the sorted table
267
268 JSOR = 1
269 JOCC = 1
270 52 JQDIVI = ISORDV(JSOR)
271
272 IF (IQMODE(KQT+JQDIVI).EQ.0) THEN
273 LSTA = LQEND(KQT+JQDIVI) - IQOCSP(JOCC)
274 ELSE
275 LSTA = LQSTA(KQT+JQDIVI)
276 ENDIF
277
278 LEND = LSTA + ISORSP(JSOR)
279
280 LENDV(JSOR) = LEND
281 LSTAV(JSOR) = LSTA
282 JOCC = JOCC + 1
283
284 54 IF (JSOR.EQ.NSOR) GO TO 55
285 JSOR = JSOR + 1
286 IF (ISORDV(JSOR).NE.JQDIVI) GO TO 52
287 LSTA = LEND
288 LEND = LSTA + ISORSP(JSOR)
289 LENDV(JSOR) = LEND
290 LSTAV(JSOR) = LSTA
291 GO TO 54
292
293C---- Transfer the information from the sorted table
294C- to the memory occupation table
295
296 55 LMT = LQMTA
297
298 DO 59 JS=1,NQSEG
299 JSOR = ITOSOR(JS)
300 IF (JSOR.GE.0) GO TO 57
301 LQ(LMT) = 0
302 LQ(LMT+1) = 0
303 LQ(LMT+2) = 0
304 LQ(LMT+3) = JSOR
305 LQ(LMT+4) = JSOR
306 LQ(LMT+5) = 0
307 LQ(LMT+6) = 0
308 LQ(LMT+7) = 0
309#if defined(CERNLIB_QDEBPRI)
310 IF (LOGLVI.GE.3) WRITE (IQLOG,9055) JS, -JSOR
311 9055 FORMAT (' FZIMTB- skip segment',I3,I9,' WORDS')
312#endif
313 GO TO 59
314
315 57 LQ(LMT) = ISORDV(JSOR)
316 LQ(LMT+1) = 1
317 LQ(LMT+2) = 0
318 LQ(LMT+3) = LSTAV(JSOR)
319 LQ(LMT+4) = LENDV(JSOR)
320 LQ(LMT+5) = 0
321 LQ(LMT+6) = 0
322 LQ(LMT+7) = 0
323#if defined(CERNLIB_QDEBPRI)
324 IF (LOGLVI.GE.3) THEN
325 WRITE (IQLOG,9058) JS,LQ(LMT),LQ(LMT+3),LQ(LMT+4)
326 ENDIF
327 9058 FORMAT (' FZIMTB- read segment',I3,' into division/from/to'
328 F,I3,2I9)
329#endif
330 59 LMT = LMT + 8
331#include "zebra/qtrace99.inc"
332 RETURN
333
334C------ Garbage collection to make room for the table
335
336 61 IF (IFLGAR.GE.2) GO TO 721
337 IXSTOR = ISHFTL (JQSTOR,26)
338 IF (IFLGAR.NE.0) GO TO 63
339
340 IXSTOR = MZIXCO (IXSTOR+21,22,23,24)
341 CALL MZGARB (IXSTOR, 0)
342 IFLGAR = 1
343 IF (JQSTOR.NE.0) GO TO 46
344 IFLGAR = 2
345 GO TO 46
346
347C-- Collect also the primary store
348
349 63 IFLGAR = 2
350 J = MZIXCO (21,22,23,24)
351 CALL MZGARB (J, 0)
352 CALL MZSDIV (IXSTOR,-7)
353 GO TO 46
354
355C---- All segments to be skipped
356
357 81 NWBKI = 0
358 JRETCD = -4
359#if defined(CERNLIB_QDEBPRI)
360 IF (LOGLVI.GE.3) WRITE (IQLOG,9081)
361 9081 FORMAT (' FZIMTB- skip all segments')
362#endif
363 GO TO 999
364
365C-------------------------------------------------
366C- ERROR CONDITIONS
367C-------------------------------------------------
368
369C---- User error
370
371C- JERROR = 15 NQSEG has been changed by the user
372 715 JERROR = 15
373 IQUEST(14)= NQSEG
374 IQUEST(15)= IQ(KQSP+LFISEG)
375 NWERR = 2
376 GO TO 719
377
378C- JERROR = 14 invalid division number in segment table
379 714 JERROR = 14
380 IQUEST(14)= JS
381 IQUEST(15)= 0
382 IQUEST(16)= IXDIV
383 NWERR = 3
384
385 719 JRETCD = 4
386 GO TO 999
387
388C---- Not enough space
389
390C- JERROR = 21 not enough space
391 721 JERROR = 21
392
393 JRETCD = 3
394 GO TO 999
395 END
396* ==================================================
397#include "zebra/qcardl.inc"