Google
 

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