	.TITLE	VFE VMS File Editor

	.IDENT	/MCCCD VFE V1.0/

	.SBTTL	Introduction
;
; VMS File Editor, Version 1.0
;
;     Written at MCCCD by Ward Condit, spring 1984
;
;     Inspired by fond rememberances of Sperry 1100 "FILEDIT",
;     written at the U of Maryland by B. K. Reid and K. E. Sibbald
;
;     Helpful hints and suggestions provided by:
;                           Jason Pociask
;                           Chris Zagar
;                           David Mitchell
;
; VFE is a utility which allows a user to perform display,
; change, locate, and compare operations on any VMS file that
; the user has privilege to access.  VFE is block-oriented
; and independent of file type.
;
; Source documentation to be provided in a later release.
;
; This software is provided free of charge in the PUBLIC DOMAIN
; by the Maricopa Community Colleges.  By accepting this software
; the user agrees not to hold the supplier liable for damages of
; any kind, resulting either from software errors or improper
; operation.
;
; It is STRONGLY SUGGESTED that VFE be operated ONLY in read-only
; mode when examining system files.  Read-only mode should also be
; used when editing other critical files for which there is no
; current backup.


LOCSIZ=50	; Buffer size (blocks) for the LOCATE command
	.PAGE
	.SBTTL	Symbol and macro definitions

	.ENABLE	SUPPRESSION

	.LIBRARY  'SYS$LIBRARY:LIB.MLB'

	$ATRDEF
	$FABDEF
	$FATDEF
	$FIBDEF
	$HLPDEF
	$IODEF
	$RABDEF
	$RMSDEF
	$NAMDEF
	$SSDEF
	$TPADEF

	.MACRO	INPUT	ARG1,ARG2,ARG3,ARG4
	CVTWL	ARG3,-(SP)
	PUSHAL	ARG4
	CVTWL	ARG1,-(SP)
	PUSHAL	ARG2
	CALLS	#4,TERMIO
	.ENDM

	.MACRO	OUTPUT	ARG1,ARG2
	CVTWL	ARG1,-(SP)
	PUSHAL	ARG2
	CALLS	#2,TERMIO
	.ENDM

	.MACRO	OUTMSG	ARG1,ARG2
	PUSHL	#1
	CVTWL	ARG1,-(SP)
	PUSHAL	ARG2
	CALLS	#3,TERMIO
	.ENDM
	.PAGE
	.SBTTL	Main program

	.PSECT	CODE

	.ENTRY	START,0

	$ASSIGN_S  DEVNAM=TERM,CHAN=TT
	BLBS	R0,100$
	BRW	ERREXT
100$:
	$QIOW_S	CHAN=TT,FUNC=#IO$_SETMODE!IO$M_CTRLCAST,-
		EFN=#1,P1=CTRLCAST,P3=#3
	BLBS	R0,200$
	BRW	ERREXT
200$:
	BSBW	GETFILE
300$:
	BSBW	GETCMD
	CLRB	STOP
	MOVL	JMPADR,R1
	JSB	(R1)
	BRB	300$

CTRLCAST:
	.WORD	0
	$QIOW_S	CHAN=TT,FUNC=#IO$_SETMODE!IO$M_CTRLCAST,-
		EFN=#1,P1=CTRLCAST,P3=#3
	BLBS	R0,100$
	BRW	ERREXT
100$:
	MOVB	#1,STOP
	RET

EXIT:
	BSBW	LOGOFF
	BSBW	RELFILE
	MOVL	#1,R0
ERREXT:
	$FORCEX_S  CODE=R0
	.PAGE
	.SBTTL	GETCMD - Get command
GETCMD:
100$:
	CLRB	HLPON
	MOVL	#20,OUTDSC
	$FAO_S	CTRSTR=SOLMSG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=CURBLK
	INPUT	OUTDSC,OUT_BUFF,#80,FUNC
	CMPB	STATUS+2,#0
	BGTR	450$
	MOVL	#1,PARA1
	MOVAL	NEXT,JMPADR
	BRW	800$
450$:
	MOVZWL	STATUS+2,R3
	MOVAL	FUNC,R4
500$:
	CMPB	(R4),#^A/ /
	BNEQ	550$
	INCL	R4
	SOBGTR	R3,500$
	BRB	650$
550$:
	CMPB	(R4),#^A/a/
	BLSSU	600$
	CMPB	(R4),#^A/z/
	BGTRU	650$
	SUBB2	#^X20,(R4)
600$:
	CMPB	(R4),#^A/A/
	BLSS	650$
	CMPB	(R4),#^A/Z/
	BGTR	650$
	INCL	R4
	SOBGTR	R3,550$
650$:
	CLRL	JMPADR
	CLRL	MFLAG
	MOVL	#TPA$K_COUNT0,TPBLK+TPA$L_COUNT
	MOVL	#TPA$M_ABBRFM,TPBLK+TPA$L_OPTIONS
	MOVZWL	STATUS+2,TPBLK+TPA$L_STRINGCNT
	MOVAL	FUNC,TPBLK+TPA$L_STRINGPTR
	PUSHAL	VFE_KEY
	PUSHAL	VFE_STATE
	PUSHAL	TPBLK
	CALLS	#3,G^LIB$TPARSE
	BLBS	R0,700$
	BSBW	ERROUT
	BRW	100$
700$:
	CMPL	#0,JMPADR
	BNEQ	800$
	BRW	100$
800$:
	RSB
	.PAGE
	.SBTTL	ALPHA - Display in alphanumeric format
ALPHA:
	BSBW	SETUP
	BLBS	R0,100$
	BRW	900$
100$:
	DIVL3	#8,PARA1,R3
	MULL2	#8,R3
	MOVL	R3,PARA2
	SUBL3	R3,PARA1,R10
	ADDL2	R10,R5
	MOVB	#^A/ /,R9
200$:
	MOVL	PARA2,R3
	BSBW	NUMOUT
	ADDL2	#64,PARA2
	MOVL	#8,R8
	MOVB	#^A/ /,(R6)+
	BRB	350$
300$:
	MOVB	#^A/|/,(R6)+
350$:
	MOVL	#8,R7
400$:
	SOBGEQ	R10,600$
	MOVB	(R4)+,R9
	CMPB	R9,#32
	BLSS	500$
	CMPB	R9,#127
	BNEQ	600$
500$:
	MOVB	#^A/./,R9
600$:
	MOVB	R9,(R6)+
	SOBGTR	R5,700$
	BRB	800$
700$:
	SOBGTR	R7,400$
	SOBGTR	R8,300$
800$:
	SUBL2	#OUT_BUFF,R6
	OUTPUT	R6,OUT_BUFF
	CMPB	STOP,#0
	BNEQ	900$
	ADDL2	#1,R5
	SOBGTR	R5,870$
	BSBW	COMPNXT
	BLBC	R0,900$
	BRW	100$
870$:
	BRW	200$
900$:
	RSB
	.PAGE
	.SBTTL	IBYTE - Display in integer byte format
IBYTE:
	BSBW	SETUP
	BLBS	R0,100$
	BRW	900$
100$:
	MOVL	PARA1,PARA2
