	.TITLE RIOPKG - DISK I/O ROUTINE FOR VERSAPLOT
;
;	NAME:	DISK I/O ROUTINES
;
;	LANGUAGE:  VAX-11 MACRO
;
;	OPERATING SYSTEM:  DEC VAX/VMS
;
;	ORDER NUMBER:  5448-SE
;
;	PART NUMBER:  000-025522-001  OCTOBER 1985
;
;	PRODUCT:  DEC VAX/VMS VERSAPLOT COLOR RANDOM 2.0
;
;	VERSATEC, INC., SANTA CLARA, CALIFORNIA 95051
;	A XEROX COMPANY
;
;	Copyright (C) 1985 by Xerox Corporation.  All rights reserved.
;
;	"NOTICE. THIS PROGRAM IS THE EXCLUSIVE PROPERTY OF VERSATEC,
;	INC. AND IS ISSUED IN STRICT CONFIDENCE UNDER A PREARRANGED
;	LICENSE AGREEMENT AND IS NOT TO BE DISCLOSED IN ANY MANNER TO
;	PERSONS OUTSIDE THE LICENSED ORGANIZATION AND SHALL NOT BE
;	REPRODUCED OR DISSEMINATED, IN WHOLE OR PART, TO ANYONE OUTSIDE
;	THE LICENSED ORGANIZATION WITHOUT THE PRIOR WRITTEN APPROVAL OF
;	VERSATEC, INC. UNLESS OTHERWISE PROVIDED FOR BY SUCH LICENSE
;	AGREEMENT.  THIS WORK IS PROTECTED AS AN UNPUBLISHED WORK UNDER
;	THE COPYRIGHT ACT OF 1976."
;
;
;
;	SUBROUTINES TO PERFORM DISK I/O OPERATIONS
;
;	THE ROUTINES (ROPEN, RREAD, RWRIT, RWAIT, RCLOS) ARE
;	USED TO CREATE AND MANIPULATE THE INTERMEDIATE FILE.
;	THE ROUTINES USE THE FACILITIES OF RMS-32 TO ALLOW THE
;	USE OF DOUBLE BUFFERING AND TO INCREASE THE THROUGH-PUT
;	OF THE PLOT PACKAGE.
;
;
;	ENTRY:	CALL ROPEN(IARG)
;			THIS ROUTINE IS CALLED TO OPEN A FILE
;			IARG.EQ.1 - OPEN A NEW FILE
;			IARG.NE.1 - OPEN AN EXISTING FILE
;	EXIT:	INTERMEDIATE FILE OPEN
;
;
;	ENTRY:	CALL RREAD (BUFFER,IREC)
;			BUFFER - ADDRESS OF BUFFER TO READ INTO
;			IREC   - DISK RECORD NUMBER
;	EXIT:	REQUEST QUEUED TO FILL BUFFER WITH DATA FROM FILE
;
;
;	ENTRY:	CALL RWRIT (BUFFER,IREC)
;			BUFFER - ADDRESS OF BUFFER TO WRITE FROM
;			IREC   - DISK RECORD NUMBER
;	EXIT:	REQUEST QUEUED TO WRITE BLOCK OF DATA TO DISK FILE
;
;
;	ENTRY:	CALL RWAIT
;	EXIT:	PREVIOUS I/O COMPLETE
;
;
;	ENTRY:	CALL RCLOS
;			THIS ROUTINE IS CALLED TO CLOSE THE OPEN FILE.
;	EXIT:	FILE CLOSED
;
;
;
;	CALLS:	$OPEN,$CREATE,$CONNECT,$READ,$WRITE,$WAIT,$CLOSE,
;
;	COMMON USED:  THIS ROUTINE READS THE IOCOM BLOCK FROM
;			VERSAPLOT TO DETERMINE WHAT THE RECORD
;			SIZE (LREC) IS.  NOTE THAT LREC MUST
;			BE A MULTIPLE OF 256 (10).
;
	$RMSDEF			; DEFINE RMS-32 DEFINITIONS
 
	.PSECT	$LOCAL,PIC,USR,CON,REL,LCL,NOSHR,NOEXE,RD,WRT
