	.TITLE	FILEHDLR File manipulation routines

MAXRFTBL=1000
MAXSEG=50

;	Key definition buffer offsets

KEYPOS=0
KEYSIZ=KEYPOS+2
KEYCHG=KEYSIZ+1
KEYREF=KEYCHG+1
KBOFF=KEYREF+1

	.ENABLE	SUPPRESSION

	.LIBRARY  'SYS$LIBRARY:LIB.MLB'
	.LIBRARY  'VFELIB'

	$ATRDEF
	$DCDEF
	$DEVDEF
	$DVIDEF
	$FABDEF
	$FATDEF
	$FIBDEF
	$IODEF
	$MTDEF
	$NAMDEF
	$RABDEF
	$XABDEF

	.PSECT	CODE,EXE,NOWRT
	.PAGE
	.SBTTL	GETFILE - Get file name and access it
GETFILE::
	MOVL	FLFLGS,FLSAVE
	CLRL	FLFLGS
	TSTW	DESC
	BEQL	150$
	BSBW	FPARSE
	BLBC	R0,200$
	TSTL	SETMASK
	BEQL	70$
	CLRL	R1
	BSBW	SETCMD
70$:
	TSTW	FDESC
	BGTR	220$
	BRB	150$
100$:
	CLRL	FLFLGS
150$:
	INPUT	FNQ,FNQ+8,#132,FNAME
	MOVAL	FNAME,DESC+4
	MOVW	TSTATUS+2,DESC
	CLRB	INITFLG
	BSBW	FPARSE
	BLBC	R0,200$
	TSTW	FDESC
	BGTR	220$
200$:
	TSTB	OPNFLG
	BEQL	100$
	MOVL	FLSAVE,FLFLGS
	BRW	900$
220$:
	TSTW	CURNAM
	BEQL	250$
	CMPW	FDESC,#1
	BNEQ	250$
	CMPB	#^A/*/,@FDESC+4
	BNEQ	250$
	SUBW3	#2,CURNAM,FDESC
	MOVC3	FDESC,CURNAM+2,FNAME
	MOVAL	FNAME,FDESC+4
	BRB	270$
250$:
	MOVC3	FDESC,@FDESC+4,CURNAM+2
	ADDW3	#2,FDESC,CURNAM
270$:
	CLRB	INITFLG
	BSBW	RELFILE
	CLRB	LOGFLG
	CLRB	SEQFLG
	CLRB	TAPFLG
	CLRB	RMSFLG
	CLRB	NRFLAG
	MOVAL	FABBLK,R2
	MOVB	FDESC,FAB$B_FNS(R2)
	MOVL	FDESC+4,FAB$L_FNA(R2)
	CLRL	FAB$L_XAB(R2)
	TSTB	RECMOD
	BNEQ	300$
	BRW	500$
300$:
	MOVB	#1,RMSFLG
	$PARSE	FAB=FABBLK
	BLBS	R0,310$
	BRW	780$
310$:
	BITL	#DEV$M_RND,FAB$L_DEV(R2)
	BNEQ	315$
	BITL	#DEV$M_NET,FAB$L_DEV(R2)
	BNEQ	315$
	OUTMSGC	DSKONLY
	BRW	790$
315$:
	MOVB	#FAB$M_GET,FAB$B_FAC(R2)
	TSTB	WRTFLG
	BEQL	320$
	MOVB	#<FAB$M_GET+FAB$M_PUT+FAB$M_UPD+FAB$M_DEL>,FAB$B_FAC(R2)
320$:
	MOVB	#<FAB$M_GET+FAB$M_PUT+FAB$M_UPD+FAB$M_DEL>,FAB$B_SHR(R2)
	MOVAL	XABSBK,FAB$L_XAB(R2)
	$OPEN	FAB=FABBLK
	BLBS	R0,325$
	BRW	780$
325$:
	MOVB	#1,RMOFLG
	CLRB	INDFLG
	CLRL	R8
	CMPB	#FAB$C_SEQ,FAB$B_ORG(R2)
	BNEQ	330$
	INCB	SEQFLG
	BRW	380$
330$:
	CMPB	#FAB$C_IDX,FAB$B_ORG(R2)
	BEQL	332$
	BRW	380$
332$:
	INCB	INDFLG
	CLRL	R7
	MOVAL	XABKBK,FAB$L_XAB(R2)
	MOVAL	KEYDFB,R10
	MOVZBL	XABSBK+XAB$B_NOK,R9
	BGTR	335$
	BRW	380$
335$:
	MOVB	R7,XABKBK+XAB$B_REF
	$DISPLAY FAB=FABBLK
	BLBS	R0,340$
	BRW	780$
340$:
	MOVAL	XABKBK,R1
	MOVZBL	XAB$B_NSG(R1),R6
	BLEQ	365$
	MOVAL	XAB$R_POS_FIELDS(R1),R3
	MOVAL	XAB$R_SIZ_FIELDS(R1),R4
	CLRW	MINSIZ[R7]
350$:
	INCL	R8
	CMPL	R8,#MAXSEG
	BLEQ	355$
	OUTMSGC	SEGOVF
	BRW	790$
355$:
	MOVW	(R3)+,KEYPOS(R10)
	MOVB	(R4)+,KEYSIZ(R10)
	EXTZV	#XAB$V_CHG,#1,XAB$B_FLG(R1),R5
	MOVB	R5,KEYCHG(R10)
	MOVB	R7,KEYREF(R10)
	MOVZBL	KEYSIZ(R10),R5
	ADDW2	KEYPOS(R10),R5
	CMPW	R5,MINSIZ[R7]
	BLEQU	360$
	MOVW	R5,MINSIZ[R7]
360$:
	ADDL2	#KBOFF,R10
	SOBGTR	R6,350$
365$:
	SOBGTR	R9,370$
	BRB	380$
370$:
	INCL	R7
	BRW	335$
380$:
	MOVL	R8,SEGCNT
	BSBW	SETKEY
	MOVB	CURKRF,RABBLK+RAB$B_KRF
	CLRL	RABBLK+RAB$L_ROP
	$CONNECT  RAB=RABBLK
	BLBS	R0,400$
	BRW	780$
400$:
	CLRL	VFCSIZE
	CMPB	FAB$B_RFM(R2),#FAB$C_VFC
	BNEQ	420$
	MOVZBL	FAB$B_FSZ(R2),VFCSIZE
420$:
	MOVZWL	FAB$W_MRS(R2),RSIZE
	BGTR	430$
	MOVL	#255,RSIZE
430$:
	MOVZBL	NAMBLK+NAM$B_RSL,CURNAM
	MOVC3	CURNAM,@NAMBLK+NAM$L_RSA,CURNAM+2
	ADDW2	#2,CURNAM
	MOVB	#1,KEYFLG
	BSBW	FIRSTRMS
	BLBS	R0,450$
	BRW	100$
450$:
	TSTB	WRTFLG
	BNEQ	460$
	OUTMSG	#ROML,ROM
	BRB	470$
460$:
	OUTMSGC	WWE
470$:
	MOVAL	RECID,BUFTYP
	BRW	870$
500$:
	MOVL	#IO$_READVBLK,READFNC
	MOVL	#IO$_WRITEVBLK,WRITEFNC
	MOVL	#1,LOBLK
	MOVAL	BLKID,BUFTYP
	$PARSE	FAB=FABBLK
	BLBS	R0,505$
	CMPL	R0,#RMS$_DNF
	BEQL	505$
	BRW	780$
505$:
	MOVAL	NAMBLK,R6
;
;	This is an unorthodox method to determine if only a device name
;	is specified, but it seems to work.  If the bit definitions
;	of NAM$L_FNB are ever changed, these instructions may require
;	modification.
;
	CMPW	#NAM$M_EXP_DEV,NAM$L_FNB(R6)
	BEQL	510$
	CMPW	#<NAM$M_EXP_DEV+NAM$M_CNCL_DEV>,NAM$L_FNB(R6)
	BNEQ	520$
;
510$:
	INCB	LOGFLG
	MOVZBL	NAM$B_DEV(R6),CURNAM
	MOVC3	CURNAM,@NAM$L_DEV(R6),CURNAM+2
	ADDW2	#2,CURNAM
	BRB	540$
520$:
	BLBS	R0,540$
	BRW	780$
540$:
	BITL	#NAM$M_WILDCARD,NAM$L_FNB(R6)
	BEQL	550$
	MOVL	#RMS$_FNM,R0
	BRW	780$
550$:
	BITL	#NAM$M_NODE,NAM$L_FNB(R6)
	BEQL	570$
	OUTMSGC	NNWMSG
	BRW	100$