200$:
	MOVL	PARA2,R3
	BSBW	NUMOUT
	ADDL2	#16,PARA2
	MOVL	#16,R7
	MOVB	#^A/ /,(R6)+
300$:
	CLRQ	R9
	MOVB	#^A/ /,R11
	CVTBL	(R4)+,R8
	BGEQ	400$
	TSTB	SGNFLG
	BNEQ	360$
	MOVZBL	R8,R8
	BRW	400$
360$:
	MOVB	#^A/-/,R11
	MNEGL	R8,R8
400$:
	INCL	R10
	EDIV	#10,R8,R8,-(SP)
	BNEQ	400$
	SUBL3	R10,#3,R9
	BLEQ	550$
500$:
	MOVB	#^A/ /,(R6)+
	SOBGTR	R9,500$
550$:
	MOVB	R11,(R6)+
600$:
	ADDL3	#^A/0/,(SP)+,R3
	MOVB	R3,(R6)+
	SOBGTR	R10,600$
	SOBGTR	R5,700$
	BRB	800$
700$:
	SOBGTR	R7,300$
800$:
	SUBL2	#OUT_BUFF,R6
	OUTPUT	R6,OUT_BUFF
	CMPB	STOP,#0
	BNEQ	900$
	ADDL2	#1,R5
	SOBGTR	R5,870$
	BSBW	COMPNXT
	BLBC	R0,900$
	BRW	100$
870$:
	BRW	200$
900$:
	RSB
	.PAGE
	.SBTTL	IWLDSP - Display in int word/lword fmt
IWLDSP:
	BSBW	SETUP
	BLBS	R0,100$
	BRW	900$
100$:
	MOVL	PARA1,PARA2
	MOVL	#SS$_NORMAL,SVSTAT
	TSTL	REM
	BLEQ	200$
	ADDL3	#1,CURBLK,R1
	$QIOW_S	CHAN=DD,FUNC=#IO$_READVBLK,IOSB=STATUS,-
		P1=LBUFF,P2=#512,P3=R1
	BSBW	IOSTAT
	MOVL	R0,SVSTAT
	BLBS	R0,200$
	TSTL	NPARA1
	BLEQ	200$
	SOBGTR	R5,200$
	BSBW	ERROUT
	BRW	900$
200$:
	MOVL	PARA2,R3
	BSBW	NUMOUT
	ADDL2	#16,PARA2
	MOVL	WLPARM,R7
300$:
	CLRQ	R9
	MOVB	#^A/ /,R11
	CMPL	WLPARM,#4
	BEQL	340$
	CVTWL	(R4)+,R8
	BGEQ	400$
	TSTB	SGNFLG
	BNEQ	360$
	MOVZWL	R8,R8
	BRB	400$
340$:
	MOVL	(R4)+,R8
	BGEQ	400$
	TSTB	SGNFLG
	BEQL	400$
360$:
	MOVB	#^A/-/,R11
	MNEGL	R8,R8
400$:
	INCL	R10
	EDIV	#10,R8,R8,-(SP)
	BNEQ	400$
	SUBL3	R10,WLPOSN,R9
500$:
	MOVB	#^A/ /,(R6)+
	SOBGTR	R9,500$
	MOVB	R11,(R6)+
600$:
	ADDL3	#^A/0/,(SP)+,R3
	MOVB	R3,(R6)+
	SOBGTR	R10,600$
	SOBGTR	R5,700$
	BRB	800$
700$:
	SOBGTR	R7,300$
800$:
	SUBL2	#OUT_BUFF,R6
	OUTPUT	R6,OUT_BUFF
	CMPB	STOP,#0
	BEQL	810$
	BRW	900$
810$:
	ADDL2	#1,R5
	SOBGTR	R5,820$
	BRB	830$
820$:
	BRW	200$
830$:
	MOVL	SVSTAT,R0
	BLBS	R0,840$
	BSBW	ERROUT
	BRB	900$
840$:
	CMPL	REM,NPARA1
	BLEQ	900$
	MOVC3	#512,LBUFF,BUFF
	INCL	CURBLK
	BSBW	BLOCK
	MOVL	#1,R0
	MOVL	NPARA1,PARA1
	MOVAL	BUFF,R4
	ADDL2	PARA1,R4
	CMPL	REM,#512
	BGTR	860$
	DIVL3	DSPCNT,REM,R5
	CLRL	REM
	BRB	880$
860$:
	SUBL2	#512,REM
	DIVL3	DSPCNT,#512,R5
880$:
	BRW	100$
900$:
	RSB
	.PAGE
	.SBTTL	HEX - Display in hexadecimal format
HEX:
	BSBW	SETUP
	BLBS	R0,100$
	BRW	900$
100$:
	DIVL3	#4,PARA1,R3
	MULL2	#4,R3
	MOVL	R3,PARA2
	SUBL3	R3,PARA1,R10
	ADDL2	R10,R5
200$:
	MOVL	PARA2,R3
	BSBW	NUMOUT
	ADDL2	#32,PARA2
	MOVL	#8,R8
300$:
	MOVL	#4,R7
	MOVB	#^A/ /,(R6)+
400$:
	SOBGEQ	R10,500$
	EXTZV	#4,#4,(R4),R9
	MOVB	HEXD[R9],(R6)+
	EXTZV	#0,#4,(R4)+,R9
	MOVB	HEXD[R9],(R6)+
	BRB	600$
500$:
	MOVW	#^A/  /,(R6)+
600$:
	SOBGTR	R5,700$
	BRB	800$
700$:
	SOBGTR	R7,400$
	SOBGTR	R8,300$
800$:
	SUBL2	#OUT_BUFF,R6
	OUTPUT	R6,OUT_BUFF
	CMPB	STOP,#0
	BNEQ	900$
	ADDL2	#1,R5
	SOBGTR	R5,870$
	BSBW	COMPNXT
	BLBC	R0,900$
	BRW	100$
870$:
	BRW	200$
900$:
	RSB
	.PAGE
	.SBTTL	DATE - Display in system date format
DATE:
	BSBW	SETUP
	BLBS	R0,100$
	BRW	900$
100$:
	TSTL	REM
	BEQL	120$
	BSBW	INVPARA
	BRW	900$
120$:
	MOVL	PARA1,R3
	BSBW	NUMOUT
	ADDL2	#8,PARA1
	MOVB	#^A/ /,(R6)+
	TSTL	4(R4)
	BGTR	200$
	BLSS	150$
	TSTL	(R4)
	BNEQ	200$
150$:
	PUSHR	#^M<R4,R5>
	MOVC3	#IVTL,IVT,(R6)
	POPR	#^M<R4,R5>
	ADDL2	#IVTL,R6
	BRB	300$
200$:
	MOVL	#30,OUTDSCV
	MOVL	R6,OUTDSCV+4
	$ASCTIM_S  TIMLEN=OUTDSCV,TIMBUF=OUTDSCV,TIMADR=(R4)
	BLBS	R0,250$
	BSBW	ERROUT
	BRW	900$
250$:
	CVTWL	OUTDSCV,R1
	ADDL2	R1,R6
300$:
	ADDL2	#8,R4
	SUBL2	#OUT_BUFF,R6
	OUTPUT	R6,OUT_BUFF
	TSTB	STOP
	BNEQ	900$
	SOBGTR	R5,800$
	BRB	900$