; FILE ACCESS BLOCK
VRF_FAB:
	$FAB	FNM=<RANDOM>, -			;DEFAULT FILE NAME
		DNM=<.RAN>, -			;DEFAULT FILE EXTENSION
		FAC=<BIO,GET,PUT>, -		;FILE ACCESS
		FOP=<MXV,TEF,SQO>, -		;FILE PROCESS OPTIONS
		RFM=FIX, -			;FIXED RECORD FORMAT
		ALQ=192, -			;INITIAL DISK BLOCK ALLOCATION
		DEQ=192, -
                RTV=255, -                      ;MAP ENTIRE FILE
		ORG=SEQ				;SEQUENTIAL ORGINIZATION
; RECORD ACCESS BLOCK
VRF_RAB:
	$RAB	FAB=VRF_FAB, -			;POINT TO CORRECT FAB
		RAC=RFA, -			;RANDOM ACCESS FOR FILE
		ROP=<BIO,ASY>			;RECORD PROCESSING OPTIONS
;
; ERROR MESSAGES
;
	.MACRO	STRING	TEXT,LAB
LAB'_ERR:.LONG		LAB'_END-LAB'_ST
	.ADDRESS	LAB'_ST
LAB'_ST:.ASCII	TEXT
LAB'_END:.ENDM	STRING
	STRING	</ROPEN - Error opening intermediate file/>,OPEN
	STRING	</RREAD - Error reading intermediate file/>,READ
	STRING	</RWRIT - Error writing to intermediate file/>,WRIT
	STRING	</RWAIT - Disk quota exceeded writing intermediate file,/-
						/ using overdraft/>,QUOT
	STRING	</RWAIT - Error rewriting intermediate file/>,RWRT
	STRING	</RWAIT - Wait error on intermediate file/>,WAIT
	STRING	</RCLOS - Error closing intermediate file/>,CLOS
NUM_SEC:	.LONG	0		;NUMBER OF BLOCKS/RECORD
NUM_SEC_M1:	.LONG	0		;NO. OF BLOCKS/RECORD - 1
;
	.PSECT	IOCOM,PIC,OVR,REL,GBL,SHR,NOEXE,RD,WRT,LONG
IUNIT:	.BLKL	1
LUNIT:	.BLKL	1
LREC:	.BLKL	1
;
	.PSECT	$CODE,PIC,SHR,NOWRT,LONG
;
; SUBROUTINE ROPEN (TYPE_OPEN)
;
	.ENTRY	ROPEN,^M<>
	ASHL	#1,LREC,R0			;GET RECORD SIZE
	MOVW	R0,VRF_FAB+FAB$W_MRS		;SET MAX. RECORD SIZE
	MOVW	R0,VRF_RAB+RAB$W_RSZ		;SET RECORD SIZE
	MOVW	R0,VRF_RAB+RAB$W_USZ		;SET USER RECORD SIZE
	MOVZBL	LREC+1,R0			;GET NO. OF BLKS/REC.
	MOVL	R0,NUM_SEC			;SAVE NO. OF BLKS/REC
	SUBL3	#1,R0,NUM_SEC_M1		;SAVE BLKS/REC - 1
	CMPL	#1,@4(AP)			;NEW FILE?
	BEQL	10$				;YES NEW FILE
	$OPEN	FAB=VRF_FAB			;OPEN EXISTING FILE
	BLBC	R0,20$				;CHECK FOR ERROR
	BRB	15$
10$:	$CREATE	FAB=VRF_FAB			;CREATE NEW FILE
	BLBC	R0,20$				;CHECK FOR ERROR
15$:	$CONNECT RAB=VRF_RAB			;CONNECT FILE
	BLBC	R0,25$				;CHECK FOR ERROR
	RET
 
20$:	PUSHL	VRF_FAB+FAB$L_STV		;PUSH FAB RMS ERROR CODE
	BRB	30$
25$:	PUSHL	VRF_RAB+RAB$L_STV		;PUSH RAB RMS ERROR CODE
30$:	PUSHR	#^M<R0>				;PUSH R0
	PUSHAL	OPEN_ERR			;ERROR MESSAGE ADDRESS
	BRW	ERROUT
