.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 MOVC3 #IVTL,IVT,(R6) POPR #^M 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 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 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 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 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 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 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 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=,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=,SHR=,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