570$:
	MOVB	NAM$B_DEV(R6),DISKD
	MOVL	NAM$L_DEV(R6),DISKD+4
	$ASSIGN_S  CHAN=DD,DEVNAM=DISKD
	BLBS	R0,600$
	BRW	780$
600$:
	MOVB	#1,ASSFLG
	$GETDVI_S  EFN=#0,CHAN=DD,ITMLST=DEVLST,IOSB=FSTATUS
	BLBS	R0,610$
	BRW	780$
610$:
	$WAITFR_S  EFN=#0
	BSBW	IOSTAT
	BLBS	R0,620$
	BRW	780$
620$:
	CMPL	#DC$_DISK,DEVCLS
	BNEQ	625$
	BRW	680$
625$:
	CMPL	#DC$_TAPE,DEVCLS
	BEQL	630$
	OUTMSGC	ICDMSG
	BRW	790$
630$:
	TSTB	LOGFLG
	BNEQ	640$
	OUTMSGC	TAP1MSG
	BRW	790$
640$:
	BITL	#DEV$M_MNT,DEVCHR
	BEQL	645$
	BITL	#DEV$M_FOR,DEVCHR
	BNEQ	650$
645$:
	OUTMSGC	TAP2MSG
	BRW	790$
650$:
	TSTW	OVRWRT
	BEQL	655$
	OUTMSGC	TAP3MSG
	BRW	790$
655$:
	MOVB	#1,TAPFLG
	MOVL	#IO$_READLBLK,READFNC
	CLRL	LOBLK
	MOVL	#9999999,HIBLK
	MOVL	#9999999,EFBLK
	MOVC5	#0,FILBLK,#^XFF,#1024,FILBLK
	TSTB	POSFLG
	BNEQ	665$
	TSTB	NOREW
	BNEQ	660$
	BSBW	REWIND
	BLBS	R0,670$
	BRW	790$
660$:
	OUTMSGC	TAP4MSG
	CLRL	CURFIL
	MNEGL	#1,CURBLK
	MOVL	#1,PARA1
	BRB	668$
665$:
	MOVL	#1,CURFIL
	BSBW	SETPOS
	CLRL	PARA1
668$:
	OUTMSG	#ROML,ROM
	CLRB	CUREOF
	MOVB	#1,PRTEOF
	BSBW	READTAPE
	BLBS	R0,670$
	BRW	900$
670$:
	BRW	870$
680$:
	CMPL	BLKSIZ,#512
	BEQL	681$
	OUTMSGC	NSBMSG
	BRW	790$
681$:
	TSTB	LOGFLG
	BNEQ	682$
	BRW	700$
682$:
	MOVL	#IO$_READLBLK,READFNC
	CLRL	LOBLK
	SUBL3	#1,MAXBLK,HIBLK
	MOVL	HIBLK,EFBLK
	MOVL	#511,FFBYTE
	TSTB	WRTFLG
	BNEQ	685$
	BRW	840$
685$:
	BITL	#DEV$M_FOR,DEVCHR
	BEQL	690$
	MOVL	#IO$_WRITELBLK,WRITEFNC
	OUTMSGC	WWED
	BRW	850$
690$:
	OUTMSGC	NWLMSG
	BRW	790$
700$:
	$SEARCH	FAB=FABBLK
	BLBS	R0,720$
	BRW	780$
720$:
	MOVL	NAM$W_FID(R6),FIB+FIB$W_FID
	MOVW	NAM$W_FID+4(R6),FIB+FIB$W_FID+4
	CLRL	FIB+FIB$L_ACCTL
	TSTB	WRTFLG
	BEQL	750$
	MOVL	#FIB$M_WRITE,FIB+FIB$L_ACCTL
750$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_ACCESS!IO$M_ACCESS, -
		IOSB=FSTATUS,P1=FIBD,P5=#ATRLST
	BSBW	IOSTAT
	BLBS	R0,800$
	CMPW	R0,#SS$_ACCONFLICT
	BNEQ	780$
	TSTB	OVRFLG
	BEQL	780$
	MOVL	#FIB$M_NOLOCK,FIB+FIB$L_ACCTL
	$QIOW_S	CHAN=DD,FUNC=#IO$_ACCESS!IO$M_ACCESS, -
		IOSB=FSTATUS,P1=FIBD,P5=#ATRLST
	BSBW	IOSTAT
	BLBC	R0,780$
	MOVL	#SS$_ACCONFLICT,R0
	BSBW	ERROUT
	BRB	800$
780$:
	BSBW	ERROUT
790$:
	BRW	100$
800$:
	MOVB	#1,ACCFLG
	MOVW	RECATTR+FAT$W_HIBLKL,HIBLK
	MOVW	RECATTR+FAT$W_HIBLKH,HIBLK+2
	TSTL	HIBLK
	BNEQ	810$
	OUTMSGC	NEF
	BRW	100$
810$:
	MOVZBL	NAM$B_RSL(R6),CURNAM
	MOVC3	CURNAM,@NAM$L_RSA(R6),CURNAM+2
	ADDW2	#2,CURNAM
	MOVW	RECATTR+FAT$W_EFBLKL,EFBLK
	MOVW	RECATTR+FAT$W_EFBLKH,EFBLK+2
	CVTWL	RECATTR+FAT$W_FFBYTE,FFBYTE
	CVTWL	RECATTR+FAT$W_RSIZE,RSIZE
	CMPZV	#FAT$V_FILEORG,#4,RECATTR+FAT$B_RTYPE,#FAT$C_SEQUENTIAL
	BNEQ	815$
	INCB	SEQFLG
	TSTL	RSIZE
	BNEQ	812$
	MOVL	#140,RSIZE
812$:
	TSTL	FFBYTE
	BNEQ	815$
	CMPL	EFBLK,#1
	BGTR	815$
	MOVL	HIBLK,EFBLK
	MOVL	#511,FFBYTE
815$:
	CLRB	VFLAG
	CLRL	VFCSIZE
	CMPZV	#FAT$V_RTYPE,#4,RECATTR+FAT$B_RTYPE,#FAT$C_VARIABLE
	BEQL	820$
	CMPZV	#FAT$V_RTYPE,#4,RECATTR+FAT$B_RTYPE,#FAT$C_VFC
	BNEQ	830$
	MOVZBL	RECATTR+FAT$B_VFCSIZE,VFCSIZE
820$:
	INCB	VFLAG
830$:
	EXTZV	#FAT$V_NOSPAN,#1,RECATTR+FAT$B_RATTRIB,NOSPNFLG
	TSTB	WRTFLG
	BEQL	840$
	OUTMSGC	WWE
	BRB	850$
840$:
	OUTMSG	#ROML,ROM
850$:
	CLRL	CURBLK
	MOVL	LOBLK,PARA1
	BSBW	READDISK
	BLBS	R0,870$
	CMPL	R0,#SS$_NOPRIV
	BNEQ	900$
	BRW	100$
870$:
	BSBW	BLOCK
900$:
	MOVB	#1,OPNFLG
	RSB

	.SBTTL	RELFILE - Deaccess file
RELFILE::
	TSTB	ACCFLG
	BEQL	150$
	$QIOW_S	CHAN=DD,FUNC=#IO$_DEACCESS,P1=FIBD
	BLBS	R0,150$
	BRW	ERREXT
150$:
	CLRB	ACCFLG
	TSTB	ASSFLG
	BEQL	170$
	$DASSGN_S  CHAN=DD
	BLBS	R0,170$
	BRW	ERREXT
170$:
	CLRB	ASSFLG
	TSTB	RMOFLG
	BEQL	200$
	$CLOSE	FAB=FABBLK
	BLBS	R0,200$
	BRW	ERREXT
200$:
	CLRB	RMOFLG
	CLRB	OPNFLG
	RSB
	.PAGE
	.SBTTL	READ - Read data
READ::
	TSTB	TAPFLG
	BNEQ	300$
	TSTB	RMSFLG
	BNEQ	200$
	CMPL	PARA1,HIBLK
	BLEQ	150$
	TSTB	LOGFLG
	BNEQ	130$
	BSBW	READDISK
	BLBS	R0,400$
130$:
	MOVL	HIBLK,PARA1
150$:
	BSBW	READDISK
	BRB	400$
200$:
	MOVB	#1,PRTEOF
	BSBW	READRMS
	BRB	400$
300$:
	TSTL	CURBLK
	BGEQ	320$
	TSTL	PARA1
	BLSS	320$
	OUTMSGC	NOABS
	CLRL	R0
	BRB	400$