;
; SUBROUTINE RREAD (IBUFR,IREC)
;
	.ENTRY RREAD,^M<>
	MOVAL	@4(AP),VRF_RAB+RAB$L_UBF	;BUFFER ADDRESS
	MULL3	@8(AP),NUM_SEC,R0		;RECORD NUMBER*(BLOCKS/REC.)
	SUBL3	NUM_SEC_M1,R0,VRF_RAB+RAB$L_BKT	;BLOCK NUMBER
	$READ	RAB=VRF_RAB
	BLBC	R0,25$				;CHECK FOR ERROR
	RET
 
25$:	PUSHL	VRF_RAB+RAB$L_STV		;PUSH RAB RMS ERROR CODE
	PUSHR	#^M<R0>				;PUSH R0
	PUSHAL	READ_ERR			;ERROR MESSAGE ADDRESS
	BRW	ERROUT
;
; SUBROUTINE RWRIT (IBUFW,IREC)
;
	.ENTRY	RWRIT,^M<>
	MOVAL	@4(AP),VRF_RAB+RAB$L_RBF	;BUFFER ADDRESS
	MULL3	@8(AP),NUM_SEC,R0		;RECORD NUMBER*(BLOCKS/REC.)
	SUBL3	NUM_SEC_M1,R0,VRF_RAB+RAB$L_BKT	;BLOCK NUMBER
	$WRITE	RAB=VRF_RAB			;WRITE RECORD
	BLBC	R0,25$				;CHECK FOR ERROR
	RET
 
25$:	PUSHL	VRF_RAB+RAB$L_STV		;PUSH RAB RMS ERROR CODE
	PUSHR	#^M<R0>				;PUSH R0
	PUSHAL	WRIT_ERR			;ERROR MESSAGE ADDRESS
	BRW	ERROUT
;
; SUBROUTINE RWAIT
;
	.ENTRY RWAIT,^M<>
; WAIT FOR READ OR WRITE TO FINISH
	$WAIT	RAB=VRF_RAB			;WAIT
	BLBC	R0,25$				;CHECK FOR ERROR
	RET
 
25$:	CMPL	R0,#RMS$_EXT			;IS ERROR EXTEND FAIL?
	BNEQ	50$				;BRANCH IF NOT
	CMPL	VRF_RAB+RAB$L_STV,#SS$_EXDISKQUOTA ;IS ERR QUOTA EXCEED?
	BNEQ	50$				;BRANCH IF NOT
	BBSS	#0,VRF_RAB+RAB$L_CTX,50$	;SET QUOTA EXCEED FLAG
	$WRITE	RAB=VRF_RAB			;REWRITE RECORD
	BLBS	R0,40$				;BRANCH IF NO ERROR
	PUSHL	VRF_RAB+RAB$L_STV		;PUSH RAB RMS ERROR CODE
	PUSHR	#^M<R0>				;PUSH R0
	PUSHAL	RWRT_ERR			;ERROR MESSAGE ADDRESS
	BRB	ERROUT
40$:	$WAIT	RAB=VRF_RAB			;WAIT FOR COMPLETION
	BLBC	R0,50$				;CHECK FOR ERROR
	PUSHAL	QUOT_ERR			;QUOTA MESSAGE ADDRESS
	CALLS	#1,G^LIB$PUT_OUTPUT		;PRINT MESSAGE
	RET					;RETURN SUCCESS
 
50$:	PUSHL	VRF_RAB+RAB$L_STV		;PUSH RAB RMS ERROR CODE
	PUSHR	#^M<R0>				;PUSH R0
	PUSHAL	WAIT_ERR			;ERROR MESSAGE ADDRESS
	BRB	ERROUT
;
; SUBROUTINE RCLOS
;
	.ENTRY RCLOS,^M<>
	$CLOSE	FAB=VRF_FAB			;CLOSE FILE
	BLBC	R0,10$				;BRANCH IF ERROR
	RET
 
10$:	PUSHL	VRF_FAB+FAB$L_STV		;PUSH FAB RMS ERROR CODE
	PUSHR	#^M<R0>				;PUSH R0
	PUSHAL	CLOS_ERR			;ERROR MESSAGE ADDRESS
;	BRB	ERROUT				;FALL THROUGH TO ERROUT
 
ERROUT:	CALLS	#1,G^LIB$PUT_OUTPUT		;WRITE TO SYS$OUTPUT
	CALLS	#2,G^LIB$STOP			;EXIT RETURN
 
	.END