800$:
	BRW	100$
900$:
	RSB
	.PAGE
	.SBTTL	RECORD - Display sequential records
RECORD:
	CMPZV	#FAT$V_FILEORG,#4,RECATTR+FAT$B_RTYPE,#FAT$C_SEQUENTIAL
	BEQL	100$
	OUTMSG	#NSFL,NSF
	BRW	900$
100$:
	CMPL	PARA1,#511
	BGTRU	200$
	CMPL	PARA2,#0
	BLEQ	200$
	ADDL3	#BUFF,PARA1,R4
	SUBL3	PARA1,#512,R5
	MOVL	PARA2,R8
	MOVL	#512+1,FFBYTE
	CMPL	CURBLK,EFBLK
	BLEQ	140$
	OUTMSG	#7,EOF
	BRW	900$
140$:
	BLSS	160$
	CVTWL	RECATTR+FAT$W_FFBYTE,FFBYTE
160$:
	BRB	250$
200$:
	BSBW	INVPARA
	BRW	900$
250$:
	BLBC	R4,280$
	INCL	R4
	DECL	R5
280$:
	TSTL	R5
	BGTR	300$
290$:
	BSBW	RECNXT
	BLBS	R0,300$
	BRW	900$
300$:
	SUBL3	#BUFF,R4,R3
	CMPL	R3,FFBYTE
	BLSS	310$
	OUTMSG	#7,EOF
	BRW	900$
310$:
	BSBW	NUMOUT
	TSTB	VFLAG
	BNEQ	320$
	MOVL	RSIZE,R7
	BRW	400$
320$:
	SUBL2	#2,R5
	CVTWL	(R4)+,R7
	ADDL2	VFCSIZE,R4
	SUBL2	VFCSIZE,R5
	SUBL2	VFCSIZE,R7
	BGEQ	350$
	CMPZV	#FAT$V_NOSPAN,#1,RECATTR+FAT$B_RATTRIB,#1
	BNEQ	340$
	CMPL	CURBLK,EFBLK
	BLSS	290$
340$:
	MOVC3	#7,EOF,(R6)
	ADDL2	#7,R6
	BRB	380$
350$:
	CMPL	R7,RSIZE
	BLEQ	400$
	MOVL	#80,OUTDSCV
	MOVL	R6,OUTDSCV+4
	$FAO_S	CTRSTR=MAXMSG,OUTLEN=OUTDSCV,OUTBUF=OUTDSCV,-
		P1=R7,P2=RSIZE
	CVTWL	OUTDSCV,R3
	ADDL2	R3,R6
380$:
	SUBL2	#OUT_BUFF,R6
	OUTMSG	R6,OUT_BUFF
	BRW	900$
400$:
	MOVL	#72,R9
	MOVB	#^A/ /,(R6)+
420$:
	TSTB	STOP
	BEQL	450$
	BRW	900$
450$:
	TSTL	R7
	BLEQ	600$
	SOBGEQ	R5,480$
	BRB	600$
480$:
	DECL	R7
	MOVB	(R4)+,R3
	CMPB	R3,#32
	BLSS	500$
	CMPB	R3,#127
	BNEQ	550$
500$:
	MOVB	#^A/./,R3
550$:
	MOVB	R3,(R6)+
	SOBGTR	R9,450$
600$:
	SUBL2	#OUT_BUFF,R6
	OUTPUT	R6,OUT_BUFF
	TSTL	R7
	BLEQ	750$
	TSTL	R5
	BGTR	700$
	BSBW	RECNXT
	BLBS	R0,700$
	BRB	900$
700$:
	PUSHR	#^M<R4,R5>
	TSTL	R9
	BGTR	720$
	MOVL	#72,R9
720$:
	SUBL3	R9,#72+6,R6
	MOVC5	#0,OUT_BUFF,#^A/ /,R6,OUT_BUFF
	ADDL2	#OUT_BUFF,R6
	POPR	#^M<R4,R5>
	BRW	420$
750$:
	SOBGTR	R8,800$
	BRB	900$
800$:
	BRW	250$
900$:
	RSB

RECNXT:
	ADDL3	#1,CURBLK,PARA1
	CMPL	PARA1,EFBLK
	BLEQ	200$
	OUTMSG	#7,EOF
	CLRL	R0
	BRB	900$
200$:
	BLSS	300$
	CVTWL	RECATTR+FAT$W_FFBYTE,FFBYTE
300$:
	BSBW	READ
	BLBC	R0,900$
	BSBW	BLOCK
	MOVAL	BUFF,R4
	MOVL	#512,R5
900$:
	RSB
	.PAGE
	.SBTTL	DIFF - Display differences with paste buffer
DIFF:
	BSBW	SETUP
	BLBS	R0,050$
	BRW	900$
050$:
	CMPL	REM,#0
	BLEQ	100$
	BSBW	INVPARA
	BRW	900$
100$:
	MOVAL	XBUFF,R9
	ADDL2	PARA1,R9
	CMPC3	R5,(R4),(R9)
	CMPL	R0,#0
	BGTR	150$
	OUTMSG	#NDIFFL,NDIFF
	BRW	900$
150$:
	DIVL3	#4,PARA1,R3
	MULL2	#4,R3
	MOVL	R3,PARA2
	SUBL3	R3,PARA1,R10
	ADDL2	R10,R5
200$:
	MOVB	#0,FLAG
	MOVL	PARA2,R3
	BSBW	NUMOUT
	ADDL2	#32,PARA2
	MOVQ	R4,R4R5S
	MOVQ	R9,R9R10S
	MOVL	#1,R11
	BRB	280$
250$:
	MOVC3	#5,PBOUT,OUT_BUFF
	MOVAL	OUT_BUFF+5,R6
	MOVQ	R4R5S,R4
	MOVQ	R9R10S,R9
280$:
	MOVL	#8,R8
300$:
	MOVL	#4,R7
	MOVB	#^A/ /,(R6)+
400$:
	SOBGEQ	R10,500$
	MOVL	R4,R3
	CMPB	(R4)+,(R9)+
	BNEQ	450$
	BLBS	R11,480$
	MOVW	#^A/../,(R6)+
	BRB	600$
450$:
	MOVB	#1,FLAG
	BLBS	R11,480$
	SUBL3	#1,R9,R3
480$:
	EXTZV	#4,#4,(R3),R1
	MOVB	HEXD[R1],(R6)+
	EXTZV	#0,#4,(R3),R1
	MOVB	HEXD[R1],(R6)+
	BRB	600$
500$:
	MOVW	#^A/  /,(R6)+
600$:
	SOBGTR	R5,700$
	BRB	800$
700$:
	SOBGTR	R7,400$
	SOBGTR	R8,300$
800$:
	CMPB	#0,FLAG
	BEQL	850$
	BLBS	R11,810$
	MOVB	#LF,(R6)+
810$:
	SUBL2	#OUT_BUFF,R6
	OUTPUT	R6,OUT_BUFF
	SOBGEQ	R11,830$
	BRB	850$
830$:
	BRW	250$
850$:
	CMPB	STOP,#0
	BNEQ	900$
	ADDL2	#1,R5
	SOBGTR	R5,870$
	BRB	900$
870$:
	BRW	200$