320$:
	SUBL2	CURBLK,PARA1
	MOVB	#1,PRTEOF
	BSBW	READTAPE
400$:
	RSB

	.SBTTL	READINT - Internal read
;
; R1=Block number, R2=Byte count
;
READINT::
	ADDL3	#BUFF,CURBCT,READLOC
	TSTB	TAPFLG
	BNEQ	100$
	$QIOW_S	CHAN=DD,FUNC=READFNC,IOSB=FSTATUS,-
		P1=@READLOC,P2=R2,P3=R1
	BRB	200$
100$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_READLBLK,IOSB=FSTATUS,-
		P1=@READLOC,P2=#MAXBCT
200$:
	BSBW	IOSTAT
	MOVZWL	FSTATUS+2,NXTBCT
	RSB
	.PAGE
	.SBTTL	TOP - Go to top of file
TOP::
	TSTB	TAPFLG
	BNEQ	200$
	TSTB	RMSFLG
	BNEQ	100$
	MOVL	LOBLK,PARA1
	BSBW	READDISK
	BRB	300$
100$:
	MOVB	CURKRF,RABBLK+RAB$B_KRF
	$REWIND	RAB=RABBLK
	BLBS	R0,120$
	BSBW	ERROUT
	CLRL	CURBCT
	CLRB	POSGOOD
	BRB	300$
120$:
	BSBW	FIRSTRMS
	BRB	300$
200$:
	TSTB	CUREOF
	BNEQ	300$
	MNEGL	#9999999,PARA1
	CLRB	PRTEOF
	BSBW	READTAPE
300$:
	RSB

	.SBTTL	NEXT - Go to next block
NEXT::
	TSTB	TAPFLG
	BNEQ	200$
	TSTB	RMSFLG
	BNEQ	150$
	MOVL	BUFFCT,R1
	TSTL	PARA1
	BLEQ	100$
	DIVL3	#512,CURBCT,R1
100$:
	MULL2	R1,PARA1
	ADDL2	CURBLK,PARA1
	BSBW	READDISK
	BRB	300$
150$:
	ADDL2	CURBLK,PARA1
	MOVB	#1,PRTEOF
	BSBW	READRMS
	BRB	300$
200$:
	MOVB	#1,PRTEOF
	BSBW	READTAPE
300$:
	RSB
	.PAGE
	.SBTTL	EOF - Position at end-of-file block
EOF::
	TSTB	TAPFLG
	BNEQ	20$
	TSTB	RMSFLG
	BEQL	30$
20$:
	BRW	100$
30$:
	MOVL	#100,OUTDSC
	MOVAL	EFBLKM,DESC+4
	TSTB	HEXFLG
	BEQL	50$
	MOVAL	EFBLKMX,DESC+4
50$:
	$FAO_S	CTRSTR=@DESC+4,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=EFBLK,P2=FFBYTE
	OUTMSG	OUTDSC,OUT_BUFF
	MOVL	EFBLK,PARA1
	CMPL	PARA1,HIBLK
	BLEQ	80$
	MOVL	HIBLK,PARA1
80$:
	BSBW	READDISK
	BRB	200$
100$:
	BSBW	LAST
200$:
	RSB

	.SBTTL	LAST - Position at last block in file
LAST::
	TSTB	TAPFLG
	BNEQ	200$
	TSTB	RMSFLG
	BNEQ	100$
	MOVL	HIBLK,PARA1
	BSBW	READDISK
	BRB	300$
100$:
	MOVL	HIBLK,PARA1
	BGTR	120$
	MOVL	#9999999,PARA1
120$:
	CLRB	PRTEOF
	BSBW	READRMS
	BRB	300$
200$:
	MOVL	#9999999,PARA1
	CLRB	PRTEOF
	BSBW	READTAPE
	CMPL	R0,#SS$_ENDOFFILE
	BNEQ	300$
	MNEGL	#1,PARA1
	MOVB	#1,PRTEOF
	BSBW	READTAPE
300$:
	RSB

	.SBTTL	FIRSTRMS - Read first RMS after connect/rewind
FIRSTRMS:
	MOVAL	RABBLK,R6
	MOVB	#RAB$C_SEQ,RAB$B_RAC(R6)
	MOVL	#RAB$M_NLK,RAB$L_ROP(R6)
	BSBW	RMSGET
	BLBS	R0,100$
	BSBW	ERROUT
	CLRL	R0
	BRB	120$
100$:
	MOVC3	#6,RAB$R_RFA_FIELDS(R6),RFATBL
	MOVL	#1,R0
	TSTB	KEYFLG
	BEQL	140$
120$:
	CLRB	KEYFLG
	CLRL	RFPMAX
	MOVL	#10,GRAN
	CLRL	HIBLK
140$:
	MOVL	#1,CURBLK
	CLRL	LPTR
	MNEGL	#1,RECPTR
	RSB

	.SBTTL	NEXTRMS - Read next RMS, called by LOCATE
NEXTRMS::
	ADDL3	#1,CURBLK,PARA1
	CLRB	PRTEOF
	BSBW	READRMS
	RSB

	.SBTTL	RRDRMS - Reread RMS (SET HEADER)
RRDRMS::
	TSTB	RMSFLG
	BEQL	200$
	TSTL	VFCSIZE
	BEQL	200$
	TSTB	POSGOOD
	BEQL	200$
	TSTB	NRFLAG
	BNEQ	200$
	MOVL	CURBLK,PARA1
	BSBW	READRMS
200$:
	RSB
	.PAGE
	.SBTTL	CREATE - Create a new record (RMS only)
CREATE::
	TSTB	RMSFLG
	BNEQ	100$
	OUTMSGC	RAF
	BRW	900$
100$:
	TSTB	WRTFLG
	BNEQ	200$
	OUTMSG	#ROML,ROM
	BRW	900$
200$:
	BSBW	LENCHK
	BLBS	R0,300$
	BRW	900$
300$:
	TSTB	SEQFLG
	BEQL	320$
	TSTL	HIBLK
	BLEQ	310$
	CMPL	CURBLK,HIBLK
	BGEQ	320$
310$:
	OUTMSGC	MBEOF
	BRW	900$
320$:
	TSTL	CRTYPE
	BGTR	400$
	MOVL	PARA1,R6
	SUBL3	CURBCT,PARA1,R1
	BLEQ	350$
	MOVL	CURBCT,R6
	ADDL3	#BUFF,CURBCT,R2
	MOVC5	#0,BUFF,#0,R1,(R2)
350$:
	TSTB	HDRFLG
	BNEQ	380$
	TSTL	VFCSIZE
	BLEQ	380$
	MOVC3	R6,BUFF,BUFFX
	MOVC3	VFCSIZE,HBUFF,BUFF
	ADDL3	#BUFF,VFCSIZE,R7
	MOVC3	R6,BUFFX,(R7)
380$:
	BRB	800$
400$:
	CMPL	CRTYPE,#1
	BGTR	500$
	TSTL	PBBCT
	BGTR	420$
	OUTMSGC	PBEMPTY
	BRW	900$
420$:
	MOVC5	PBBCT,PBUFF,#0,PARA2,BUFF
	BRB	800$
500$:
	MOVC5	#0,BUFF,#0,PARA2,BUFF
800$:
	TSTB	HDRFLG
	BNEQ	820$
	MOVB	#1,HDRFLG
	OUTMSGC	HFS
820$:
	TSTB	NRFLAG
	BNEQ	850$
	TSTB	RECLCK
	BEQL	840$
	$RELEASE RAB=RABBLK
840$:
	MOVB	#1,NRFLAG
850$:
	MOVB	#1,RECLCK
	ADDL3	PARA2,VFCSIZE,CURBCT
	CLRL	LPTR
	MNEGL	#1,RECPTR
900$:
	RSB
	.PAGE
	.SBTTL	SETLEN - Change record size
SETLEN::
	TSTB	RMSFLG
	BNEQ	100$
	OUTMSGC	RAF
	BRW	900$
100$:
	TSTB	WRTFLG
	BNEQ	200$
	OUTMSG	#ROML,ROM
	BRW	900$
200$:
	TSTB	INDFLG
	BNEQ	250$
	OUTMSGC	IFONLY
	BRB	900$
250$:
	TSTB	RECLCK
	BNEQ	300$
	OUTMSGC	MUSTLCK
	BRB	900$
300$:
	BSBW	LENCHK
	BLBS	R0,400$
	BRB	900$
