Trailing-Edge
-
PDP-10 Archives
-
BB-H348C-RM_1982
-
swskit-v21/listings/tkb-vnp/fio20.bpt
There are no other files named fio20.bpt in the archive.
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
1 !<TKB-VNP>FIO20.BLI.5, 13-Jun-79 08:02:30, Edit by SROBINSON
2 !<SAUTER.TKB20>FIO20.BLI.55, 5-Mar-79 15:59:16, Edit by SROBINSON
3 MODULE FIO20 ( !File I/O for TOPS-20
4 IDENT = 'X0.3'
5 ) =
6 BEGIN
7 !
8 ! COPYRIGHT (c) 1977, 1978, 1979 BY
9 ! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
10 !
11 ! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
12 ! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
13 ! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
14 ! COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
15 ! OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
16 ! TRANSFERRED.
17 !
18 ! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
19 ! AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
20 ! CORPORATION.
21 !
22 ! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
23 ! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
24 !
25
26 !++
27 ! FACILITY: TKB-20 and VNP-20
28 !
29 ! ABSTRACT:
30 !
31 ! This module does all I/O operations associated with the processing
32 ! of files by VNP-20 and TKB-20. It also contains routines that are
33 ! system dependent.
34 !
35 ! The I/O routines supported are:
36 ! RESET_ALL - initialization of I/O system
37 ! OPEN - open a file
38 ! CLOSE - close a file
39 ! INPUT - get data from a file
40 ! OUTPUT - put data onto a file
41 !
42 ! The system dependent routines are:
43 ! STOP_PROGRAM - terminate program
44 !
45 ! Channel 0 is always the terminal. Other channels are assigned at
46 ! will and are an artifact of programs written for TOPS-10 I/O.
47 !
48 ! ENVIRONMENT: TOPS-20 User Mode
49 !
50 ! AUTHOR: Scott G. Robinson, CREATION DATE: 25-NOV-78
51 !
52 ! MODIFIED BY:
53 !
54 ! Scott G. Robinson, 5-MAR-79 : VERSION X0.2
55 ! - Modify to use JSYS_CALL macro to resolve register conflicts
56 !
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
57 ! Scott G. Robinson, 13-JUN-79 : VERSION X0.3
58 ! - Add routine STOP_PROGRAM
59 !
60 ! , : VERSION
61 ! 01 -
62 !--
63
64 !
65 ! TABLE OF CONTENTS:
66 !
67
68 FORWARD ROUTINE
69 RESET_ALL : NOVALUE, !Reset all I/O
70 OPEN, !Open a file
71 CLOSE : NOVALUE, !Close a file
72 INPUT, !Read from a file
73 OUTPUT : NOVALUE, !Write on a file
74 STOP_PROGRAM : NOVALUE; !Terminate execution
75
76 !
77 ! INCLUDE FILES:
78 !
79
80 LIBRARY 'BLI:MONSYM.L36';
81
82 LIBRARY 'BLI:TENDEF.L36';
83
84 !
85 ! MACROS:
86 !
87
88 MACRO
89 JSYS_CALL (TYPE, FUNC, AC1, AC2, AC3, AC4) =
90 BEGIN
91 REGISTER T1=1,T2=2,T3=3,T4=4;
92 LOCAL VALUE;
93 BUILTIN JSYS;
94 %IF NOT %NULL(AC1) %THEN T1=.AC1; %FI
95 %IF NOT %NULL(AC2) %THEN T2=.AC2; %FI
96 %IF NOT %NULL(AC3) %THEN T3=.AC3; %FI
97 %IF NOT %NULL(AC4) %THEN T4=.AC4; %FI
98 VALUE = JSYS(TYPE,FUNC,T1,T2,T3,T4);
99 %IF NOT %NULL(AC1) %THEN %IF %DECLARED(AC1) %THEN AC1=.T1; %FI %FI
100 %IF NOT %NULL(AC2) %THEN %IF %DECLARED(AC2) %THEN AC2=.T2; %FI %FI
101 %IF NOT %NULL(AC3) %THEN %IF %DECLARED(AC3) %THEN AC3=.T3; %FI %FI
102 %IF NOT %NULL(AC4) %THEN %IF %DECLARED(AC4) %THEN AC4=.T4; %FI %FI
103 .VALUE
104 END %;
105
106 !
107 ! EQUATED SYMBOLS:
108 !
109
110 LITERAL
111 DEBUG = 0,
112 LEN_LINE_BUFF = 160;
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
113
114 !
115 ! OWN STORAGE:
116 !
117
118 OWN
119 CHAN_MODE : VECTOR [16], !1=Character, 2=Word
120 CHAN_DIRECTION : VECTOR [16], !0=Input, 1=Output
121 CHAN_JFN : VECTOR [16], !Channel to JFN Mapping
122 CHAN_NEXT : VECTOR [16], !Next byte in word mode
123 LINE_BUFF : VECTOR [CH$ALLOCATION (LEN_LINE_BUFF)]; !Input line buffer
124
125 !
126 ! BOUND STORAGE FOR TERMINAL INPUT PROCESSING
127 !
128
129 BIND
130 LINE_LEN = CHAN_MODE [0],
131 LINE_STATUS = CHAN_DIRECTION [0],
132 LINE_PTR = CHAN_NEXT [0];
133
134 !
135 ! EXTERNAL REFERENCES:
136 !
137
138 EXTERNAL ROUTINE
139 ERROR : NOVALUE, !Programming Error
140 ERRMSG : NOVALUE; !Standard Error Message
141
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
142 GLOBAL ROUTINE RESET_ALL : NOVALUE = !Reset all I/O
143
144 !++
145 ! FUNCTIONAL DESCRIPTION:
146 !
147 ! Initializes the I/O system
148 !
149 ! FORMAL PARAMETERS:
150 !
151 ! NONE
152 !
153 ! IMPLICIT INPUTS:
154 !
155 ! NONE
156 !
157 ! IMPLICIT OUTPUTS:
158 !
159 ! NONE
160 !
161 ! COMPLETION CODES:
162 !
163 ! NONE
164 !
165 ! SIDE EFFECTS:
166 !
167 ! All Files currently open are dropped
168 !
169 !--
170
171 BEGIN
172
173 BIND
174 ROUTINE_NAME = UPLIT (%ASCIZ'RESET_ALL');
175
176 JSYS_CALL (0, RESET);
177 END; !of RESET_ALL
178
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
179 GLOBAL ROUTINE OPEN (CHANX, FNAME, MODE, IO, DEFEXT) : = !Open a File
180
181 !++
182 ! FUNCTIONAL DESCRIPTION:
183 !
184 ! Opens a file on channel "CHANX" with name "FNAME" in mode "MODE"
185 ! with direction "IO" with default extension "DEFEXT".
186 !
187 ! FORMAL PARAMETERS:
188 !
189 ! CHANX - Contains the channel number to associate with the file
190 ! FNAME - Points at the file name
191 ! MODE - File Mode (1=Character, 2= Word)
192 ! IO - Direction (0=Input,1=Output)
193 ! DEFEXT - Default extension if none specified in FNAME
194 !
195 ! IMPLICIT INPUTS:
196 !
197 ! NONE
198 !
199 ! IMPLICIT OUTPUTS:
200 !
201 ! NONE
202 !
203 ! ROUTINE VALUE:
204 !
205 ! 1 If OPEN Successful, 0 If not.
206 !
207 ! SIDE EFFECTS:
208 !
209 ! Modifies OWN storage to reflect associated file information.
210 !
211 !--
212
213 BEGIN
214
215 BIND
216 ROUTINE_NAME = UPLIT (%ASCIZ'OPEN');
217
218 LOCAL
219 CHAN,
220 GTJFN_BLOCK : VECTOR [9],
221 BYTE_SIZE,
222 AC1,
223 AC2,
224 AC3;
225
226 !
227 ! Check on legality of channel number
228 !
229 CHAN = .CHANX;
230
231 IF (.CHAN EQL 0)
232 THEN
233 ERROR (UPLIT (%ASCIZ'May not OPEN channel 0 - OPEN'))
234 ELSE
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
235
236 IF ((.CHAN GTR 15) OR (.CHAN LSS 0))
237 THEN
238 ERROR (UPLIT (%ASCIZ'Invalid Channel Number - OPEN'))
239 ELSE
240
241 IF (.CHAN_JFN [.CHAN] NEQ 0)
242 THEN
243 ERROR (UPLIT (%ASCIZ'Attempting to OPEN an already OPEN channel - OPEN'))
244 ELSE
245 !
246 ! We now have what appears to be a valid request: The channel number is within
247 ! range and it is not open.
248 !
249 ! Build a GTJFN Block to attempt and access the file.
250 !
251 BEGIN
252 GTJFN_BLOCK [$GJGEN] = (CASE .IO FROM 0 TO 1 OF
253 SET
254 [0] : GJ_OLD;
255 [1] : GJ_FOU + GJ_NEW;
256 [OUTRANGE] : -1;
257 TES);
258
259 INCR FOO FROM $GJDEV TO $GJJFN DO
260 GTJFN_BLOCK [.FOO] = 0;
261
262 GTJFN_BLOCK [$GJSRC] = %O'377777377777'; !.NULIO,,.NULIO
263 GTJFN_BLOCK [$GJEXT] = CH$PTR (.DEFEXT);
264 AC2 = CH$PTR (.FNAME);
265 AC1 = GTJFN_BLOCK;
266
267 IF NOT JSYS_CALL (1, GTJFN, AC1, AC2) !Get the JFN
268 THEN
269 BEGIN !and if in error
270 ERRMSG (0, 2, ROUTINE_NAME, .FNAME, 0, 0, 0);
271 RETURN 0
272 END;
273
274 CHAN_JFN [.CHAN] = .AC1; !Save returned JFN
275 CHAN_MODE [.CHAN] = .MODE; ! and mode
276 CHAN_DIRECTION [.CHAN] = .IO; ! with direction
277 CHAN_NEXT [.CHAN] = -1; !Indicate Initial State
278 !
279 ! Because we were apparently successful in accessing the file, open
280 ! it.
281 !
282 BYTE_SIZE = (CASE .MODE FROM 1 TO 2 OF
283 SET
284 [1] : 7; !Character mode
285 [2] : 18; !16-bit word mode
286 [OUTRANGE] : 0; !Use default
287 TES);
288 AC2 = FLD (.BYTE_SIZE, OF_BSZ) + (CASE .IO FROM 0 TO 1 OF
289 SET
290 [0] : OF_RD;
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
291 [1] : OF_WR;
292 [OUTRANGE] : 0;
293 TES);
294 AC1 = .CHAN_JFN [.CHAN];
295
296 IF NOT JSYS_CALL (1, OPENF, AC1, AC2)
297 THEN
298 BEGIN !OPENF Failed!!!
299 ERRMSG (0, 3, ROUTINE_NAME, .FNAME, 0, 0, 0);
300 CHAN_JFN [.CHAN] = 0;
301 RETURN 0
302 END;
303
304 END;
305
306 1
307 END; !End of OPEN
308
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
309 GLOBAL ROUTINE CLOSE (CHANX) : NOVALUE = !Close a channel
310
311 !++
312 ! FUNCTIONAL DESCRIPTION:
313 !
314 ! Close a file channel
315 !
316 ! FORMAL PARAMETERS:
317 !
318 ! CHANX - the channel to close
319 !
320 ! IMPLICIT INPUTS:
321 !
322 ! NONE
323 !
324 ! IMPLICIT OUTPUTS:
325 !
326 ! NONE
327 !
328 ! COMPLETION CODES:
329 !
330 ! NONE
331 !
332 ! SIDE EFFECTS:
333 !
334 ! Minipulation of the OWN data base occurs
335 !
336 !--
337
338 BEGIN
339
340 BIND
341 ROUTINE_NAME = UPLIT (%ASCIZ'CLOSE');
342
343 LOCAL
344 CHAN,
345 AC1;
346
347 !
348 ! Validate Channel number
349 !
350 CHAN = .CHANX;
351
352 IF (.CHAN EQL 0)
353 THEN
354 ERROR (UPLIT (%ASCIZ'You May Not Close Channel 0 - CLOSE'))
355 ELSE
356
357 IF ((.CHAN LSS 0) OR (.CHAN GTR 15))
358 THEN
359 ERROR (UPLIT (%ASCIZ'Invalid Channel Number - CLOSE'))
360 ELSE
361
362 IF (.CHAN_JFN [.CHAN] EQL 0)
363 THEN
364 ERROR (UPLIT (%ASCIZ'Channel is not OPEN - CLOSE'))
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
365 ELSE
366 BEGIN
367 AC1 = .CHAN_JFN [.CHAN];
368 JSYS_CALL (1, CLOSF, AC1);
369 CHAN_JFN [.CHAN] = 0;
370 END;
371
372 END; !End of CLOSE
373
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
374 GLOBAL ROUTINE INPUT (CHANX) : = !Read from file
375
376 !++
377 ! FUNCTIONAL DESCRIPTION:
378 !
379 ! Returns the next character (or PDP-11) word from a file.
380 !
381 ! FORMAL PARAMETERS:
382 !
383 ! CHANX - the channel number associated with the file
384 !
385 ! IMPLICIT INPUTS:
386 !
387 ! NONE
388 !
389 ! IMPLICIT OUTPUTS:
390 !
391 ! NONE
392 !
393 ! ROUTINE VALUE:
394 !
395 ! The character or word is returned.
396 ! If EOF or an ERROR is reached then -1 is returned.
397 !
398 ! SIDE EFFECTS:
399 !
400 ! NONE
401 !
402 !--
403
404 BEGIN
405
406 BIND
407 ROUTINE_NAME = UPLIT (%ASCIZ'INPUT');
408
409 LOCAL
410 CHAN,
411 CHAN_CHAR,
412 AC1,
413 AC2,
414 AC3;
415
416 !
417 ! Determine whether the channel is for the terminal or a file then
418 ! process accordingly.
419 !
420 CHAN = .CHANX;
421
422 IF (.CHAN EQL 0)
423 THEN
424 BEGIN
425
426 IF (.LINE_PTR EQL 0)
427 THEN
428 BEGIN
429 AC3 = 0;
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
430 AC2 = RD_TOP + RD_RAI + LEN_LINE_BUFF;
431 AC1 = CH$PTR (LINE_BUFF);
432 LINE_STATUS = (IF NOT JSYS_CALL (1, RDTTY, AC1, AC2, AC3) THEN -1 ELSE .AC2);
433 LINE_PTR = CH$PTR (LINE_BUFF);
434 LINE_LEN = LEN_LINE_BUFF - (.LINE_STATUS AND %O'777777');
435 END;
436
437 CHAN_CHAR = CH$RCHAR_A (LINE_PTR);
438
439 IF ((LINE_LEN = .LINE_LEN - 1) EQL 0) THEN LINE_PTR = 0;
440
441 END
442 ELSE
443 BEGIN
444
445 IF ((.CHAN LSS 0) OR (.CHAN GTR 15))
446 THEN
447 BEGIN
448 ERROR (UPLIT (%ASCIZ'Channel number out of range - INPUT'));
449 AC1 = 0;
450 END
451 ELSE
452 AC1 = .CHAN_JFN [.CHAN];
453
454 IF (.AC1 EQL 0)
455 THEN
456 BEGIN
457 ERROR (UPLIT (%ASCIZ'Channel not OPEN - INPUT'));
458 RETURN -1
459 END;
460
461 !
462 ! The next section of code either returns the character just read for a
463 ! character mode file or the next byte of a word mode file.
464 ! CHAN_NEXT[.CHAN] is -1 if a new BIN JSYS should be done.
465 !
466
467 IF (.CHAN_NEXT [.CHAN] LSS 0)
468 THEN
469 BEGIN
470 CHAN_CHAR = (IF NOT JSYS_CALL (-1, BIN, AC1, AC2) THEN -1 ELSE .AC2);
471
472 IF ((.CHAN_MODE [.CHAN] EQL 2) AND (.CHAN_CHAR GEQ 0))
473 THEN
474 BEGIN
475 CHAN_NEXT [.CHAN] = .CHAN_CHAR<8, 8>; !Next character
476 CHAN_CHAR = .CHAN_CHAR<0, 8>; !Current Character
477 END;
478
479 END
480 ELSE
481 BEGIN !The second byte of the word
482 CHAN_CHAR = .CHAN_NEXT [.CHAN]; !The character to return
483 CHAN_NEXT [.CHAN] = -1;
484 END;
485
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
486 END;
487
488 .CHAN_CHAR
489 END; !End of INPUT
490
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
491 GLOBAL ROUTINE OUTPUT (CHANX, OUTWRD) : NOVALUE = !Output to a file
492
493 !++
494 ! FUNCTIONAL DESCRIPTION:
495 !
496 ! Output a byte or word to a file.
497 !
498 ! FORMAL PARAMETERS:
499 !
500 ! CHANX - the channel number
501 ! OUTWRD - the byte or word to output
502 !
503 ! IMPLICIT INPUTS:
504 !
505 ! NONE
506 !
507 ! IMPLICIT OUTPUTS:
508 !
509 ! NONE
510 !
511 ! COMPLETION CODES:
512 !
513 ! NONE
514 !
515 ! SIDE EFFECTS:
516 !
517 ! NONE
518 !
519 !--
520
521 BEGIN
522
523 BIND
524 ROUTINE_NAME = UPLIT (%ASCIZ'OUTPUT');
525
526 LOCAL
527 CHAN,
528 AC1,
529 AC2;
530
531 !
532 ! Determine whether the channel is for the terminal or a file then
533 ! process accordingly.
534 !
535 CHAN = .CHANX;
536
537 IF (.CHAN EQL 0)
538 THEN
539 AC1 = $PRIOU !For Primary OUTPUT media
540 ELSE
541
542 IF ((.CHAN LSS 0) OR (.CHAN GTR 15))
543 THEN
544 BEGIN
545 ERROR (UPLIT (%ASCIZ'Channel number out of range - OUTPUT'));
546 AC1 = 0
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
547 END
548 ELSE
549 AC1 = .CHAN_JFN [.CHAN];
550
551 IF (.AC1 EQL 0)
552 THEN
553 BEGIN
554 ERROR (UPLIT (%ASCIZ'Channel not OPEN - OUTPUT'));
555 RETURN
556 END;
557
558 !
559 ! The following code either outputs a character immediately in
560 ! character mode or waits for two bytes in word mode.
561 !
562
563 IF ((.CHAN_NEXT [.CHAN] LSS 0) OR (.CHAN EQL 0))
564 THEN
565
566 IF (.CHAN_MODE [.CHAN] EQL 2)
567 THEN
568 CHAN_NEXT [.CHAN] = .OUTWRD<0, 8> !First Byte of word
569 ELSE
570 BEGIN
571 AC2 = .OUTWRD;
572 JSYS_CALL (0, BOUT, AC1, AC2);
573 END
574
575 ELSE
576 BEGIN
577 AC2 = ((.OUTWRD<0, 8>)^8) + .CHAN_NEXT [.CHAN];
578 JSYS_CALL (0, BOUT, AC1, AC2);
579 CHAN_NEXT [.CHAN] = -1;
580 END;
581
582 END; !End of OUTPUT
583
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
584 GLOBAL ROUTINE STOP_PROGRAM : NOVALUE = !Terminate execution
585
586 !++
587 ! FUNCTIONAL DESCRIPTION:
588 !
589 ! Terminates the program. Usually used to stop program when some
590 ! abnormal condition occurs.
591 !
592 ! FORMAL PARAMETERS:
593 !
594 ! NONE
595 !
596 ! IMPLICIT INPUTS:
597 !
598 ! NONE
599 !
600 ! IMPLICIT OUTPUTS:
601 !
602 ! NONE
603 !
604 ! COMPLETION CODES:
605 !
606 ! NONE
607 !
608 ! SIDE EFFECTS:
609 !
610 ! The program is halted.
611 !
612 !--
613
614 BEGIN
615
616 BIND
617 ROUTINE_NAME = UPLIT (%ASCIZ'STOP_PROGRAM');
618
619 JSYS_CALL (0, HALTF);
620 END; !of RESET_ALL
621
622 END !End of module
623
624 ELUDOM
625 ! Local Modes:
626 ! Comment Column:36
627 ! Comment Start:!
628 ! Auto Save Mode:2
629 ! Mode:Fundamental
630 ! End:
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
AC1 89 94 99# 222 265# 267 274
294# 296 345 367# 368 412 431#
432 449# 452# 454 470 528 539#
546# 549# 551 572 578
AC2 89 95 100# 223 264# 267 288#
296 413 430# 432 470 529 571#
572 577# 578
AC3 89 96 101# 224 414 429# 432
AC4 89 97 102#
BIN 470
BOUT 572 578
BYTE_SIZE 221 282# 288
CHAN 219 229# 231 236 241 274 275
276 277 294 300 344 350# 352
357 362 367 369 410 420# 422
445 452 467 472 475 482 483
527 535# 537 542 549 563 566
568 577 579
CHANX 179 229 309 350 374 420 491
535
CHAN_CHAR 411 437# 470# 472 475 476# 482#
488
CHAN_DIRECTION 120 131 276#
CHAN_JFN 121 241 274# 294 300# 362 367
369# 452 549
CHAN_MODE 119 130 275# 472 566
CHAN_NEXT 122 132 277# 467 475# 482 483#
563 568# 577 579#
CLOSE 71 309*
CLOSF 368
DEFEXT 179 263
ERRMSG 140 270 299
ERROR 139* 233 238 243 354 359 364
448 457 545 554
FIO20 3#
FLD 288
FNAME 179 264 270 299
FOO 259 260
FUNC 89 98
GJ_FOU 255
GJ_NEW 255
GJ_OLD 254
GTJFN_BLOCK 220 252# 260# 262# 263# 265
GTJFN 267
HALTF 619
INPUT 72 374*
IO 179 252 276 288
JSYS 93 98
JSYS_CALL 89# 176 267 296 368 432 470
572 578 619
LEN_LINE_BUFF 112# 123 430 434
LINE_BUFF 123 431 433
LINE_LEN 130# 434# 439#
LINE_PTR 132# 426 433# 437 439#
LINE_STATUS 131# 432# 434
DSK:FIO20.XRF[4,31] 31-Aug-79 14:43
MODE 179 275 282
OF_BSZ 288
OF_RD 290
OF_WR 291
OPEN 70 179*
OPENF 296
OUTPUT 73 491*
OUTWRD 491 568 571 577
RDTTY 432
RD_RAI 430
RD_TOP 430
RESET_ALL 69 142*
RESET 176
ROUTINE_NAME 174# 216# 270 299 341# 407# 524#
617#
STOP_PROGRAM 74 584*
T1 91# 94# 98 99
T2 91# 95# 98 100
T3 91# 96# 98 101
T4 91# 97# 98 102
TYPE 89 98
VALUE 92 98# 103#
$GJDEV 259
$GJEXT 263
$GJGEN 252
$GJJFN 259
$GJSRC 262
$PRIOU 539