900$:
	RSB
	.PAGE
	.SBTTL	CHANGE - Change one or more sequential bytes
CHANGE:
	ADDW3	PARA1,QDESC,R1
	CMPW	R1,#512
	BLEQ	200$
	BSBW	INVPARA
	BRB	400$
200$:
	MOVAL	BUFF,R6
	ADDL2	PARA1,R6
	MOVL	QDESC+4,R7
	MOVC3	QDESC,(R7),(R6)
	MOVAL	BUFF,LPTR
400$:
	RSB

	.SBTTL	ADD - Add 1 or more numbers & print
ADD:
	MOVAL	ADDMSG,R1
	TSTB	SGNFLG
	BNEQ	100$
	MOVAL	ADDMSGU,R1
100$:
	MOVL	#30,OUTDSC
	$FAO_S	CTRSTR=(R1),OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=ACCUM,P2=ACCUM
	OUTMSG	OUTDSC,OUT_BUFF
	RSB

	.SBTTL	CUT - Transfer work buffer to paste buffer
CUT:
	MOVC3	#512,BUFF,XBUFF
	RSB

	.SBTTL	PASTE - Transfer paste buffer to work buffer
PASTE:
	MOVC3	#512,XBUFF,BUFF
	MOVAL	BUFF,LPTR
	RSB

	.SBTTL	ROTATE - Exchange paste and work buffers
ROTATE:
	MOVC3	#512,BUFF,LBUFF
	MOVC3	#512,XBUFF,BUFF
	MOVC3	#512,LBUFF,XBUFF
	MOVAL	BUFF,LPTR
	RSB
	.PAGE
	.SBTTL	LOCATE - Search for a specified string
LOCATE:
	MOVL	QDESC+4,R7
	CMPW	LSTRL,QDESC
	BNEQ	300$
	CMPC3	LSTRL,(R7),LSTR
	CMPL	R0,#0
	BEQL	400$
300$:
	MOVC3	QDESC,(R7),LSTR
	MOVZWL	QDESC,LSTRL
	MOVAL	BUFF,LPTR
400$:
	MOVL	LPTR,R7
	MOVB	#0,FLAG
	SUBL3	LPTR,#BUFF+512,R8
	CMPL	LSTRL,R8
	BGTR	420$
	MATCHC	LSTRL,LSTR,R8,(R7)
	CMPL	R0,#0
	BNEQ	420$
	SUBL3	LSTRL,R3,R9
	BRW	800$
420$:
	MOVC3	#512,BUFF,SBUFF
	MOVL	CURBLK,LBLOCK
	MOVL	#1,LBLKCT
450$:
	CMPB	STOP,#0
	BEQL	500$
	DECL	LBLKCT
	ADDL3	LBLKCT,LBLOCK,CURBLK
	BRW	900$
500$:
	ADDL2	LBLKCT,LBLOCK
	MOVL	#LOCSIZ,LBLKCT
	SUBL3	LBLOCK,HIBLK,R4
	BGEQ	520$
	MOVL	#SS$_ENDOFFILE,R0
	BRB	540$
520$:
	CMPL	R4,LBLKCT
	BGEQ	530$
	ADDL3	#1,R4,LBLKCT
530$:
	MULL3	#512,LBLKCT,R4
	$QIOW_S	CHAN=DD,FUNC=#IO$_READVBLK,IOSB=STATUS,-
		P1=LBUFF,P2=R4,P3=LBLOCK
	BSBW	IOSTAT
	BLBC	R0,540$
	BRW	650$
540$:
	CMPB	FLAG,#0
	BEQL	550$
	MOVL	R0,R6
	MOVC3	#512,SBUFF,BUFF
	MOVL	R6,R0
550$:
	CMPW	R0,#SS$_ENDOFFILE
	BEQL	570$
	BSBW	ERROUT
	BRW	900$
570$:
	MOVAL	BUFF+512,LPTR
	OUTMSG	#NFMSGL,NFMSG
	BRW	900$
650$:
	SUBL3	LSTRL,#BUFF+513,R7
	MULL3	#512,LBLKCT,R4
	DECL	R4
	ADDL3	R4,LSTRL,R8
	MATCHC	LSTRL,LSTR,R8,(R7)
	CMPL	R0,#0
	BEQL	700$
	MOVB	#1,FLAG
	MULL3	#512,LBLKCT,R6
	ADDL2	#BUFF,R6
	MOVC3	#512,(R6),BUFF
	BRW	450$
700$:
	SUBL3	LSTRL,R3,R9
	CMPL	R9,#BUFF+511
	BLEQ	750$
	SUBL3	#BUFF,R9,R6
	DIVL2	#512,R6
	ADDL2	R6,LBLOCK
	MULL2	#512,R6
	SUBL2	R6,R9
	ADDL2	#BUFF,R6
	MOVC3	#512,(R6),BUFF
750$:
	SUBL3	#1,LBLOCK,CURBLK
800$:
	INCL	R9
	MOVL	R9,LPTR
	SUBL2	#BUFF+1,R9
	MOVL	#100,OUTDSC
	$FAO_S	CTRSTR=FNDMSG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=CURBLK,P2=R9
	OUTMSG	OUTDSC,OUT_BUFF
900$:
	RSB
	.PAGE
	.SBTTL	HELP - Call system help procedure
HELP:
	INCB	HLPON
	PUSHAL	HELPIN
	PUSHAL	HELPFLG
	PUSHAL	HELPLIB
	PUSHAL	DESC
	PUSHAL	HELPWID
	PUSHAL	HELPOUT
	CALLS	#6,G^LBR$OUTPUT_HELP
	BLBS	R0,900$
	BSBW	ERROUT
900$:
	RSB

HELPIN:
	.WORD	^M<R2>
	MOVL	4(AP),R2
	CVTWL	(R2),-(SP)
	PUSHL	4(R2)
	MOVL	8(AP),R2
	CVTWL	(R2),-(SP)
	PUSHL	4(R2)
	CALLS	#4,TERMIO
	CMPL	(AP),#3
	BLSS	200$
	MOVW	STATUS+2,@12(AP)
200$:
	MOVL	#SS$_NORMAL,R0
	RET

HELPOUT:
	.WORD	^M<R2>
	MOVL	4(AP),R2
	CVTWL	(R2),-(SP)
	PUSHL	4(R2)
	CALLS	#2,TERMIO
	MOVL	#SS$_NORMAL,R0
	RET
	.PAGE
	.SBTTL	LOGON - Turn on logging or switch log file
LOGON:
	BSBW	LOGOFF
	MOVB	DESC,LOGFAB+FAB$B_FNS
	MOVL	DESC+4,LOGFAB+FAB$L_FNA
	$CREATE	FAB=LOGFAB
	BLBS	R0,100$
	BSBW	ERROUT
	BRW	900$
100$:
	$CONNECT  RAB=LOGRAB
	BLBS	R0,200$
	BRW	ERREXT
200$:
	CLRB	NOLOG
900$:
	RSB

	.SBTTL	LOGOFF - Turn off logging
LOGOFF:
	TSTB	NOLOG
	BNEQ	900$
	$CLOSE	FAB=LOGFAB
	BLBS	R0,900$
	BRW	ERREXT