400$:
	SUBL3	CURBCT,PARA1,R1
	BLEQ	500$
	ADDL3	#BUFF,CURBCT,R2
	MOVC5	#0,BUFF,#0,R1,(R2)
500$:
	MOVL	PARA1,CURBCT
900$:
	RSB
	.PAGE
;
;	This routine called from CREATE, SETLEN to validate rec length
;
LENCHK:
	MOVL	PARA1,PARA2
	TSTB	HDRFLG
	BEQL	100$
	SUBL2	VFCSIZE,PARA2
100$:
	TSTL	PARA2
	BLSS	200$
	CMPL	PARA2,#MAXBCT
	BLEQ	250$
200$:
	BSBW	INVPARA
	BRW	900$
250$:
	MOVZWL	FABBLK+FAB$W_MRS,R6
	BGTR	300$
	MOVL	#65535,R6
300$:
	CMPL	PARA2,R6
	BLEQ	350$
	MOVW	#80,OUTDSC
	$FAO_S	CTRSTR=RTL,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=R6
	OUTMSG	OUTDSC,OUT_BUFF
	BRW	900$
350$:
	TSTB	INDFLG
	BNEQ	370$
	BRW	800$
370$:
	MOVZBL	CURKRF,R5
	CMPW	MINSIZ,MINSIZ[R5]
	BLSSU	400$
	CMPW	PARA2,MINSIZ
	BLSSU	390$
	BRW	800$
390$:
	MOVW	#80,OUTDSC
	$FAO_S	CTRSTR=RTS,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=MINSIZ
	OUTMSG	OUTDSC,OUT_BUFF
	BRW	900$
400$:
	CMPW	PARA2,MINSIZ[R5]
	BGEQU	800$
	MOVZWL	MINSIZ[R5],R4
	MOVW	#80,OUTDSC
	$FAO_S	CTRSTR=RTSKR,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=R4
	OUTMSG	OUTDSC,OUT_BUFF
	BRW	900$
800$:
	MOVL	#1,R0
	BRB	950$
900$:
	CLRL	R0
950$:
	RSB
	.PAGE
	.SBTTL	READDISK - Read disk blk, PARA1=address
READDISK:
	MOVL	BUFFCT,R1
	CMPL	PARA1,LOBLK
	BGEQ	100$
	MOVL	LOBLK,PARA1
	BRB	200$
100$:
	TSTB	LOGFLG
	BEQL	200$
	SUBL3	PARA1,HIBLK,R1
	BGEQ	150$
	MOVL	#SS$_ENDOFFILE,R0
	CLRL	R1
	BRB	250$
150$:
	INCL	R1
	CMPL	R1,BUFFCT
	BLEQ	200$
	MOVL	BUFFCT,R1
200$:
	MULL2	#512,R1
	$QIOW_S	CHAN=DD,FUNC=READFNC,IOSB=FSTATUS,-
		P1=BUFF,P2=R1,P3=PARA1
	DIVL3	#512,FSTATUS+2,R1
	BSBW	IOSTAT
	BLBS	R0,300$
	TSTL	R1
	BEQL	250$
	CMPL	R0,#SS$_ENDOFFILE
	BEQL	300$
250$:
	MOVL	R0,SVSTAT
	BSBW	ERROUT
	TSTL	R1
	BGTR	300$
	MOVL	SVSTAT,R0
	CMPL	PARA1,HIBLK
	BLEQ	280$
	BRW	400$
280$:
	MOVL	#512,CURBCT
	BRB	350$
300$:
	MOVL	#1,R0
	TSTL	R1
	BGTR	310$
	MOVL	#1,R1
310$:
	MULL3	#512,R1,CURBCT
	DECL	R1
	ADDL2	PARA1,R1
	CMPL	R1,HIBLK
	BLEQ	350$
	MOVL	R1,HIBLK
	MOVL	R1,EFBLK
	MOVL	#511,FFBYTE
350$:
	MOVL	PARA1,CURBLK
	CLRL	LPTR
	MNEGL	#1,RECPTR
400$:
	RSB

	.SBTTL	WRITEDISK - Write work buffer to disk
WRITEDISK::
	TSTB	WRTFLG
	BNEQ	100$
	OUTMSG	#ROMWL,ROM
	BRW	900$
100$:
	TSTB	RMSFLG
	BNEQ	300$
	$QIOW_S	CHAN=DD,FUNC=WRITEFNC,IOSB=FSTATUS,-
		P1=BUFF,P2=CURBCT,P3=CURBLK
	BSBW	IOSTAT
	BLBS	R0,200$
	BSBW	ERROUT
	BRB	900$
200$:
	OUTMSGC	RDY
	BRB	900$
300$:
	TSTB	NRFLAG
	BNEQ	350$
	OUTMSGC	MSTUPD
	BRB	900$
350$:
	OUTMSGC	MSTPUT
900$:
	RSB
	.PAGE
	.SBTTL	UPDRMS - Update an RMS record
UPDRMS::
	TSTB	RMSFLG
	BNEQ	100$
	OUTMSGC RAF
	BRW	900$
100$:
	TSTB	WRTFLG
	BNEQ	200$
	OUTMSG	#ROML,ROM
	BRW	900$
200$:
	TSTB	NRFLAG
	BEQL	300$
	OUTMSGC	MSTPUT
	BRW	900$
300$:
	TSTB	POSGOOD
	BNEQ	400$
	OUTMSGC	CNEX
	BRW	900$
400$:
	TSTB	RECCHG
	BNEQ	500$
	OUTMSGC	RNC
	BRW	900$
500$:
	MOVAL	RABBLK,R6
	TSTB	HDRFLG
	BEQL	550$
	MOVAL	BUFF,RAB$L_RHB(R6)
	ADDL3	#BUFF,VFCSIZE,RAB$L_RBF(R6)
	SUBW3	VFCSIZE,CURBCT,RAB$W_RSZ(R6)
	BRB	600$
550$:
	CLRL	RAB$L_RHB(R6)
	MOVAL	BUFF,RAB$L_RBF(R6)
	MOVW	CURBCT,RAB$W_RSZ(R6)
600$:
	CLRW	RMSLC
	CLRL	RAB$L_ROP(R6)
	$UPDATE	RAB=RABBLK
	BLBS	R0,800$
	BSBW	ERROUT
	CLRB	POSGOOD
	BRB	900$
800$:
	OUTMSGC	RDY
	TSTB	KEYDIF
	BEQL	900$
	MOVL	RAB$L_RFA0(R6),PARA1
	MOVZWL	RAB$W_RFA4(R6),PARA2
	BSBW	RFAREAD
900$:
	RSB
	.PAGE
	.SBTTL	PUTRMS - Write a new RMS record
PUTRMS::
	TSTB	RMSFLG
	BNEQ	100$
	OUTMSGC RAF
	BRW	900$
100$:
	TSTB	WRTFLG
	BNEQ	200$
	OUTMSG	#ROML,ROM
	BRW	900$
200$:
	TSTB	NRFLAG
	BNEQ	300$
	OUTMSGC	MSTUPD
	BRW	900$
300$:
	MOVAL	RABBLK,R6
	MOVAL	BUFF,RAB$L_RHB(R6)
	ADDL3	#BUFF,VFCSIZE,RAB$L_RBF(R6)
	SUBW3	VFCSIZE,CURBCT,RAB$W_RSZ(R6)
	CLRL	RAB$L_ROP(R6)
	TSTB	INDFLG
	BEQL	400$
	MOVB	#RAB$C_KEY,RAB$B_RAC(R6)
	BRB	420$
400$:
	MOVB	#RAB$C_SEQ,RAB$B_RAC(R6)
420$:
	$PUT	RAB=RABBLK
	BLBS	R0,500$
	BSBW	ERROUT
	BRB	900$
500$:
	OUTMSGC	RDY
	CLRB	NRFLAG
	TSTB	SEQFLG
	BNEQ	600$
	MOVL	RAB$L_RFA0(R6),PARA1
	MOVZWL	RAB$W_RFA4(R6),PARA2
	BSBW	RFAREAD
	BRB	900$
600$:
	CLRB	POSGOOD
	ADDL3	#1,CURBLK,PARA1
	BSBW	READRMS
900$:
	RSB
	.PAGE
	.SBTTL	DELETE - Delete an RMS record
DELETE::
	TSTB	RMSFLG
	BNEQ	100$
	OUTMSGC	RAF
	BRW	900$
100$:
	TSTB	WRTFLG
	BNEQ	200$
	OUTMSG	#ROML,ROM
	BRW	900$
200$:
	TSTB	NRFLAG
	BEQL	250$
	MOVL	CURBLK,PARA1
	BRW	800$
