.TITLE AUXIO
/
/COPYRIGHT (C) 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS
/SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-
/VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
/EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO
/THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
/WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-
/MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
	.EJECT
/COPYRIGHT 1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
/EDIT #015  1-27-72	R. FOLK, W.A. DESIMONE, R MCLEAN.
/	016	XX
/
/EDIT #017  29-JUL-75  R. K. BLACKETT
/	THE NAME OF THE FIOPS DOUBLE BUFFER ADDRESS TABLE HAS BEEN
/	CHANGED FROM 'BTABLE' TO '.BTABL' TO AVOID POSSIBLE CONFLICT WITH
/	CUSTOMER SYMBOLS.  THIS CHANGE WAS DONE WITH THE 'CONVERT' COMMAND,
/	SO NO EDIT MARKS WILL APPEAR ON THE CHANGED LINES.
/	ALSO, REMOVE HIGH DESCRIPTOR BITS FROM THE BUFFER ADDRESS BEFORE
/	ISSUING THE .GVBUF IN THE MASS STORAGE 'END FILE' CASE.
/	ALSO, REMOVE THE '.END' STATEMENT FROM WITHIN CONDITIONALIZED
/	CODE TO PREVENT GETTING THE ASSEMBLERS 'Y' ERROR.
/ EDIT #018	20-AUG-75	M. HEBENSTREIT	DISCLAIMER
/
/EDIT #019  24-NOV-75  R. K. BLACKETT
/	ADD A NEW ASSEMBLY PARAMETER, '%NODBL', TO PREVENT
/	DOUBLE BUFFERING FOR DOS, AND MAKE DOUBLE BUFFERED DEFAULT.
/
/EDIT #020  20-MAY-76  G. A. REID
/	CHANGE THE RSX VERSION TO PASS THE LUN AND THE EVENT
/	VARIABLE TO OTSER WHEN REPORTING AN OTS-20 ERROR.
/	THIS CHANGE REQUIRES THE USE OF OTSER EDIT #016 OR
/	LATER.
/
/
/DEFINE %V5A FOR V5A SYSTEMS
/DEFINE RSX FOR RSX SYSTEMS.
/
	.IFUND	RSX
	.IFUND %V5A
%DOS15=0
	.ENDC
	.IFUND	%NODBL		/(RKB-019)
%DBL=0				/(RKB-019)
	.ENDC			/(RKB-019)
/4-23-68
/AUXILIARY I/O STATEMENT OBJECT-TIME PACKAGE.
/   INTERNAL GLOBALS --
       .GLOBL .FT		       /BACKSPACE STATEMENT.
       .GLOBL .FU		       /REWIND STATEMENT.
       .GLOBL .FV		       /ENDFILE STATEMENT.
	.GLOBL AUXIO