900$:
	MOVB	#1,NOLOG
	RSB

	.SBTTL	DSPON - Enable terminal display
DSPON:
	MOVB	#1,DSPFLG
	RSB

	.SBTTL	DSPOFF - Disable terminal display
DSPOFF:
	CLRB	DSPFLG
	RSB

	.SBTTL	SGNON - Turn on signed output flag
SGNON:
	MOVB	#1,SGNFLG
	RSB

	.SBTTL	SGNOFF - Turn off signed output flag
SGNOFF:
	CLRB	SGNFLG
	RSB
	.PAGE
	.SBTTL	TOP - Go to top of file
TOP:
	MOVL	#1,PARA1
	BSBW	READ
	RSB

	.SBTTL	NEXT - Go to next block
NEXT:
	ADDL2	CURBLK,PARA1
	BSBW	READ
	RSB

	.SBTTL	LAST - Position at last block in file
LAST:
	MOVL	HIBLK,PARA1
	BSBW	READ
	RSB

	.SBTTL	READ - Read data
READ:
	CMPL	PARA1,#0
	BGTR	100$
	MOVL	#1,PARA1
100$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_READVBLK,IOSB=STATUS,-
		P1=BUFF,P2=#512,P3=PARA1
	BSBW	IOSTAT
	BLBS	R0,300$
	BSBW	ERROUT
	MOVL	#0,R0
	CMPL	PARA1,HIBLK
	BGTR	400$
300$:
	MOVL	PARA1,CURBLK
	MOVAL	BUFF,LPTR
400$:
	RSB

	.SBTTL	WRITE - Write work buffer to file
WRITE:
	TSTB	RDONLY
	BEQL	100$
	OUTMSG	#ROMWL,ROM
	BRB	900$
100$:
	TSTL	CURBLK
	BEQL	900$
	$QIOW_S	CHAN=DD,FUNC=#IO$_WRITEVBLK,IOSB=STATUS,-
		P1=BUFF,P2=#512,P3=CURBLK
	BSBW	IOSTAT
	BLBS	R0,200$
	BSBW	ERROUT
	BRB	900$
200$:
	OUTMSG	#RDYL,RDY
900$:
	RSB
	.PAGE
	.SBTTL	GETFILE - Get file name and access it
GETFILE:
100$:
	MOVW	#80,DESC
	MOVAL	FNAME,DESC+4
	PUSHAL	FNFP
	PUSHAL	FNL
	PUSHAL	FNQ
	PUSHAL	DESC
	CALLS	#4,G^LIB$GET_FOREIGN
	BLBS	R0,200$
	CMPL	R0,#RMS$_EOF
	BNEQ	180$
	BRW	EXIT
180$:
	BRW	ERREXT
200$:
	MOVAL	FNAME,R4
	CVTWL	FNL,R5
	BGTR	420$
	TSTB	ACCFLG
	BEQL	100$
	BRW	900$
420$:
	BSBW	RELFILE
	MOVB	#1,RDONLY
	CMPB	(R4),#^A/#/
	BNEQ	430$
	CLRB	RDONLY
	INCL	R4
	DECL	R5
	BGTR	430$
	BRW	100$
430$:
	MOVAL	OPNFAB,R2
	MOVB	R5,FAB$B_FNS(R2)
	MOVL	R4,FAB$L_FNA(R2)
	$OPEN	FAB=OPNFAB
	BLBS	R0,500$
	BSBW	ERROUT
	BRW	100$
500$:
	$CLOSE	FAB=OPNFAB
	BLBS	R0,600$
	BSBW	ERROUT
	BRW	100$
600$:
	MOVAL	OPNNAM,R6
	MOVB	NAM$B_DEV(R6),DISKD
	MOVL	NAM$L_DEV(R6),DISKD+4
	$ASSIGN_S  CHAN=DD,DEVNAM=DISKD
	BLBS	R0,700$
	BSBW	ERROUT
	BRW	100$
700$:
	MOVB	#1,ASSFLG
	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	RDONLY
	BNEQ	750$
	MOVL	#FIB$M_WRITE,FIB+FIB$L_ACCTL
750$:
	$QIOW_S	CHAN=DD,FUNC=#IO$_ACCESS!IO$M_ACCESS, -
		IOSB=STATUS,P1=FIBD,P5=#ATRLST
	BSBW	IOSTAT
	BLBS	R0,800$
	BSBW	ERROUT
	BRW	100$
800$:
	MOVB	#1,ACCFLG
	MOVW	RECATTR+FAT$W_HIBLKL,HIBLK
	MOVW	RECATTR+FAT$W_HIBLKH,HIBLK+2
	TSTL	HIBLK
	BNEQ	810$
	OUTMSG	#NEFL,NEF
	BRW	100$
810$:
	MOVW	RECATTR+FAT$W_EFBLKL,EFBLK
	MOVW	RECATTR+FAT$W_EFBLKH,EFBLK+2
	CVTWL	RECATTR+FAT$W_RSIZE,RSIZE
	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$
	CVTBL	RECATTR+FAT$B_VFCSIZE,VFCSIZE
820$:
	INCB	VFLAG
830$:
	TSTB	RDONLY
	BNEQ	840$
	OUTMSG	#WWEL,WWE
	BRB	850$
840$:
	OUTMSG	#ROML,ROM
850$:
	CLRL	CURBLK
	MOVL	#1,PARA1
	BSBW	READ
	BLBC	R0,900$
	BSBW	BLOCK
900$:
	RSB
	.PAGE
	.SBTTL	RELFILE - Deaccess file
RELFILE:
	CMPB	#0,ACCFLG
	BEQL	150$
	$QIOW_S	CHAN=DD,FUNC=#IO$_DEACCESS,P1=FIBD
	BLBS	R0,150$
	BRW	ERREXT
150$:
	MOVB	#0,ACCFLG
	CMPB	#0,ASSFLG
	BEQL	170$
	$DASSGN_S  CHAN=DD
	BLBS	R0,170$
	BRW	ERREXT
170$:
	MOVB	#0,ASSFLG
	RSB

	.SBTTL	WHERE - Display current file and block
WHERE:
	MOVAL	OPNNAM,R6
	MOVB	NAM$B_RSL(R6),DESC
	MOVL	NAM$L_RSA(R6),DESC+4
	MOVL	#100,OUTDSC
	$FAO_S	CTRSTR=WHRMSG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=#DESC,P2=CURBLK
	OUTMSG	OUTDSC,OUT_BUFF
	RSB
	.PAGE
	.SBTTL	TERMIO - Control I/O to the terminal
TERMIO:
	.WORD	^M<R2,R3,R4,R5,R6,R7>
	MOVC3	8(AP),@4(AP),TERMBUFF
	ADDL3	#1,8(AP),R6
	CMPL	(AP),#3
	BLEQ	100$
	BRW	200$
100$:
	CMPL	(AP),#2
	BGTR	120$
	TSTW	TERMON
	BEQL	160$
120$:
	MOVB	#CR,TERMBUFF-1[R6]
	INCL	R6
	$QIOW_S	CHAN=TT,FUNC=#IO$_WRITEVBLK,P1=TERMLF,P2=R6
	BLBS	R0,150$
	BRW	ERREXT