250$:
	TSTB	RECLCK
	BNEQ	300$
	OUTMSGC	LBD
	BRB	900$
300$:
	CLRW	RMSLC
	CLRL	RABBLK+RAB$L_ROP
	$DELETE	RAB=RABBLK
	BLBS	R0,500$
	BSBW	ERROUT
	CLRB	POSGOOD
	BRB	900$
500$:
	OUTMSGC	RDY
	SUBL3	#1,CURBLK,PARA1
	BGTR	550$
	MOVB	#1,KEYFLG
	BSBW	TOP
	BRB	900$
550$:
	SUBL3	#1,PARA1,R1
	DIVL3	GRAN,R1,RFPMAX
	CLRL	HIBLK
800$:
	BSBW	READRMS
900$:
	RSB
	.PAGE
	.SBTTL	READRMS - Read via rms, PARA1=rec number
READRMS:
	PUSHR	#^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
	MOVAL	RABBLK,R6
	MOVL	#RAB$M_NLK,RAB$L_ROP(R6)
	TSTL	PARA1
	BGTR	50$
	MOVL	#1,PARA1
50$:
	SUBL3	#1,PARA1,R7
	DIVL2	GRAN,R7
	CMPL	R7,RFPMAX
	BLEQ	60$
	MOVL	RFPMAX,R7
60$:
	MULL3	GRAN,R7,R8
	TSTB	POSGOOD
	BEQL	200$
	CMPL	PARA1,CURBLK
	BLSS	200$
	BEQL	140$
	TSTB	CURKRF
	BNEQ	100$
	CMPL	CURBLK,R8
	BLSS	200$
	BRW	400$
100$:
	CMPB	LSTRAC,#RAB$C_RFA
	BEQL	120$
	SUBL3	GRAN,R8,R1
	CMPL	CURBLK,R1
	BLEQ	120$
	BRW	400$
120$:
	CMPL	CURBLK,R8
	BLEQ	200$
140$:
	MOVC3	#6,CURRFA,RFASAV
	MOVAL	RFASAV,R7
	BRB	220$
200$:
	ADDL3	#1,R8,CURBLK
	MULL2	#6,R7
	ADDL2	#RFATBL,R7
220$:
	MOVL	R7,RFAADR
	MOVC3	#6,(R7),RAB$R_RFA_FIELDS(R6)
	MOVB	#RAB$C_RFA,RAB$B_RAC(R6)
	BSBW	RMSGET
	BLBS	R0,230$
	BRW	450$
230$:
	CMPL	CURBLK,PARA1
	BLSS	235$
	BRW	800$
235$:
	TSTB	CURKRF
	BNEQ	240$
	BRW	400$
240$:
	MOVAL	SBUFF,R10
	BSBW	EXTKEY
	BLBS	R0,250$
	BRW	400$
250$:
	MOVB	#RAB$C_KEY,RAB$B_RAC(R6)
	MOVL	#RAB$M_NLK,RAB$L_ROP(R6)
	MOVAL	SBUFF,RAB$L_KBF(R6)
	MOVB	KEYLEN,RAB$B_KSZ(R6)
	BSBW	RMSGET
	BLBC	R0,270$
260$:
	CMPC3	#6,RAB$R_RFA_FIELDS(R6),@RFAADR
	BEQL	400$
	TSTB	STOP
	BNEQ	275$
	MOVB	#RAB$C_SEQ,RAB$B_RAC(R6)
	BSBW	RMSGET
	BLBC	R0,270$
	MOVAL	SBUFF+512,R10
	BSBW	EXTKEY
	CMPC3	KEYLEN,SBUFF,SBUFF+512
	BEQL	260$
	BRB	275$
270$:
	BSBW	ERROUT
275$:
	OUTMSGC	ERRPOS
	CLRL	CURBCT
	CLRB	POSGOOD
	CLRL	R0
	BRW	900$
400$:
	MOVB	#RAB$C_SEQ,RAB$B_RAC(R6)
	BSBW	RMSGET
	BLBS	R0,500$
	CMPL	R0,#RMS$_EOF
	BNEQ	450$
	TSTB	PRTEOF
	BEQL	420$
	BSBW	ERROUT
420$:
	BSBW	GETCUR
	BLBC	R0,450$
	MOVL	CURBLK,HIBLK
	MOVL	#RMS$_EOF,R0
	BRW	820$
450$:
	BSBW	ERROUT
	CLRL	R0
	BRW	900$
500$:
	MOVL	CURBLK,R0
	CLRL	R1
	INCL	CURBLK
	EDIV	GRAN,R0,R1,R0
	TSTL	R0
	BNEQ	700$
	CMPL	R1,RFPMAX
	BLEQ	700$
	CMPL	R1,#MAXRFTBL
	BLSS	600$
	BEQL	700$
	MOVAL	RFATBL,R2
	MOVAL	RFATBL,R3
	MOVL	#<MAXRFTBL/2>,R4
550$:
	MOVL	(R2)+,(R3)+
	MOVW	(R2)+,(R3)+
	ADDL2	#6,R2
	SOBGTR	R4,550$
	MULL2	#2,GRAN
	DIVL2	#2,R1
600$:
	MOVL	R1,RFPMAX
	MULL2	#6,R1
	ADDL2	#RFATBL,R1
	MOVL	RAB$L_RFA0(R6),(R1)
	MOVW	RAB$W_RFA4(R6),4(R1)
700$:
	CMPL	CURBLK,PARA1
	BGEQ	800$
	TSTB	STOP
	BNEQ	800$
	BRW	400$
800$:
	MOVL	#1,R0
	TSTL	HIBLK
	BEQL	820$
	CMPL	CURBLK,HIBLK
	BLEQ	820$
	MOVL	CURBLK,HIBLK
820$:
	CLRL	LPTR
	MNEGL	#1,RECPTR
900$:
	POPR	#^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
	RSB

EXTKEY:
	MOVAL	XABKBK,R1
	MOVZBL	XAB$B_NSG(R1),R7
	BNEQ	100$
	CLRL	R0
	BRB	500$
100$:
	MOVAL	XAB$R_POS_FIELDS(R1),R8
	MOVAL	XAB$R_SIZ_FIELDS(R1),R9
	CLRL	KEYLEN
200$:
	MOVZWL	(R8)+,R5
	MOVZBL	(R9)+,R11
	BEQL	400$
	TSTB	HDRFLG
	BEQL	300$
	ADDL2	VFCSIZE,R5
300$:
	ADDL2	R11,KEYLEN
	MOVC3	R11,BUFF(R5),(R10)
	ADDL2	R11,R10
400$:
	SOBGTR	R7,200$
	MOVL	#1,R0
500$:
	RSB
	.PAGE
	.SBTTL	KEYREAD - Read an indexed file via key
KEYREAD::
	TSTB	RMSFLG
	BEQL	100$
	TSTB	INDFLG
	BNEQ	200$
100$:
	OUTMSGC	IFONLY
	BRW	900$
200$:
	MOVL	QDESC+4,R7
	TSTB	QTYPE
	BNEQ	250$
	TSTB	EBCFLG
	BEQL	250$
	MOVW	QDESC,DESC
	MOVAL	SBUFF,DESC+4
	PUSHAL	DESC
	PUSHAL	QDESC
	CALLS	#2,G^LIB$TRA_ASC_EBC
	BLBS	R0,220$
	BSBW	ERROUT
	BRB	900$
220$:
	MOVAL	SBUFF,R7
250$:
	MOVAL	RABBLK,R6
	MOVB	#RAB$C_KEY,RAB$B_RAC(R6)
	MOVL	#<RAB$M_NLK+RAB$M_KGE>,RAB$L_ROP(R6)
	MOVB	QDESC,RAB$B_KSZ(R6)
	MOVL	R7,RAB$L_KBF(R6)
	BSBW	RMSGET
	BLBS	R0,500$
	BSBW	ERROUT
	BSBW	GETCUR
	BRB	900$
500$:
	MOVB	#1,KEYFLG
	MOVL	#1,CURBLK
	CLRL	RFPMAX
	MOVL	#10,GRAN
	MOVC3	#6,CURRFA,RFATBL
	CLRL	HIBLK
	CLRL	LPTR
	MNEGL	#1,RECPTR
900$:
	RSB
	.PAGE
	.SBTTL	RFAREAD - Read an RMS file via RFA
RFAREAD::
	TSTB	RMSFLG
	BNEQ	100$
	OUTMSGC	RAF
	BRB	900$
