OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 TABLE OF CONTENTS 4- 88 OPEN - OPEN A FILE FOR READ OR WRITE 5- 152 OPENR - OPEN THE FILE FOR READ 6- 204 ONEXT - OPEN THE NEXT WILDCARD FILE 7- 234 OPENW - OPEN FILE FOR WRITE OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 1 1 .TITLE OPEN - OPEN FILES FOR READ/WRITE 2 .IDENT /02.2/ 3 .ENABL LC 4 ;+ 5 ; 6 ; Free software BY 7 ; Project Software & Development, Inc. 8 ; 9 ; This software is furnished for free and may be used and copied as 10 ; desired. This software or any other copies thereof may be provided 11 ; or otherwise made available to any other person. No title to and 12 ; ownership of the software is hereby transferred or allowed. 13 ; 14 ; The information in this software is subject to change without notice 15 ; and should not be construed as a commitment by PROJECT SOFTWARE 16 ; AND DEVELOPMENT, INC. 17 ; 18 ; PROJECT SOFTWARE assumes no responsibility for the use or reliability 19 ; of this software on any equipment whatsoever. 20 ; 21 ; Project Software & Development, Inc. 22 ; 14 Story St. 23 ; Cambridge, Ma. 02138 24 ; 617-661-1444 25 ; 26 ; 27 ; Title: OPEN 28 ; Author: Robin Miller 29 ; Date: February 11, 1982 30 ; 31 ; Description: 32 ; 33 ; This module is called to open a file for read or write. It 34 ; will do all the neccessary syntax checking and parsing of the file 35 ; specification into the File Descriptor Block (FDB). It presumes 36 ; the FDB is setup with all the required information such as the LUN, 37 ; the EFN, the record attributes, and the access mode. 38 ; 39 ; 40 ; Modification History: 41 ; 42 ;- 43 .ENABL AMA 44 45 ; DEBUG = 0 ; DEFINE FOR DDT DEBUGGING 46 47 .MCALL CSI$, CLOSE$, FCSBT$, FDOFF$, NBOFF$ OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 2 49 50 ; Bit and offset definitions. 51 52 000000 CSI$ ; DEFINE CSI OFFSETS 53 54 .IF NDF DEBUG 55 56 000000 FCSBT$ ; DEFINE FCS BITS 57 000000 FDOFF$ DEF$L ; DEFINE FDB OFFSETS 58 000000 NBOFF$ DEF$L ; DEFINE FNB OFFSETS 59 60 .IFF 61 62 .GLOBL WLDFNB, WLDDSD, WLDVER, WLDFLG, CSIBLK 63 64 FCSBT$ DEF$G ; DEFINE FCS BITS GLOBALLY 65 FDOFF$ DEF$G ; DEFINE FDB OFFSETS GLOBALLY 66 NBOFF$ DEF$G ; DEFINE FNB OFFSETS GLOBALLY 67 68 .ENDC OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 3 70 71 ; Command String Interpreter (CSI) block. 72 73 000016 S.WUIC = 14. ; EXTRA BYTES FOR WILDCARD UIC 74 000052 N.WNM2 = 42. ; OFFSET TO DIRECTORY STRING STORAGE 75 001470 NB.SFL = NB.SD1!NB.SD2!NB.SNM!NB.STP!NB.SVR ; WILDCARD BITS 76 77 000000 CSIBLK: .BLKB C.SIZE ; ALLOCATE CSI BUFFER 78 .EVEN 79 80 000054 WLDFNB: .BLKB S.FNB+S.WUIC ; FNB FOR WILDCARD UIC'S 81 82 000130 WLDDSD: .BLKW 6 ; WILDCARDS DATASET DESCRIPTOR 83 84 000144 000000 WLDVER: .WORD 0 ; SPACE TO SAVE ORIGINAL VERISION 85 86 000146 000000 WLDFLG::.WORD 0 ; WILDCARDS ACTIVE FLAG <> 0 = TRUE OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 4 OPEN - OPEN A FILE FOR READ OR WRITE 88 .SBTTL OPEN - OPEN A FILE FOR READ OR WRITE 89 ;+ 90 ; 91 ; OPEN - Open a file for read or write. 92 ; 93 ; This routine calls the CSI routines to check for syntax errors, and if 94 ; there are none, opens the file for append, read, or write. The carry 95 ; bit is returned for both syntax errors from the CSI routines and FCS 96 ; errors from open. The actual error code is in offset F.ERR of the FDB. 97 ; 98 ; The error code IE.BNM (bad file name) is returned in offset F.ERR of the 99 ; file descriptor block if errors are encountered by the CSI routines. 100 ; 101 ; Inputs: 102 ; R0 = the address of the FDB. 103 ; R1 = the address of the FNB. 104 ; R2 = Address of file specification (terminated by NULL). 105 ; R3 = Type of open to perform: 106 ; #'R = open for read. 107 ; #'W = open for write. 108 ; 109 ; Outputs: 110 ; C clear/set = success/failure. 111 ; All registers are preserved. 112 ; 113 ;- 114 000150 004737 000000G OPEN:: CALL $SAVAL ; SAVE ALL REGISTERS 115 000154 005760 000070 TST F.BDB(R0) ; IS THE FILE ALREADY OPEN ? 116 000160 001402 BEQ 10$ ; IF EQ, NO 117 000162 CLOSE$ R0 ; YES, CLOSE IT 118 000166 012704 000026 10$: MOV #C.SIZE/2,R4 ; GET CSI SIZE IN WORDS 119 000172 012705 000000' MOV #CSIBLK,R5 ; SET ADDRESS OF CSI BLOCK 120 000176 005025 20$: CLR (R5)+ ; CLEAR THE CSI BLOCK 121 000200 077402 SOB R4,20$ ; BR UNTIL DONE 122 000202 010004 MOV R0,R4 ; COPY THE FDB ADDRESS 123 000204 010105 MOV R1,R5 ; AND THE FNB ADDRESS 124 000206 012700 000000' MOV #CSIBLK,R0 ; ADDRESS OF CSI BLOCK 125 000212 010260 000004 MOV R2,C.CMLD+2(R0) ; SAVE THE STRING ADDRESS 126 000216 005064 000044 CLR F.DSPT(R4) ; CLEAR THE DATASET POINTER 127 000222 005064 000052 CLR F.ERR(R4) ; INITIALIZE FCS ERROR CODE 128 000226 152764 000000G 000052 BISB #IE.BNM,F.ERR(R4) ; NOW SET IT TO BAD FILE NAME 129 000234 105722 30$: TSTB (R2)+ ; AT END OF THE STRING ? 130 000236 001376 BNE 30$ ; IF NE, NO (LOOP) 131 000240 005302 DEC R2 ; ADJUST FOR THE NULL 132 000242 166002 000004 SUB C.CMLD+2(R0),R2 ; CALCULATE THE BYTE COUNT 133 000246 001412 BEQ 40$ ; IF EQ, DON'T DO CSI 134 000250 010260 000002 MOV R2,C.CMLD(R0) ; AND SAVE IT 135 000254 004737 000000G CALL .CSI1 ; CHECK THE SYNTAX 136 000260 103423 BCS 50$ ; IF CS, BAD SYNTAX 137 000262 112710 000002 MOVB #CS.OUT,(R0) ; SET FOR OUTPUT FILE 138 000266 004737 000000G CALL .CSI2 ; PARSE FILE SPECIFICATION 139 000272 103416 BCS 50$ ; IF CS, ERROR 140 000274 010400 40$: MOV R4,R0 ; RESET THE FDB ADDRESS 141 000276 010501 MOV R5,R1 ; AND THE FNB ADDRESS 142 000300 012760 000006' 000044 MOV #CSIBLK+C.DSDS,F.DSPT(R0) ; POINT TO DATASET DESCRIPTOR 143 000306 122703 000122 CMPB #'R,R3 ; OPEN FILE FOR READ ? 144 000312 001410 BEQ OPENR ; IF EQ, YES OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 4-1 OPEN - OPEN A FILE FOR READ OR WRITE 145 000314 132737 000030 000001' BITB #CS.MOR!CS.WLD,CSIBLK+C.STAT ; WILDCARDS OR MULTIPLE FILES ? 146 000322 001002 BNE 50$ ; IF NE, YES (ILLEGAL FOR WRITE) 147 000324 000137 000566' JMP OPENW ; NO, OPEN IT FOR WRITE 148 149 000330 000261 50$: SEC ; SHOW SYNTAX ERROR 150 000332 000207 RETURN OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 5 OPENR - OPEN THE FILE FOR READ 152 .SBTTL OPENR - OPEN THE FILE FOR READ 153 ;+ 154 ; 155 ; OPENR - Open the file for read (handles wildcards). 156 ; ONEXT - Alternate entry to open next file for wildcards. 157 ; 158 ; This routine is used to open a file or a series of files if wildcards 159 ; are specified. The dataset descriptor pointed to by the FDB is first 160 ; copied to the wildcard dataset descriptor. This is used when wildcards 161 ; are specified in the project or programmer number (UIC). On subsequent 162 ; calls to ONEXT, either the next file specification will be returned, or 163 ; the carry bit will be set to indicate an FCS failure (should be IE.NSF). 164 ; 165 ; Inputs: 166 ; R0 = the address of the FDB. 167 ; R1 = the address of the FNB. 168 ; 169 ; Outputs: 170 ; C bit clear/set = success/failure. 171 ; Presumes registers saved by OPEN routine. 172 ; 173 ;- 174 000334 012702 000006 OPENR:: MOV #6,R2 ; SIZE OF DATASET DESCRIPTOR 175 000340 016003 000044 MOV F.DSPT(R0),R3 ; ADDESS OF DATASET DESCRIPTOR 176 000344 012704 000130' MOV #WLDDSD,R4 ; ADDRESS OF WILDCARD DATASET 177 178 ; Copy the dataset descriptor to the wildcard descriptor. 179 180 000350 012324 10$: MOV (R3)+,(R4)+ ; COPY THE DATASET 181 000352 077202 SOB R2,10$ ; LOOP TILL DONE 182 000354 013702 000000C MOV WLDDSD+N.DIRD,R2 ; GET LENGTH OF DESCRIPTOR 183 000360 001410 BEQ 30$ ; IF EQ, NONE AVAILABLE 184 000362 013703 000000C MOV WLDDSD+N.DIRD+2,R3 ; GET ADDRESS OF DIRECTORY 185 000366 012704 000126' MOV #WLDFNB+N.WNM2,R4 ; ADDRESS OF STRING STORAGE 186 000372 010437 000000C MOV R4,WLDDSD+N.DIRD+2 ; SET NEW STRING ADDRESS 187 188 ; Copy the directory descriptor. 189 190 000376 112324 20$: MOVB (R3)+,(R4)+ ; COPY TO SCRATCH STORAGE 191 000400 077202 SOB R2,20$ ; LOOP TILL DONE 192 193 000402 016002 000044 30$: MOV F.DSPT(R0),R2 ; ADDRESS OF DATASET DESCRIPTOR 194 000406 016003 000046 MOV F.DFNB(R0),R3 ; ADDRESS OF THE DEFAULT FNB 195 000412 012704 000054' MOV #WLDFNB,R4 ; ADDRESS OF THE WILDCARD FNB 196 000416 004737 000000G CALL .WPARS ; PARSE THE CONTROLLING STRING 197 000422 103407 BCS 40$ ; IF CS, FAILURE 198 000424 012737 177777 000146' MOV #-1,WLDFLG ; PRESUME WILDCARDS ACTIVE 199 000432 016137 000016 000144' MOV N.FVER(R1),WLDVER ; SAVE ORIGINAL VERSION # 200 000440 000401 BR ONEXT ; CONTINUE TO DO THE .FIND 201 202 000442 000207 40$: RETURN OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 6 ONEXT - OPEN THE NEXT WILDCARD FILE 204 .SBTTL ONEXT - OPEN THE NEXT WILDCARD FILE 205 206 ; Alternate entry to find next file when doing wildcards. 207 ; Inputs: R0 = the FDB address, R1 = the FNB address. 208 209 000444 005760 000070 ONEXT:: TST F.BDB(R0) ; IS THE FILE ALREADY OPEN ? 210 000450 001402 BEQ 5$ ; IF EQ, NO 211 000452 CLOSE$ R0 ; YES, CLOSE IT 212 000456 112760 000000G 000052 5$: MOVB #IE.NSF,F.ERR(R0) ; PRESUME NO SUCH FILE 213 000464 005737 000146' TST WLDFLG ; ANY WILDCARDS ACTIVE ? 214 000470 001432 BEQ 20$ ; IF EQ, NO 215 000472 032761 001470 000020 BIT #NB.SFL,N.STAT(R1) ; ARE THERE ANY WILDCARDS ? 216 000500 001002 BNE 10$ ; IF NE, YES 217 000502 005037 000146' CLR WLDFLG ; NO, CLEAR THE FLAG 218 219 000506 012702 000054' 10$: MOV #WLDFNB,R2 ; ADDRESS OF WILDCARD FNB 220 000512 016161 000016 000004 MOV N.FVER(R1),N.FID+4(R1) ; COPY OLD VERSION NUMBER 221 000520 013761 000144' 000016 MOV WLDVER,N.FVER(R1) ; RESTORE ORIGINAL VERSION # 222 000526 004737 000000G CALL .FNDNX ; FIND THE NEXT FILE 223 000532 103411 BCS 20$ ; IF CS, WE FAILED 224 000534 105760 000043 TSTB F.FACC(R0) ; IS THE FILE ACCESS SETUP ? 225 000540 001003 BNE 15$ ; IF NE, PRSEUME YES 226 000542 112760 000001 000043 MOVB #FO.RD,F.FACC(R0) ; SETUP THE FDB FOR READ 227 000550 004737 000000G 15$: CALL .OPFNB ; OPEN THE FILE FOR READ 228 000554 000207 RETURN 229 230 000556 005037 000146' 20$: CLR WLDFLG ; NO MORE FILES 231 000562 000261 SEC ; SHOW FAILURE 232 000564 000207 RETURN OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 7 OPENW - OPEN FILE FOR WRITE 234 .SBTTL OPENW - OPEN FILE FOR WRITE 235 ;+ 236 ; 237 ; OPENW - Open a file for write. 238 ; 239 ; This routine is called after the command string interpreter to open 240 ; a new file. 241 ; 242 ; Inputs: 243 ; R0 = the address of the FDB. 244 ; R1 = the address of the FNB. 245 ; 246 ; Outputs: 247 ; C bit clear/set = success/failure. 248 ; Presumes registers are saved by OPEN routine. 249 ; 250 ;- 251 000566 016002 000044 OPENW:: MOV F.DSPT(R0),R2 ; ADDRESS OF DATASET DESCRIPTOR 252 000572 016003 000046 MOV F.DFNB(R0),R3 ; ADDRESS OF THE DEFAULT FNB 253 000576 004737 000000G CALL .PARSE ; PARSE THE FILE SPECIFICATION 254 000602 103410 BCS 20$ ; IF CS, ERROR 255 000604 105760 000043 TSTB F.FACC(R0) ; IS THE FILE ACCESS SETUP ? 256 000610 001003 BNE 10$ ; IF NE, PRESUME YES 257 000612 112760 000116 000043 MOVB #FO.WRT!FA.NSP,F.FACC(R0) ; SETUP THE FDB FOR WRITE 258 000620 004737 000000G 10$: CALL .OPFNB ; OPEN THE FILE FOR WRITE 259 000624 000207 20$: RETURN 260 261 000001 .END OPEN - OPEN FILES FOR READ/WRIT MACRO M1200 24-NOV-82 10:10 PAGE 7-1 SYMBOL TABLE CH.AND= 000001 FA.WRT= 000002 F.ACTL= 000076 F.RCTL= 000017 N.UNIT= 000034 CSIBLK 000000R FD.BLK= 000010 F.ALOC= 000040 F.RSIZ= 000002 N.WNM2= 000052 CS.DIF= 000002 FD.CCL= 000002 F.BBFS= 000062 F.RTYP= 000000 ONEXT 000444RG CS.DVF= 000004 FD.COM= 020000 F.BDB = 000070 F.SEQN= 000100 OPEN 000150RG CS.EQU= 000040 FD.CR = 000002 F.BGBC= 000057 F.SPDV= 000072 OPENR 000334RG CS.INP= 000001 FD.DIR= 000010 F.BKDN= 000026 F.SPUN= 000074 OPENW 000566RG CS.MOR= 000020 FD.FTN= 000001 F.BKDS= 000020 F.STBK= 000036 PAR$$$= 000000 CS.NMF= 000001 FD.F11= 040000 F.BKEF= 000050 F.UNIT= 000136 R.FIX = 000001 CS.OUT= 000002 FD.INS= 000010 F.BKP1= 000051 F.URBD= 000020 R.SEQ = 000003 CS.WLD= 000010 FD.ISP= 002000 F.BKST= 000024 F.VBN = 000064 R.STM = 000004 C.CMLD= 000002 FD.MNT= 100000 F.BKVB= 000064 F.VBSZ= 000060 R.VAR = 000002 C.DEVD= 000006 FD.OSP= 004000 F.CHR = 000075 IE.BNM= ****** GX S.ANM1= 000014 C.DIRD= 000012 FD.PLC= 000004 F.CNTG= 000034 IE.NSF= ****** GX S.ANM2= 000005 C.DSDS= 000006 FD.PRN= 000004 F.DFNB= 000046 NB.ANS= 002000 S.FATT= 000016 C.FILD= 000016 FD.PSE= 010000 F.DSPT= 000044 NB.DEV= 000200 S.FDB = 000140 C.MKW1= 000024 FD.RAH= 000001 F.DVNM= 000134 NB.DIR= 000100 S.FNAM= 000006 C.MKW2= 000026 FD.RAN= 000002 F.EFBK= 000010 NB.NAM= 000004 S.FNB = 000036 C.SIZE= 000054 FD.REC= 000001 F.EFN = 000050 NB.SD1= 000400 S.FNBW= 000017 C.STAT= 000001 FD.RWM= 000001 F.EOBB= 000032 NB.SD2= 001000 S.FNTY= 000004 C.SWAD= 000022 FD.SDI= 000020 F.ERR = 000052 NB.SFL= 001470 S.FTYP= 000002 C.TYPR= 000000 FD.SQD= 000040 F.FACC= 000043 NB.SNM= 000040 S.NFEN= 000020 FA.APD= 000100 FD.TTY= 000004 F.FFBY= 000014 NB.STP= 000020 S.WUIC= 000016 FA.CRE= 000010 FD.WBH= 000002 F.FNAM= 000110 NB.SVR= 000010 WLDDSD 000130R FA.DLK= 001000 FF.CHR= 000005 F.FNB = 000102 NB.TYP= 000002 WLDFLG 000146RG FA.ENB= 100000 FF.NV = 000003 F.FTYP= 000116 NB.VER= 000001 WLDFNB 000054R FA.EXC= 002000 FF.POE= 000002 F.FVER= 000120 NB.WCH= 004000 WLDVER 000144R FA.EXL= 004000 FF.RWD= 000001 F.HIBK= 000004 N.ANM1= 000002 $SAVAL= ****** GX FA.EXT= 000004 FF.RWF= 000006 F.LUN = 000042 N.ANM2= 000024 .CLOSE= ****** G FA.LKL= 002000 FF.SPC= 000004 F.MBCT= 000054 N.DID = 000024 .CSI1 = ****** GX FA.NSP= 000100 FO.APD= 000106 F.MBC1= 000055 N.DIRD= ****** GX .CSI2 = ****** GX FA.POS= 010000 FO.MFY= 000002 F.MBFG= 000056 N.DVNM= 000032 .FNDNX= ****** GX FA.RD = 000001 FO.RD = 000001 F.NRBD= 000024 N.FID = 000000 .OPFNB= ****** GX FA.RWD= 004000 FO.UPD= 000006 F.NREC= 000030 N.FNAM= 000006 .PARSE= ****** GX FA.SEQ= 040000 FO.WRT= 000016 F.OVBS= 000030 N.FTYP= 000014 .WPARS= ****** GX FA.SHR= 000040 FT.ANI= 000001 F.RACC= 000016 N.FVER= 000016 ...GBL= 000000 FA.TMP= 000020 FT.BBF= 000002 F.RATT= 000001 N.NEXT= 000022 ...TPC= 000140 FA.WCK= 020000 FT.MBF= 000004 F.RCNM= 000034 N.STAT= 000020 . ABS. 000000 000 000626 001 ERRORS DETECTED: 0 VIRTUAL MEMORY USED: 10605 WORDS ( 42 PAGES) DYNAMIC MEMORY: 12314 WORDS ( 47 PAGES) ELAPSED TIME: 00:00:23 OPEN,OPEN/-SP=OPEN