150$:
	TSTB	NOLOG
	BNEQ	170$
160$:
	MOVL	8(AP),R6
	BRW	600$
170$:
	BRW	900$
200$:
	MOVAL	TERMLF,R7
220$:
	$QIOW_S	CHAN=TT,FUNC=#IO$_READPROMPT,IOSB=STATUS,-
		P1=@12(AP),P2=16(AP),P5=R7,P6=R6
	BLBS	R0,300$
	BRW	ERREXT
300$:
	CMPW	STATUS+4,#CR
	BEQL	500$
	TSTB	HLPON
	BEQL	350$
	CVTWL	STATUS+2,R7
	CMPL	R7,16(AP)
	BGEQ	500$
	ADDL2	12(AP),R7
	MOVB	STATUS+4,(R7)
	INCW	STATUS+2
	BRW	500$
350$:
	CMPW	STATUS+4,#CZ
	BNEQ	400$
	BRW	EXIT
400$:
	MOVAL	TERMCR,R7
	ADDL3	#2,8(AP),R6
	BRW	220$
500$:
	TSTB	NOLOG
	BNEQ	900$
	MOVL	8(AP),R6
	TSTW	STATUS+2
	BLEQ	600$
	ADDL3	#TERMBUFF,R6,R7
	MOVC3	STATUS+2,@12(AP),(R7)
	ADDW2	STATUS+2,R6
600$:
	MOVW	R6,LOGRAB+RAB$W_RSZ
	$PUT	RAB=LOGRAB
	BLBS	R0,900$
	BRW	ERREXT
900$:
	RET
	.PAGE
	.SBTTL	Miscellaneous utility routines

ERROUT:
	MOVL	R0,ERRCOD
	MOVL	#80,OUTDSC
	$GETMSG_S  MSGID=ERRCOD,MSGLEN=OUTDSC,BUFADR=OUTDSC
	OUTMSG	OUTDSC,OUT_BUFF
	RSB

SETUP:
	CMPL	PARA1,#511
	BGTRU	600$
	CMPL	PARA2,#0
	BLEQ	600$
	CLRL	REM
	EDIV	DSPCNT,PARA1,R2,NPARA1
	MULL2	DSPCNT,PARA2
	ADDL3	PARA1,PARA2,R3
	CMPL	R3,#512
	BLEQ	400$
	SUBL3	#512,R3,REM
	ADDL3	#512,NPARA1,R3
400$:
	ADDL3	#BUFF,PARA1,R4
	SUBL3	PARA1,R3,R5
	DIVL2	DSPCNT,R5
	MOVL	#1,R0
	BRB	900$
600$:
	BSBW	INVPARA
900$:
	RSB

COMPNXT:
	CLRL	R0
	CMPL	REM,#0
	BLEQ	900$
	MOVL	#1,PARA1
	BSBW	NEXT
	BLBC	R0,900$
	BSBW	BLOCK
	MOVAL	BUFF,R4
	CLRL	PARA1
	CMPL	REM,#512
	BGTR	200$
	MOVL	REM,R5
	CLRL	REM
	BRB	900$
200$:
	SUBL2	#512,REM
	MOVL	#512,R5
900$:
	RSB
	.PAGE
NUMOUT:
	MOVAL	OUT_BUFF,R6
	DIVL3	#100,R3,R2
	ADDB3	R2,#^A/0/,(R6)+
	MULL2	#100,R2
	SUBL2	R2,R3
	DIVL3	#10,R3,R2
	ADDB3	R2,#^A/0/,(R6)+
	MULL2	#10,R2
	SUBL2	R2,R3
	ADDB3	R3,#^A/0/,(R6)+
	MOVB	#^A/:/,(R6)+
	MOVB	#^A/ /,(R6)+
	RSB

BLOCK:
	MOVL	#20,OUTDSC
	$FAO_S	CTRSTR=BLKMSG,OUTLEN=OUTDSC,OUTBUF=OUTDSC,-
		P1=CURBLK
	OUTPUT	OUTDSC,OUT_BUFF
	RSB

INVPARA:
	OUTMSG	#INVPL,INVP
	MOVL	#0,R0
	RSB

IOSTAT:
	BLBC	R0,100$
	MOVZWL	STATUS,R0
100$:
	RSB
	.PAGE
	.SBTTL	Parser state table and action routines