100$:
	MOVAL	RABBLK,R6
	MOVB	#RAB$C_RFA,RAB$B_RAC(R6)
	MOVL	#RAB$M_NLK,RAB$L_ROP(R6)
	MOVL	PARA1,RAB$L_RFA0(R6)
	MOVW	PARA2,RAB$W_RFA4(R6)
	BSBW	RMSGET
	BLBS	R0,500$
	BSBW	ERROUT
	BSBW	GETCUR
	BRB	900$
500$:
	MOVB	#1,KEYFLG
	MOVL	#1,CURBLK
	CLRL	RFPMAX
	MOVL	#10,GRAN
	MOVC3	#6,CURRFA,RFATBL
	CLRL	HIBLK
	CLRL	LPTR
	MNEGL	#1,RECPTR
900$:
	RSB
	.PAGE
	.SBTTL	LOCK - Read and lock an RMS record
LOCK::
	TSTB	RMSFLG
	BNEQ	100$
	OUTMSGC	RAF
	BRW	900$
100$:
	TSTB	WRTFLG
	BNEQ	200$
	OUTMSG	#ROML,ROM
	BRW	900$
200$:
	TSTB	NRFLAG
	BEQL	250$
	BRW	900$
250$:
	TSTB	POSGOOD
	BNEQ	300$
	OUTMSGC	CNEX
	BRW	900$
300$:
	TSTB	RECLCK
	BEQL	340$
	OUTMSGC	RAL
	BRW	900$
340$:
	MOVC3	CURBCT,BUFF,BUFFX
	MOVL	CURBCT,R7
	MOVAL	RABBLK,R6
	MOVL	#RAB$M_RLK,RAB$L_ROP(R6)
	MOVB	#RAB$C_RFA,RAB$B_RAC(R6)
	MOVL	CURRFA,RAB$L_RFA0(R6)
	MOVW	CURRFA+4,RAB$W_RFA4(R6)
	BSBW	RMSGET
	BLBS	R0,500$
	BSBW	ERROUT
	CLRB	RECLCK
	BSBW	GETCUR
	BRB	900$
500$:
	MOVB	#1,RECLCK
	CLRB	RECCHG
	CLRB	KEYDIF
	CMPL	R7,CURBCT
	BNEQ	600$
	CMPC3	CURBCT,BUFF,BUFFX
	BEQL	700$
600$:
	OUTMSGC	RHC
	BRB	900$
700$:
	OUTMSGC	RDY
900$:
	RSB
	.PAGE
	.SBTTL	GETCUR - Reread last good RMS record after error
GETCUR:
	MOVL	#RAB$M_NLK,RAB$L_ROP(R6)
	MOVB	#RAB$C_RFA,RAB$B_RAC(R6)
	MOVL	CURRFA,RAB$L_RFA0(R6)
	MOVW	CURRFA+4,RAB$W_RFA4(R6)
	BSBW	RMSGET
	RSB

	.SBTTL	RMSGET - Internal, do an RMS $GET
RMSGET:
	TSTL	VFCSIZE
	BLEQ	100$
	TSTB	HDRFLG
	BEQL	100$
	MOVAL	BUFF,RAB$L_RHB(R6)
	ADDL3	#BUFF,VFCSIZE,RAB$L_UBF(R6)
	BRB	120$
100$:
	MOVAL	HBUFF,RAB$L_RHB(R6)
	MOVAL	BUFF,RAB$L_UBF(R6)
120$:
	MOVB	CURKRF,RAB$B_KRF(R6)
	MOVB	RAB$B_RAC(R6),LSTRAC
	TSTB	OVRFLG
	BEQL	150$
	BITL	#RAB$M_RLK,RAB$L_ROP(R6)
	BNEQ	150$
	INSV	#1,#RAB$V_RRL,#1,RAB$L_ROP(R6)
150$:
	$GET	RAB=RABBLK
	BLBS	R0,200$
	CLRL	CURBCT
	CLRB	POSGOOD
	BRB	900$
200$:
	MOVZWL	RAB$W_RSZ(R6),CURBCT
	TSTB	HDRFLG
	BEQL	300$
	ADDL2	VFCSIZE,CURBCT
300$:
	MOVL	RAB$L_RFA0(R6),CURRFA
	MOVW	RAB$W_RFA4(R6),CURRFA+4
	MOVB	#1,POSGOOD
900$:
	CLRW	RMSLC
	CLRB	NRFLAG
	RSB
	.PAGE
	.SBTTL	REWIND - Rewind a tape
REWIND::
	TSTB	TAPFLG
	BNEQ	100$
	OUTMSGC	TAPONLY
	BRB	300$
100$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_REWIND,IOSB=FSTATUS
	BSBW	IOSTAT
	BLBS	R0,200$
	BSBW	ERROUT
	CLRL	R0
	BRB	300$
200$:
	MOVL	#1,CURFIL
	CLRL	CURBLK
	CLRB	CUREOF
	MOVL	#1,PARA1
	MOVB	#1,PRTEOF
	BSBW	READTAPE
	MOVL	#1,R0
300$:
	RSB

	.SBTTL	BACKSPACE - Move a tape back one block or EOF
BACKSPACE::
	TSTB	TAPFLG
	BEQL	100$
	BITL	#MT$M_LOST,FSTATUS+4
	BNEQ	100$
	$QIOW_S	CHAN=DD,FUNC=#IO$_SKIPRECORD,IOSB=FSTATUS,-
		P1=-1
	BSBW	IOSTAT
	BLBS	R0,100$
	CMPL	R0,#SS$_ENDOFFILE
	BEQL	100$
	BSBW	ERROUT
100$:
	RSB
	.PAGE
	.SBTTL	MOVE - Move over 1 or more EOF marks
MOVE::
	TSTB	TAPFLG
	BNEQ	50$
	OUTMSGC	TAPONLY
	BRW	900$
50$:
	MOVL	PARA1,R2
	BGTR	100$
	BEQL	70$
	BRW	200$
70$:
	BRW	900$
100$:
	TSTB	STOP
	BNEQ	140$
	$QIOW_S	CHAN=DD,FUNC=#IO$_SKIPFILE,IOSB=FSTATUS,-
		P1=1
	BSBW	IOSTAT
	BLBS	R0,120$
	CMPL	R0,#SS$_ENDOFFILE
	BEQL	120$
	BSBW	ERROUT
	CLRL	CURBCT
	BRB	140$
120$:
	INCL	CURFIL
	CLRL	CURBLK
	CLRL	CURBCT
	MOVB	#1,CUREOF
	SOBGTR	R2,100$
140$:
	BRW	900$
200$:
	TSTB	STOP
	BEQL	220$
	BRW	900$
220$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_SKIPFILE,IOSB=FSTATUS,-
		P1=-1
	BSBW	IOSTAT
	BLBS	R0,240$
	CMPL	R0,#SS$_ENDOFFILE
	BEQL	240$
	BSBW	ERROUT
	BRB	250$
240$:
	BITL	#MT$M_BOT,FSTATUS+4
	BEQL	270$
	OUTMSGC	BOTMSG
	CLRL	CURBLK
	MOVB	#1,CUREOF
250$:
	CLRL	CURBCT
	BRW	900$
270$:
	DECL	CURFIL
	MOVZBL	CURFIL,R1
	MOVL	FILBLK[R1],CURBLK
	CLRB	CUREOF
	CLRL	CURBCT
	AOBLSS	#0,R2,300$
	BRB	400$
300$:
	BRW	200$
400$:
	CLRL	PARA1
	CLRB	PRTEOF
	BSBW	READTAPE
900$:
	RSB
	.PAGE
	.SBTTL	READTAPE - Read tape blk, PARA1 = offset
READTAPE:
	CMPL	PARA1,#1
	BGTR	100$
	BEQL	50$
	BRW	200$
50$:
	BRW	510$
100$:
	SUBL3	#1,PARA1,SKIPTOT
110$:
	MOVL	SKIPTOT,SKIPCT
	SUBL2	SKPINC,SKIPTOT
	BLEQ	120$
	MOVL	SKPINC,SKIPCT
120$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_SKIPRECORD,IOSB=FSTATUS,-
		P1=@SKIPCT
	BSBW	IOSTAT
	MOVZWL	FSTATUS+2,R1
	BLBC	R0,140$
	ADDL2	R1,CURBLK
	TSTL	SKIPTOT
	BLEQ	130$
	TSTB	STOP
	BEQL	110$
130$:
	BRW	500$
140$:
	TSTB	BUGFLG
	BNEQ	145$
	DECL	R1
	BLEQ	145$
	ADDL2	R1,CURBLK
