;REMOTE NETWORK FILE ACCESS PROGRAM(RFA.MAC) ; ; PAUL ELKINS 4-SEPT-84 ; ; LOS ALAMOS NATIONAL LAB. ; PO BOX 1663 MS-J957 ; LOS ALAMOS NM 87545 ; 505 667 3502 ; ; ; ;COPYRIGHT, 1984,THE REGENTS OF THE UNIVERSITY OF CALIFORNIA. ;THIS SOFTWARE WAS PRODUCED UNDER A U.S. GOVERNMENT CONTRACT ;(W-7405-ENG-36) BY THE LOS ALAMOS NATIONAL LABORATORY,WHICH ;IS OPERATED BY THE UNIVERSITY OF CALIFORNIA FOR THE U.S. ;DEPARTMENT OF ENERGY. THE U.S. GOVERNMENT IS LICENSED TO USE, ;REPRODUCE, AND DISTRIBUTE THIS SOFTWARE. PERMISSION IS GRANTED ;TO THE PUBLIC TO COPY AND USE THIS SOFTWARE WITHOUT CHARGE, ;PROVIDED THAT THIS NOTICE AND ANY STATEMENT OF AUTHORSHIP ARE ;REPRODUCED ON ALL COPIES. NEITHER THE GOVERNMENT NOR THE ;UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ;ANY LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE. ; ; ;USES DATA SET DESCRIPTOR ; .TITLE RFA .MCALL FSRSZ$,FDBDF$,FDRC$A,FDBK$A,FDOP$A .MCALL NMBLK$,FINIT$,READ$,WAIT$ .MCALL FDOP$R,WRITE$,CLOSE$,EXIT$S .MCALL FDRC$R,FDBK$R,DIR$,QIOW$,QIO$,CMKT$S .MCALL OPEN$,GET$,PUT$,DELET$,FCSBT$ .MCALL RCVD$,SRDA$S,SDAT$,WTLO$S,SETF$S,ASTX$S,MRKT$ .MCALL XQPRCL,XQFTYP,XQFOFF,XQFACC ; .LIST MEB ; FCSBT$ ;DEFINE BIT VALUES FOR FDB PARAMETERS XQPRCL ;DEFINE XQ PROTOCOL PACKET FIELDS XQFTYP ;DEFINE XQ FILE ACCESS TYPE CODES XQFOFF ;DEFINE XQ FILE OFFSETS IN PACKET XQFACC ;DEFINE FILE ACCESS CODES ; L1=1 ;FILE ACCESS LUN L2=2 ;ETHERNET QIO LUN EF1=1 ;FILE ACCESS EVENT FLAG EF2=2 ;ETHERNET QIO EVENT FLAG RECEF=15. ;RECEIVE DATA AST EVENT FLAG WTEF=14. ;TIME OUT EVENT FLAG RCMSK=40000 ;RECEIVE DATA EF MASK WORD WTMSK=20000 ;TIME OUT EF MASK WORD XQMSK=2 ;ETHERNET EF MASK WORD TMMSK=WTMSK!XQMSK ;ETHERNET RECEIVE TIME OUT MASK DLYMSK=RCMSK!WTMSK ;RECEIVE DATA OR TIMEOUT EVENT FLAG MASK LHDR=XQRECL+2 ;HEADER LENGTH IN BYTES LBUF=1000 ;DATA BUFFER LENGTH IN BYTES LBFX=LHDR+LBUF ;TOTAL BUFFER LENGTH LREQ=200 ;REQUEST PACKET LENGTH IN BYTES LACK=100 ;ACKNOWLEDGE PACKET LENGTH IN BYTES NDSPT=4 ;NUMBER OF DSPT ENTRIES LDSPT=NDSPT*4 ;DSPT FIELD SIZE IN BYTES ALLWLD=37 ;WILD CARD BITS(UIC,FNAME,EXT,VER) XQCONR=1 ;XQ: CONNECT REQUEST TYPE CODE XQFERR=44 ;XQ: FILE ACCESS ERROR BLOCK XQEFBK=34 ;EOF BLOCK NUMBER HIGH WORD XQFFBY=40 ;FIRST FREE BYTE ; ; START:: FINIT$ ;INIT FSR AT RUN TIME CLOSE$ #FDB ;FLUSH OUT FDB SRDA$S #RECAST ;SPECIFY RECEIVE DATA AST DIR$ #SDAT ;SYNCRONIZE WITH LWT... DIR$ #TMO ;SETUP TIMEOUT DELAY WTLO$S 0,#DLYMSK ;WAIT FOR REC. DATA/TIMEOUT CMKT$S #WTEF ;CANCEL MARKTIME(USED LATER) DIR$ #RCVD ;GET CONNECT SEND DATA CMP #1,$DSW ;VALID RECEIVE ? BEQ 5$ ;YES CONTINUE JMP EXIT ;NO CONNECT FAILED 5$: JSR PC,SACK ;RETURN CONNECT REQUEST JSR PC,RDPKT ;GET INPUT REQUEST MOV HDR+XQDUIC,R1 ;GET(REMOTE NODE) DEFAULT TASK UIC JSR PC,.WDFUI ;SET DEFAULT UIC JSR PC,.WFOWN ;SET FILE OWNER UIC MOV #STBLK,FDB+F.STBK ;INITIALIZE STATISTICS BLOCK MOV #HDR,R0 ;HDR ADDRESS ADD #XQDSPT,R0 ;DSPT OFFSET MOV #LINE,R1 ;SAVE DSPT/CMDLIN BUFFER MOV #XQDESL/2,R2 ;DSPT+CMDLIN LENGTH 10$: MOV (R0)+,(R1)+ ;XFR CMDLIN+DSPT SOB R2,10$ MOV #NDSPT,R1 ;NUMBER OF DSPT ENTRIES MOV #LINE+2,R0 ;DSPT START ADDRESS 15$: ADD R0,(R0) ;BUILD DSPT ADDRESS CMP (R0)+,(R0)+ ;POINT TO NEXT ENTRY SOB R1,15$ MOV HDR+XQSTYP,R0 ;GET SUB-TYPE CMP R0,#XQDELF ;DELETE ? BNE .+6 ;NO SKIP JMP DELF ;YES CMP R0,#XQDIR ;DIRECTORY ? BNE .+6 ;NO SKIP JMP DIR ;YES CMP R0,#XQOPEN ;OPEN ? BNE .+6 ;NO SKIP JMP OPEN ;YES JSR PC,ERR1 ;ILLEGAL TYPE CODE ; ;OPEN FILE ; OPEN: MOV #FDB,R0 ;GET FDB ADDRESS MOV HDR+XQFST,FSTAT ;SAVE FILE STATUS BIT #FO.RD,FSTAT ;OPEN FOR READ ? BNE 3$ ;YES MOV HDR+XQCNTG,F.CNTG(R0) ;INIT FILE SIZE MOVB HDR+XQRTYP,F.RTYP(R0) ;INIT RECORD TYPE MOVB HDR+XQRATT,F.RATT(R0) ;INIT RECORD ATTRIBUTE MOV HDR+XQRSIZ,F.RSIZ(R0) ;INIT RECORD SIZE 3$: OPEN$ R0,FSTAT,,,,FSTAT+1 ;OPEN FILE BCC .+6 ;SKIP IF NOT ERROR JSR PC,ERR2 ;FILE OPEN ERROR MOV F.EFBK(R0),EFBK ;SAVE EOF BLOCK NUMBER(HIGH) MOV F.EFBK+2(R0),EFBK+2 ;SAVE EOF BLOCK NUMBER(LO) MOV F.FFBY(R0),FFBY ;SAVE FIRST FREE BYTE POINTER BIT #FO.WRT,FSTAT ;OPEN FOR WRITE ? BNE 7$ ;YES MOV STBLK+6,HDR+XQCNTG ;GET FILE SIZE TST STBLK ;CONTIGUOUS BNE 5$ ;YES TST STBLK+2 ;CONTIGUOUS BNE 5$ ;YES NEG HDR+XQCNTG ;NONCONTIGUOUS 5$: MOVB F.RTYP(R0),HDR+XQRTYP ;RECORD TYPE MOVB F.RATT(R0),HDR+XQRATT ;RECORD ATTRIBUTES MOV F.RSIZ(R0),HDR+XQRSIZ ;RECORD SIZE 7$: JSR PC,SACK ;SEND ACKNOWLEDGE BITB #FD.RWM,FSTAT+1 ;BLOCK I/O ? BEQ 10$ ;NO BIT #FO.RD,FSTAT ;READ BLOCK ? BNE RDBLK ;YES BIT #FO.WRT,FSTAT ;WRITE BLOCK ? BNE WRBLK ;YES JSR PC,ERR1 ;BLOCK I/O FUNCTION CODE ERROR 10$: BIT #FO.RD,FSTAT ;READ RECORD ? BNE RDREC ;YES BIT #FO.WRT,FSTAT ;WRITE RECORD ? BNE WRREC ;YES JSR PC,ERR1 ;SEQUENTIAL I/O FUNCTION CODE ERROR ; ;READ BLOCK ; RDBLK: JSR PC,RDPKT ;RECEIVE AND WAIT CMP HDR+XQSTYP,#XQRDBK ;READ BLOCK ? BEQ 5$ ;YES JSR PC,ERR1 ;READ BLOCK TYPE CODE ERROR 5$: READ$ #FDB ;READ BLOCK BCS CKEOF ;CHECK END OF FILE WAIT$ R0 ;WAIT ON I/O JSR PC,SBLK ;SEND BLOCK BR RDBLK ;GET NEXT REQUEST ; ;WRITE BLOCK ; WRBLK: JSR PC,RDPKT ;RECEIVE BLOCK AND WAIT CMP HDR+XQSTYP,#XQWRBK ;WRITE BLOCK ? BEQ 5$ ;YES CMP HDR+XQSTYP,#XQCLSF ;CLOSE FILE ? BNE 4$ ;NO MUST BE AN ERROR JMP CLOS2 ;YES 4$: JSR PC,ERR1 ;WRITE BLOCK TYPE CODE ERROR 5$: WRITE$ #FDB ;WRITE BLOCK BCC .+6 ;OK SKIP JSR PC,ERR2 ;WRITE BLOCK ERROR WAIT$ R0 ;WAIT FOR I/O JSR PC,SACK ;SEND ACKNOWLEDGE BR WRBLK ; ;READ RECORD ; RDREC: JSR PC,RDPKT ;RECEIVE AND WAIT CMP HDR+XQSTYP,#XQRDRC ;READ RECORD ? BEQ 5$ ;YES JSR PC,ERR1 ;READ RECORD TYPE CODE ERROR 5$: GET$ #FDB ;READ RECORD BCS CKEOF ;CHECK END OF FILE WAIT$ R0 ;WAIT FOR I/O JSR PC,SREC ;SEND RECORD BR RDREC CKEOF: CMPB #IE.EOF,F.ERR(R0) ;END OF FILE ? BEQ CLOS1 ;YES JSR PC,ERR2 ;READ FILE ERROR ; ;WRITE RECORD ; WRREC: JSR PC,RDPKT ;RECEIVE AND WAIT CMP HDR+XQSTYP,#XQWRRC ;WRITE RECORD ? BEQ 5$ CMP HDR+XQSTYP,#XQCLSF ;CLOSE FILE ? BEQ CLOSE ;YES JSR PC,ERR1 ;WRITE RECORD TYPE CODE ERROR 5$: PUT$ #FDB,HDR+XQRECL ;WRITE RECORD BCC .+6 ;OK SKIP JSR PC,ERR2 ;WRITE RECORD ERROR WAIT$ R0 ;WAIT FOR I/O JSR PC,SACK ;SEND ACKNOWLEDGE BR WRREC ; ;GET FILE DIRECTORY ; DIR: MOV #FDB,R0 ;GET FDB ADDRESS MOV #FDB+F.FNB,R1 ;GET FILE NAME BLOCK ADDRESS MOV #DSPT,R2 ;GET DATA SET DESC. POINTER ADDRESS CLR R3 ;INDICATE NO DFNB JSR PC,.PARSE ;FILL IN FILE NAME BLOCK 10$: MOV #FDB,R0 ;GET FDB ADDRESS MOV #FDB+F.FNB,R1 ;GET FNB ADDRESS JSR PC,.FIND ;LOCATE DIRECTORY ENTRY BCS 20$ ;DONE ? MOV #FDB+F.FNB,R0 ;GET FNB ADDRESS MOV #BUF,R1 ;GET DATA BUFFER ADDRESS MOV #S.FNBW,R2 ;GET FNB SIZE IN WORDS 15$: MOV (R0)+,(R1)+ ;TRANSFER FNB SOB R2,15$ JSR PC,SDIR ;SEND FNB TO REQUESTER BIT #ALLWLD,XQFST ;ANY WILD CARDS ? BEQ EXIT ;NO JSR PC,RDPKT ;YES WAIT FOR NEW REQUEST BR 10$ ;LOCATE NEXT ENTRY 20$: MOV #XQCLSF,HDR+XQSTYP ;INDICATE DONE JSR PC,SACK ;ACK END OF DIRECTORY BR EXIT ; ;DELETE FILE ; DELF: DELET$ #FDB ;DELETE FILE BCC 5$ JSR PC,ERR2 ;DELETE FILE ERROR 5$: JSR PC,SACK ;SEND ACKNOWLEDGE BR EXIT ; ;CLOSE FILE AND EXIT ; CLOS1: MOV #XQCLSF,HDR+XQSTYP ;CLOSE SUB-TYPE CODE MOV EFBK,HDR+XQEFBK ;GET EOF BLOCK NUMBER(HIGH) MOV EFBK+2,HDR+XQEFBK+2 ;GET EOF BLOCK NUMBER(LO) MOV FFBY,HDR+XQFFBY ;GET FIRST FREE BYTE EXIT1: JSR PC,SACK ;SEND CLOSE REQUEST BR CLOSE CLOS2: MOV HDR+XQEFBK,FDB+F.EFBK ;RESTORE EOF BLOCK NUMBER(HIGH) MOV HDR+XQEFBK+2,FDB+F.EFBK+2 ;RESTORE EOF BLOCK NUMBER(LO) MOV HDR+XQFFBY,FDB+F.FFBY ;RESTORE FIRST FREE BYTE CLOSE: CLOSE$ #FDB ;CLOSE FILE EXIT: EXIT$S ;EXIT ; ;SWAP TO/FROM FIELDS ; SWAP: MOV #HDR,R0 ;GET HDR ADDRESS MOV XQDST+4(R0),R1 ;GET OLD DEST MOV XQSRC+4(R0),XQDST+4(R0) ;GET NEW DEST MOV R1,XQSRC+4(R0) ;GET NEW SOURCE MOV XQDTSK(R0),R1 ;SAVE DEST. TASK NAME(1) MOV XQSTSK(R0),XQDTSK(R0) ;SWAP SRC/DEST. TASK NAME(1) MOV R1,XQSTSK(R0) ;SWAP DEST./SRC TASK NAME(1) MOV XQDTSK+2(R0),R1 ;SAVE DEST. TASK NAME(2) MOV XQSTSK+2(R0),XQDTSK+2(R0) ;SWAP SRC/DEST. TASK NAME(2) MOV R1,XQSTSK+2(R0) ;SWAP DEST./SRC TASK NAME(2) RTS PC ; ;SWAP TO/FROM FIELDS AND SEND PACKET ; SACK: MOV #LACK,R0 ;ACKNOWLEDGE BYTE COUNT BR SPX SREC: MOV FDB+F.NRBD,R0 ;GET RECORD LENGTH MOV R0,HDR+XQRECL ;SAVE RECORD SIZE SR1: ADD #LHDR,R0 ;ADD IN HEADER SIZE BR SPX SDIR: MOV #S.FNB,R0 ;GET FILE NAME BLOCK LENGTH BR SR1 SBLK: MOV #LBFX,R0 ;SEND BLOCK BYTE COUNT SPX: MOV R0,WDPB+Q.IOPL+2 ;QIO BYTE COUNT ASR R0 ;WORD COUNT MOV R0,HDR+XQWC ;PACKET WORD COUNT JSR PC,SWAP ;SWAP TO/FROM FIELDS DIR$ #WDPB ;SEND PACKET RTS PC ; ;RECEIVE PACKET AND WAIT ; RDPKT: DIR$ #RDPB ;ISSUE READ QIO AND WAIT BCS CLOSE ;ETHERNET RECEIVE ERROR EXIT DIR$ #TMO ;START TIME OUT WTLO$S 0,#TMMSK ;WAIT FOR RECEIVE/TIME OUT TST IOSB2 ;TIME OUT ? BEQ CLOSE ;YES EXIT RTS PC ; ;GENERAL ERROR ROUTINE ; ERR1: MOV #-1,R1 ;TYPE OR FUNCTION CODE ERROR BR ERRX ERR2: MOV #-2,R1 ;FILE ACCESS ERROR CODE ERRX: MOV #HDR+XQFERR,R2 ;ERROR CODE BUFFER MOV R1,(R2)+ ;INSERT ERROR CODE IN PACKET MOV F.ERR(R0),(R2)+ ;INSERT FILE ACCESS ERROR CODE MOV $DSW,(R2)+ ;INSERT DIRECTIVE STATUS WORD MOV (SP)+,R1 ;GET PROGRAM ERROR ADDRESS SUB #START,R1 ;MAKE IT RELATIVE MOV R1,(R2)+ ;INSERT RELATIVE ADDRESS NEG HDR+XQSTYP ;INDICATE ERROR TO REMOTE STATION BR EXIT1 ; ;RECEIVE DATA AST ENTRY ; RECAST: SETF$S #RECEF ;SET RECEIVE AST EVENT FLAG ASTX$S ;EXIT AST STATE ; IOSB1: .BLKW 2 ;FILE ACCESS IOSB IOSB2: .BLKW 2 ;ETHERNET IOSB EFBK: .BLKW 2 ;EOF BLOCK NUMBER FFBY: .BLKW 1 ;FIRST FREE BYTE FSTAT: .BLKW 1 ;FILE STATUS WORD(F.FACC/F.RACC) LINE: .BLKB XQDESL ;DSPT + CMDLIN BUFFER DSPT=LINE ;DSPT STARTING ADDRESS CMDLIN=LINE+LDSPT ;CMDLIN STARTING ADDRESS STBLK: .BLKW 5 ;STATISTICS BLOCK RDPB: QIO$ IO.RLB,L2,EF2,,IOSB2,, ;READ QIO DPB WDPB: QIOW$ IO.WLB,L2,EF2,,IOSB2,, ;WRITE QIO DPB SDAT: SDAT$ LWT...,RECBUF RCVD: RCVD$ LWT...,RECBUF TMO: MRKT$ WTEF,12,2 ;EF=14.,DT=TEN SECONDS FSRSZ$ 1 ;INIT. FSR FOR RECORD I/O FDB: FDBDF$ ;ALLOCATE FDB FOR INPUT/OUTPUT FDRC$A FD.RWM ;INIT RECORD ACCESS FDBK$A BUF,512.,,EF1,IOSB1 ;INIT BLOCK ACCESS FDOP$A L1,DSPT,DFNB ;INIT FILE OPEN DFNB: NMBLK$ ,,,SY,0 ;SY0: AS DEFAULT DEVICE XQCON: .WORD XQCONR ;XQ: CONNECT REQUEST TYPE CODE .=XQCON ;MUST IMEADIATELY PRECEED RECBUF RECBUF: .BLKB LBFX+4 ;HEADER + DATA BUFFER HDR=RECBUF+4 BUF=HDR+LHDR ;DATA BUFFER STARTING ADDRESS END:: .END START