COMMA=^A/,/
DQUOTE=^A/"/
SQUOTE=^A/'/
QUEST=^A/?/

	$INIT_STATE  VFE_STATE,VFE_KEY

	$STATE	BEGIN
	$TRAN	TPA$_DECIMAL,DEFGET,,,PARA1
	$TRAN	'ASCII',PARAM2,AINIT,ALPHA,JMPADR
	$TRAN	'ADD',ADDPAR,ADDINI,ADD,JMPADR
	$TRAN	'CHANGE',CPARA,,CHANGE,JMPADR
	$TRAN	'CUT',TSTEOS,,CUT,JMPADR
	$TRAN	'DIFFERENCES',PARAM2,AINIT,DIFF,JMPADR
	$TRAN	'DATE',PARAM2,DTINIT,DATE,JMPADR
	$TRAN	'EXIT',TSTEOS,,EXIT,JMPADR
	$TRAN	'FILE',FPARM
	$TRAN	'GET',PARAM1,GINIT,READ,JMPADR
	$TRAN	'HEX',PARAM2,AINIT,HEX,JMPADR
	$TRAN	'HELP',HLPPAR,,HELP,JMPADR
	$TRAN	'IBYTE',PARAM2,AINIT,IBYTE,JMPADR
	$TRAN	'IWORD',PARAM2,IWINIT,IWLDSP,JMPADR
	$TRAN	'ILONG',PARAM2,ILINIT,IWLDSP,JMPADR
	$TRAN	'LOCATE',LPARA,,LOCATE,JMPADR
	$TRAN	'LAST',TSTEOS,,LAST,JMPADR
	$TRAN	'NEXT',NPARA,NINIT,NEXT,JMPADR
	$TRAN	'PASTE',TSTEOS,,PASTE,JMPADR
	$TRAN	'RECORD',PARAM2,RINIT,RECORD,JMPADR
	$TRAN	'ROTATE',TSTEOS,,ROTATE,JMPADR
	$TRAN	'SET',SETPAR,UCASE
	$TRAN	'TOP',TSTEOS,,TOP,JMPADR
	$TRAN	'WRITE',TSTEOS,,WRITE,JMPADR
	$TRAN	'+',NPARA2,NINIT,NEXT,JMPADR
	$TRAN	'-',NPARA2,NINITM,NEXT,JMPADR
	$TRAN	TPA$_EOS,TPA$_EXIT,NINIT,NEXT,JMPADR
	$TRAN	TPA$_LAMBDA,TPA$_EXIT,BDCOMM

	$STATE	DEFGET
	$TRAN	TPA$_EOS,TPA$_EXIT,,READ,JMPADR

	$STATE	PARAM2
	$TRAN	TPA$_DECIMAL,,,,PARA1
	$TRAN	COMMA,P2S2
	$TRAN	TPA$_EOS,TPA$_EXIT
	$STATE
	$TRAN	TPA$_DECIMAL,TSTEOS,,,PARA2
	$TRAN	COMMA,P2S2
	$TRAN	TPA$_EOS,TPA$_EXIT,SINGLE
	$STATE	P2S2
	$TRAN	TPA$_DECIMAL,TSTEOS,,,PARA2

	$STATE	PARAM1
	$TRAN	TPA$_DECIMAL,TSTEOS,,,PARA1
	$TRAN	TPA$_EOS,TPA$_EXIT

	$STATE	NPARA
	$TRAN	'-',,NINITM
	$TRAN	'+'
	$TRAN	TPA$_LAMBDA
	$STATE	NPARA2
	$TRAN	TPA$_DECIMAL,,,,PARA1
	$TRAN	TPA$_LAMBDA
	$STATE
	$TRAN	TPA$_EOS,TPA$_EXIT,NEGATE

	$STATE	ADDPAR
	$TRAN	'-',,,1,MFLAG
	$TRAN	'+'
	$TRAN	TPA$_LAMBDA
	$STATE
	$TRAN	'H',HEXX
	$TRAN	'h',HEXX
	$TRAN	'0',OCT
	$TRAN	TPA$_DECIMAL,ADDP2,ACCUML
	$STATE	HEXX
	$TRAN	TPA$_HEX,ADDP2,ACCUML
	$STATE	OCT
	$TRAN	TPA$_OCTAL,ADDP2,ACCUML
	$STATE	ADDP2
	$TRAN	COMMA,ADDPAR
	$TRAN	TPA$_EOS,TPA$_EXIT
	
	$STATE	CPARA
	$TRAN	TPA$_DECIMAL,,,,PARA1
	$STATE
	$TRAN	COMMA,QPARSE

	$STATE	LPARA
	$TRAN	TPA$_EOS,TPA$_EXIT,LNULL
	$TRAN	TPA$_LAMBDA,QPARSE

	$STATE	QPARSE
	$TRAN	TPA$_HEX,TSTEOS,CNUM
	$TRAN	'+',DECCL
	$TRAN	'-',DECCL,,1,MFLAG
	$TRAN	SQUOTE,,SPACON,,QCHAR
	$TRAN	DQUOTE,,SPACON,,QCHAR
	$STATE
	$TRAN	!QSTRING,,,,QDESC
	$STATE
	$TRAN	TPA$_ANY,TSTEOS,CSTR

	$STATE	QSTRING
	$TRAN	TPA$_ANY,QSTRING,TESTQ
	$TRAN	TPA$_LAMBDA,TPA$_EXIT

	$STATE	DECCL
	$TRAN	TPA$_DECIMAL,TSTEOS,CDEC

	$STATE	FPARM
	$TRAN	TPA$_EOS,TPA$_EXIT,,GETFILE,JMPADR
	$TRAN	QUEST,TSTEOS,,WHERE,JMPADR

	$STATE	HLPPAR
	$TRAN	TPA$_BLANK
	$TRAN	TPA$_LAMBDA
	$STATE
	$TRAN	TPA$_LAMBDA,TPA$_EXIT,GENDESC

	$STATE	SETPAR
	$TRAN	'LOG',LOGPAR,,LOGON,JMPADR
	$TRAN	'NOLOG',TSTEOS,CHAR3,LOGOFF,JMPADR
	$TRAN	'DISPLAY',TSTEOS,,DSPON,JMPADR
	$TRAN	'NODISPLAY',TSTEOS,CHAR3,DSPOFF,JMPADR
	$TRAN	'SIGN',TSTEOS,,SGNON,JMPADR
	$TRAN	'NOSIGN',TSTEOS,CHAR3,SGNOFF,JMPADR
	$TRAN	TPA$_LAMBDA,TPA$_EXIT,BDCOMM

	$STATE	LOGPAR
	$TRAN	'='
	$TRAN	TPA$_EOS,TPA$_EXIT,LOGDEF
	$STATE
	$TRAN	TPA$_EOS,TPA$_EXIT,BDCOMM
	$TRAN	TPA$_LAMBDA,TPA$_EXIT,GENDESC

	$STATE	TSTEOS
	$TRAN	TPA$_EOS,TPA$_EXIT

	$END_STATE

AINIT:
	.WORD	0
	MOVL	#1,DSPCNT
	MOVL	#0,PARA1
	MOVL	#512,PARA2
	RET

DTINIT:
	.WORD	0
	MOVL	#8,DSPCNT
	MNEGL	#1,PARA1
	RET

IWINIT:
	.WORD	0
	MOVL	#2,DSPCNT
	MOVL	#0,PARA1
	MOVL	#256,PARA2
	MOVL	#8,WLPARM
	MOVL	#6,WLPOSN
	RET

ILINIT:
	.WORD	0
	MOVL	#4,DSPCNT
	MOVL	#0,PARA1
	MOVL	#128,PARA2
	MOVL	#4,WLPARM
	MOVL	#11,WLPOSN
	RET

RINIT:
	.WORD	0
	MNEGL	#1,PARA1
	RET

SINGLE:
	.WORD	0
	MOVL	#1,PARA2
	RET

ADDINI:
	.WORD	0
	CLRL	ACCUM
	CLRL	MFLAG
	RET

ACCUML:
	.WORD	0
	CMPL	MFLAG,#0
	BEQL	100$
	SUBL2	TPA$L_NUMBER(AP),ACCUM
	BRB	200$
100$:
	ADDL2	TPA$L_NUMBER(AP),ACCUM
200$:
	CLRL	MFLAG
	RET

GINIT:
	.WORD	0
	MOVL	CURBLK,PARA1
	RET

NINIT:
	.WORD	0
	CLRL	MFLAG
	MOVL	#1,PARA1
	RET

NINITM:
	.WORD	0
	MOVL	#1,MFLAG
	MOVL	#1,PARA1
	RET

NEGATE:
	.WORD	0
	CMPL	MFLAG,#0
	BEQL	100$
	MNEGL	PARA1,PARA1
100$:
	RET

LNULL:
	.WORD	0
	CMPW	LSTRL,#0
	BGTR	100$
	CLRL	R0
	BRB	200$
100$:
	MOVW	LSTRL,QDESC
	MOVAL	LSTR,QDESC+4
200$:
	RET

CNUM:
	.WORD	^M<R2,R3,R4,R5,R6,R7,R8>
	MOVAL	QSTR,R6
	MOVL	R6,QDESC+4
	ADDL3	#1,TPA$L_TOKENCNT(AP),R7
	DIVL2	#2,R7
	MOVW	R7,QDESC
	CMPL	R7,#4
	BLEQ	100$
	SUBL3	#4,R7,R8
	MOVC5	#0,BUFF,#0,R8,(R6)
	ADDL2	R8,R6
	MOVL	#4,R7
100$:
	MOVAL	TPA$L_NUMBER(AP),R8
	ADDL2	R7,R8
200$:
	MOVB	-(R8),(R6)+
	SOBGTR	R7,200$
	MOVL	#1,R0
	RET

CDEC:
	.WORD	0
	MOVL	TPA$L_NUMBER(AP),R1
	CMPL	TPA$L_TOKENCNT(AP),#5
	BGTR	600$
	CMPL	TPA$L_TOKENCNT(AP),#3
	BGTR	400$
	CMPL	R1,#255
	BGTR	400$
	TSTL	MFLAG
	BEQL	300$
	CMPL	R1,#128
	BGTR	400$
	MNEGL	R1,R1