145$:
	CMPL	R0,#SS$_ENDOFFILE
	BNEQ	180$
	TSTB	BUGFLG
	BEQL	150$
	CMPL	SKIPCT,#1
	BGTR	160$
150$:
	MOVZBL	CURFIL,R1
	MOVL	CURBLK,FILBLK[R1]
160$:
	BRW	600$
180$:
	BRW	900$
200$:
	TSTB	CUREOF
	BNEQ	220$
	SUBL3	#1,PARA1,SKIPTOT
	BRW	300$
220$:
	TSTL	PARA1
	BNEQ	230$
	MOVL	#1,R0
	BRW	950$
230$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_SKIPRECORD,IOSB=FSTATUS,-
		P1=-1
	BSBW	IOSTAT
	BLBC	R0,250$
	BITL	#MT$M_BOT,FSTATUS+4
	BEQL	240$
	BRW	400$
240$:
	DECL	CURBLK
	BRB	270$
250$:
	CMPL	R0,#SS$_ENDOFFILE
	BEQL	260$
	BRW	450$
260$:
	DECL	CURFIL
	MOVZBL	CURFIL,R1
	MOVL	FILBLK[R1],CURBLK
270$:
	CLRB	CUREOF
	MOVL	PARA1,SKIPTOT
300$:
	MOVL	SKIPTOT,SKIPCT
	ADDL2	#50,SKIPTOT
	BGEQ	320$
	MNEGL	#50,SKIPCT
320$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_SKIPRECORD,IOSB=FSTATUS,-
		P1=@SKIPCT
	BSBW	IOSTAT
	BLBC	R0,350$
	BITL	#MT$M_BOT,FSTATUS+4
	BNEQ	400$
	MOVZWL	FSTATUS+2,R1
	SUBL2	R1,CURBLK
	TSTL	SKIPTOT
	BGEQ	330$
	TSTB	STOP
	BEQL	300$
330$:
	BRW	500$
350$:
	CMPL	R0,#SS$_ENDOFFILE
	BNEQ	450$
	BITL	#MT$M_BOT,FSTATUS+4
	BNEQ	400$
	DECL	CURFIL
	MOVZBL	CURFIL,R1
	MOVL	FILBLK[R1],CURBLK
	BRW	500$
400$:
	OUTMSGC	BOTMSG
	CLRL	CURBLK
	MOVB	#1,CUREOF
	CLRL	CURBCT
	MOVL	#SS$_ENDOFFILE,R0
	BRW	950$
450$:
	MOVZWL	FSTATUS+2,R1
	DECL	R1
	BGTR	460$
	BRW	900$
460$:
	SUBL2	R1,CURBLK
	CLRB	CUREOF
	BRW	900$
500$:
	CLRL	CURBCT
510$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_READLBLK,IOSB=FSTATUS,-
		P1=BUFF,P2=#MAXBCT
	BSBW	IOSTAT
	MOVZWL	FSTATUS+2,CURBCT
	BLBC	R0,520$
	INCL	CURBLK
	CLRB	CUREOF
	BRW	950$
520$:
	CMPL	R0,#SS$_ENDOFFILE
	BNEQ	800$
	MOVZBL	CURFIL,R1
	MOVL	CURBLK,FILBLK[R1]
600$:
	TSTB	PRTEOF
	BEQL	620$
	OUTMSGC	EOFMSG
620$:
	CLRL	CURBCT
	CLRL	CURBLK
	INCL	CURFIL
	MOVB	#1,CUREOF
	MOVL	#SS$_ENDOFFILE,R0
	BRB	950$
800$:
	TSTL	CURBCT
	BGTR	850$
	BITL	#MT$M_LOST,FSTATUS+4
	BNEQ	900$
850$:
	INCL	CURBLK
900$:
	MOVL	R0,SVSTAT
	BSBW	ERROUT
	MOVL	SVSTAT,R0
950$:
	CLRL	LPTR
	MNEGL	#1,RECPTR
	RSB
	.PAGE
	.SBTTL	SHOFILE - Display current file and block
SHOFILE::
	SUBW3	#2,CURNAM,DESC
	MOVAL	CURNAM+2,DESC+4
	MOVL	#150,OUTDSC
	TSTB	LOGFLG
	BEQL	20$
	BRW	100$
20$:
	MOVL	CURBLK,R5
	TSTB	RMSFLG
	BEQL	50$
	TSTB	NRFLAG
	BNEQ	40$
	TSTB	POSGOOD
	BNEQ	80$
40$:
	CLRL	R5
50$:
	$FAO_S	CTRSTR=WHRMSG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=#DESC,P2=BUFTYP,P3=R5
	BRB	200$
80$:
	$FAO_S	CTRSTR=WHRRFA,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=#DESC,P2=CURBLK,P3=CURRFA,P4=CURRFA+4
	BRB	200$
100$:
	$FAO_S	CTRSTR=WHDMSG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=#DESC,P2=CURBLK
200$:
	OUTMSG	OUTDSC,OUT_BUFF
	RSB

IOSTAT:
	BLBC	R0,100$
	MOVZWL	FSTATUS,R0
100$:
	RSB

	.SBTTL	SETPOS - Set file, block pos for tape
SETPOS::
	TSTB	TAPFLG
	BNEQ	100$
	OUTMSGC	TAPONLY
	BRB	200$
100$:
	MOVL	POSBLK,CURBLK
	MOVZBL	CURFIL,R1
	MOVL	#^XFFFFFFFF,FILBLK[R1]
	CMPL	POSFIL,CURFIL
	BEQL	200$
	MOVL	POSFIL,CURFIL
	MOVC5	#0,FILBLK,#^XFF,#1024,FILBLK
200$:
	RSB
	.PAGE
	.SBTTL	SETKEY - Setup key of reference
SETKEY::
	CMPL	NEWKRF,#254
	BLEQU	100$
	OUTMSGC	INVKRF
	MOVZBL	CURKRF,NEWKRF
	BRW	900$
100$:
	TSTB	RMSFLG
	BEQL	900$
	TSTB	INDFLG
	BEQL	400$
	CMPB	NEWKRF,XABSBK+XAB$B_NOK
	BLSSU	200$
	OUTMSGC	FWRKYS
	CLRL	NEWKRF
	BRB	400$
200$:
	TSTB	NEWKRF
	BEQL	400$
	MOVAL	XABKBK,FABBLK+FAB$L_XAB
	MOVB	NEWKRF,XABKBK+XAB$B_REF
	$DISPLAY FAB=FABBLK
	BLBC	R0,300$
	MOVB	NEWKRF,CURKRF
	BRB	900$
300$:
	BSBW	ERROUT
400$:
	CLRB	CURKRF
900$:
	RSB

	.SBTTL	KEYCHK - check for user key modifications
KEYCHK::
	TSTB	RMSFLG
	BEQL	100$
	TSTB	NRFLAG
	BNEQ	100$
	MOVL	SEGCNT,R8
	BGTR	120$
100$:
	BRW	800$
120$:
	MOVAL	KEYDFB,R9
	CLRL	R10
	MOVB	#^XFF,R11
200$:
	MOVZWL	KEYPOS(R9),R2
	TSTB	HDRFLG
	BEQL	220$
	ADDL2	VFCSIZE,R2
220$:
	MOVZBL	KEYSIZ(R9),R3
	ADDL2	R2,R3
	DECL	R3
	CMPL	R2,PARA1
	BGEQ	240$
	MOVL	R6,R4
	MOVL	PARA1,R2
	BRB	250$
240$:
	ADDL3	R6,R2,R4
	SUBL2	PARA1,R4
250$:
	ADDL3	PARA1,PARA2,R1
	DECL	R1
	CMPL	R3,R1
	BLEQ	260$
	MOVL	R1,R3
260$:
	SUBL2	R2,R3
	BGEQ	280$
	BRW	500$
280$:
	INCL	R3
	ADDL2	#BUFF,R2
	CMPC3	R3,(R2),(R4)
	BNEQ	300$
	BRW	500$
300$:
	TSTB	KEYCHG(R9)
	BNEQ	400$
	MOVL	#80,OUTDSC
	$FAO_S	CTRSTR=NOCHG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=KEYREF(R9)
	OUTMSG	OUTDSC,OUT_BUFF
	CLRL	R0
	BRB	900$
400$:
	CMPB	R11,KEYREF(R9)
	BEQL	500$
	MOVB	KEYREF(R9),R11
	MOVL	#80,OUTDSC
	$FAO_S	CTRSTR=WILCHG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=KEYREF(R9)
	OUTMSG	OUTDSC,OUT_BUFF
	CMPB	CURKRF,KEYREF(R9)
	BNEQ	500$
	INCL	R10
	OUTMSGC	CHGCUR
