.TITLE REOPEN .IDENT /V01/ .SBTTL DESCRIPTION ; ; ; COMPONENT: REOPEN ; ; DATE: 05-MAR-79 ; ; AUTHOR: GR JOHNSON ; BATTELLE NORTHWEST ; P O BOX 999 ; RICHLAND WA 99352 ; ; SOURCE: MACRO-11 ; ; CALLER: FORTRAN IV-PLUS ; ; CALLING SEQUENCE: ; ; CALL REOPEN(LUN,IFDB,[MODE],[SHARE],[IASV],[ISW]) ; ; LUN = INTEGER CONTAINING A LOGICAL UNIT NUMBER. ; ; IFDB = 23-WORD ARRAY CONTAINING THE FDB. ; ; MODE = LITERAL SPECIFYING TYPE OF ACCESS. ; ; 'UPDATE' FOR READ/WRITE ACCESS [DEFAULT] ; 'READONLY' FOR READ-ONLY ACCESS ; 'APPEND' FOR APPEND ACCESS ; ; SHARE = THE LITERAL 'SHARED' INDICATING SHARED FILE ACCESS. ; ; IASV = INTEGER "ASSOCIATE" VARIABLE FOR DIRECT ACCESS FILES. ; ; ISW = VARIABLE TO RECIEVE THE INTEGER STATUS WORD. ; ; 00 = SUCCESS ; ; -01 = SYNTAX ERROR ; -34 = LUN ALREADY IN USE ; -96 = INVALID LOGICAL UNIT NUMBER ; ; -NN = OTHER FCS ERROR CODE ; ; ; DESCRIPTION: ; ; THE "REOPEN" DIRECTIVE OPENS A FILE BY FILE-ID. THE SUBROUTINE ; UTILIZES A FORTRAN FILE DESCRIPTOR BLOCK SAVED BY THE "GETFDB" ROUTINE. ; ; .SBTTL SYMBOL DEFINITIONS ; ; .PSECT FACC: .WORD 0 ; FILE ACCESS RACC: .WORD 0 ; RECORD ACCESS URBA: .WORD 0 ; ADDR OF USER RECORD BUFFER URBS: .WORD 0 ; ADDR OF USER RECORD BUFFER LENGTH ; UPD: .ASCIZ /UPDATE/ ; 'UPDATE' LITERAL .EVEN ; RDO: .ASCIZ /READONLY/ ; 'READONLY' LITERAL .EVEN ; APD: .ASCIZ /APPEND/ ; 'APPEND' LITERAL .EVEN ; SHR: .ASCIZ /SHARED/ ; 'SHARED' LITERAL .EVEN ; ; .MCALL OTSWA,$AOTS,FBLOCK ; IN [11,40]F4P.MAC .MCALL OFID$ ; OTSWA ; DEFINE OTS OFFSETS FBLOCK ; DEFINE FDB AND FFDB OFFSETS AND BITS ; ; ; REGISTER USAGE: ; ; R0 = ADDR OF FBD ; R1 = ADDR OF FFDB ; R2 = LUN # OR # BYTES TO TRANSFER FOR SOB LOOPS ; R3,R4 = SCRATCH ; R5 = ARGUEMENT POINTER ; ; .SBTTL LOCAL MACRO DEFINITIONS ; ; ; ; COMPARE TWO ASCIZ STRINGS .MACRO CMPSTR STR1,STR2 ; MACRO CMPSTR DEFINITION ; MOV STR1,R3 ; STR1 ADDR TO R3 MOV STR2,R4 ; STR2 ADDR TO R4 CMPB (R3)+,(R4) ; COMPARE CHARACTERS BNE .+6 ; EXIT IF NOT EQUAL TSTB (R4)+ ; TEST FOR END OF STRING BNE .-6 ; NEXT CHARACTER IF NOT ; .ENDM CMPSTR ; ; .SBTTL ENTRY POINT -- TEST INPUT PARAMETERS ; ; ; REOPEN:: ; ; TEST LUN MOV @2(R5),R2 ; GET LUN BGT 4$ ; LUN.GT.0? 2$: JMP IEILU ; NO, ERROR 4$: $AOTS ; ADDR OF IMPURE OTS SECT INTO R3 CMP W.LUNS(R3),R2 ; COMPARE LUN TO TKB OPTION BLT 2$ ; LUN.GT.MAX LUN SPECIFIED DURING TKB? ; ; FETCH USER BUFFER PARAMETERS MOV W.BFAD(R3),URBA ; ADDR OF USER RECORD BUFFER MOV W.BLEN(R3),URBS ; ADDR OF USER RECORD BUFFER LENGTH ; ; TEST LUN OPEN JSR PC,$FCHNL ; GET ADDR OF LUN'S FFDB IN R0 BIT #DV.OPN,D.STAT(R0) ; OPEN? BEQ 6$ ; NO JMP IEALN ; YES, ERROR 6$: MOV R0,R1 ; SAVE FFDB ADDR FOR LATER ADD #D.FDB,R0 ; START OF FDB ; .SBTTL RESTORE FORTRAN FILE DESCRIPTOR ; ; ; ; RESTORE FFDB HEADER MOV #D.FDB,R2 ; BYTE LENGTH OF HEADER MOV 4(R5),R3 ; ADDR OF ARRAY (IFDB) MOV R1,R4 ; ADDR OF FFBD HEADER 10$: MOVB (R3)+,(R4)+ ; MOVE ARRAY TO HEADER SOB R2,10$ ; ; ; CLEAR FDB FOR SAFETY MOV R0,R4 ; START OF FDB MOV #S.FDB,R2 ; BYTE LENGTH OF FDB 12$: CLRB (R4)+ ; CLEAR FDB FOR SAFETY SOB R2,12$ ; ; ; RESTORE FNB MOV R0,R4 ; START OF FDB ADD #F.FNB,R4 ; START OF FNB MOV #S.FNB,R2 ; BYTE LENGTH OF FNB 14$: MOVB (R3)+,(R4)+ ; MOVE ARRAY TO FNB SOB R2,14$ ; ; ; RESTORE MISC FDB ITEMS MOV (R3)+,F.ALOC(R0) ; EXTENSION SIZE (EXTENDSIZE=) MOVB (R3)+,F.MBCT(R0) ; MULTIPLE BUFFER COUNT (BYTE) MOVB (R3)+,F.MBFG(R0) ; MULTIPLE BUFFER FLAG (BYTE) ; ; RESET RECORD COUNT VALUES IN HEADER CLR D.RCNM(R1) ; ZERO RECORD COUNTER (LOW ORDER) CLR D.RCN2(R1) ; ZERO RECORD COUNTER (HIGH ORDER) CLR D.AVAD(R1) ; CLEAR ASSOC. VARIABLE ADDR CMPB #5,@R5 ; ASSOC. VARIABLE PARAMETER? BGT 16$ ; NO TST 12(R5) ; ASSOC. VARIABLE ADDRESS? BLT 16$ ; NO MOV 12(R5),D.AVAD(R1) ; YES, STORE ASSOC. VARIABLE ADDR ; ; RESET MISC STATUS BITS IN HEADER 16$: BIS #DV.OLD,D.STA2(R1) ; FORCE TYPE='OLD' BIC #DV.NEW,D.STA2(R1) ; CLEAR TYPE='NEW' BIC #DV.UNK,D.STA2(R1) ; CLEAR TYPE='UNKNOWN' BIC #DV.AI4,D.STA2(R1) ; CLEAR I*4 ASSOCIATEVARIABLE ; ; RESET MODE STATUS BITS BIC #DV.RDO,D.STA2(R1) ; CLEAR 'READONLY' STATUS BIT BIC #DV.APD,D.STA2(R1) ; CLEAR 'APPEND' STATUS BIT CMPB #3,@R5 ; MODE PARAMETER? BGT 22$ ; NO TST 6(R5) ; MODE LITERAL ADDR? BLT 22$ ; NO CMPSTR #UPD,6(R5) ; 'UPDATE'? BEQ 22$ ; YES, CONTINUE CMPSTR #RDO,6(R5) ; 'READONLY'? BNE 20$ ; NO, TRY 'APPEND' BIS #DV.RDO,D.STA2(R1) ; YES, SET 'READONLY' STATUS BIT BR 22$ ; AND CONTINUE 20$: CMPSTR #APD,6(R5) ; 'APPEND'? BNE IEBAD ; NO, SYNTAX ERROR BIS #DV.APD,D.STA2(R1) ; YES, SET 'APPEND' STATUS BIT ; .SBTTL OPEN FILE BY FILE-ID ; ; ; ; SET UP FILE ACCESS WORD (FACC) 22$: CLR FACC ; CLEAR FILE ACCESS WORD BIT #DV.RDO,D.STA2(R1) ; 'READONLY'? BEQ 24$ ; NO, TRY APPEND BIS #FO.RD,FACC ; YES, SET FACC BIT BR 30$ ; CONTINUE 24$: BIT #DV.APD,D.STA2(R1) ; 'APPEND'? BEQ 26$ ; NO, MUST BE UPDATE BIS #FO.APD,FACC ; YES, SET FACC BIT BR 30$ ; CONTINUE 26$: BIS #FO.UPD,FACC ; MUST BE UPDATE, SET FACC BIT ; ; SET UP FOR SHARED ACCESS 30$: CMPB #4,@R5 ; SHARED PARAMETER? BGT 32$ ; NO TST 10(R5) ; SHARED LITERAL ADDR? BLT 32$ ; NO CMPSTR #SHR,10(R5) ; 'SHARED'? BNE IEBAD ; NO, SYNTAX ERROR BIS #FA.SHR,FACC ; YES, SET FACC BIT ; ; SET UP RECORD ACCESS WORD (RACC) 32$: MOV #FD.PLC,RACC ; DEFAULT RECORD ACCESS IS SEQUENTIAL BIT #DV.DFD,D.STAT(R1) ; RANDOM ACCESS? BEQ 34$ ; NO BIS #FD.RAN,RACC ; YES, SET RACC BIT ; 34$: OFID$ R0,FACC,@2(R5),,,RACC,URBA,URBS ; OPEN FILE BY FILE-ID BCS ERR ; OPEN ERROR CLR R4 ; ISW = SUCCESS ; .SBTTL PROCESS ERRORS AND RETURN TO CALLER ; ; ; SUC: CLR R4 ; SUCCESS BR RTN ; IEBAD: MOV #IE.BAD,R4 ; SYNTAX ERROR BR RTN ; IEILU: MOV #IE.ILU,R4 ; INVALID LUN BR RTN ; IEALN: MOV #IE.ALN,R4 ; LUN ALREADY OPEN BR RTN ; ERR: MOVB F.ERR(R0),R4 ; OPEN FAILURE CLR D.STAT(R1) ; CLEAR STATUS WORD ; ; RTN: CMPB #6,@R5 ; SIX ARGUMENTS? BNE 2$ ; NO, RETURN TO CALLER TST 14(R5) ; NULL ARGUMENT? BLT 2$ ; YES, RETURN TO CALLER MOV R4,@14(R5) ; NO, SET STATUS WORD 2$: RTS PC ; RETURN TO CALLER .END ;