300$:
	MOVB	R1,QSTR
	MOVW	#1,QDESC
	BRB	850$
400$:
	CMPL	R1,#65535
	BGTR	600$
	TSTL	MFLAG
	BEQL	500$
	CMPL	R1,#32768
	BGTR	600$
	MNEGL	R1,R1
500$:
	MOVW	R1,QSTR
	MOVW	#2,QDESC
	BRB	850$
600$:
	TSTL	MFLAG
	BEQL	800$
	TSTL	R1
	BGEQ	700$
	CLRL	R0
	BRB	900$
700$:
	MNEGL	R1,R1
800$:
	MOVL	R1,QSTR
	MOVW	#4,QDESC
850$:
	MOVAL	QSTR,QDESC+4
900$:
	RET

SPACON:
	.WORD	0
	MOVL	#TPA$M_ABBRFM!TPA$M_BLANKS,TPA$L_OPTIONS(AP)
	RET

CSTR:
	.WORD	0
	CMPW	QDESC,#0
	BGTR	100$
	MOVL	#TPA$M_ABBRFM,TPA$L_OPTIONS(AP)
	CLRL	R0
100$:
	RET

TESTQ:
	.WORD	0
	CMPB	TPA$B_CHAR(AP),QCHAR
	BNEQ	100$
	CLRL	R0
100$:
	RET

UCASE:
	.WORD	^M<R2,R3>
	MOVL	TPA$L_STRINGCNT(AP),R2
	BLEQ	900$
	MOVL	TPA$L_STRINGPTR(AP),R3
100$:
	CMPB	(R3),#^A/a/
	BLSS	200$
	CMPB	(R3),#^A/z/
	BGTR	200$
	SUBB2	#^X20,(R3)
200$:
	INCB	R3
	SOBGTR	R2,100$
900$:
	RET

CHAR3:
	.WORD	0
	CMPL	TPA$L_TOKENCNT(AP),#3
	BGEQ	100$
	CLRL	R0
100$:
	RET

GENDESC:
	.WORD	0
	MOVW	TPA$L_STRINGCNT(AP),DESC
	MOVL	TPA$L_STRINGPTR(AP),DESC+4
	RET

LOGDEF:
	.WORD	0
	MOVQ	DEFLOG,DESC
	RET

BDCOMM:
	.WORD	0
	OUTMSG	#BDCL,BDC
	CLRL	JMPADR
	RET
	.PAGE
	.SBTTL	Data definitions
	.PSECT	DATA,LONG

TERM:	.ASCID	/TT/
TT:	.BLKW	1

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

DESC:	.WORD	0
	.WORD	^X010E
	.LONG	0

STATUS: .BLKL	2
OUTDSC: .LONG	100
	.ADDRESS  OUT_BUFF
OUTDSCV: .QUAD	0
OUT_BUFF:  .BLKB  100

TERMCR:	.BYTE	CR
TERMLF:	.BYTE	LF
TERMBUFF:  .BLKB  200

FNFP:	.LONG	0
FNL:	.LONG	0
FNAME:	.BLKB	80
FNQ:	.ASCID	/File name? /

SOLMSG:	.ASCID	/!UL> /
FUNC:	.BLKB	80

BDC:	.ASCII	/Invalid command./
BDCL=.-BDC
INVP:	.ASCII	/Invalid parameter(s)/
INVPL=.-INVP

WWE:	.ASCII	/File accessed with write enabled/
WWEL=.-WWE

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

NEF:	.ASCII	/Can not edit an empty file/
NEFL=.-NEF

RDY:	.ASCII	/Ready/
RDYL=.-RDY

NDIFF:	.ASCII	/No differences./
NDIFFL=.-NDIFF

NFMSG:	.ASCII	/Not found./
NFMSGL=.-NFMSG

NSF:	.ASCII	/File must be SEQUENTIAL in order to use this command./
NSFL=.-NSF

BLKMSG:	.ASCID	/Block !UL/

WHRMSG:	.ASCID	/File !AS - Block !UL/

FNDMSG:	.ASCID	/Find at block !UL, byte !UL/

ADDMSG:	.ASCID	/!SL(10)  !XL(16)/
ADDMSGU: .ASCID	/!UL(10)  !XL(16)/

MAXMSG:	.ASCID	/**Record size of !UL exceeds maximum allowed (!UL)**/

IVT:	.ASCII	/Invalid date-time format/
IVTL=.-IVT

HEXD:	.ASCII	/0123456789ABCDEF/

PBOUT:	.ASCII	/*PB* /
EOF:	.ASCII	/**EOF**/

HELPLIB: .ASCID	/SYS$HELP:VFE.HLB/
HELPFLG: .LONG	HLP$M_PROMPT
HELPWID: .LONG	80
HLPON:	.BYTE	0

DEFLOG:	.ASCID	/VFE.LOG/
TERMON:
DSPFLG:	.BYTE	1
NOLOG:	.BYTE	1

	.ALIGN	LONG

LOGFAB:	$FAB	FAC=PUT,FOP=<MXV,SQO,TEF>,ORG=SEQ,RAT=CR,RFM=VAR,SHR=NIL
LOGRAB:	$RAB	FAB=LOGFAB,RBF=TERMBUFF,RAC=SEQ

TPBLK:	.BLKL	TPA$K_COUNT0
JMPADR:	.LONG	0
STOP:	.BYTE	0
SGNFLG:	.BYTE	1
PARA1:	.LONG	0
	.LONG	0
PARA2:	.LONG	0
REM:	.LONG	0
NPARA1:	.LONG	0
SVSTAT:	.LONG	0
DSPCNT:	.LONG	0
WLPARM:	.LONG	0
WLPOSN:	.LONG	0
R4R5S:	.QUAD	0
R9R10S:	.QUAD	0
FLAG:	.BYTE	0
ACCUM:	.LONG	0
MFLAG:	.LONG	0
QCHAR:	.BYTE	0
QDESC:	.QUAD	0
QSTR:	.BLKB	100

CR=^X0D
LF=^X0A
CZ=^X1A

ERRCOD:	.LONG	0

	.ALIGN	LONG

OPNFAB:	$FAB	FAC=<BIO>,SHR=<GET,PUT,UPI>,NAM=OPNNAM
OPNNAM:	$NAM	RSA=OPNNBK,RSS=200
OPNNBK:	.BLKB	200

CURBLK:	.LONG	1
HIBLK:	.LONG	0
EFBLK:	.LONG	0
FFBYTE:	.LONG	0
VFCSIZE: .LONG	0
VFLAG:	.BYTE	0
RSIZE:	.LONG	0
LBLOCK:	.LONG	0
LBLKCT:	.LONG	0
LPTR:	.ADDRESS  BUFF
ASSFLG:	.BYTE	0
ACCFLG:	.BYTE	0
RDONLY:	.BYTE	1
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
BUFF::	.BLKB	512
LBUFF:	.BLKB	LOCSIZ*512
LSTRL:	.LONG	0
LSTR:	.BLKB	100
SBUFF:	.BLKB	512
XBUFF:	.BLKB	512

	.END	START