500$:
	SOBGTR	R8,520$
	BRB	700$
520$:
	ADDL2	#KBOFF,R9
	BRW	200$
700$:
	MOVB	R10,KEYDIF
800$:
	MOVL	#1,R0
900$:
	RSB
	.PAGE
	.SBTTL	Data definitions

	.PSECT	DATA,WRT,NOEXE,LONG

DISKD:	.WORD	0
	.WORD	^X010E
	.LONG	0
DD:	.BLKW	1

FSTATUS: .BLKL 2

FDESC::	.WORD	0
	.WORD	^X010E
	.LONG	0

FNAME::	.BLKB	NAM$C_MAXRSS
FNQ::	.ASCID	/File name? /

BLKID:	.ASCID	/block/
RECID:	.ASCID	/record/

DSKONLY: .ASCIC	/Record-accessed file must be on disk/

SEGOVF:	.ASCIC	/File has too many keys or key segments/

NNWMSG:	.ASCIC	/Network operation is unsupported for block mode access./

ICDMSG:	.ASCIC	/Incorrect device type - must be disk or tape./

TAP1MSG: .ASCIC	/File-structured operation is unsupported for tape./

TAP2MSG: .ASCIC	/Tape is not mounted or is not mounted FOREIGN./

TAP3MSG: .ASCIC	"Can not specify /OVER or /WRITE for tape operation."

TAP4MSG: .ASCIC	/*Tape position is unknown*/

NSBMSG:	.ASCIC	/Disk device has nonstandard block size - can not edit./

NWLMSG:	.ASCIC	"Can not specify /WRITE for XQP-device logical I/O."

WWE:	.ASCIC	/File accessed with write enabled/

WWED:	.ASCIC	/Device accessed with write enabled/

ROM:	.ASCII	/Read-only mode/
ROML=.-ROM
	.ASCII	/; WRITE not allowed/
ROMWL=.-ROM

NEF:	.ASCIC	/Can not edit an empty file/

RDY:	.ASCIC	/Ready/

MSTUPD:	.ASCIC	/You must use UPDATE to modify this record on disk./

MSTPUT:	.ASCIC	/You must use PUT to add this record to the file./

LBD:	.ASCIC	/Record must be locked before delete./

IFONLY:	.ASCIC	/File must be INDEXED in order to use this command./

RAF:	.ASCIC	/This function is valid only for record-accessed files./

CNEX:	.ASCIC	/Cannot execute command due to previous error(s)/

ERRPOS:	.ASCIC	/Error positioning multi-keyed file/

RAL:	.ASCIC	/Record is already locked/

RHC:	.ASCIC	/Record has changed; check data before modification/

RNC:	.ASCIC	/Record has not been changed./

RTS:	.ASCID	/Record must be at least !UW bytes long, to contain primary key/

RTSKR:	.ASCID	/Record must be at least !UW bytes long, to contain key of reference/

RTL:	.ASCID	/Record length exceeds maximum for this file (!UL)/

MBEOF:	.ASCIC	/Must be positioned at EOF to create new sequential record/

HFS:	.ASCIC	/HEADER mode activated; must be set for new record/

NOABS:	.ASCIC	/Absolute addresses unknown within this file./

TAPONLY: .ASCIC	/This command can only be used with a tape device./

BOTMSG:	.ASCIC	/**BOT**/

EOFMSG:	.ASCIC	/**EOF**/

EFBLKM:	.ASCID	/EOF block=!SL, EOF byte=!UL/
EFBLKMX: .ASCID	/EOF block=!SL, EOF byte=!4XL/

WHRMSG:	.ASCID	/Editing file !AS - !AS !SL/

WHRRFA:	.ASCID	/Editing file !AS - record !SL, RFA=!UL:!UW/
WHDMSG:	.ASCID	/Editing device !AS - Block !UL/

INVKRF:	.ASCIC	/Invalid key of reference, must be 0-254/

FWRKYS:	.ASCIC	/File has fewer keys than specified - primary key used/

NOCHG:	.ASCID	/Cannot change key !UB/

WILCHG:	.ASCID	/Warning: key !UB will be modified by this change/

CHGCUR:	.ASCIC	/(Changing key of reference will lose position upon update)/

	.ALIGN	LONG

FABBLK:	$FAB	NAM=NAMBLK
NAMBLK:	$NAM	RSA=RESSTR,RSS=NAM$C_MAXRSS,-
		ESA=EXPSTR,ESS=NAM$C_MAXRSS
RABBLK:	$RAB	FAB=FABBLK,USZ=MAXBCT
XABSBK:	$XABSUM
XABKBK:	$XABKEY
RESSTR:	.BLKB	NAM$C_MAXRSS
EXPSTR:	.BLKB	NAM$C_MAXRSS

CURNAM:: .WORD	0
	.BLKB	NAM$C_MAXRSS

BUFTYP:: .BLKL	1

CURBLK:: .LONG	1
LOBLK:	.LONG	1
HIBLK::	.LONG	0
EFBLK::	.LONG	0
FFBYTE:: .LONG	0
CURFIL:: .LONG	0
CURBCT:: .LONG	512
NXTBCT:: .LONG	0
BUFFCT:: .LONG	1
NBUFCT:: .LONG	0
CUREOF: .BYTE	0
PRTEOF:	.BYTE	1
SEQFLG:: .BYTE	0
INDFLG:	.BYTE	0
VFLAG::	.BYTE	0
RSIZE::	.LONG	0
SEGCNT:	.LONG	0
VFCSIZE:: .LONG	0
NOSPNFLG:: .LONG 0
SVSTAT: .LONG	0
CURRFA:	.BLKB	6
POSGOOD: .BLKB	1
LSTRAC:	.BLKB	1
GRAN:	.BLKL	1
RFPMAX:	.BLKL	1
RFASAV:	.BLKB	6
RFAADR:	.BLKL	1

ASSFLG:	.BYTE	0

ACCFLG:	.BYTE	0

RMOFLG:	.BYTE	0

OPNFLG:	.BYTE	0

TAPFLG:: .BYTE	0

LOGFLG:	.BYTE	0

READFNC:  .LONG	IO$_READVBLK
WRITEFNC: .LONG	IO$_WRITEVBLK

READLOC: .LONG	0
SKIPTOT: .LONG	0
SKIPCT:	.LONG	0

RECMOD:: .BYTE	0

FLFLGS:
OVRWRT::
OVRFLG:: .BYTE	0
WRTFLG:: .BYTE	0
NOREW::	.BYTE	0
POSFLG:: .BYTE	0
FLSAVE:	.LONG	0

RMSFLG:: .BYTE	0
NRFLAG:: .BYTE	0
KEYFLG:: .BYTE	0
CURKRF:: .BYTE	0
NEWKRF:: .LONG	0
KEYLEN:	.LONG	0
KEYDIF:	.BYTE	0

RMSLC:
RECLCK:: .BYTE	0
RECCHG:: .BYTE	0

POSFIL:: .LONG	0
POSBLK:: .LONG	0

BUGFLG:: .BYTE	0
SKPINC:: .LONG	50

DEVLST:	.WORD	4
	.WORD	DVI$_DEVCHAR
	.ADDRESS DEVCHR
	.LONG	0
	.WORD	4
	.WORD	DVI$_DEVCLASS
	.ADDRESS DEVCLS
	.LONG	0
	.WORD	4
	.WORD	DVI$_DEVBUFSIZ
	.ADDRESS BLKSIZ
	.LONG	0
	.WORD	4
	.WORD	DVI$_MAXBLOCK
	.ADDRESS MAXBLK
	.LONG	0
	.LONG	0
DEVCHR:	.LONG	0
DEVCLS:	.LONG	0
BLKSIZ:	.LONG	0
MAXBLK:	.LONG	0
FIB:	.BLKL	12
FIBD:	.LONG	12
	.LONG	FIB
ATRLST:	.WORD	ATR$S_RECATTR
	.WORD	ATR$C_RECATTR
	.ADDRESS  RECATTR
	.LONG	0
RECATTR:  .BLKB	ATR$S_RECATTR

	.ALIGN	LONG

HBUFF:
FILBLK:	.BLKL	256

KEYDFB:	.BLKB	<MAXSEG*KBOFF>

MINSIZ:	.BLKW	255

RFATBL:	.BLKB	<MAXRFTBL*6>

	.END
