diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/IFSFUNC/IFSFILE.ASM | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSFILE.ASM')
| -rw-r--r-- | v4.0/src/CMD/IFSFUNC/IFSFILE.ASM | 1778 |
1 files changed, 1778 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM b/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM new file mode 100644 index 0000000..5b0188f --- /dev/null +++ b/v4.0/src/CMD/IFSFUNC/IFSFILE.ASM | |||
| @@ -0,0 +1,1778 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | ; SCCSID = @(#)ifsfile.asm 1.0 87/05/11 ;AN000; | ||
| 3 | TITLE IFS FILE ROUTINES - Routines for IFS dispatch ;AN000; | ||
| 4 | NAME IFSFILE ;AN000; | ||
| 5 | ;************************************************************************************ | ||
| 6 | ; | ||
| 7 | ; FILE (WFP_START) related Network calls | ||
| 8 | ; | ||
| 9 | ; IFS_DISK_INFO | ||
| 10 | ; IFS_SEQ_SET_FILE_ATTRIBUTE | ||
| 11 | ; IFS_SET_FILE_ATTRIBUTE | ||
| 12 | ; IFS_SEQ_GET_FILE_INFO | ||
| 13 | ; IFS_GET_FILE_INFO | ||
| 14 | ; IFS_SEQ_RENAME | ||
| 15 | ; IFS_RENAME | ||
| 16 | ; IFS_SEQ_DELETE | ||
| 17 | ; IFS_DELETE | ||
| 18 | ; IFS_SEQ_OPEN | ||
| 19 | ; IFS_OPEN | ||
| 20 | ; IFS_SEQ_CREATE | ||
| 21 | ; IFS_CREATE | ||
| 22 | ; IFS_SEQ_XOPEN | ||
| 23 | ; IFS_XOPEN | ||
| 24 | ; IFS_SEQ_SEARCH_FIRST | ||
| 25 | ; IFS_SEQ_SEARCH_NEXT | ||
| 26 | ; IFS_SEARCH_FIRST | ||
| 27 | ; IFS_SEARCH_NEXT | ||
| 28 | ; OPEN_CHECK_SEQ | ||
| 29 | ; | ||
| 30 | ; Programming notes: | ||
| 31 | ; Old redirector segmentation and DOS interface preserved. | ||
| 32 | ; Routine prologues are accurate for input/output. | ||
| 33 | ; However, the pseudocode was not kept up to date. | ||
| 34 | ; Use it for a rough idea of the routine function. | ||
| 35 | ; | ||
| 36 | ; REVISION HISTORY: | ||
| 37 | ; A000 Original version 4.00 - May 1987 | ||
| 38 | ; A001 PTM 316 - Fix search next drive byte interpretation | ||
| 39 | ; Set drive number in DMAADD | ||
| 40 | ; A002 PTM 845 - Disk info ignored | ||
| 41 | ; A003 PTM 869 - Lock failure due to sf_ifs_hdr not set | ||
| 42 | ; A004 DCR 213 - SFT Serial number | ||
| 43 | ; A005 PTM 849 - Printer open problems | ||
| 44 | ; A006 PTM 1518- open mode/flag finalized | ||
| 45 | ; A007 PTM ????- Action Taken not set on Extended open 10/27 FEIGENBAUM | ||
| 46 | ; A008 PTM ????- Old Open/Creates pass parms list 10/27 FEIGENBAUM | ||
| 47 | ; A009 PTM 2247- Delete does not return carry on error 11/3 RG | ||
| 48 | ; A010 PTM 2248- Old Create mode incorrect - must be 2 11/3 RG | ||
| 49 | ; A011 DCR 285 - Remove Extended Attribute/Lock support 1/88 RG | ||
| 50 | ; A012 PTM 3968- set sft time/date on create 3/25/88 RMG | ||
| 51 | ; A013 - sft analysis changes 3/25/88 RMG | ||
| 52 | ; A014 Austin Deviceless Attach problems 3/28/88 RMG | ||
| 53 | ; A015 P4392 SFT change - attr_hi gone 4/19/88 RMG | ||
| 54 | ; A016 P4801 File size segment not right 5/10/88 RMG | ||
| 55 | ; A017 P???? DS not preserved during CALLBACK 5/13/88 RPS | ||
| 56 | ; LOC - 486 | ||
| 57 | ; | ||
| 58 | ;************************************************************************************ | ||
| 59 | |||
| 60 | .xlist ;AN000; | ||
| 61 | .xcref ;AN000; | ||
| 62 | INCLUDE IFSSYM.INC ;AN000; | ||
| 63 | INCLUDE IFSFSYM.INC ;AN000; | ||
| 64 | INCLUDE DOSSYM.INC ;AN000; | ||
| 65 | INCLUDE DEVSYM.INC ;AN000; | ||
| 66 | INCLUDE DOSCNTRY.INC | ||
| 67 | .cref ;AN000; | ||
| 68 | .list ;AN000; | ||
| 69 | ;AN000; | ||
| 70 | AsmVars <IBM, Installed, DEBUG> ;AN000; | ||
| 71 | ;AN000; | ||
| 72 | ; then define the base code segment of the ifsfunc support first ;AN000; | ||
| 73 | ;AN000; | ||
| 74 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 75 | IFSSEG ENDS ;AN000; | ||
| 76 | ;AN000; | ||
| 77 | ; include the rest of the segment definitions for normal MSDOS ;AN000; | ||
| 78 | ;AN000; | ||
| 79 | include dosseg.asm ;AN000; | ||
| 80 | ;AN000; | ||
| 81 | DATA SEGMENT WORD PUBLIC 'DATA' ;AN000; | ||
| 82 | ;DOSGROUP Data ;AN000; | ||
| 83 | Extrn REN_WFP:WORD ;AN000; | ||
| 84 | Extrn WFP_START:WORD ;AN000; | ||
| 85 | Extrn SATTRIB:BYTE ;AN000; | ||
| 86 | Extrn ATTRIB:BYTE ;AN000; | ||
| 87 | Extrn THISCDS:DWORD ;AN000; | ||
| 88 | Extrn THISSFT:DWORD ;AN000; | ||
| 89 | Extrn DMAADD:DWORD ;AN000; | ||
| 90 | Extrn CDSADDR:DWORD ;AN000; | ||
| 91 | Extrn SAVE_BX:WORD ;AN000; | ||
| 92 | Extrn SAVE_CX:WORD ;AN000; | ||
| 93 | Extrn SAVE_DX:WORD ;AN000; | ||
| 94 | Extrn SAVE_SI:WORD ;AN000; | ||
| 95 | Extrn SAVE_DI:WORD ;AN000; | ||
| 96 | Extrn SAVE_DS:WORD ;AN000; | ||
| 97 | Extrn SAVE_ES:WORD ;AN000; | ||
| 98 | Extrn Name1:BYTE ;AN000; | ||
| 99 | Extrn DEVPT:DWORD ;AN000; | ||
| 100 | Extrn CPSWFLAG:BYTE | ||
| 101 | Extrn COUNTRY_CDPG:BYTE | ||
| 102 | if debug ;AN000; | ||
| 103 | Extrn BugLev:WORD ;AN000; | ||
| 104 | Extrn BugTyp:WORD ;AN000; | ||
| 105 | include bugtyp.asm ;AN000; | ||
| 106 | endif ;AN000; | ||
| 107 | DATA ENDS ;AN000; | ||
| 108 | ;AN000; | ||
| 109 | ;AN000; | ||
| 110 | ; define our own code segment ;AN000; | ||
| 111 | ;AN000; | ||
| 112 | IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000; | ||
| 113 | ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000; | ||
| 114 | ;AN000; | ||
| 115 | ;IFS Data ;AN000; | ||
| 116 | Extrn IFSR:WORD ;AN000; | ||
| 117 | Extrn IFSDRV:BYTE ;AN000; | ||
| 118 | Extrn IFSPROC_FLAGS:WORD ;AN000; | ||
| 119 | Extrn UNC_FS_HDR:DWORD ;AN000; | ||
| 120 | Extrn THISIFS:DWORD ;AN000; | ||
| 121 | Extrn THISDFL:DWORD ;AN000; | ||
| 122 | Extrn DEVICE_CB@_OFFSET:WORD ;AN000; | ||
| 123 | Extrn SFT_SERIAL_NUMBER:WORD ;AN004; | ||
| 124 | Extrn fAssign:BYTE ;AN014; | ||
| 125 | ;AN000; | ||
| 126 | BREAK <IFS_DISK_INFO Get disk Info> ;AN000; | ||
| 127 | ;AN000; | ||
| 128 | ;************************************************************************************ ;AN000; | ||
| 129 | ; ;AN000; | ||
| 130 | ; IFS_DISK_INFO ;AN000; | ||
| 131 | ; ;AN000; | ||
| 132 | ; Input: ;AN000; | ||
| 133 | ; ES:DI -> CDS (not NULL) ;AN000; | ||
| 134 | ; DS -> DOSGROUP ;AN000; | ||
| 135 | ; Function: ;AN000; | ||
| 136 | ; Prep IFSRH: ;AN000; | ||
| 137 | ; * IFSR_LENGTH DW 48 ; Total length of request ;AN000; | ||
| 138 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 139 | ; + IFSR_RETCODE DW ? ;AN000; | ||
| 140 | ; + IFSR_RETCLASS DB ? ;AN000; | ||
| 141 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 142 | ; * IFSR_APIFUNC DB 2 ; Disk Attributes ;AN000; | ||
| 143 | ; + IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 144 | ; + IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 145 | ; + IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 146 | ; + IFSR_ALLOWED DB ? ;AN000; | ||
| 147 | ; + IFSR_I24_RETRY DB ? ;AN000; | ||
| 148 | ; + IFSR_I24_RESP DB ? ;AN000; | ||
| 149 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 150 | ; *+ IFSR_DEVICE_CB@ DD ? ; Call CDS_TO_CD to convert CDS to CD ;AN000; | ||
| 151 | ; ; and set this as pointer to it. ;AN000; | ||
| 152 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 153 | ; + IFSR_ALLOCUNITS DW number of allocation units ;AN000; | ||
| 154 | ; + IFSR_ALLOCSIZE DW allocation unit sectors ;AN000; | ||
| 155 | ; + IFSR_SECTSIZE DW sector size ;AN000; | ||
| 156 | ; + IFSR_AVAILALLOC DW free allocation units ;AN000; | ||
| 157 | ; + IFSR_FSID DB file system media id ;AN000; | ||
| 158 | ; IFSR_RESV3 DB 0 ;AN000; | ||
| 159 | ; ;AN000; | ||
| 160 | ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; | ||
| 161 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 162 | ; DO ;AN000; | ||
| 163 | ; Call CD_TO_CDS to update CDS ;AN000; | ||
| 164 | ; Set: ;AN000; | ||
| 165 | ; DX = IFSR_AVAILALLOC ;AN000; | ||
| 166 | ; BX = IFSR_ALLOCUNITS ;AN000; | ||
| 167 | ; CX = IFSR_SECTSIZE ;AN000; | ||
| 168 | ; AL = IFSR_ALLOCSIZE ;AN000; | ||
| 169 | ; AH = IFSR_FSID ;AN000; | ||
| 170 | ; Clear carry ;AN000; | ||
| 171 | ; ENDDO ;AN000; | ||
| 172 | ; ELSE DO ;AN000; | ||
| 173 | ; Put error code in AX ;AN000; | ||
| 174 | ; Set carry ;AN000; | ||
| 175 | ; ENDDO ;AN000; | ||
| 176 | ; ENDIF ;AN000; | ||
| 177 | ; ;AN000; | ||
| 178 | ; Output: ;AN000; | ||
| 179 | ; DX = Number of free allocation units ;AN000; | ||
| 180 | ; BX = Total Number of allocation units on disk ;AN000; | ||
| 181 | ; CX = Sector size ;AN000; | ||
| 182 | ; AL = Sectors per allocation unit ;AN000; | ||
| 183 | ; AH = Media ID BYTE ;AN000; | ||
| 184 | ; Carry set if error ;AN000; | ||
| 185 | ; ;AN000; | ||
| 186 | ; Regs: Segs and DI preserved, others destroyed ;AN000; | ||
| 187 | ; ;AN000; | ||
| 188 | ;************************************************************************************ ;AN000; | ||
| 189 | ;AN000; | ||
| 190 | procedure IFS_DISK_INFO,NEAR ;AN000; | ||
| 191 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 192 | ;AN000; | ||
| 193 | MOV AX,DI ; set ifsDrv for possible I24 ;AN000; | ||
| 194 | invoke IFSDrvFromCDS ;AN000; | ||
| 195 | ;AN000; | ||
| 196 | ifsr_fcn_def EXECAPI ; define ifsr for diskattr ;AN000; | ||
| 197 | ifsr_api_def DISKATTR ;AN000; | ||
| 198 | MOV CS:IFSPROC_FLAGS,ZERO ; & processing flags ;AN000; | ||
| 199 | ;AN000; | ||
| 200 | PUSH ES ; set ds:si -> cds ;AN000; | ||
| 201 | POP DS ;AN000; | ||
| 202 | MOV SI,DI ;AN000; | ||
| 203 | ;AN000; | ||
| 204 | invoke PREP_IFSR ; init ifsr ;AN000; | ||
| 205 | SaveReg <DS,SI> ; save for cd_to_cds ;AN000; | ||
| 206 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 207 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 208 | ; ES:BX -> IFSRH ;AN000; | ||
| 209 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 210 | ; ds - IFSSEG ;AN000; | ||
| 211 | MOV ES:[BX.IFSR_LENGTH],LENGTH_DISKATTR ; prep IFSRH ;AN000; | ||
| 212 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 213 | MOV ES:[BX.IFSR_APIFUNC],IFSDISKATTR ;AN000; | ||
| 214 | ;AN000; | ||
| 215 | invoke CALL_IFS ; call fs with diskattr request ;AN000; | ||
| 216 | ;AN000; | ||
| 217 | JNC DA_20 ;AN000; | ||
| 218 | RestoreReg <DI,ES> ; error - restore stack ;AN000; | ||
| 219 | JMP FA_1000 ; go return ;AN000; | ||
| 220 | DA_20: ;AN000; | ||
| 221 | MOV DX,ES:[BX.IFSR_AVAILALLOC] ; no error - load return regs ;AN000; | ||
| 222 | MOV CX,ES:[BX.IFSR_SECTSIZE] ;AN000; | ||
| 223 | MOV AX,ES:[BX.IFSR_ALLOCSIZE] ;AN000; | ||
| 224 | MOV AH,ES:[BX.IFSR_FSID] ;AN000; | ||
| 225 | MOV BX,ES:[BX.IFSR_ALLOCUNITS] ;AM002; | ||
| 226 | RestoreReg <DI,ES> ; restore cds into es:di ;AN000; | ||
| 227 | invoke CD_TO_CDS ;AN000; | ||
| 228 | CLC ;AN000; | ||
| 229 | JMP FA_1000 ; go ret in file attr routine ;AN000; | ||
| 230 | ; since it restores ds-dosgroup ;AN000; | ||
| 231 | ;AN000; | ||
| 232 | EndProc IFS_DISK_INFO ;AN000; | ||
| 233 | ;AN000; | ||
| 234 | ;AN000; | ||
| 235 | BREAK <IFS_SEQ_SET_FILE_ATTRIBUTE - Seq Set File Attributes> ;AN000; | ||
| 236 | ;AN000; | ||
| 237 | ;************************************************************************************ ;AN000; | ||
| 238 | ; ;AN000; | ||
| 239 | ; IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; | ||
| 240 | ; ;AN000; | ||
| 241 | ; see IFS_GET_FILE_INFO for details ;AN000; | ||
| 242 | ; ;AN000; | ||
| 243 | ;************************************************************************************ ;AN000; | ||
| 244 | ;AN000; | ||
| 245 | procedure IFS_SEQ_SET_FILE_ATTRIBUTE,NEAR ;AN000; | ||
| 246 | ;AN000; | ||
| 247 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 248 | ifsr_api_def FILEATTR ;AN000; | ||
| 249 | ;AN000; | ||
| 250 | PUSH AX ; save file attrs ;AN000; | ||
| 251 | ;AN000; | ||
| 252 | invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; | ||
| 253 | JC SA_20 ; cf=0 unc, cf=1 device ;AN000; | ||
| 254 | ;AN000; | ||
| 255 | PUSH CS ; get addressability to IFSSEG ;AN000; | ||
| 256 | POP DS ; prep ifsflags for set ;AN000; | ||
| 257 | ASSUME DS:IFSSEG ;AN000; | ||
| 258 | MOV IFSPROC_FLAGS,ZERO ;AN000; | ||
| 259 | JMP SHORT SFA_20 ; cont. in ifs_seq_get_fa ;AN000; | ||
| 260 | ;AN000; | ||
| 261 | EndProc IFS_SEQ_SET_FILE_ATTRIBUTE ;AN000; | ||
| 262 | ;AN000; | ||
| 263 | BREAK <IFS_SET_FILE_ATTRIBUTE - Set File Attributes> ;AN000; | ||
| 264 | ;AN000; | ||
| 265 | ;************************************************************************************ ;AN000; | ||
| 266 | ; ;AN000; | ||
| 267 | ; IFS_SET_FILE_ATTRIBUTE ;AN000; | ||
| 268 | ; ;AN000; | ||
| 269 | ; see IFS_GET_FILE_INFO for details ;AN000; | ||
| 270 | ; ;AN000; | ||
| 271 | ;************************************************************************************ ;AN000; | ||
| 272 | ;AN000; | ||
| 273 | procedure IFS_SET_FILE_ATTRIBUTE,NEAR ;AN000; | ||
| 274 | ;AN000; | ||
| 275 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 276 | ifsr_api_def FILEATTR ;AN000; | ||
| 277 | ;AN000; | ||
| 278 | PUSH AX ; save file attrs ;AN000; | ||
| 279 | SA_20: ;AN000; | ||
| 280 | MOV CS:IFSPROC_FLAGS,0 ; prep ifsflags ;AN000; | ||
| 281 | JMP SHORT FA_20 ; cont. in ifs_get_file_info ;AN000; | ||
| 282 | ;AN000; | ||
| 283 | EndProc IFS_SET_FILE_ATTRIBUTE ;AN000; | ||
| 284 | ;AN000; | ||
| 285 | BREAK <IFS_SEQ_GET_FILE_INFO - Seq Get File Attributes> ;AN000; | ||
| 286 | ;AN000; | ||
| 287 | ;************************************************************************************ ;AN000; | ||
| 288 | ; ;AN000; | ||
| 289 | ; IFS_SEQ_GET_FILE_ATTRIBUTE ;AN000; | ||
| 290 | ; ;AN000; | ||
| 291 | ; see IFS_GET_FILE_INFO for details ;AN000; | ||
| 292 | ; ;AN000; | ||
| 293 | ;************************************************************************************ ;AN000; | ||
| 294 | ;AN000; | ||
| 295 | procedure IFS_SEQ_GET_FILE_INFO,NEAR ;AN000; | ||
| 296 | ;AN000; | ||
| 297 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 298 | ifsr_api_def FILEATTR ;AN000; | ||
| 299 | ;AN000; | ||
| 300 | invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; | ||
| 301 | JC FA_10 ; cf=0 unc, cf=1 device ;AN000; | ||
| 302 | ;AN000; | ||
| 303 | PUSH CS ; prep ifsflags for get & seq ;AN000; | ||
| 304 | POP DS ;AN000; | ||
| 305 | ASSUME DS:IFSSEG ;AN000; | ||
| 306 | MOV IFSPROC_FLAGS,ISGET ;AN000; | ||
| 307 | ;AN000; | ||
| 308 | SFA_20: ;AN000; | ||
| 309 | OR IFSPROC_FLAGS,ISSEQ ; SEQ - UNC ;AN000; | ||
| 310 | invoke SET_THISIFS_UNC ; set thisifs = unc ;AN000; | ||
| 311 | invoke PREP_IFSR ; init ifsr ;AN000; | ||
| 312 | JMP SHORT FA_200 ; cont. in ifs_get_file_info ;AN000; | ||
| 313 | ;AN000; | ||
| 314 | EndProc IFS_SEQ_GET_FILE_INFO ;AN000; | ||
| 315 | ;AN000; | ||
| 316 | BREAK <IFS_GET_FILE_INFO - Get File Attributes> ;AN000; | ||
| 317 | ;AN000; | ||
| 318 | ;************************************************************************************ ;AN000; | ||
| 319 | ; ;AN000; | ||
| 320 | ; GET_FILE_INFO ;AN000; | ||
| 321 | ; ;AN000; | ||
| 322 | ; Routines called: DFL_SINGLE_FILE_CHECK ;AN000; | ||
| 323 | ; ;AN000; | ||
| 324 | ; Inputs: ;AN000; | ||
| 325 | ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; | ||
| 326 | ; terminated) ;AN000; | ||
| 327 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 328 | ; (Low word = -1 if NUL CDS (dfl)) ;AN000; | ||
| 329 | ; [SATTRIB] is attribute of search (determines what files may be found) ;AN000; | ||
| 330 | ; AX is new attributes to give to file (already checked for bad bits) ;AN000; | ||
| 331 | ; Function: ;AN000; | ||
| 332 | ; ;AN000; | ||
| 333 | ; IF seq call THEN ;AN000; | ||
| 334 | ; DO ;AN000; | ||
| 335 | ; Set IFS Header pointer to UNC IFS ;AN000; | ||
| 336 | ; Set IFSR_DEVICE_CB@ = null ;AN000; | ||
| 337 | ; ENDDO ;AN000; | ||
| 338 | ; ELSE DO ;AN000; | ||
| 339 | ; IF [THISCDS] .NOT. NULL THEN ;AN000; | ||
| 340 | ; CALL CDS_TO_CD ;AN000; | ||
| 341 | ; ELSE DO ;AN000; | ||
| 342 | ; CALL DFL_SINGLE_FILE_CHECK ;AN000; | ||
| 343 | ; IF have DFL that supports single file fcns THEN ;AN000; | ||
| 344 | ; call DFL_TO_DF ;AN000; | ||
| 345 | ; ELSE set error - device not IFS or no single file support ;AN000; | ||
| 346 | ; ENDIF ;AN000; | ||
| 347 | ; ENDDO ;AN000; | ||
| 348 | ; ENDIF ;AN000; | ||
| 349 | ; ENDDO ;AN000; | ||
| 350 | ; IF no error THEN ;AN000; | ||
| 351 | ; DO ;AN000; | ||
| 352 | ; Prep IFSRH: ;AN000; | ||
| 353 | ; * IFSR_LENGTH DW 66 ; Total length of request ;AN000; | ||
| 354 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 355 | ; + IFSR_RETCODE DW ? ;AN000; | ||
| 356 | ; + IFSR_RETCLASS DB ? ;AN000; | ||
| 357 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 358 | ; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name ;AN000; | ||
| 359 | ; + IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 360 | ; + IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 361 | ; + IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 362 | ; + IFSR_ALLOWED DB ? ;AN000; | ||
| 363 | ; + IFSR_I24_RETRY DB ? ;AN000; | ||
| 364 | ; + IFSR_I24_RESP DB ? ;AN000; | ||
| 365 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 366 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF ;AN000; | ||
| 367 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 368 | ; * IFSR_FUNC DB ? ; 2=get 3=set depends on INT 2FH ;AN000; | ||
| 369 | ; * IFSR_RESV3 DB ? | ||
| 370 | ; * IFSR_SUBFUNC DB 0 ; in-line parms ;AN000; | ||
| 371 | ; * IFSR_RESV4 DB ? | ||
| 372 | ; IFSR_BUFFER1@ DD ? ; not used here | ||
| 373 | ; IFSR_BUFFER2@ DD ? ; not used here | ||
| 374 | ; IFSR_COUNT DW ? ; not used here | ||
| 375 | ; * IFSR_MATCHATTR DW ? ; format 0000000re0advshr ;AN000; | ||
| 376 | ; * IFSR_NAME@ DD ? ; ASCIIZ file name ptr ;AN000; | ||
| 377 | ; + IFSR_SIZE DD ? ; file size ;AN000; | ||
| 378 | ; + IFSR_DATE DW ? ; file date ;AN000; | ||
| 379 | ; + IFSR_TIME DW ? ; file time ;AN000; | ||
| 380 | ; *+ IFSR_ATTR DW ? ; file attribute ;AN000; | ||
| 381 | ; ; format 0000000re0advshr ;AN000; | ||
| 382 | ; ; Set to AX on set ;AN000; | ||
| 383 | ; ;AN000; | ||
| 384 | ; IF set THEN ;AN000; | ||
| 385 | ; DO ;AN000; | ||
| 386 | ; IFSR_FUNC = 3 ;AN000; | ||
| 387 | ; IFSR_ATTR = AX ;AN000; | ||
| 388 | ; ENDDO ;AN000; | ||
| 389 | ; ELSE IFSR_FUNC = 2 ;AN000; | ||
| 390 | ; ENDIF ;AN000; | ||
| 391 | ; CALL routine, CALL_IFS, with pointer to IFS Header ;AN000; | ||
| 392 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 393 | ; DO ;AN000; | ||
| 394 | ; IF cds THEN Call CD_TO_CDS ;AN000; | ||
| 395 | ; IF dfl THEN Call DF_TO_DFL ;AN000; | ||
| 396 | ; IF get THEN ;AN000; | ||
| 397 | ; DO ;AN000; | ||
| 398 | ; AX = IFSR_ATTR ;AN000; | ||
| 399 | ; CX = IFSR_TIME ;AN000; | ||
| 400 | ; DX = IFSR_DATE ;AN000; | ||
| 401 | ; BX:DI = IFSR_SIZE ;AN000; | ||
| 402 | ; ENDDO ;AN000; | ||
| 403 | ; Clear carry ;AN000; | ||
| 404 | ; ENDDO ;AN000; | ||
| 405 | ; ELSE DO ;AN000; | ||
| 406 | ; AX = IFSR_RETCODE ;AN000; | ||
| 407 | ; Set carry ;AN000; | ||
| 408 | ; ENDDO ;AN000; | ||
| 409 | ; ENDIF ;AN000; | ||
| 410 | ; ENDDO ;AN000; | ||
| 411 | ; ELSE Set carry ;AN000; | ||
| 412 | ; ENDIF ;AN000; | ||
| 413 | ; Outputs: ;AN000; | ||
| 414 | ; CARRY CLEAR ;AN000; | ||
| 415 | ; AX = ATTR ;AN000; | ||
| 416 | ; CX = TIME ;AN000; | ||
| 417 | ; DX = DATE ;AN000; | ||
| 418 | ; BX:DI = SIZE ;AN000; | ||
| 419 | ; CARRY SET ;AN000; | ||
| 420 | ; AX is error code ;AN000; | ||
| 421 | ; error_file_not_found ;AN000; | ||
| 422 | ; Last element of path not found ;AN000; | ||
| 423 | ; error_path_not_found ;AN000; | ||
| 424 | ; Bad path (not in curr dir part if present) ;AN000; | ||
| 425 | ; error_access_denied ;AN000; | ||
| 426 | ; Attempt to set an attribute which cannot be set ;AN000; | ||
| 427 | ; (attr_directory, attr_volume_ID) ;AN000; | ||
| 428 | ; error_sharing_violation ;AN000; | ||
| 429 | ; Sharing mode of file did not allow the change ;AN000; | ||
| 430 | ; (this request requires exclusive write/read access) ;AN000; | ||
| 431 | ; (INT 24H generated) ;AN000; | ||
| 432 | ; ;AN000; | ||
| 433 | ; Regs: DS preserved, others destroyed ;AN000; | ||
| 434 | ; ;AN000; | ||
| 435 | ;************************************************************************************ ;AN000; | ||
| 436 | ;AN000; | ||
| 437 | procedure IFS_GET_FILE_INFO,NEAR ;AN000; | ||
| 438 | ;AN000; | ||
| 439 | ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000; | ||
| 440 | ifsr_api_def FILEATTR ;AN000; | ||
| 441 | ;AN000; | ||
| 442 | FA_10: ;AN000; | ||
| 443 | MOV CS:IFSPROC_FLAGS,ISGET ; set for get ;AN000; | ||
| 444 | ;AN000; | ||
| 445 | FA_20: ;AN000; | ||
| 446 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 447 | CMP WORD PTR [THISCDS],NULL_PTR ; determine CDS or DFL ;AN000; | ||
| 448 | JE FA_100 ;AN000; | ||
| 449 | LDS SI,[THISCDS] ;AN000; | ||
| 450 | ASSUME DS:NOTHING ;AN000; | ||
| 451 | TEST CS:IFSPROC_FLAGS,ISGET ;AN000; | ||
| 452 | JZ FA_40 ;AN000; | ||
| 453 | SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000; | ||
| 454 | JMP SHORT FA_60 ;AN000; | ||
| 455 | FA_40: ;AN000; | ||
| 456 | RestoreReg <AX> ; want attr on stack to stay on top ;AN000; | ||
| 457 | SaveReg <DS,SI,AX> ; stack - ax,si,ds ;AN000; | ||
| 458 | ;AN000; | ||
| 459 | FA_60: ;AN000; | ||
| 460 | invoke PREP_IFSR ; clear ifsrh ;AN000; | ||
| 461 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 462 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 463 | ; ES:BX -> IFSRH ;AN000; | ||
| 464 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 465 | ; DS - IFSSEG ;AN000; | ||
| 466 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 467 | JMP FA_200 ;AN000; | ||
| 468 | ;AN000; | ||
| 469 | FA_100: ;AN000; | ||
| 470 | invoke DFL_SINGLE_FILE_CHECK ; DFL: sets [THISIFS] ;AN000; | ||
| 471 | ; ES:BX -> IFSRH ;AN000; | ||
| 472 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 473 | ; DS - IFSSEG ;AN000; | ||
| 474 | JNC SHORT FA_200 ;AN000; | ||
| 475 | MOV AX,error_invalid_function ; error - invalid fcn ;AN000; | ||
| 476 | invoke SET_EXTERR_INFO ; set error info & ;AN000; | ||
| 477 | JMP FA_980 ; go return ;AN000; | ||
| 478 | ;AN000; | ||
| 479 | FA_200: ;AN000; | ||
| 480 | invoke DRIVE_FROM_CDS ; set IFSDrv for possible I24 ;AN000; | ||
| 481 | ;AN000; | ||
| 482 | MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; continue prepping ifsr ;AN000; | ||
| 483 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 484 | MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000; | ||
| 485 | TEST IFSPROC_FLAGS,ISGET ;AN000; | ||
| 486 | JNZ FA_220 ;AN000; | ||
| 487 | MOV ES:[BX.IFSR_FUNC],FUNC_SET_BY_NAME ;AN000; | ||
| 488 | POP ES:[BX.IFSR_ATTR] ; retrieve attr from stack ;AN000; | ||
| 489 | JMP SHORT FA_240 ;AN000; | ||
| 490 | FA_220: ;AN000; | ||
| 491 | MOV ES:[BX.IFSR_FUNC],FUNC_GET_BY_NAME ; get file info ;AN000; | ||
| 492 | ;AN000; | ||
| 493 | FA_240: ;AN000; | ||
| 494 | PUSH DS ; save ds - IFSSEG ;AN000; | ||
| 495 | PUSH SS ; get ds = dosgroup so can access ;AN000; | ||
| 496 | POP DS ; wfp_start, sattrib ;AN000; | ||
| 497 | ASSUME DS:DOSGROUP ;AN000; | ||
| 498 | ;AN000; | ||
| 499 | MOV SI,[WFP_START] ;AN000; | ||
| 500 | invoke STRIP_WFP_START ;AN000; | ||
| 501 | MOV ES:WORD PTR [BX.IFSR_NAME@],SI ; ifsr_name@ ;AN000; | ||
| 502 | MOV ES:WORD PTR [BX.IFSR_NAME@+2],DS ;AN000; | ||
| 503 | MOV AL,[SATTRIB] ;AN000; | ||
| 504 | XOR AH,AH ;AN000; | ||
| 505 | MOV ES:[BX.IFSR_MATCHATTR],AX ; ifsr_matchattr ;AN000; | ||
| 506 | ;AN000; | ||
| 507 | POP DS ; restore ds=IFSSEG ;AN000; | ||
| 508 | ASSUME DS:IFSSEG ;AN000; | ||
| 509 | |||
| 510 | ;************************************************ | ||
| 511 | invoke CALL_IFS ; call ifs with file attr request ;AN000; | ||
| 512 | ;************************************************ | ||
| 513 | ;AN000; | ||
| 514 | JNC FA_260 ;AN000; | ||
| 515 | TEST IFSPROC_FLAGS,ISCDS ; request failed - ;AN000; | ||
| 516 | JZ FA_980 ; go set carry & return ;AN000; | ||
| 517 | ADD SP,4 ; if cds, restore stack first ;AN000; | ||
| 518 | JMP FA_980 ;AN000; | ||
| 519 | ;AN000; | ||
| 520 | FA_260: ; request successful ;AN000; | ||
| 521 | TEST IFSPROC_FLAGS,ISGET ; if get - prep return regs with ;AN000; | ||
| 522 | JZ FA_270 ; file info ;AN000; | ||
| 523 | MOV AX,ES:[BX.IFSR_ATTR] ;AN000; | ||
| 524 | MOV CX,ES:[BX.IFSR_TIME] ;AN000; | ||
| 525 | MOV DX,ES:[BX.IFSR_DATE] ;AN000; | ||
| 526 | MOV DI,ES:WORD PTR [BX.IFSR_SIZE] ;AN000; | ||
| 527 | MOV BX,ES:WORD PTR [BX.IFSR_SIZE+2] ;AC016; | ||
| 528 | FA_270: ;AN000; | ||
| 529 | TEST IFSPROC_FLAGS,ISCDS ; if cds - update cds w/cd ;AN000; | ||
| 530 | JZ FA_280 ;AN000; | ||
| 531 | RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000; | ||
| 532 | invoke CD_TO_CDS ; cd-cds ;AN000; | ||
| 533 | JMP SHORT FA_990 ; go clc & return ;AN000; | ||
| 534 | FA_280: ;AN000; | ||
| 535 | TEST IFSPROC_FLAGS,ISSEQ ;AN000; | ||
| 536 | JNZ FA_990 ;AN000; | ||
| 537 | invoke DF_TO_DFL ; update dfl w/df ;AN000; | ||
| 538 | JMP SHORT FA_990 ;AN000; | ||
| 539 | ;AN000; | ||
| 540 | FA_980: ;AN000; | ||
| 541 | STC ;AN000; | ||
| 542 | JMP SHORT FA_1000 ;AN000; | ||
| 543 | FA_990: ;AN000; | ||
| 544 | CLC ;AN000; | ||
| 545 | FA_1000: ;AN000; | ||
| 546 | PUSH SS ; restore original ds (dosgroup) ;AN000; | ||
| 547 | POP DS ; since this routine preserves ds ;AN000; | ||
| 548 | return ;AN000; | ||
| 549 | ;AN000; | ||
| 550 | ;AN000; | ||
| 551 | EndProc IFS_GET_FILE_INFO ;AN000; | ||
| 552 | ;AN000; | ||
| 553 | BREAK <IFS_SEQ_RENAME Rename> ;AN000; | ||
| 554 | ;************************************************************************************ ;AN000; | ||
| 555 | ; ;AN000; | ||
| 556 | ; IFS_SEQ_RENAME ;AN000; | ||
| 557 | ; ;AN000; | ||
| 558 | ; see ifs_rename for details ;AN000; | ||
| 559 | ; ;AN000; | ||
| 560 | ;************************************************************************************ ;AN000; | ||
| 561 | procedure IFS_SEQ_RENAME,NEAR ;AN000; | ||
| 562 | ;AN000; | ||
| 563 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 564 | ifsr_api_def RENFILE ;AN000; | ||
| 565 | ;AN000; | ||
| 566 | MOV CS:IFSPROC_FLAGS,ISREN ; set for rename and cont. ;AN000; | ||
| 567 | JMP SHORT SD_10 ; in ifs_seq_delete ;AN000; | ||
| 568 | ;AN000; | ||
| 569 | ;AN000; | ||
| 570 | EndProc IFS_SEQ_RENAME ;AN000; | ||
| 571 | ;AN000; | ||
| 572 | ;AN000; | ||
| 573 | BREAK <IFS_RENAME Rename> ;AN000; | ||
| 574 | ;AN000; | ||
| 575 | ;************************************************************************************ ;AN000; | ||
| 576 | ; ;AN000; | ||
| 577 | ; IFS_RENAME ;AN000; | ||
| 578 | ; ;AN000; | ||
| 579 | ; Inputs: ;AN000; | ||
| 580 | ; [WFP_START] Points to SOURCE WFP string ("//" must be first 2 ;AN000; | ||
| 581 | ; chars, NUL terminated) ;AN000; | ||
| 582 | ; [REN_WFP] Points to DEST WFP string ("//" must be first 2 ;AN000; | ||
| 583 | ; chars, NUL terminated) ;AN000; | ||
| 584 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 585 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 586 | ; Function: ;AN000; | ||
| 587 | ; same processing as delete except for following parms: ;AN000; | ||
| 588 | ; * IFSR_LENGTH DB 48 ;AN000; | ||
| 589 | ; * IFSR_APIFUNC DB 7 ; Rename file ;AN000; | ||
| 590 | ; * IFSR_NAME1@ DD ? ; addr of WFP_START ;AN000; | ||
| 591 | ; * IFSR_NAME2@ DD ? ; addr of REN_WFP ;AN000; | ||
| 592 | ; ;AN000; | ||
| 593 | ; Outputs: ;AN000; | ||
| 594 | ; CARRY CLEAR ;AN000; | ||
| 595 | ; OK ;AN000; | ||
| 596 | ; CARRY SET ;AN000; | ||
| 597 | ; AX is error code ;AN000; | ||
| 598 | ; error_file_not_found ;AN000; | ||
| 599 | ; No match for source, or dest path invalid ;AN000; | ||
| 600 | ; error_not_same_device ;AN000; | ||
| 601 | ; Source and dest are on different devices ;AN000; | ||
| 602 | ; error_access_denied ;AN000; | ||
| 603 | ; Directory specified (not simple rename), ;AN000; | ||
| 604 | ; Device name given, Destination exists. ;AN000; | ||
| 605 | ; NOTE: In third case some renames may have ;AN000; | ||
| 606 | ; been done if metas. ;AN000; | ||
| 607 | ; error_path_not_found ;AN000; | ||
| 608 | ; Bad path (not in curr dir part if present) ;AN000; | ||
| 609 | ; SOURCE ONLY ;AN000; | ||
| 610 | ; error_sharing_violation ;AN000; | ||
| 611 | ; Deny both access required, generates an INT 24. ;AN000; | ||
| 612 | ; DS preserved, others destroyed ;AN000; | ||
| 613 | ; ;AN000; | ||
| 614 | ;************************************************************************************ ;AN000; | ||
| 615 | ;AN000; | ||
| 616 | procedure IFS_RENAME,NEAR ;AN000; | ||
| 617 | ;AN000; | ||
| 618 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 619 | ifsr_api_def RENFILE ;AN000; | ||
| 620 | ;AN000; | ||
| 621 | MOV CS:IFSPROC_FLAGS,ISREN ; set for rename ;AN000; | ||
| 622 | JMP SHORT D_20 ; processing continues in ifs_delete ;AN000; | ||
| 623 | ;AN000; | ||
| 624 | EndProc IFS_RENAME ;AN000; | ||
| 625 | ;AN000; | ||
| 626 | ;AN000; | ||
| 627 | BREAK <IFS_SEQ_DELETE Delete> ;AN000; | ||
| 628 | ;AN000; | ||
| 629 | ;************************************************************************************ ;AN000; | ||
| 630 | ; ;AN000; | ||
| 631 | ; IFS_SEQ_DELETE ;AN000; | ||
| 632 | ; ;AN000; | ||
| 633 | ; see ifs_delete for details ;AN000; | ||
| 634 | ; ;AN000; | ||
| 635 | ;************************************************************************************ ;AN000; | ||
| 636 | procedure IFS_SEQ_DELETE,NEAR ;AN000; | ||
| 637 | ;AN000; | ||
| 638 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 639 | ifsr_api_def DELFILE ;AN000; | ||
| 640 | ;AN000; | ||
| 641 | MOV IFSPROC_FLAGS,0 ; Clear IFS processing flags ;AN000; | ||
| 642 | SD_10: ;AN000; | ||
| 643 | invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; | ||
| 644 | JC D_20 ; cf=0 unc, cf=1 device ;AN000; | ||
| 645 | ;AN000; | ||
| 646 | SD_20: ; welcome ifs_seq_rename code ;AN000; | ||
| 647 | PUSH CS ;AN000; | ||
| 648 | POP DS ;AN000; | ||
| 649 | ASSUME DS:IFSSEG ;AN000; | ||
| 650 | OR IFSPROC_FLAGS,ISSEQ ; SEQ - UNC ;AN000; | ||
| 651 | invoke SET_THISIFS_UNC ; set [THISIFS] = UNC IFS ;AN000; | ||
| 652 | JMP SHORT D_30 ; cont. in ifs_delete ;AN000; | ||
| 653 | ;AN000; | ||
| 654 | EndProc IFS_SEQ_DELETE ;AN000; | ||
| 655 | ;AN000; | ||
| 656 | ;AN000; | ||
| 657 | BREAK <IFS_DELETE Delete> ;AN000; | ||
| 658 | ;AN000; | ||
| 659 | ;************************************************************************************ ;AN000; | ||
| 660 | ; ;AN000; | ||
| 661 | ; IFS_DELETE ;AN000; | ||
| 662 | ; ;AN000; | ||
| 663 | ; Called by: IFSFUNC Dispatcher ;AN000; | ||
| 664 | ; ;AN000; | ||
| 665 | ; Routines called: CDS_TO_CD ;AN000; | ||
| 666 | ; CD_TO_CDS CALL_IFS ;AN000; | ||
| 667 | ; ;AN000; | ||
| 668 | ; Inputs: ;AN000; | ||
| 669 | ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; | ||
| 670 | ; terminated) ;AN000; | ||
| 671 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 672 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 673 | ; Function: ;AN000; | ||
| 674 | ; IF INT 2FH call .NOT. SEQ version THEN ;AN000; | ||
| 675 | ; DO ;AN000; | ||
| 676 | ; IF [THISCDS] .NOT. NULL THEN ;AN000; | ||
| 677 | ; DO ;AN000; | ||
| 678 | ; CALL CDS_TO_CD ;AN000; | ||
| 679 | ; Set IFS_DEVICE_CB@ as pointer to CD ;AN000; | ||
| 680 | ; Set IFS_HDR_PTR = CURDIR_IFS_HDR ;AN000; | ||
| 681 | ; ENDDO ;AN000; | ||
| 682 | ; ELSE DO ;AN000; | ||
| 683 | ; Set AX = invalid function ;AN000; | ||
| 684 | ; Set extended error info ;AN000; | ||
| 685 | ; ENDDO ;AN000; | ||
| 686 | ; ENDIF ;AN000; | ||
| 687 | ; ENDDO ;AN000; | ||
| 688 | ; ELSE DO ;AN000; | ||
| 689 | ; Set IFS_DEVICE_CB@ to NULL ;AN000; | ||
| 690 | ; Set IFS_HDR_PTR = [UNC_FS_HDR] ;AN000; | ||
| 691 | ; ENDDO ;AN000; | ||
| 692 | ; ENDIF ;AN000; | ||
| 693 | ; IF no error THEN ;AN000; | ||
| 694 | ; DO ;AN000; | ||
| 695 | ; Prep IFSRH: ;AN000; | ||
| 696 | ; * IFSR_LENGTH DW 44 ; Total length of request ;AN000; | ||
| 697 | ; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000; | ||
| 698 | ; + IFSR_RETCODE DW ? ;AN000; | ||
| 699 | ; + IFSR_RETCLASS DB ? ;AN000; | ||
| 700 | ; IFSR_RESV1 DB 16 DUP(0) ;AN000; | ||
| 701 | ; * IFSR_APIFUNC DB 6 ; Delete file ;AN000; | ||
| 702 | ; + IFSR_ERROR_CLASS DB ? ;AN000; | ||
| 703 | ; + IFSR_ERROR_ACTION DB ? ;AN000; | ||
| 704 | ; + IFSR_ERROR_LOCUS DB ? ;AN000; | ||
| 705 | ; + IFSR_ALLOWED DB ? ;AN000; | ||
| 706 | ; + IFSR_I24_RETRY DB ? ;AN000; | ||
| 707 | ; + IFSR_I24_RESP DB ? ;AN000; | ||
| 708 | ; IFSR_RESV2 DB ? ;AN000; | ||
| 709 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD ;AN000; | ||
| 710 | ; IFSR_OPEN_CB@ DD ? ;AN000; | ||
| 711 | ; * IFSR_MATCHATTR DW ? ; attribute - format 00000000e0a00shr ;AN000; | ||
| 712 | ; * IFSR_NAME@ DD ? ; filename to delete ;AN000; | ||
| 713 | ; ;AN000; | ||
| 714 | ; Call routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR ;AN000; | ||
| 715 | ; IF IFSR_RETCODE = 0 THEN ;AN000; | ||
| 716 | ; DO ;AN000; | ||
| 717 | ; Call CD_TO_CDS or DF_TO_DFL ;AN000; | ||
| 718 | ; Clear carry ;AN000; | ||
| 719 | ; ENDDO ;AN000; | ||
| 720 | ; ELSE DO ;AN000; | ||
| 721 | ; AX = IFSR_RETCODE ;AN000; | ||
| 722 | ; Set carry ;AN000; | ||
| 723 | ; ENDDO ;AN000; | ||
| 724 | ; ENDIF ;AN000; | ||
| 725 | ; ENDDO ;AN000; | ||
| 726 | ; ELSE set carry ;AN000; | ||
| 727 | ; ENDIF ;AN000; | ||
| 728 | ; ;AN000; | ||
| 729 | ; Outputs: ;AN000; | ||
| 730 | ; CARRY CLEAR ;AN000; | ||
| 731 | ; OK ;AN000; | ||
| 732 | ; CARRY SET ;AN000; | ||
| 733 | ; AX is error code ;AN000; | ||
| 734 | ; error_file_not_found ;AN000; | ||
| 735 | ; Last element of path not found ;AN000; | ||
| 736 | ; error_path_not_found ;AN000; | ||
| 737 | ; Bad path ;AN000; | ||
| 738 | ; error_access_denied ;AN000; | ||
| 739 | ; Attempt to delete device or directory ;AN000; | ||
| 740 | ; DS preserved, others destroyed ;AN000; | ||
| 741 | ; ;AN000; | ||
| 742 | ;************************************************************************************ ;AN000; | ||
| 743 | ;AN000; | ||
| 744 | procedure IFS_DELETE,NEAR ;AN000; | ||
| 745 | ;AN000; | ||
| 746 | ifsr_fcn_def EXECAPI ;AN000; | ||
| 747 | ifsr_api_def DELFILE ;AN000; | ||
| 748 | ;AN000; | ||
| 749 | MOV CS:IFSPROC_FLAGS,ZERO ; Clear IFS processing flags ;AN000; | ||
| 750 | ;AN000; | ||
| 751 | D_20: ; (Welcome ifs_ren) ;AN000; | ||
| 752 | ASSUME DS:DOSGROUP ;AN000; | ||
| 753 | invoke DRIVE_FROM_CDS ; ds - dosgroup ;AN000; | ||
| 754 | CMP WORD PTR [THISCDS],NULL_PTR ; CDS must not be null ;AN000; | ||
| 755 | JNE D_30 ;AN000; | ||
| 756 | MOV AX,error_invalid_function ;AN000; | ||
| 757 | invoke SET_EXTERR_INFO ;AN000; | ||
| 758 | JMP FA_980 ; go up, preserve ds, ret w/carry ;AN000; | ||
| 759 | D_30: ; (Welcome seq ren/del code) ;AN000; | ||
| 760 | invoke PREP_IFSR ; zero ifsr, es:bx -> ifsr ;AN000; | ||
| 761 | MOV SI,[WFP_START] ;AN000; | ||
| 762 | invoke STRIP_WFP_START ;AN000; | ||
| 763 | TEST CS:IFSPROC_FLAGS,ISREN ;AN000; | ||
| 764 | JZ D_40 ; rename ;AN000; | ||
| 765 | MOV ES:WORD PTR [BX.IFSR_NAME1@],SI ; ifsr_name1@ & 2@ ;AN000; | ||
| 766 | MOV ES:WORD PTR [BX.IFSR_NAME1@+2],DS ;AN000; | ||
| 767 | MOV SI,[REN_WFP] ;AN000; | ||
| 768 | CMP BYTE PTR DS:[SI+1],":" ;AN000; | ||
| 769 | JNE D_36 ;AN000; | ||
| 770 | ADD SI,2 ;AN000; | ||
| 771 | D_36: ;AN000; | ||
| 772 | MOV ES:WORD PTR [BX.IFSR_NAME2@],SI ;AN000; | ||
| 773 | MOV ES:WORD PTR [BX.IFSR_NAME2@+2],DS ;AN000; | ||
| 774 | MOV ES:[BX.IFSR_LENGTH],LENGTH_RENFILE ; ifsr_length ;AN000; | ||
| 775 | MOV ES:[BX.IFSR_APIFUNC],IFSRENFILE ; ifsr_apifunc ;AN000; | ||
| 776 | JMP SHORT D_60 ;AN000; | ||
| 777 | D_40: ; delete ;AN000; | ||
| 778 | MOV ES:WORD PTR [BX.IFSR_NAME@],SI ; ifsr_name@ ;AN000; | ||
| 779 | MOV ES:WORD PTR [BX.IFSR_NAME@+2],DS ;AN000; | ||
| 780 | MOV ES:[BX.IFSR_LENGTH],LENGTH_DELFILE ; ifsr_length ;AN000; | ||
| 781 | MOV ES:[BX.IFSR_APIFUNC],IFSDELFILE ; ifsr_apifunc ;AN000; | ||
| 782 | D_60: ;AN000; | ||
| 783 | MOV AL,[SATTRIB] ;AN000; | ||
| 784 | XOR AH,AH ;AN000; | ||
| 785 | MOV ES:[BX.IFSR_MATCHATTR],AX ; ifsr_matchattr ;AN000; | ||
| 786 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ; ifsr_function ;AN000; | ||
| 787 | ;AN000; | ||
| 788 | TEST CS:IFSPROC_FLAGS,ISSEQ ; if unc, don't do cds stuff ;AN000; | ||
| 789 | JNZ D_70 ;AN000; | ||
| 790 | LDS SI,[THISCDS] ;AN000; | ||
| 791 | ASSUME DS:NOTHING ;AN000; | ||
| 792 | SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000; | ||
| 793 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 794 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 795 | ; ES:BX -> IFSRH ;AN000; | ||
| 796 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 797 | ; ds - IFSSEG ;AN000; | ||
| 798 | ;AN000; | ||
| 799 | D_70: ;AN000; | ||
| 800 | invoke CALL_IFS ; call ifs w/request ;AN000; | ||
| 801 | ;AN000; | ||
| 802 | JNC D_80 ;AN000; | ||
| 803 | TEST IFSPROC_FLAGS,ISSEQ ; fs error - restore stack ;AN000; | ||
| 804 | JZ D_75 ; if not unc - go ret ;AN000; | ||
| 805 | JMP FA_980 ;AC009; | ||
| 806 | D_75: ;AN000; | ||
| 807 | ADD SP,4 ;AN000; | ||
| 808 | JMP FA_980 ;AC009; | ||
| 809 | ;AN000; | ||
| 810 | D_80: ;AN000; | ||
| 811 | TEST IFSPROC_FLAGS,ISSEQ ; fs successful ;AN000; | ||
| 812 | JZ D_90 ; if seq, just ret ;AN000; | ||
| 813 | JMP FA_990 ;AN000; | ||
| 814 | D_90: ; else - ;AN000; | ||
| 815 | RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000; | ||
| 816 | invoke CD_TO_CDS ;AN000; | ||
| 817 | JMP FA_990 ; go up & ret in fa to preserve ds ;AN000; | ||
| 818 | ;AN000; | ||
| 819 | ;AN000; | ||
| 820 | EndProc IFS_DELETE ;AN000; | ||
| 821 | ;AN000; | ||
| 822 | BREAK <IFS_SEQ_OPEN Open> ;AN000; | ||
| 823 | ;************************************************************************************ ;AN000; | ||
| 824 | ; see IFS_OPEN for details ;AN000; | ||
| 825 | ;************************************************************************************ ;AN000; | ||
| 826 | ;AN000; | ||
| 827 | procedure IFS_SEQ_OPEN,NEAR ;AN000; | ||
| 828 | ;AN000; | ||
| 829 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 830 | ifsr_api_def OPENFILE ;AN000; | ||
| 831 | ;AN000; | ||
| 832 | PUSH AX ; save access/share byte ;AN000; | ||
| 833 | ;AN000; | ||
| 834 | MOV CS:IFSPROC_FLAGS,ISOLDOPEN ; remember this is old open ;AN000; | ||
| 835 | JMP SHORT SXO_10 ; cont. in ifs_seq_xopen ;AN000; | ||
| 836 | ;AN000; | ||
| 837 | EndProc IFS_SEQ_OPEN ;AN000; | ||
| 838 | ;AN000; | ||
| 839 | BREAK <IFS_OPEN Open> ;AN000; | ||
| 840 | ;AN000; | ||
| 841 | ;************************************************************************************ ;AN000; | ||
| 842 | ; ;AN000; | ||
| 843 | ; IFS_OPEN ;AN000; | ||
| 844 | ; ;AN000; | ||
| 845 | ; Inputs: ;AN000; | ||
| 846 | ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL ;AN000; | ||
| 847 | ; terminated) ;AN000; | ||
| 848 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 849 | ; [THISSFT] Points to SFT to fill in if file found ;AN000; | ||
| 850 | ; (sf_mode field set so that FCB may be detected) ;AN000; | ||
| 851 | ; ES:DI = [THISSFT] ;AN000; | ||
| 852 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 853 | ; AX is Access and Sharing mode ;AN000; | ||
| 854 | ; High NIBBLE of AL (Sharing Mode) ;AN000; | ||
| 855 | ; sharing_compat file is opened in compatibility mode ;AN000; | ||
| 856 | ; sharing_deny_none file is opened Multi reader, Multi writer ;AN000; | ||
| 857 | ; sharing_deny_read file is opened Only reader, Multi writer ;AN000; | ||
| 858 | ; sharing_deny_write file is opened Multi reader, Only writer ;AN000; | ||
| 859 | ; sharing_deny_both file is opened Only reader, Only writer ;AN000; | ||
| 860 | ; Low NIBBLE of AL (Access Mode) ;AN000; | ||
| 861 | ; open_for_read file is opened for reading ;AN000; | ||
| 862 | ; open_for_write file is opened for writing ;AN000; | ||
| 863 | ; open_for_both file is opened for both reading and writing. ;AN000; | ||
| 864 | ; ;AN000; | ||
| 865 | ; For FCB SFTs AL should = -1 ;AN000; | ||
| 866 | ; (not checked) ;AN000; | ||
| 867 | ; Function: ;AN000; | ||
| 868 | ; see IFS_XOPEN ;AN000; | ||
| 869 | ; Outputs: ;AN000; | ||
| 870 | ; sf_ref_count is NOT altered ;AN000; | ||
| 871 | ; CARRY CLEAR ;AN000; | ||
| 872 | ; THISSFT filled in. ;AN000; | ||
| 873 | ; CARRY SET ;AN000; | ||
| 874 | ; AX is error code ;AN000; | ||
| 875 | ; error_file_not_found ;AN000; | ||
| 876 | ; Last element of path not found ;AN000; | ||
| 877 | ; error_path_not_found ;AN000; | ||
| 878 | ; Bad path ;AN000; | ||
| 879 | ; error_access_denied ;AN000; | ||
| 880 | ; Attempt to open read only file for writting, or ;AN000; | ||
| 881 | ; open a directory ;AN000; | ||
| 882 | ; error_sharing_violation ;AN000; | ||
| 883 | ; The sharing mode was correct but not allowed ;AN000; | ||
| 884 | ; generates an INT 24 on compatibility mode SFTs ;AN000; | ||
| 885 | ; Regs: DS preserved, others destroyed ;AN000; | ||
| 886 | ; ;AN000; | ||
| 887 | ;************************************************************************************ ;AN000; | ||
| 888 | ;AN000; | ||
| 889 | procedure IFS_OPEN,NEAR ;AN000; | ||
| 890 | ;AN000; | ||
| 891 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 892 | ifsr_api_def OPENFILE ;AN000; | ||
| 893 | ;AN000; | ||
| 894 | PUSH AX ; save access/share mode ;AN000; | ||
| 895 | ;AN000; | ||
| 896 | MOV CS:IFSPROC_FLAGS,ISOLDOPEN ; set for old open ;AN000; | ||
| 897 | JMP SHORT XO_20 ; Rest of processing in ;AN000; | ||
| 898 | ; extended open routine. ;AN000; | ||
| 899 | EndProc IFS_Open ;AN000; | ||
| 900 | ;AN000; | ||
| 901 | BREAK <IFS_SEQ_CREATE Open> ;AN000; | ||
| 902 | ;AN000; | ||
| 903 | ;************************************************************************************ ;AN000; | ||
| 904 | ; ;AN000; | ||
| 905 | ; IFS_SEQ_CREATE ;AN000; | ||
| 906 | ; ;AN000; | ||
| 907 | ; see IFS_CREATE for details ;AN000; | ||
| 908 | ; ;AN000; | ||
| 909 | ;************************************************************************************ ;AN000; | ||
| 910 | ;AN000; | ||
| 911 | procedure IFS_SEQ_CREATE,NEAR ;AN000; | ||
| 912 | ;AN000; | ||
| 913 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 914 | ifsr_api_def OPENFILE ;AN000; | ||
| 915 | ;AN000; | ||
| 916 | PUSH AX ; save attribute ;AN000; | ||
| 917 | ;AN000; | ||
| 918 | MOV CS:IFSPROC_FLAGS,IsOldCreate + IsCreate ; remember is old create ;AN012; | ||
| 919 | JMP SHORT SXO_10 ; cont. in ifs_seq_xopen ;AN000; | ||
| 920 | ;AN000; | ||
| 921 | EndProc IFS_SEQ_CREATE ;AN000; | ||
| 922 | ;AN000; | ||
| 923 | BREAK <IFS_CREATE Create> ;AN000; | ||
| 924 | ;AN000; | ||
| 925 | ;************************************************************************************ ;AN000; | ||
| 926 | ; ;AN000; | ||
| 927 | ; IFS_CREATE ;AN000; | ||
| 928 | ; ;AN000; | ||
| 929 | ; Inputs: ;AN000; | ||
| 930 | ; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL ;AN000; | ||
| 931 | ; terminated) ;AN000; | ||
| 932 | ; [CURR_DIR_END] Points to end of Current dir part of string ;AN000; | ||
| 933 | ; ( = -1 if current dir not involved, else ;AN000; | ||
| 934 | ; Points to first char after last "/" of current dir part) ;AN000; | ||
| 935 | ; [THISCDS] Points to CDS being used ;AN000; | ||
| 936 | ; [THISSFT] Points to SFT to fill in if file created ;AN000; | ||
| 937 | ; (sf_mode field set so that FCB may be detected) ;AN000; | ||
| 938 | ; ES:DI = [THISSFT] ;AN000; | ||
| 939 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 940 | ; AL is Attribute to create ;AN000; | ||
| 941 | ; AH is 0 if CREATE, non zero if CREATE_NEW ;AN000; | ||
| 942 | ; Function: ;AN000; | ||
| 943 | ; See IFS_XOPEN for details ;AN000; | ||
| 944 | ; Outputs: ;AN000; | ||
| 945 | ; sf_ref_count is NOT altered ;AN000; | ||
| 946 | ; CARRY CLEAR ;AN000; | ||
| 947 | ; THISSFT filled in. ;AN000; | ||
| 948 | ; sf_mode = sharing_compat + open_for_both for Non-FCB SFT ;AN000; | ||
| 949 | ; CARRY SET ;AN000; | ||
| 950 | ; AX is error code ;AN000; | ||
| 951 | ; error_path_not_found ;AN000; | ||
| 952 | ; Bad path (not in curr dir part if present) ;AN000; | ||
| 953 | ; error_access_denied ;AN000; | ||
| 954 | ; Attempt to re-create read only file , or ;AN000; | ||
| 955 | ; create a second volume id or create a dir ;AN000; | ||
| 956 | ; error_sharing_violation ;AN000; | ||
| 957 | ; The sharing mode was correct but not allowed ;AN000; | ||
| 958 | ; generates an INT 24 ;AN000; | ||
| 959 | ; Regs: DS preserved, others destroyed ;AN000; | ||
| 960 | ; ;AN000; | ||
| 961 | ;************************************************************************************ ;AN000; | ||
| 962 | ;AN000; | ||
| 963 | procedure IFS_CREATE,NEAR ;AN000; | ||
| 964 | ;AN000; | ||
| 965 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 966 | ifsr_api_def OPENFILE ;AN000; | ||
| 967 | ;AN000; | ||
| 968 | PUSH AX ; save attribute ;AN000; | ||
| 969 | ;AN000; | ||
| 970 | MOV CS:IFSPROC_FLAGS,ISOLDCREATE ; remember is old create ;AN000; | ||
| 971 | JMP SHORT XO_20 ; cont. in ifs_xopen ;AN000; | ||
| 972 | ;AN000; | ||
| 973 | EndProc IFS_Create ;AN000; | ||
| 974 | ;AN000; | ||
| 975 | ;AN000; | ||
| 976 | BREAK <IFS_SEQ_XOPEN Open> ;AN000; | ||
| 977 | ;AN000; | ||
| 978 | ;************************************************************************************ ;AN000; | ||
| 979 | ; ;AN000; | ||
| 980 | ; IFS_SEQ_XOPEN ;AN000; | ||
| 981 | ; ;AN000; | ||
| 982 | ; see IFS_XOPEN for details ;AN000; | ||
| 983 | ; ;AN000; | ||
| 984 | ;************************************************************************************ ;AN000; | ||
| 985 | ;AN000; | ||
| 986 | procedure IFS_SEQ_XOPEN,NEAR ;AN000; | ||
| 987 | ;AN000; | ||
| 988 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 989 | ifsr_api_def OPENFILE ;AN000; | ||
| 990 | ;AN000; | ||
| 991 | MOV IFSPROC_FLAGS,0 ; Clear IFS processing flags ;AN000; | ||
| 992 | SXO_10: ;AN000; | ||
| 993 | invoke CHECK_SEQ ; check if this is unc or ifs device ;AN000; | ||
| 994 | JC XO_20 ; cf=0 unc, cf=1 device ;AN000; | ||
| 995 | ;AN000; | ||
| 996 | SXO_20: ;AN000; | ||
| 997 | PUSH CS ; ds-ifsseg ;AN000; | ||
| 998 | POP DS ;AN000; | ||
| 999 | ASSUME DS:IFSSEG ;AN000; | ||
| 1000 | ;AN000; | ||
| 1001 | OR IFSPROC_FLAGS,ISSEQ ; SEQ = UNC ;AN000; | ||
| 1002 | invoke SET_THISIFS_UNC ; set [THISIFS] = UNC IFS ;AN000; | ||
| 1003 | invoke PREP_IFSR ; zero out ifsr ;AN000; | ||
| 1004 | JMP XO_200 ; cont. in ifs_xopen ;AN000; | ||
| 1005 | ;AN000; | ||
| 1006 | EndProc IFS_SEQ_XOPEN ;AN000; | ||
| 1007 | ;AN000; | ||
| 1008 | ;AN000; | ||
| 1009 | BREAK <IFS_XOPEN Open> ;AN000; | ||
| 1010 | ;AN000; | ||
| 1011 | ;************************************************************************************ | ||
| 1012 | ; | ||
| 1013 | ; IFS_XOPEN | ||
| 1014 | ; | ||
| 1015 | ; Called by: IFSFUNC dispatcher | ||
| 1016 | ; | ||
| 1017 | ; Routines called: CALL_IFS DFL_MATCH | ||
| 1018 | ; CD_TO_CDS DFL_TO_DF | ||
| 1019 | ; CDS_TO_CD DF_TO_DFL | ||
| 1020 | ; SFT_TO_SFF | ||
| 1021 | ; SF_TO_SFT | ||
| 1022 | ; | ||
| 1023 | ; Inputs: | ||
| 1024 | ; [THISCDS] Set | ||
| 1025 | ; [THISSFT] Set | ||
| 1026 | ; [SAVE_DX] = FLAG: FUNCTION CONTROL, FORMAT=0000000C NNNN EEEE | ||
| 1027 | ; C 0=VALIDATE CODE PAGE, 1=NO CODE PAGE CHECK | ||
| 1028 | ; NNNN=DOES NOT EXIST ACTION: 0=FAIL, 1=CREATE | ||
| 1029 | ; EEEE=EXISTS ACTION : 0=FAIL, 1=OPEN, 2=REPLACE/OPEN | ||
| 1030 | ; [SAVE_BX] = MODE OPEN MODE FORMAT : 0WF00000ISSS0AAA | ||
| 1031 | ; AAA = ACCESS CODE: 0=READ, 1=WRITE, 2=READ/WRITE | ||
| 1032 | ; 3=EXECUTE (UNDOCUMENTED) | ||
| 1033 | ; 7=FCB (UNDOCUMENTED) | ||
| 1034 | ; SSS=SHARING MODE : 0=COMPATIBILITY, 1=DENY READ/WRITE | ||
| 1035 | ; 2=DENY WRITE, 3=DENY READ, | ||
| 1036 | ; 4=DENY NONE | ||
| 1037 | ; I 0=PASS HANDLE TO CHILD, 1=NO INHERIT | ||
| 1038 | ; F 0=INT 24H, 1=RETURN ERROR | ||
| 1039 | ; ON THIS OPEN AND ANY IO TO THIS HANDLE | ||
| 1040 | ; W 0=NO COMMIT, 1=AUTO-COMMIT ON WRITE | ||
| 1041 | ; AX = ATTR SEARCH/CREATE ATTRIBUTE | ||
| 1042 | ; [SAVE_DS]:[SAVE_SI] = Full path name | ||
| 1043 | ; [SAVE_ES]:[SAVE_DI] = Parameter list | ||
| 1044 | ; Null list if DI=-1 | ||
| 1045 | ; | ||
| 1046 | ; Function: | ||
| 1047 | ; IF SEQ THEN | ||
| 1048 | ; prep for UNC | ||
| 1049 | ; ELSE DO | ||
| 1050 | ; IF [THISCDS] .NOT. NULL THEN | ||
| 1051 | ; DO | ||
| 1052 | ; Call CDS_TO_CD | ||
| 1053 | ; Set IFSR_DEVICE_CB@ as pointer to CD | ||
| 1054 | ; Set IFS pointer to CURDIR_IFSR_HDR | ||
| 1055 | ; DFL_FLAG = 0 | ||
| 1056 | ; ENDDO | ||
| 1057 | ; ELSE DO | ||
| 1058 | ; Call DFL_TO_DF | ||
| 1059 | ; Set IFSR_DEVICE_CB@ as pointer to DF | ||
| 1060 | ; Set IFS pointer to DFL_IFSR_HDR | ||
| 1061 | ; DFL_FLAG = 1 | ||
| 1062 | ; ENDDO | ||
| 1063 | ; ENDIF | ||
| 1064 | ; ENDDO | ||
| 1065 | ; ENDIF | ||
| 1066 | ; Prep IFSRH: | ||
| 1067 | ; * IFSR_LENGTH DW 62 ; Request length | ||
| 1068 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1069 | ; + IFSR_RETCODE DW ? | ||
| 1070 | ; + IFSR_RETCLASS DB ? | ||
| 1071 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1072 | ; * IFSR_APIFUNC DB 9 ; Open/Create File | ||
| 1073 | ; + IFSR_ERROR_CLASS DB ? | ||
| 1074 | ; + IFSR_ERROR_ACTION DB ? | ||
| 1075 | ; + IFSR_ERROR_LOCUS DB ? | ||
| 1076 | ; + IFSR_ALLOWED DB ? | ||
| 1077 | ; + IFSR_I24_RETRY DB ? | ||
| 1078 | ; + IFSR_I24_RESP DB ? | ||
| 1079 | ; IFSR_RESV2 DB ? | ||
| 1080 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF | ||
| 1081 | ; *+ IFSR_OPEN_CB@ DD ? ; convert SFT to SFF | ||
| 1082 | ; ; and set this as pointer to it. | ||
| 1083 | ; * IFSR_MODE DW ? ; BX - open mode | ||
| 1084 | ; * IFSR_FLAG DW ? ; AL | ||
| 1085 | ; * IFSR_CP DW ? ; Global code page | ||
| 1086 | ; * IFSR_CPSW DB 0 ; Code page switch flag | ||
| 1087 | ; IFSR_RESV3 DB 0 | ||
| 1088 | ; * IFSR_NAME@ DD ? ; ptr to full asciiz filename | ||
| 1089 | ; * IFSR_PARMS@ DD ? ; ES:DI | ||
| 1090 | ; * IFSR_MATCHATTR DW ? ; CX | ||
| 1091 | ; + IFSR_ACTION DW 0 ; Action taken code: 1=file opened | ||
| 1092 | ; ; 2=file created/opened | ||
| 1093 | ; ; 3=file replaced/opened | ||
| 1094 | ; | ||
| 1095 | ; CALL routine, CALL_IFS, with IFS pointer | ||
| 1096 | ; IF IFSR_RETCODE = 0 THEN | ||
| 1097 | ; DO | ||
| 1098 | ; IF DFL_FLAG = 0 THEN | ||
| 1099 | ; Call CD_TO_CDS | ||
| 1100 | ; ELSE Call DF_TO_DFL | ||
| 1101 | ; Call SF_TO_SFT | ||
| 1102 | ; CX = IFSR_ACTION | ||
| 1103 | ; ENDDO | ||
| 1104 | ; ELSE DO /* error */ | ||
| 1105 | ; AX = IFSR_RETCODE | ||
| 1106 | ; Set carry | ||
| 1107 | ; ENDDO | ||
| 1108 | ; ENDIF | ||
| 1109 | ; | ||
| 1110 | ; Outputs: | ||
| 1111 | ; CX=ACTION TAKEN CODE | ||
| 1112 | ; 1 = FILE OPENED | ||
| 1113 | ; 2 = FILE CREATED/OPENED | ||
| 1114 | ; 3 = FILE REPLACED/OPENED | ||
| 1115 | ; sf_ref_count is NOT altered | ||
| 1116 | ; THISSFT filled in or updated | ||
| 1117 | ; AX set on error: | ||
| 1118 | ; error_file_not_found | ||
| 1119 | ; Last element of path not found | ||
| 1120 | ; error_path_not_found | ||
| 1121 | ; Bad path | ||
| 1122 | ; error_access_denied | ||
| 1123 | ; Attempt to open read only file for writing, | ||
| 1124 | ; or open a directory | ||
| 1125 | ; error_sharing_violation | ||
| 1126 | ; The sharing mode was correct but not allowed | ||
| 1127 | ; generates an INT 24 on compatibility mode SFTs | ||
| 1128 | ; DS preserved, others destroyed | ||
| 1129 | ; | ||
| 1130 | ;************************************************************************************ | ||
| 1131 | ;AN000; | ||
| 1132 | procedure IFS_XOPEN,NEAR ;AN000; | ||
| 1133 | ;AN000; | ||
| 1134 | ifsr_fcn_def EXECAPI ; define ifsr for open/create ;AN000; | ||
| 1135 | ifsr_api_def OPENFILE ;AN000; | ||
| 1136 | ;AN000; | ||
| 1137 | PUSH AX ; srch attr/create attr | ||
| 1138 | MOV CS:IFSPROC_FLAGS,ZERO ; Clear IFS processing flags ;AN000; | ||
| 1139 | JMP SHORT XO_25 ;AN008; BAF | ||
| 1140 | ;AN000; | ||
| 1141 | XO_20: ; (welcome all old open/create calls) ;AN000; | ||
| 1142 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1143 | MOV [SAVE_DI],-1 ; set no parms list on old calls ;AN008; BAF | ||
| 1144 | XO_25: ;AN008; BAF | ||
| 1145 | invoke PREP_IFSR ; zero out ifsr ;AN000; | ||
| 1146 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1147 | ;AN000; | ||
| 1148 | LEA SI,COUNTRY_CDPG ; load cp and cpsw ;AN000; | ||
| 1149 | MOV AX,DS:[SI.ccDosCodePage] ; | ;AN000; | ||
| 1150 | MOV ES:[BX.IFSR_CP],AX ; | ;AN000; | ||
| 1151 | MOV AL,[CPSWFLAG] ; | ;AN000; | ||
| 1152 | MOV ES:[BX.IFSR_CPSW],AL ; | ;AN000; | ||
| 1153 | |||
| 1154 | CMP WORD PTR [THISCDS],NULL_PTR ; determine CDS or DFL ;AN000; | ||
| 1155 | JE XO_100 ;AN000; | ||
| 1156 | ;AN000; | ||
| 1157 | LDS SI,[THISCDS] ; cds--cds--cds--cds--cds--cds ;AN000; | ||
| 1158 | MOV AX,SI ; set ifsDrv for possible I24 ;AN000; | ||
| 1159 | invoke IFSDrvFromCDS ;AN000; | ||
| 1160 | RestoreReg <AX> ; must have ax 1st on stack ;AN000; | ||
| 1161 | SaveReg <DS,SI,AX> ; cds ptr, attr ;AN000; | ||
| 1162 | XO_60: ;AN000; | ||
| 1163 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 1164 | ; ES:BX -> IFSRH ;AN000; | ||
| 1165 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1166 | ; ds - IFSSEG ;AN000; | ||
| 1167 | OR IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1168 | JMP SHORT XO_200 ; go prep IFSRH ;AN000; | ||
| 1169 | ;AN000; | ||
| 1170 | XO_100: ;AN000; | ||
| 1171 | SaveReg <ES> ; if deviceless attach, skip device stuff;AN014; | ||
| 1172 | LES DI,CS:[THISDFL] ;AN014; | ||
| 1173 | CMP WORD PTR [THISDFL],NULL_PTR ;AN014; | ||
| 1174 | RestoreReg <ES> ;AN014; | ||
| 1175 | JNE XO_110 ;AN014; | ||
| 1176 | OR CS:IFSPROC_FLAGS,IsSeq ;AN014; | ||
| 1177 | CMP CS:[fAssign],ZERO | ||
| 1178 | JNE XO_200 | ||
| 1179 | ADD SP,2 | ||
| 1180 | MOV AX,72 | ||
| 1181 | JMP XO_120 ;AN014; | ||
| 1182 | XO_110: ;AN014; | ||
| 1183 | invoke DFL_SINGLE_FILE_CHECK ; DFL: sets [THISIFS] ;AN000; | ||
| 1184 | ; ES:BX -> IFSRH ;AN000; | ||
| 1185 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1186 | ; ds - IFSSEG ;AN000; | ||
| 1187 | JNC XO_200 ;AN000; | ||
| 1188 | ;;;;;;;;TEST IFSPROC_FLAGS,ISOLDOPEN+ISOLDCREATE ; new open also pushes ax ;AD014; | ||
| 1189 | ;;;;;;;;JZ XO_120 ; dfl error ;AD014; | ||
| 1190 | ADD SP,2 ; get saved ax off stack if old ;AN000; | ||
| 1191 | ;XO_120: ;AD014; | ||
| 1192 | MOV AX,error_invalid_function ; set error info and quit ;AN000; | ||
| 1193 | XO_120: ;AN014; | ||
| 1194 | invoke SET_EXTERR_INFO ;AN000; | ||
| 1195 | JMP FA_980 ; ret up in FA to preserve DS ;AN000; | ||
| 1196 | ;AN000; | ||
| 1197 | XO_200: ; (welcome seq open/create) ;AN000; | ||
| 1198 | Context DS ; get addressability to dosgroup ;AN000; | ||
| 1199 | invoke SFT_TO_SFF ; SFT: sets IFSR_OPEN_CB@ ;AN000; | ||
| 1200 | ; ES:BX -> IFSRH ;AN000; | ||
| 1201 | ; ds - IFSSEG ;AN000; | ||
| 1202 | MOV ES:[BX.IFSR_LENGTH],LENGTH_OPENFILE ; prep IFRH ;AN000; | ||
| 1203 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 1204 | MOV ES:[BX.IFSR_APIFUNC],IFSOPENFILE ;AN000; | ||
| 1205 | POP AX ; restore input AX ;AN000; | ||
| 1206 | TEST IFSPROC_FLAGS,ISOLDOPEN ; check for old open/create ;AN000; | ||
| 1207 | JZ XO_220 ;AN000; | ||
| 1208 | ;;;;;; OR AX,OLDOPEN_MODE ; why did I do this???? scrap ;AD006; | ||
| 1209 | |||
| 1210 | SaveReg <DS,SI> ; old redirector does this ;AN013; | ||
| 1211 | Context DS ;AN013; | ||
| 1212 | LDS SI,[THISSFT] ;AN013; | ||
| 1213 | TEST DS:[SI.SF_MODE],sf_isFCB ;AN013; | ||
| 1214 | RestoreReg <SI,DS> ;AN013; | ||
| 1215 | JZ XO_210 ;AN013; | ||
| 1216 | MOV AL,-1 ;AN013; | ||
| 1217 | XO_210: ;AN013; | ||
| 1218 | |||
| 1219 | MOV ES:[BX.IFSR_MODE],AX ;AN000; | ||
| 1220 | MOV ES:[BX.IFSR_FLAG],OLDOPEN_FLAG ;AN000; | ||
| 1221 | XOR AH,AH ;AN000; | ||
| 1222 | JMP SHORT XO_240 ;AN000; | ||
| 1223 | XO_220: ;AN000; | ||
| 1224 | TEST IFSPROC_FLAGS,ISOLDCREATE ;AN000; | ||
| 1225 | JZ XO_260 ;AN000; | ||
| 1226 | MOV ES:[BX.IFSR_MODE],OLDCREATE_MODE ; old create ;AC006;AC010; | ||
| 1227 | MOV ES:[BX.IFSR_FLAG],OLDCREATE_FLAG ;AN000; | ||
| 1228 | OR AH,AH ; is this create new?? ;AN000; | ||
| 1229 | JZ XO_230 ;AN000; | ||
| 1230 | MOV ES:[BX.IFSR_FLAG],OLDCREATENEW_FLAG ;AN000; | ||
| 1231 | XO_230: ;AN000; | ||
| 1232 | XCHG AH,AL ;AN000; | ||
| 1233 | XO_240: ;AN000; | ||
| 1234 | PUSH SS ; get ds = dosgroup so can access ;AN000; | ||
| 1235 | POP DS ; wfp_start ;AN000; | ||
| 1236 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1237 | MOV AL,[SATTRIB] ;AN000; | ||
| 1238 | MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; | ||
| 1239 | JMP SHORT XO_280 ; go call FS ;AN000; | ||
| 1240 | ;AN000; | ||
| 1241 | XO_260: ; -------extended open/create------------;AN000; | ||
| 1242 | Context DS ; set ds-dosgroup ;AN000; | ||
| 1243 | ;;;;;;;;PUSH [SAVE_DX] ;AD012; | ||
| 1244 | ;;;;;;;;POP ES:[BX.IFSR_FLAG] ; input dx - flag ;AD012; | ||
| 1245 | SaveReg <AX> ; check if create, if so set flag ;AN012; | ||
| 1246 | MOV AX,[SAVE_DX] ;AN012; | ||
| 1247 | MOV ES:[BX.IFSR_FLAG],AX | ||
| 1248 | MOV AH,AL ;AN012; | ||
| 1249 | AND AX,0FF0H ;AN012; | ||
| 1250 | CMP AL,NOTEXIST_ACT_CREATE*16 ;AN012; | ||
| 1251 | RestoreReg <AX> ;AN012; | ||
| 1252 | JNE XO_270 ;AN012; | ||
| 1253 | OR IFSPROC_FLAGS,IsCreate ;AN012; | ||
| 1254 | XO_270: ;AN012; | ||
| 1255 | |||
| 1256 | PUSH [SAVE_BX] ;AN000; | ||
| 1257 | POP ES:[BX.IFSR_MODE] ; input bx - mode ;AN000; | ||
| 1258 | XCHG AH,AL ; attr ;AN000; | ||
| 1259 | MOV AL,[SATTRIB] ;AN000; | ||
| 1260 | MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; | ||
| 1261 | ; MOV DI,[SAVE_DI] ; parm list ;AD011; | ||
| 1262 | ; CMP DI,NULL_PTR ; if offset -1, then no parm list ;AD011; | ||
| 1263 | ; JE XO_280 ; | ;AD011; | ||
| 1264 | ; MOV ES:WORD PTR[BX.IFSR_PARMS@],DI ; | ;AD011; | ||
| 1265 | ; PUSH [SAVE_ES] ; | ;AD011; | ||
| 1266 | ; POP ES:WORD PTR[BX.IFSR_PARMS@+2] ; | ;AD011; | ||
| 1267 | |||
| 1268 | XO_280: ;AN000; | ||
| 1269 | MOV SI,[WFP_START] ;AN000; | ||
| 1270 | invoke STRIP_WFP_START ;AN000; | ||
| 1271 | MOV WORD PTR ES:[BX.IFSR_NAME@],SI ;AN000; | ||
| 1272 | MOV WORD PTR ES:[BX.IFSR_NAME@+2],DS ;AN000; | ||
| 1273 | PUSH CS ;AN000; | ||
| 1274 | POP DS ;AN000; | ||
| 1275 | ASSUME DS:IFSSEG ;AN000; | ||
| 1276 | ;AN000; | ||
| 1277 | ;****************************************************************************** ;AN000; | ||
| 1278 | invoke CALL_IFS ; call fs with open/create request ;AN000; | ||
| 1279 | ;****************************************************************************** ;AN000; | ||
| 1280 | ;AN000; | ||
| 1281 | JNC XO_300 ;AN000; | ||
| 1282 | TEST IFSPROC_FLAGS,ISCDS ; request FAILED - ;AN000; | ||
| 1283 | JNZ XO_290 ;AN000; | ||
| 1284 | JMP FA_980 ; go up, set carry & return ;AN000; | ||
| 1285 | XO_290: ;AN000; | ||
| 1286 | RestoreReg <SI,DS> ; if cds, restore stack first ;AN000; | ||
| 1287 | JMP FA_980 ;AN000; | ||
| 1288 | ;AN000; | ||
| 1289 | XO_300: ; request SUCCEEDED - ;AN000; | ||
| 1290 | TEST IFSPROC_FLAGS,ISOLDOPEN+ISOLDCREATE ; check for old open/create ;AN007; BAF | ||
| 1291 | JNZ XO_310 ;AN007; BAF | ||
| 1292 | SaveReg <DS,SI> ;AN007; BAF | ||
| 1293 | CallInstall Get_User_Stack,multDOS,24 ; Set action take back into CX ;AN007; BAF ;AN000; | ||
| 1294 | ASSUME DS:DOSGROUP ;AN007; BAF | ||
| 1295 | MOV AX,ES:[BX.IFSR_ACTION] ; action take only if Ext Open ;AN007; BAF | ||
| 1296 | MOV DS:[SI].USER_CX,AX ;AN007; BAF | ||
| 1297 | RestoreReg <SI,DS> ;AN007; BAF | ||
| 1298 | ASSUME DS:IFSSEG ;AN007; BAF | ||
| 1299 | XO_310: ; request SUCCEEDED - ;AN007; BAF | ||
| 1300 | MOV AX,ES:[BX.IFSR_MATCHATTR] ;AN000; | ||
| 1301 | ;AN000; | ||
| 1302 | invoke SFF_TO_SFT ; update sft ;AN000; | ||
| 1303 | TEST IFSPROC_FLAGS,ISCDS ;AN000; | ||
| 1304 | JZ XO_320 ;AN000; | ||
| 1305 | RestoreReg <DI,ES> ; cds-restore cds ptr into es:di ;AN000; | ||
| 1306 | invoke CD_TO_CDS ; update cds ;AN000; | ||
| 1307 | JMP XO_360 ;AN000; | ||
| 1308 | XO_320: ;AN000; | ||
| 1309 | TEST IFSPROC_FLAGS,ISSEQ ;AN000; | ||
| 1310 | JZ XO_340 ;AN000; | ||
| 1311 | MOV DI,NULL_PTR ; set seq devptr to null ;AN000; | ||
| 1312 | SaveReg <DI> ; this for sf_devptr ;AN000; | ||
| 1313 | RestoreReg <ES> ;AN000; | ||
| 1314 | JMP SHORT XO_360 ;AN000; | ||
| 1315 | ;AN000; | ||
| 1316 | XO_340: ;AN000; | ||
| 1317 | invoke DF_TO_DFL ; update dfl ;AN000; | ||
| 1318 | LES DI,[THISDFL] ; this for sf_devptr ;AN000; | ||
| 1319 | XOR AX,AX ; attr 0 for devices ;AN000; | ||
| 1320 | ;AN000; | ||
| 1321 | XO_360: ;AN000; | ||
| 1322 | Context DS ;AN000; | ||
| 1323 | LDS SI,[THISSFT] ; set some fields in sft ;AN000; | ||
| 1324 | MOV DS:[SI.sf_attr],AL ;AN000; | ||
| 1325 | ;;;;;;;;MOV DS:[SI.sf_attr_hi],AH ;AD015; | ||
| 1326 | MOV WORD PTR DS:[SI.sf_devptr],DI ;AN000; | ||
| 1327 | MOV WORD PTR DS:[SI.sf_devptr+2],ES ;AN000; | ||
| 1328 | TEST CS:IFSPROC_FLAGS,IsCDS + IsSeq ; let deviceless attach stuff thru here ;AC014; | ||
| 1329 | JZ XO_380 ;AN000; | ||
| 1330 | MOV AL,CS:[IFSDRV] ; drive ;AN000; | ||
| 1331 | AND AX,devid_file_mask_drive ; Drive in correct bits ;AN000; | ||
| 1332 | OR AX,sf_isnet + devid_file_clean ;AN000; | ||
| 1333 | MOV DS:[SI.sf_flags],AX ;AN000; | ||
| 1334 | ; now set sf_name to filename in form: ;AN000; | ||
| 1335 | ; filename ext (8 char fn spaced out - ;AN000; | ||
| 1336 | ; 3 char ext spaced out) ;AN000; | ||
| 1337 | SaveReg <CX,DS,SI,DS> ; save dssi->sf for later pop & action ;AN000; | ||
| 1338 | RestoreReg <ES> ;AN000; | ||
| 1339 | MOV DI,SI ; esdi->sft ;AN000; | ||
| 1340 | ;AN000; | ||
| 1341 | ADD DI,sf_name ; blank out sf_name ;AN000; | ||
| 1342 | SaveReg <DI> ; | ;AN000; | ||
| 1343 | MOV AX,2020H ; | ;AN000; | ||
| 1344 | MOV CX,5 ; | ;AN000; | ||
| 1345 | CLD ; | ;AN000; | ||
| 1346 | REP STOSW ; | ;AN000; | ||
| 1347 | STOSB ; | ;AN000; | ||
| 1348 | RestoreReg <DI> ; | ;AN000; | ||
| 1349 | ;AN000; | ||
| 1350 | Context DS ;AN000; | ||
| 1351 | MOV SI,[WFP_START] ; dssi->wfp_start ;AN000; | ||
| 1352 | CallInstall DStrlen,multDOS,37 ; get length of full path name (in cx) ;AN000; | ||
| 1353 | ADD SI,CX ; mov si to end of name ;AN000; | ||
| 1354 | DEC SI ; si now on null ;AN000; | ||
| 1355 | XO_362: ;AN000; | ||
| 1356 | DEC SI ; mov back one ;AN000; | ||
| 1357 | CMP BYTE PTR DS:[SI],"\" ; looking for \ just before fn ;AN000; | ||
| 1358 | JNE XO_362 ;AN000; | ||
| 1359 | ;AN000; | ||
| 1360 | INC SI ; si now pointing to 1st char fn ;AN000; | ||
| 1361 | MOV CX,8 ; esdi -> sf_name ;AN000; | ||
| 1362 | XO_364: ;AN000; | ||
| 1363 | LODSB ;AN000; | ||
| 1364 | STOSB ;AN000; | ||
| 1365 | DEC CX ;AN000; | ||
| 1366 | CMP AL,"." ;AN000; | ||
| 1367 | JE XO_368 ;AN000; | ||
| 1368 | OR AL,AL ;AN000; | ||
| 1369 | JZ XO_366 ;AN000; | ||
| 1370 | JCXZ XO_369 ;AN000; | ||
| 1371 | JMP SHORT XO_364 ;AN000; | ||
| 1372 | ;AN000; | ||
| 1373 | XO_366: ;AN000; | ||
| 1374 | MOV BYTE PTR ES:[DI-1]," " ;AN000; | ||
| 1375 | JMP SHORT XO_378 ;AN000; | ||
| 1376 | ;AN000; | ||
| 1377 | XO_368: ;AN000; | ||
| 1378 | MOV BYTE PTR ES:[DI-1]," " ;AN000; | ||
| 1379 | ADD DI,CX ;AN000; | ||
| 1380 | XO_369: ;AN000; | ||
| 1381 | MOV CX,3 ;AN000; | ||
| 1382 | XO_370: ;AN000; | ||
| 1383 | LODSB ;AN000; | ||
| 1384 | STOSB ;AN000; | ||
| 1385 | DEC CX ;AN000; | ||
| 1386 | OR AL,AL ;AN000; | ||
| 1387 | JZ XO_372 ;AN000; | ||
| 1388 | JCXZ XO_378 ;AN000; | ||
| 1389 | JMP SHORT XO_370 ;AN000; | ||
| 1390 | XO_372: ;AN000; | ||
| 1391 | MOV BYTE PTR ES:[DI-1]," " ;AN000; | ||
| 1392 | ;AN000; | ||
| 1393 | XO_378: ;AN000; | ||
| 1394 | RestoreReg <SI,DS,CX> ; dssi -> sft, cx=action code ;AN000; | ||
| 1395 | JMP SHORT XO_500 ;AN000; | ||
| 1396 | ;AN000; | ||
| 1397 | XO_380: ;AN000; | ||
| 1398 | ;;;;;;;;TEST CS:IFSPROC_FLAGS,ISSEQ ;AD014; | ||
| 1399 | ;;;;;;;;JNZ XO_500 ;AD014; | ||
| 1400 | MOV DS:[SI.sf_flags],sf_isnet+devid_file_clean+sf_net_spool+devid_device ;AN000; | ||
| 1401 | SaveReg <CX,DS,SI> ; sft ptr, action ;AN003; | ||
| 1402 | invoke XCHGP ; dssi -> dfl, esdi -> sft ;AN000; | ||
| 1403 | ADD DI,sf_name ;AN000; | ||
| 1404 | ADD SI,DFL_DEV_NAME ; Skip over path sep, now pointing to name ;AN000; | ||
| 1405 | MOV CX,4 ;AN000; | ||
| 1406 | REP MOVSW ;AN000; | ||
| 1407 | MOV AX,2020H ;AN000; | ||
| 1408 | STOSW ;AN000; | ||
| 1409 | STOSB ;AN000; | ||
| 1410 | RestoreReg <SI,DS,CX> ; sft ptr, action ;AN003/AC005; | ||
| 1411 | |||
| 1412 | XO_500: ;AN000; | ||
| 1413 | MOV AX,WORD PTR CS:[THISIFS] ; set sf_ifs_hdr ;AN003; | ||
| 1414 | MOV WORD PTR DS:[SI.SF_IFS_HDR],AX ;AN003; | ||
| 1415 | MOV AX,WORD PTR CS:[THISIFS+2] ;AN003; | ||
| 1416 | MOV WORD PTR DS:[SI.SF_IFS_HDR+2],AX ;AN003; | ||
| 1417 | |||
| 1418 | MOV AX,CS:[SFT_SERIAL_NUMBER] ; give new sft serial number for ;AN004; | ||
| 1419 | MOV DS:[SI.SF_FIRCLUS],AX ; fcb processing ;AN004; | ||
| 1420 | INC CS:[SFT_SERIAL_NUMBER] ;AN004; | ||
| 1421 | |||
| 1422 | MOV WORD PTR DS:[SI.SF_POSITION],0 ;AN012; | ||
| 1423 | MOV WORD PTR DS:[SI.SF_POSITION+2],0 ;AN012; | ||
| 1424 | |||
| 1425 | TEST CS:IFSPROC_FLAGS,IsCreate ; if create, set sf time/date ;AN012; | ||
| 1426 | JZ XO_520 ;AN012; | ||
| 1427 | push ds ;AN017: SAVE DS **RPS | ||
| 1428 | CallInstall DATE16,MultDOS,13 ;AN012; | ||
| 1429 | pop ds ;AN017: SAVE DS **RPS | ||
| 1430 | MOV DS:[SI.SF_TIME],DX ;AN012; | ||
| 1431 | MOV DS:[SI.SF_DATE],AX ;AN012; | ||
| 1432 | MOV WORD PTR DS:[SI.SF_SIZE],0 ;AN012; | ||
| 1433 | MOV WORD PTR DS:[SI.SF_SIZE+2],0 ;AN012; | ||
| 1434 | XO_520: ;AN012; | ||
| 1435 | |||
| 1436 | PUSH SS ; Preserve input DS ;AN000; | ||
| 1437 | POP DS ;AN000; | ||
| 1438 | MOV AX,(multDOS SHL 8) OR 12 ;AN000; | ||
| 1439 | INT 2FH ;AN000; | ||
| 1440 | ;AN000; | ||
| 1441 | return ;AN000; | ||
| 1442 | ;AN000; | ||
| 1443 | EndProc IFS_XOPEN ;AN000; | ||
| 1444 | ;AN000; | ||
| 1445 | BREAK <IFS_SEQ_SEARCH> ;AN000; | ||
| 1446 | ;AN000; | ||
| 1447 | ;************************************************************************************ ;AN000; | ||
| 1448 | ; ;AN000; | ||
| 1449 | ; IFS_SEQ_SEARCH ;AN000; | ||
| 1450 | ; ;AN000; | ||
| 1451 | ; Inputs: ;AN000; | ||
| 1452 | ; [WFP_START] Points to WFP string ("d:/" must be first 3 chars, NUL ;AN000; | ||
| 1453 | ; terminated) ;AN000; | ||
| 1454 | ; [SATTRIB] Is attribute of search, determines what files can be found ;AN000; | ||
| 1455 | ; [DMAADD] Points to 53 byte buffer ;AN000; | ||
| 1456 | ; Function: ;AN000; | ||
| 1457 | ; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000; | ||
| 1458 | ; Outputs: ;AN000; | ||
| 1459 | ; CARRY SET ;AN000; | ||
| 1460 | ; AX = error_path_not_found ;AN000; | ||
| 1461 | ; DS preserved, others destroyed ;AN000; | ||
| 1462 | ; ;AN000; | ||
| 1463 | ;************************************************************************************ ;AN000; | ||
| 1464 | ;AN000; | ||
| 1465 | procedure IFS_SEQ_SEARCH_FIRST,NEAR ;AN000; | ||
| 1466 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1467 | ;AN000; | ||
| 1468 | MOV AX,error_path_not_found ;AN000; | ||
| 1469 | STC ;AN000; | ||
| 1470 | return ;AN000; | ||
| 1471 | ;AN000; | ||
| 1472 | EndProc IFS_SEQ_SEARCH_FIRST ;AN000; | ||
| 1473 | ;AN000; | ||
| 1474 | ;************************************************************************************ ;AN000; | ||
| 1475 | ; ;AN000; | ||
| 1476 | ; IFS_SEQ_SEARCH_NEXT ;AN000; | ||
| 1477 | ; ;AN000; | ||
| 1478 | ; Inputs: ;AN000; | ||
| 1479 | ; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000; | ||
| 1480 | ; (only first 21 bytes must have valid information) ;AN000; | ||
| 1481 | ; Function: ;AN000; | ||
| 1482 | ; BECAUSE OF THE STRUCTURE OF SEARCH IT MUST BE RELATIVE TO A CDS SESSION ;AN000; | ||
| 1483 | ; Outputs: ;AN000; | ||
| 1484 | ; CARRY SET ;AN000; | ||
| 1485 | ; AX = error_no_more_files ;AN000; | ||
| 1486 | ; DS preserved, others destroyed ;AN000; | ||
| 1487 | ; ;AN000; | ||
| 1488 | ;************************************************************************************ ;AN000; | ||
| 1489 | ;AN000; | ||
| 1490 | procedure IFS_SEQ_SEARCH_NEXT,NEAR ;AN000; | ||
| 1491 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1492 | ;AN000; | ||
| 1493 | JMP IFS_SEQ_SEARCH_FIRST ;AN000; | ||
| 1494 | ;AN000; | ||
| 1495 | EndProc IFS_SEQ_SEARCH_NEXT ;AN000; | ||
| 1496 | ;AN000; | ||
| 1497 | ;AN000; | ||
| 1498 | BREAK <IFS_SEARCH_FIRST Search for first entry> ;AN000; | ||
| 1499 | ;AN000; | ||
| 1500 | ;************************************************************************************ | ||
| 1501 | ; | ||
| 1502 | ; IFS_SEARCH_FIRST | ||
| 1503 | ; | ||
| 1504 | ; Inputs: | ||
| 1505 | ; [WFP_START] Points to WFP string ("//" must be first 2 chars, NUL | ||
| 1506 | ; terminated) | ||
| 1507 | ; [THISCDS] Points to CDS being used may not be NUL | ||
| 1508 | ; [SATTRIB] Is attribute of search, determines what files can be found | ||
| 1509 | ; [DMAADD] Points to 53 byte buffer | ||
| 1510 | ; DS - dosgroup | ||
| 1511 | ; | ||
| 1512 | ; Function: | ||
| 1513 | ; Prep IFSRH: | ||
| 1514 | ; * IFSR_LENGTH DW 50 ; Request length | ||
| 1515 | ; * IFSR_FUNCTION DB 4 ; Execute API function | ||
| 1516 | ; + IFSR_RETCODE DW ? | ||
| 1517 | ; + IFSR_RETCLASS DB ? | ||
| 1518 | ; IFSR_RESV1 DB 16 DUP(0) | ||
| 1519 | ; * IFSR_APIFUNC DB 8 ; Search file | ||
| 1520 | ; + IFSR_ERROR_CLASS DB ? | ||
| 1521 | ; + IFSR_ERROR_ACTION DB ? | ||
| 1522 | ; + IFSR_ERROR_LOCUS DB ? | ||
| 1523 | ; + IFSR_ALLOWED DB ? | ||
| 1524 | ; + IFSR_I24_RETRY DB ? | ||
| 1525 | ; + IFSR_I24_RESP DB ? | ||
| 1526 | ; IFSR_RESV2 DB ? | ||
| 1527 | ; *+ IFSR_DEVICE_CB@ DD ? ; CD | ||
| 1528 | ; IFSR_OPEN_CB@ DD ? ; null | ||
| 1529 | ; * IFSR_SUBFUNC DB subfunction ; 1=first, 2=next | ||
| 1530 | ; ; 4=last (CP/DOS only) | ||
| 1531 | ; * IFSR_RESV3 DB ? ; DOS Reserved | ||
| 1532 | ; *+ IFSR_CONTINFO@ DD continuation info address (always set): | ||
| 1533 | ; * DB 8 DUP(?) ; SEARCH FILE NAME | ||
| 1534 | ; * DB 3 DUP(?) ; SEARCH FILE EXTENSION | ||
| 1535 | ; * DB ? ; SEARCH ATTRIBUTE | ||
| 1536 | ; DB 8 DUP(?) ; FSDA | ||
| 1537 | ; DIRECTORY ENTRY | ||
| 1538 | ; + DB 8 DUP(?) ; FOUND FILE NAME | ||
| 1539 | ; + DB 3 DUP(?) ; FOUND FILE EXTENSION | ||
| 1540 | ; + DB ? ; FOUND ATTRIBUTE LOW ??? DB/DD | ||
| 1541 | ; + DW ? ; FILE CODE PAGE (OR 0) | ||
| 1542 | ; + DW ? ; RESERVED | ||
| 1543 | ; + DB ? ; FOUND ATTRIBUTE HIGH | ||
| 1544 | ; + DB 5 DUP(?) ; RESERVED | ||
| 1545 | ; + DW ? ; FILE TIME | ||
| 1546 | ; + DW ? ; FILE DATE | ||
| 1547 | ; + DW ? ; MEANING FILE SYSTEM SPECIFIC | ||
| 1548 | ; ; (STARTING CLUSTER IN FAT) | ||
| 1549 | ; + DD ? ; FILE SIZE | ||
| 1550 | ; following on search first only | ||
| 1551 | ; * IFSR_MATCHATTR DW ; search attribute ; format 0000000re0advshr | ||
| 1552 | ; * IFSR_NAME@ DD ; asciiz name to process | ||
| 1553 | ; | ||
| 1554 | ; IF search first THEN | ||
| 1555 | ; DO | ||
| 1556 | ; IFSR_SUBFUNC = 1 | ||
| 1557 | ; Get CDS from [THISCDS] | ||
| 1558 | ; Call CDS_TO_CD | ||
| 1559 | ; ENDDO | ||
| 1560 | ; ELSE DO | ||
| 1561 | ; IFSR_SUBFUNC = 2 | ||
| 1562 | ; Get CDS from drive byte in DMAADD | ||
| 1563 | ; Call CDS_TO_CD | ||
| 1564 | ; ENDDO | ||
| 1565 | ; ENDIF | ||
| 1566 | ; CALL routine, CALL_IFS, with pointer to CURDIR_IFSR_HDR | ||
| 1567 | ; IF IFSR_RETCODE = 0 THEN | ||
| 1568 | ; DO | ||
| 1569 | ; Call CD_TO_CDS | ||
| 1570 | ; DMAADD = IFSR_CONTINFO | ||
| 1571 | ; Clear carry | ||
| 1572 | ; ENDDO | ||
| 1573 | ; ELSE DO {error} | ||
| 1574 | ; AX = error code | ||
| 1575 | ; Set carry | ||
| 1576 | ; ENDDO | ||
| 1577 | ; ENDIF | ||
| 1578 | ; | ||
| 1579 | ; Outputs: | ||
| 1580 | ; CARRY CLEAR | ||
| 1581 | ; The 53 bytes ot DMAADD are filled in as follows: | ||
| 1582 | ; | ||
| 1583 | ; Drive Byte (A=1, B=2, ...) High bit = 1 --| | ||
| 1584 | ; 11 byte search name with Meta chars in it | From | ||
| 1585 | ; Search Attribute Byte, attribute of search | Server | ||
| 1586 | ; WORD LastEnt value | | ||
| 1587 | ; WORD DirStart ------------------------------| | ||
| 1588 | ; DWORD Local CDS | ||
| 1589 | ; 32 bytes of the directory entry found | ||
| 1590 | ; CARRY SET | ||
| 1591 | ; AX = error code | ||
| 1592 | ; error_no_more_files | ||
| 1593 | ; No match for this file | ||
| 1594 | ; error_access_denied | ||
| 1595 | ; Device name given | ||
| 1596 | ; error_path_not_found | ||
| 1597 | ; Bad path | ||
| 1598 | ; DS preserved, others destroyed | ||
| 1599 | ; | ||
| 1600 | ;************************************************************************************ | ||
| 1601 | ;AN000; | ||
| 1602 | procedure IFS_SEARCH_FIRST,NEAR ;AN000; | ||
| 1603 | ;AN000; | ||
| 1604 | ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000; | ||
| 1605 | ifsr_api_def SEARCHFILE ;AN000; | ||
| 1606 | ;AN000; | ||
| 1607 | MOV CS:IFSPROC_FLAGS,ZERO ;AN000; | ||
| 1608 | invoke PREP_IFSR ; zero ifsr ;AN000; | ||
| 1609 | ;AN000; | ||
| 1610 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1611 | LES DI,[DMAADD] ; esdi -> dmaadd ;AN001; | ||
| 1612 | LDS SI,[THISCDS] ; dssi -> cds ;AN000; | ||
| 1613 | |||
| 1614 | invoke DRIVE_FROM_CDS ; set ifsdrv (0-based) ;AN001; | ||
| 1615 | MOV AL,CS:[IFSDRV] ; put 1-based drive # in dmaadd ;AN001; | ||
| 1616 | INC AL ;AN001; | ||
| 1617 | OR AL,80H ; turn on ifs indicator ;AN001; | ||
| 1618 | STOSB ;AN001; | ||
| 1619 | |||
| 1620 | SaveReg <DS,SI> ; preserve ds:si -> cds ;AN000; | ||
| 1621 | MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000; | ||
| 1622 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 1623 | ; ES:BX -> IFSRH ;AN000; | ||
| 1624 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1625 | ; ds - IFSSEG ;AN000; | ||
| 1626 | PUSH DS ; save ds-ifsseg ;AN000; | ||
| 1627 | Context DS ; ds-dosgroup ;AN000; | ||
| 1628 | ;AN000; | ||
| 1629 | MOV SI,[WFP_START] ;AN000; | ||
| 1630 | invoke STRIP_WFP_START ; remove leading d:\ if present ;AN000; | ||
| 1631 | MOV ES:WORD PTR[BX.IFSR_NAME@],SI ;AN000; | ||
| 1632 | MOV ES:WORD PTR[BX.IFSR_NAME@+2],DS ;AN000; | ||
| 1633 | MOV AL,[SATTRIB] ;AN000; | ||
| 1634 | XOR AH,AH ;AN000; | ||
| 1635 | MOV ES:[BX.IFSR_MATCHATTR],AX ;AN000; | ||
| 1636 | ;AN000; | ||
| 1637 | POP DS ;AN000; | ||
| 1638 | ASSUME DS:IFSSEG,ES:IFSSEG ;AN000; | ||
| 1639 | ;AN000; | ||
| 1640 | MOV AL,IFSSEARCH_FIRST ;AN000; | ||
| 1641 | JMP SHORT SN_60 ; rest of processing is in ;AN000; | ||
| 1642 | ; search_next routine ;AN000; | ||
| 1643 | ;AN000; | ||
| 1644 | EndProc IFS_SEARCH_FIRST ;AN000; | ||
| 1645 | ;AN000; | ||
| 1646 | BREAK <IFS_SEARCH_NEXT Search for next> ;AN000; | ||
| 1647 | ;AN000; | ||
| 1648 | ;************************************************************************************ ;AN000; | ||
| 1649 | ; ;AN000; | ||
| 1650 | ; IFS_SEARCH_NEXT ;AN000; | ||
| 1651 | ; ;AN000; | ||
| 1652 | ; Inputs: ;AN000; | ||
| 1653 | ; [DMAADD] Points to 53 byte buffer returned by DOS_SEARCH_FIRST ;AN000; | ||
| 1654 | ; (only first 21 bytes must have valid information) ;AN000; | ||
| 1655 | ; Function: ;AN000; | ||
| 1656 | ; Look for subsequent matches ;AN000; | ||
| 1657 | ; Outputs: ;AN000; | ||
| 1658 | ; CARRY CLEAR ;AN000; | ||
| 1659 | ; The 53 bytes at DMAADD are updated for next call ;AN000; | ||
| 1660 | ; (see NET_SEARCH_FIRST) ;AN000; | ||
| 1661 | ; CARRY SET ;AN000; | ||
| 1662 | ; AX = error code ;AN000; | ||
| 1663 | ; error_no_more_files ;AN000; | ||
| 1664 | ; No more files to find ;AN000; | ||
| 1665 | ; DS preserved, others destroyed ;AN000; | ||
| 1666 | ; ;AN000; | ||
| 1667 | ;************************************************************************************ ;AN000; | ||
| 1668 | ;AN000; | ||
| 1669 | procedure IFS_SEARCH_NEXT,NEAR ;AN000; | ||
| 1670 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1671 | ;AN000; | ||
| 1672 | ifsr_fcn_def EXECAPI ; define ifsr for search ;AN000; | ||
| 1673 | ifsr_api_def SEARCHFILE ;AN000; | ||
| 1674 | ;AN000; | ||
| 1675 | MOV CS:IFSPROC_FLAGS,ZERO ; clear processing flags ;AN000; | ||
| 1676 | invoke PREP_IFSR ; zero out ifsr ;AN000; | ||
| 1677 | ;AN000; | ||
| 1678 | SN_20: ;AN000; | ||
| 1679 | LDS SI,[DMAADD] ;AN000; | ||
| 1680 | LODSB ;AN000; | ||
| 1681 | AND AL,NOT 80H ; turn off ifs indicator ;AN000; | ||
| 1682 | DEC AL ; make 0-based ;AN000; | ||
| 1683 | MOV CS:[IFSDRV],AL ; set this for possible i24 ;AN000; | ||
| 1684 | CallInstall GetCDSFromDrv,multDOS,23,AX,AX ;AN000; | ||
| 1685 | ASSUME DS:NOTHING ;AN000; | ||
| 1686 | JNC SN_40 ;AN000; | ||
| 1687 | MOV AX,error_invalid_drive ; no cds, set error & ;AN000; | ||
| 1688 | invoke SET_EXTERR_INFO ;AN000; | ||
| 1689 | JMP FA_1000 ; ret up in FA to preserve DS ;AN000; | ||
| 1690 | SN_40: ; (welcome lock) ;AN000; | ||
| 1691 | SaveReg <DS,SI> ; save cds ptr ;AN000; | ||
| 1692 | invoke CDS_TO_CD ; CDS: sets [THISIFS] ;AN000; | ||
| 1693 | ; ES:BX -> IFSRH ;AN000; | ||
| 1694 | ; IFSR_DEVICE_CB@ ;AN000; | ||
| 1695 | ; ds - IFSSEG ;AN000; | ||
| 1696 | MOV AL,IFSSEARCH_NEXT ; start with subfunc=search next ;AN000; | ||
| 1697 | ; TEST IFSPROC_FLAGS,ISADD ;AD011; | ||
| 1698 | ; JZ SN_60 ;AD011; | ||
| 1699 | ; INC AL ; inc subfunc to search same ;AD011; | ||
| 1700 | SN_60: ;AN000; | ||
| 1701 | MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000; | ||
| 1702 | MOV ES:[BX.IFSR_LENGTH],LENGTH_SEARCHFILE ;AN000; | ||
| 1703 | MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000; | ||
| 1704 | MOV ES:[BX.IFSR_APIFUNC],IFSSEARCHFILE ;AN000; | ||
| 1705 | ;AN000; | ||
| 1706 | PUSH DS ;AN000; | ||
| 1707 | Context DS ;AN000; | ||
| 1708 | MOV AX,WORD PTR [DMAADD] ;AN000; | ||
| 1709 | INC AX ;AN000; | ||
| 1710 | MOV ES:WORD PTR[BX.IFSR_CONTINFO@],AX ;AN000; | ||
| 1711 | MOV AX,WORD PTR [DMAADD+2] ;AN000; | ||
| 1712 | MOV ES:WORD PTR[BX.IFSR_CONTINFO@+2],AX ;AN000; | ||
| 1713 | ;AN000; | ||
| 1714 | POP DS ;AN000; | ||
| 1715 | ASSUME DS:IFSSEG ;AN000; | ||
| 1716 | invoke CALL_IFS ; call FS ;AN000; | ||
| 1717 | RestoreReg <DI,ES> ; restore cds ptr into es:di ;AN000; | ||
| 1718 | JC SN_1000 ;AN000; | ||
| 1719 | invoke CD_TO_CDS ;AN000; | ||
| 1720 | CLC ;AN000; | ||
| 1721 | ;AN000; | ||
| 1722 | SN_1000: ;AN000; | ||
| 1723 | JMP FA_1000 ; go up & preserve ds, ret ;AN000; | ||
| 1724 | ;AN000; | ||
| 1725 | EndProc IFS_SEARCH_NEXT ;AN000; | ||
| 1726 | ;AN000; | ||
| 1727 | ;AN000; | ||
| 1728 | BREAK <OPEN_CHECK_DEVICE - check that device to be opened is real> ;AN000; | ||
| 1729 | ;AN000; | ||
| 1730 | ;************************************************************************************ ;AN000; | ||
| 1731 | ; ;AN000; | ||
| 1732 | ; CHECK_OPEN_DEVICE ;AN000; | ||
| 1733 | ; ;AN000; | ||
| 1734 | ; Inputs: ;AN000; | ||
| 1735 | ; [WFP_START] ;AN000; | ||
| 1736 | ; ;AN000; | ||
| 1737 | ; Function: ;AN000; | ||
| 1738 | ; ;AN000; | ||
| 1739 | ; Outputs: ;AN000; | ||
| 1740 | ; ;AN000; | ||
| 1741 | ; ;AN000; | ||
| 1742 | ; ;AN000; | ||
| 1743 | ;************************************************************************************ ;AN000; | ||
| 1744 | ;AN000; | ||
| 1745 | procedure OPEN_CHECK_DEVICE,NEAR ;AN000; | ||
| 1746 | ASSUME DS:DOSGROUP,ES:NOTHING ;AN000; | ||
| 1747 | ;AN000; | ||
| 1748 | MOV SI,[WFP_START] ; dssi -> path to open ;AN000; | ||
| 1749 | ; invoke PARSE_DEVICE_PATH ; dssi -> device name (asciiz) ;AN000; | ||
| 1750 | ;AN000; | ||
| 1751 | PUSH SS ; Now check if this device is real ;AN000; | ||
| 1752 | POP ES ;AN000; | ||
| 1753 | MOV DI,OFFSET DOSGROUP:NAME1 ;AN000; | ||
| 1754 | MOV CX,4 ;AN000; | ||
| 1755 | REP MOVSW ; Transfer name to NAME1 ;AN000; | ||
| 1756 | MOV AX,2020H ;AN000; | ||
| 1757 | STOSW ;AN000; | ||
| 1758 | STOSB ;AN000; | ||
| 1759 | ;AN000; | ||
| 1760 | PUSH ES ;AN000; | ||
| 1761 | POP DS ;AN000; | ||
| 1762 | ASSUME DS:DOSGROUP ;AN000; | ||
| 1763 | MOV [ATTRIB],attr_hidden + attr_system + attr_directory ;AN000; | ||
| 1764 | ; Must set this to something interesting ;AN000; | ||
| 1765 | ; to call DEVNAME. ;AN000; | ||
| 1766 | CallInstall DEVNAME,multDOS,35 ;AN000; | ||
| 1767 | JNC OCD_120 ;AN000; | ||
| 1768 | MOV AX,error_file_not_found ;AN000; | ||
| 1769 | transfer ifs_980 ;AN000; | ||
| 1770 | ;AN000; | ||
| 1771 | OCD_120: ;AN000; | ||
| 1772 | transfer ifs_990 ;AN000; | ||
| 1773 | ;AN000; | ||
| 1774 | EndProc OPEN_CHECK_DEVICE ;AN000; | ||
| 1775 | ;AN000; | ||
| 1776 | ;AN000; | ||
| 1777 | IFSSEG ENDS ;AN000; | ||
| 1778 | END ;AN000; | ||