AUXIO=.
/   VIRTUAL GLOBALS --
       .GLOBL .FH		       /READ/WRITE FLAG.
       .GLOBL .FC		       /I/O DEVICE INITIALIZER.
       .GLOBL .FQ		       /LINE BUFFER TRANSFER ROUTINE.
       .GLOBL .FN		       /LINE BUFFER
	.GLOBL	.CHKDL		/* CHK. DELETE BIT & DELETE IF NEC. (FIOPS)
	.IFDEF %DOS15
	.GLOBL .FLZW0,.FLZW,.DSK,.FLRA
	.ENDC
	.IFDEF  %DBL
	.GLOBL .BTABL
	.ENDC
/   CONSTANTS AND WORKING STORAGE--
C00001	.DSA	1
C00002 .DSA   2
V77777 .DSA   377777
S02000 .DSA   2000
IDLOC=.FU
CNT=FT00
SLOT=.FV
       .EJECT
/BACKSPACE
/  CALLING SEQUENCE -- JMS   .FT
/		   .DSA  ADDRESS OF SLOT NUMBER
.FT    CAL    0
       DZM*   .FH		       /SET READ/WRITE FLAG TO READ.
       LAC*   .FT		       /INITIALIZE DEVICE.
       JMS*   .FC
       DAC    SLOT	         /SAVE SLOT NUMBER.
       XOR    S02000         /SET .MTAPE FUNCTION 02.
       DAC    FT00
       DAC    FT01
	.IFDEF %DOS15
	DAC FT03
	.ENDC
       ISZ    .FT		       /BUMP RETURN ADDRESS.
	.IFDEF %DOS15
	LAC SLOT
	JMS* .FLRA	/FILE OPEN FOR RAND. ACC?
	JMP* .FT	/YES-IGNORE BACKSPACE
	.ENDC
       LAC    .FN		       /GET ADDRESS OF RECORD ID.
       TAD    C00002
       DAC    IDLOC
	DZM* IDLOC	/FOR BACKSPACE OVER EOF.
	.IFDEF %DBL
	LAC SLOT
	JMS SBTAB	/SET BIT 0 IN THE BUFFER ADDRESS TABLE IN FIOPS
	.ENDC
FT00   CAL    0		     /BACKSPACE ONE PHYSICAL RECORD, AND READ
       .DSA   7		     /   IT INTO LINE BUFFER.
       LAC    SLOT
	JMS* .FQ
	LAC* .FN
	AND (17
	XOR C00002
	SNA
	.IFUND %DOS15
	JMP FT02
	.ENDC
	.IFDEF %DOS15
	JMP FT03	/ASCII.  DONE
	.ENDC
       LAC*   IDLOC          /CLEAR OUT BIT ZERO OF ID AND IT IS NOW
       AND    V77777         /   ONE LESS THA5 THE 5UMBER OF PHYSICAL
FT02       CMA		/   RECORDS THAT MUST BE BACKSPACED.
       DAC    CNT		       /(-ID-1) TO COUNTER
FT01   CAL    0		     /BACKSPACE (ID+1) PHYSICAL RECORDS.
       .DSA   7
       ISZ    CNT
       JMP    FT01
       JMP*   .FT		       /EXIT
	.IFDEF %DOS15
FT03	0		/BACKSPACE TO UNDO .READ
	7
	JMP* .FT
	.ENDC
       .EJECT
/REWIND
/  CALLING SEQUENCE -- JMS   .FU
/		   .DSA  ADDRESS OF SLOT NUMBER
.FU    CAL    0
       DZM*   .FH		       /SET READ/WRITE FLAG TO READ.
       LAC*   .FU		       /INITIALIZE DEVICE.
       JMS*   .FC
       DAC    FU00
	.IFDEF %DOS15
	JMS* .FLRA	/FILE OPEN FOR RAND. ACC.?
	JMP FU02	/YES- IGNORE REWIND
	.ENDC
FU00   CAL    0		     /REWIND TAPE.
       .DSA   7
	.IFDEF %DOS15
	LAC FU00	/SLOT # INTO AC
	DAC FU03
	DAC FU04
	JMS* .DSK	/A DISK?
	SNA
	JMP FU02	/NO
	LAC FU00	/YES-
	JMS* .FLZW0	/ZERO FILE ACTIVE ACTIVE WORD AND
/PROCEED TO .CLOSE THE FILE
FU03	0		/.CLOSE
	6
FU04	0		/.WAIT
	12
	.ENDC
FU02       ISZ    .FU		       /BUMP RETURN ADDRESS.
	.IFDEF %DBL
	LAC FU00
	JMS SBTAB
	.ENDC
       JMP*   .FU		       /EXIT
       .EJECT
/WRITE END-OF-FILE
/  CALLING SEQUENCE -- JMS   .FV
/		   .DSA  ADDRESS OF SLOT NUMBER
.FV    CAL    0
       LAC    C00001         /SET READ/WRITE FLAG TO WRITE
       DAC*   .FH
       LAC*   .FV		       /INITIALIZE DEVICE.
       JMS*   .FC
       DAC    FV00
	DAC FV01
	JMS*	.CHKDL		/* CHK. DELETE AND DELETE IF NEC.
	.IFDEF %DOS15
	LAC FV00
	JMS* .FLZW	/ZERO FILE ENTRY
	.ENDC
FV00   CAL    0		     /CLOSE FILE.
       .DSA   6
FV01	0	/.WAIT
	12
       ISZ    .FV		       /BUMP RETURN ADDRESS.
	.IFDEF %DBL
	LAW -1
	TAD .BTABL
	TAD FV00
	DAC SBTAB1
	LAC* SBTAB1
	AND	(77777)	/(RKB-017) STRIP HIGH DESCRIPTOR BITS FROM BUF ADDR.
	DAC BUFADR
	SAD (-1
	JMP* .FV
	AND (100000	/CHECK FOR MASS STORAGE DEVICE
	SNA
	.ENDC
	JMP* .FV
	.IFDEF %DBL
	0
	22
BUFADR	0
	JMP* .FV
/
/
/
SBTAB	XX
	TAD .BTABL
	TAD (-1
	DAC SBTAB1
	LAC* SBTAB1
	AND (377777
	TAD (400000
	DAC* SBTAB1
	JMP* SBTAB
/
/
SBTAB1	XX
/
/
	.ENDC
	.ENDC
	.IFDEF	RSX
/AUXILIARY I/O STATEMENT OBJECT-TIME PACKAGE FOR RSX.
/ AUXIO HANDLES THE BACKSPACE, REWIND, AND ENDFILE
/ REQUESTS FOR FORTRAN OTS.
/   INTERNAL GLOBALS --
       .GLOBL .FT		       /BACKSPACE STATEMENT.
       .GLOBL .FU		       /REWIND STATEMENT.
       .GLOBL .FV		       /ENDFILE STATEMENT.
	.GLOBL AUXIO
AUXIO=.
/   VIRTUAL GLOBALS --
       .GLOBL .FH		       /READ/WRITE FLAG.
       .GLOBL .FC		       /I/O DEVICE INITIALIZER.
       .GLOBL .FQ		       /LINE BUFFER TRANSFER ROUTINE.
       .GLOBL .FN		       /LINE BUFFER
	.GLOBL .ER			/OTS ERROR ROUT.
	.GLOBL .XFLRA			/SUBR. TO DETERM. R.A. PROC. (FIOPS)
	.GLOBL .CHKDL			/SUBR. TO DEL. DEF. FILE ON ENDF. (FIOPS)
/   CONSTANTS AND WORKING STORAGE--
C00002 .DSA   2
V77777 .DSA   377777
EV	0			/QUEUE I/O REQ. EV.
IDLOC=.FU
SLOT=.FV
       .EJECT
/BACKSPACE
/  CALLING SEQUENCE -- JMS   .FT
/		   .DSA  ADDRESS OF LUN NUMBER
.FT    CAL    0
       DZM*   .FH		       /SET READ/WRITE FLAG TO READ.
       LAC*   .FT		       /INITIALIZE DEVICE.
       JMS*   .FC
       DAC    SLOT	         /SAVE LUN NUMBER.
	DAC	LUNS		/SET LOG. UNIT NO.
       ISZ    .FT		       /BUMP RETURN ADDRESS.
	JMS*	.XFLRA		/IF FILE BEING PROCESSED BY R.A.
	JMP*	.FT		/IGNORE BACKSPACE.  SUBR. RET. HERE IF YES.
       LAC    .FN		       /GET ADDRESS OF RECORD ID.
	AAC	2
       DAC    IDLOC
	DZM* IDLOC	/FOR BACKSPACE OVER EOF.
	CLA!IAC		/ALSO INIT. CNT TO 1 FOR SINGLE BACKSP.
	DAC	CNT
FT00	CAL	BKSP	/BACKSPACE ONE PHYSICAL RECORD, AND READ
	JMS	WFEVT	/WAIT FOR EV SETTING AND RETURN TO JMP IF ERROR.
	JMP	AUXERR	/RETURNS HERE IF ERROR.
       LAC    SLOT		/READ A RECORD.  IF BINARY, BACKSPACE
	JMS* .FQ		/ID+1 PHYS. RECORDS.  IF ASCII, BACKSPACE
	LAC* .FN		/ONE PHYSICAL RECORD.
	AND	(60)		/VALIDITY BITS SET?  IF CHKSM OR PARITY
	SZA!CLA			/,COULD BE DUE TO BINARY READ OF ASCII
				/DATA.  IF THIS THE CASE,ASSUME RECORD IS
				/ASCII AND PROCEED ACCORDINGLY.  IF IT WAS
				/A TRUE PARITY OR CHKSM OR SHORTLINE, ERROR
				/WILL BE CAUGHT LATER ON FORTRAN READ.
	JMP	FT02		/YES.  ASSUME ASCII.
       LAC*   IDLOC          /NO.(BINARY)  CLEAR OUT BIT ZERO OF ID AND IT IS NOW
       AND    V77777         /   ONE LESS THA5 THE 5UMBER OF PHYSICAL
FT02       IAC		/   RECORDS THAT MUST BE BACKSPACED. ADD 1 ID.
       DAC    CNT		       /(ID+1) TO COUNTER
FT01   CAL    BKSP		     /BACKSPACE (ID+1) PHYSICAL RECORDS.
	JMS	WFEVT	/WAIT FOR EV SETTING AND RET. TO JMP IF ERROR.
	JMP	AUXERR	/RETURNS HERE IF ERROR.
       JMP*   .FT		       /EXIT
/
/CAL PARAMETER BLOCKS
/
BKSP	4200		/BACKSPACE.
	EV
LUNS	0		/LOG. UNIT NO.
CNT	0		/BACKSPACE CNT.
/
WFEV	20		/WAITFOR.
	EV
/
/
       .EJECT
/REWIND
/  CALLING SEQUENCE -- JMS   .FU
/		   .DSA  ADDRESS OF LUN NUMBER
.FU    CAL    0
       DZM*   .FH		       /SET READ/WRITE FLAG TO READ.
       LAC*   .FU		       /INITIALIZE DEVICE.
       JMS*   .FC
       DAC    RLUN
	ISZ	.FU		/BUMP EXIT.
	JMS*	.XFLRA		/IF R.A. FILE BEING PROCESSED ON THIS LUN
	JMP*	.FU		/IGNORE REWIND.
FU00	CAL	REW		/REWIND TAPE
	JMS	WFEVT	/WAIT FOR EV SETTING.  RET. TO JMP IF ERROR.
	JMP	AUXERR	/RET. HERE IF ERROR.
       JMP*   .FU		       /EXIT
/
/CAL PARAMETER BLOCK.
REW	4100
	EV
RLUN	0		/LOGICAL UNIT NO.
/
/
/SUBR. TO CHECK FOR I/O ERROR AFTER A WAITFOR ON EV.
/CALLING SEQUENCE:
/	JMS	WFEVT		/EVENT VAR. ASSUMED TO BE EV.
/	JMP	ERROR		/RETURNS HERE IF NEG. EV.
/	NEXT INSTR.		/RETURNS HERE IF POS EV SETTING.
/
WFEVT	0			/SUBR. ENTRY.
	CAL	WFEV		/WAITFOR EV SETTING.
	LAC	EV
	DZM	EV		/REINIT. EV.
	SMA			/IF NEG., DON'T BUMP EXIT.
	ISZ	WFEVT		/BUMP EXIT.
	JMP*	WFEVT		/EXIT
/
/
AUXERR	LMQ			/(GAR-020) SAVE THE E.V.
	LAC	WFLUN		/(GAR-020) GET THE LUN NUMBER.
	JMS*	.ER		/(GAR-020) GO REPORT OTS-20 ERROR.
		20		/.OTS 20.
/
       .EJECT
/WRITE END-OF-FILE
/  CALLING SEQUENCE -- JMS   .FV
/		   .DSA  ADDRESS OF LUN NUMBER
.FV    CAL    0
       CLA!IAC         /SET READ/WRITE FLAG TO WRITE
       DAC*   .FH
       LAC*   .FV		       /INITIALIZE DEVICE.
	JMS*	.FC
	DAC	WFLUN			/LOG. UNIT NO.
	ISZ	.FV		/BUMP EXIT.
	JMS*	.XFLRA		/IF RAND ACC. FILE BEING PROCESSED ON
	JMP	FV1		/DON'T TREAT AS MAGTAPE.
	CAL	WEOF		/WRITE END OF FILE.
	JMS	WFEVT	/WAITFOR EV SETTING.  RET. TO JMP IF ERROR.
	JMP	AUXERR	/RETURNS HERE IF ERROR.
FV1	LAC	WFLUN		/FOR .CHKDL.
	JMS*	.CHKDL		/WON'T HURT IF MAGTAPE.  IF R.A. FILE
				/BEING PROCESSED ONNTHIS LUN,.CHKDL WILL
				/CLOSE OUT FILE AND DELETE IT IF IT WAS
				/A DEFAULT FILE AND THE DELETE OPTION WAS
				/SPEC. BY CALL DEFINE.  IN THE CASE OF
				/A LUN NOT PROC. A R.A. FILE, .CHKDL IS A NOP.
       JMP*   .FV		       /EXIT.
/
/CAL PARAMETER BLOCK.
WEOF	4400		/WRITE END-OF-FILE.
	EV
WFLUN	0		/LOGICAL UNIT. NO.
/
	.ENDC
	.END