.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' .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 .MACRO OUTMSGC ARG1 PUSHL #1 MOVZBL ARG1,-(SP) PUSHAL ARG1+1 CALLS #3,TERMIO .ENDM $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 .globl GETFILE GETFILE:: .jsb_entry 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$B_FAC(R2) 320$: MOVB #,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$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 .globl RELFILE RELFILE:: .jsb_entry 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 .globl READ READ:: .jsb_entry 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 ; .globl READINT READINT:: .jsb_entry 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 .globl TOP TOP:: .jsb_entry 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 .globl NEXT NEXT:: .jsb_entry 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 .globl EOF EOF:: .jsb_entry 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 .globl LAST LAST:: .jsb_entry 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: .jsb_entry 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 .globl NEXTRMS NEXTRMS:: .jsb_entry ADDL3 #1,CURBLK,PARA1 CLRB PRTEOF BSBW READRMS RSB .SBTTL RRDRMS - Reread RMS (SET HEADER) .globl RRDRMS RRDRMS:: .jsb_entry 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) .globl buff BUFFX= .globl CREATE CREATE:: .jsb_entry 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 .globl SETLEN SETLEN:: .jsb_entry 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: .jsb_entry 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: .jsb_entry 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 .globl WRITEDISK WRITEDISK:: .jsb_entry 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 .globl UPDRMS UPDRMS:: .jsb_entry 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 .globl PUTRMS PUTRMS:: .jsb_entry 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 .globl DELETE DELETE:: .jsb_entry 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: .jsb_entry PUSHR #^M 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 #,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 RSB EXTKEY: .jsb_entry 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 .globl KEYREAD KEYREAD:: .jsb_entry 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$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 .globl RFAREAD RFAREAD:: .jsb_entry 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 .globl LOCK LOCK:: .jsb_entry 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: .jsb_entry 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: .jsb_entry 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 .globl REWIND REWIND:: .jsb_entry 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 .globl BACKSPACE BACKSPACE:: .jsb_entry 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 .globl MOVE MOVE:: .jsb_entry 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: .jsb_entry 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 .globl SHOFILE SHOFILE:: .jsb_entry 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: .jsb_entry BLBC R0,100$ MOVZWL FSTATUS,R0 100$: RSB .SBTTL SETPOS - Set file, block pos for tape .globl SETPOS SETPOS:: .jsb_entry 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 .globl SETKEY SETKEY:: .jsb_entry 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 .globl KEYCHK KEYCHK:: .jsb_entry 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,quad DISKD: .WORD 0 .WORD ^X010E .LONG 0 DD: .BLKW 1 FSTATUS: .BLKL 2 .globl FDESC FDESC:: .WORD 0 .WORD ^X010E .LONG 0 .globl FNAME FNAME:: .BLKB NAM$C_MAXRSS .globl FNQ 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 quad 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 .globl CURNAM CURNAM:: .WORD 0 .BLKB NAM$C_MAXRSS .globl BUFTYP BUFTYP:: .BLKL 1 .align quad .globl CURBLK CURBLK:: .LONG 1 LOBLK: .LONG 1 .globl HIBLK HIBLK:: .LONG 0 .globl EFBLK EFBLK:: .LONG 0 .globl FFBYTE FFBYTE:: .LONG 0 .globl CURFIL CURFIL:: .LONG 0 .globl CURBCT CURBCT:: .LONG 512 .globl NXTBCT NXTBCT:: .LONG 0 .globl BUFFCT BUFFCT:: .LONG 1 .globl NBUFCT NBUFCT:: .LONG 0 CUREOF: .BYTE 0 PRTEOF: .BYTE 1 .globl SEQFLG SEQFLG:: .BYTE 0 INDFLG: .BYTE 0 .globl VFLAG VFLAG:: .BYTE 0 .globl RSIZE RSIZE:: .LONG 0 SEGCNT: .LONG 0 .globl VFCSIZE VFCSIZE:: .LONG 0 .globl NOSPNFLG 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 .globl TAPFLG TAPFLG:: .BYTE 0 LOGFLG: .BYTE 0 READFNC: .LONG IO$_READVBLK WRITEFNC: .LONG IO$_WRITEVBLK READLOC: .LONG 0 SKIPTOT: .LONG 0 SKIPCT: .LONG 0 .globl RECMOD RECMOD:: .BYTE 0 FLFLGS: .globl OVRWRT OVRWRT:: .globl OVRFLG OVRFLG:: .BYTE 0 .globl WRTFLG WRTFLG:: .BYTE 0 .globl NOREW NOREW:: .BYTE 0 .globl POSFLG POSFLG:: .BYTE 0 FLSAVE: .LONG 0 .globl RMSFLG RMSFLG:: .BYTE 0 .globl NRFLAG NRFLAG:: .BYTE 0 .globl KEYFLG KEYFLG:: .BYTE 0 .globl CURKRF CURKRF:: .BYTE 0 .globl NEWKRF NEWKRF:: .LONG 0 KEYLEN: .LONG 0 KEYDIF: .BYTE 0 RMSLC: .globl RECLCK RECLCK:: .BYTE 0 .globl RECCHG RECCHG:: .BYTE 0 .globl POSFIL POSFIL:: .LONG 0 .globl POSBLK POSBLK:: .LONG 0 .globl BUGFLG BUGFLG:: .BYTE 0 .globl SKPINC 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 quad HBUFF: FILBLK: .BLKL 256 KEYDFB: .BLKB MINSIZ: .BLKW 255 RFATBL: .BLKB .END