diff options
Diffstat (limited to 'v4.0/src/DOS/LOCK.ASM')
| -rw-r--r-- | v4.0/src/DOS/LOCK.ASM | 372 |
1 files changed, 372 insertions, 0 deletions
diff --git a/v4.0/src/DOS/LOCK.ASM b/v4.0/src/DOS/LOCK.ASM new file mode 100644 index 0000000..2089882 --- /dev/null +++ b/v4.0/src/DOS/LOCK.ASM | |||
| @@ -0,0 +1,372 @@ | |||
| 1 | ; SCCSID = @(#)lock.asm 1.1 85/04/10 | ||
| 2 | TITLE LOCK ROUTINES - Routines for file locking | ||
| 3 | NAME LOCK | ||
| 4 | |||
| 5 | ; | ||
| 6 | ; LOCK_CHECK | ||
| 7 | ; LOCK_VIOLATION | ||
| 8 | ; $LockOper | ||
| 9 | ; | ||
| 10 | ; Revision history: | ||
| 11 | ; A000 version 4.00 Jan. 1988 | ||
| 12 | ; | ||
| 13 | include dosseg.asm | ||
| 14 | |||
| 15 | CODE SEGMENT BYTE PUBLIC 'CODE' | ||
| 16 | ASSUME SS:DOSGROUP,CS:DOSGROUP | ||
| 17 | |||
| 18 | .xlist | ||
| 19 | .xcref | ||
| 20 | INCLUDE DOSSYM.INC | ||
| 21 | INCLUDE DEVSYM.INC | ||
| 22 | include lock.inc ;AN000; | ||
| 23 | .cref | ||
| 24 | .list | ||
| 25 | |||
| 26 | AsmVars <IBM, Installed> | ||
| 27 | |||
| 28 | Installed = TRUE | ||
| 29 | |||
| 30 | i_need THISSFT,DWORD | ||
| 31 | i_need THISDPB,DWORD | ||
| 32 | i_need EXTERR,WORD | ||
| 33 | i_need ALLOWED,BYTE | ||
| 34 | i_need RetryCount,WORD | ||
| 35 | I_need fShare,BYTE | ||
| 36 | I_Need EXTERR_LOCUS,BYTE ; Extended Error Locus | ||
| 37 | i_need JShare,DWORD | ||
| 38 | i_need Lock_Buffer,DWORD ;AN000; DOS 4.00 | ||
| 39 | i_need Temp_Var,WORD ;AN000; DOS 4.00 | ||
| 40 | |||
| 41 | BREAK <$LockOper - Lock Calls> | ||
| 42 | |||
| 43 | ; | ||
| 44 | ; Assembler usage: | ||
| 45 | ; MOV BX, Handle (DOS 3.3) | ||
| 46 | ; MOV CX, OffsetHigh | ||
| 47 | ; MOV DX, OffsetLow | ||
| 48 | ; MOV SI, LengthHigh | ||
| 49 | ; MOV DI, LengthLow | ||
| 50 | ; MOV AH, LockOper | ||
| 51 | ; MOV AL, Request | ||
| 52 | ; INT 21h | ||
| 53 | ; | ||
| 54 | ; Error returns: | ||
| 55 | ; AX = error_invalid_handle | ||
| 56 | ; = error_invalid_function | ||
| 57 | ; = error_lock_violation | ||
| 58 | ; | ||
| 59 | ; Assembler usage: | ||
| 60 | ; MOV AX, 5C?? (DOS 4.00) | ||
| 61 | ; | ||
| 62 | ; 0? lock all | ||
| 63 | ; 8? lock write | ||
| 64 | ; ?2 lock multiple | ||
| 65 | ; ?3 unlock multiple | ||
| 66 | ; ?4 lock/read | ||
| 67 | ; ?5 write/unlock | ||
| 68 | ; ?6 add (lseek EOF/lock/write/unlock) | ||
| 69 | ; MOV BX, Handle | ||
| 70 | ; MOV CX, count or size | ||
| 71 | ; LDS DX, buffer | ||
| 72 | ; INT 21h | ||
| 73 | ; | ||
| 74 | ; Error returns: | ||
| 75 | ; AX = error_invalid_handle | ||
| 76 | ; = error_invalid_function | ||
| 77 | ; = error_lock_violation | ||
| 78 | |||
| 79 | procedure $LockOper,NEAR | ||
| 80 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 81 | ; MOV BP,AX ;MS. BP=AX ;AN000; | ||
| 82 | ; AND BP,7FH ;MS. clear bit 7 ;AN000; | ||
| 83 | ; CMP BP,Lock_add ;MS. supported function ? ;AN000; | ||
| 84 | ; JA lock_bad_func ;MS. no, ;AN000; | ||
| 85 | |||
| 86 | CMP AL,1 ;AN000;;MS. no, | ||
| 87 | JA lock_bad_func ;AN000;;MS. no, | ||
| 88 | |||
| 89 | PUSH DI ; Save LengthLow | ||
| 90 | invoke SFFromHandle ; ES:DI -> SFT | ||
| 91 | JNC lock_do ; have valid handle | ||
| 92 | POP DI ; Clean stack | ||
| 93 | error error_invalid_handle | ||
| 94 | lock_bad_func: | ||
| 95 | MOV EXTERR_LOCUS,errLoc_Unk ; Extended Error Locus | ||
| 96 | error error_invalid_function | ||
| 97 | |||
| 98 | ; Align_buffer call has been deleted, since it corrupts the DTA (6/5/88) P5013 | ||
| 99 | |||
| 100 | lock_do: | ||
| 101 | ; PUSH AX ;AN000;;MS. save ax | ||
| 102 | ; PUSH BX ;AN000;;MS. save handle | ||
| 103 | ; MOV [Temp_Var],DX ;AN000;;MS. save DX | ||
| 104 | ; invoke Align_Buffer ;AN000;;MS. align ds:dx and set DMAADD | ||
| 105 | ; POP BX ;AN000;;MS. restore handle | ||
| 106 | ; POP AX ;AN000;;MS. save ax | ||
| 107 | ;AN000; | ||
| 108 | ; CMP BP,Unlock_all ;AN000;;MS. old function 0 or 1 ? | ||
| 109 | ; JA chk_lock_mul ;AN000;;MS. no, new function | ||
| 110 | ; TEST AL,80H ;AN000;;MS. 80H bit on ? | ||
| 111 | ; JZ old_33 ;AN000;;MS. no, old DOS 3.3 interface | ||
| 112 | ; MOV CX,1 ;AN000;;MS. adjust for new interface | ||
| 113 | ; ADD BP,2 ;AN000;;MS. | ||
| 114 | ; JMP SHORT chk_lock_mul ;AN000;;MS. | ||
| 115 | old_33: | ||
| 116 | MOV BX,AX ;AN000;;MS. save AX | ||
| 117 | ;AN000; | ||
| 118 | ;; MOV DX,[Temp_Var] ;AN000;;MS. retore DX (P5013) 6/5/88 | ||
| 119 | |||
| 120 | MOV BP, OFFSET DOSGROUP:Lock_Buffer ;AN000;;MS. get DOS LOCK buffer | ||
| 121 | MOV WORD PTR [BP.Lock_position],DX ;AN000;;MS. set low offset | ||
| 122 | MOV WORD PTR [BP.Lock_position+2],CX;AN000;;MS. set high offset | ||
| 123 | POP CX ;AN000;;MS. get low length | ||
| 124 | MOV WORD PTR [BP.Lock_length],CX ;AN000;;MS. set low length | ||
| 125 | MOV WORD PTR [BP.Lock_length+2],SI ;AN000;;MS. set high length | ||
| 126 | MOV CX,1 ;AN000;;MS. one range | ||
| 127 | PUSH CS ;AN000;;MS. | ||
| 128 | POP DS ;AN000;;MS. DS:DX points to | ||
| 129 | MOV DX,BP ;AN000;;MS. Lock_Buffer | ||
| 130 | TEST AL,Unlock_all ;AN000;;MS. function 1 | ||
| 131 | JNZ DOS_Unlock ;AN000;;MS. yes | ||
| 132 | JMP DOS_Lock ;AN000;;MS. function 0 | ||
| 133 | ;;chk_lock_mul: ;AN000; | ||
| 134 | ; POP SI ;AN000;;MS. pop low length | ||
| 135 | ; TEST ES:[DI.sf_flags],sf_isnet ;AN000;;MS. net handle? | ||
| 136 | ; JZ LOCAL_DOS_LOCK ;AN000;;MS. no | ||
| 137 | ; invoke OWN_SHARE ;AN000;;MS. IFS owns share ? | ||
| 138 | ; JNZ LOCAL_DOS_LOCK ;AN000;;MS. no | ||
| 139 | ; MOV BX,AX ;AN000;;MS. BX=AX | ||
| 140 | ; CallInstall NET_XLock,multNet,10 ;AN000;;MS. issue Net Extended Lock | ||
| 141 | ; MOV [Temp_Var],CX ;AN000;;MS. cx= retuened from IFS | ||
| 142 | ; JMP ValChk ;AN000;;MS. check return | ||
| 143 | ;LOCAL_DOS_LOCK: ;AN000; | ||
| 144 | ; CMP BP,Lock_mul_range ;AN000;;MS. lock mul range? | ||
| 145 | ; JNZ unmul ;AN000;;MS. lock mul range? | ||
| 146 | ; JMP LOCAL_LOCK ;AN000;;MS. yes | ||
| 147 | ;unmul: | ||
| 148 | ; CMP BP,Unlock_mul_range ;AN000;;MS. unlock mul range? | ||
| 149 | ; JZ LOCAL_UNLOCK ;AN000;;MS. yes | ||
| 150 | ; CMP BP,Lock_read ;AN000;;MS. lock read? | ||
| 151 | ; JNZ chk_write_unlock ;AN000;;MS. no | ||
| 152 | ; CALL Set_Lock_Buffer ;AN000;;MS. set DOS lock buffer | ||
| 153 | ; CALL Set_Lock ;AN000;;MS. set the lock | ||
| 154 | ; JC lockerror ;AN000;;MS. error | ||
| 155 | ; invoke $READ ;AN000;;MS. do read | ||
| 156 | ; JC lockerror ;AN000;;MS. error | ||
| 157 | ;lockend: ;AN000; | ||
| 158 | ; transfer SYS_RET_OK ;AN000;;MS. return | ||
| 159 | ;chk_write_unlock: ;AN000; | ||
| 160 | ; CMP BP,Write_unlock ;AN000;;MS. write unlock ? | ||
| 161 | ; JNZ Lock_addf ;AN000;;MS. no | ||
| 162 | ; CALL Set_Lock_Buffer ;AN000;;MS. set DOS lock buffer | ||
| 163 | ;WriteUnlock: ;AN000; | ||
| 164 | ; PUSH AX ;AN000;;MS. save AX for unlock | ||
| 165 | ; invoke $WRITE ;AN000;;MS. do write | ||
| 166 | ; MOV [Temp_Var],AX ;AN000;;MS. save number of bytes writ | ||
| 167 | ; POP AX ;AN000;;MS. restore AX | ||
| 168 | ; JC lockerror ;AN000;;MS. error | ||
| 169 | ; MOV CX,1 ;AN000;;MS. one range unlock | ||
| 170 | ; PUSH CS ;AN000;;MS. | ||
| 171 | ; POP DS ;AN000;;MS. DS:DX points to | ||
| 172 | ; MOV DX,OFFSET DOSGROUP:Lock_Buffer ;AN000;;MS. Lock_BUffer | ||
| 173 | ; JMP LOCAL_UNLOCK ;AN000;;MS. do unlock | ||
| 174 | ;Lock_addf: ;AN000; | ||
| 175 | ; MOV SI,WORD PTR ES:[DI.SF_Size] ;AN000;;MS. must be lock add | ||
| 176 | ; MOV WORD PTR ES:[DI.SF_Position],SI ;AN000;;MS. set file position to | ||
| 177 | ; MOV SI,WORD PTR ES:[DI.SF_Size+2] ;AN000;;MS. EOF | ||
| 178 | ; MOV WORD PTR ES:[DI.SF_Position+2],SI;AN000;;MS. | ||
| 179 | ; CALL Set_Lock_Buffer ;AN000;;MS. set DOS lock buffer | ||
| 180 | ; CALL Set_Lock ;AN000;;MS. set the lock | ||
| 181 | ; JC lockerror ;AN000;;MS. error | ||
| 182 | ; JMP WriteUnlock ;AN000;;MS. do write unlock | ||
| 183 | ;AN000;;MS. | ||
| 184 | DOS_Unlock: | ||
| 185 | TEST ES:[DI.sf_flags],sf_isnet | ||
| 186 | JZ LOCAL_UNLOCK | ||
| 187 | ;; invoke OWN_SHARE ;AN000;;MS. IFS owns share ? | ||
| 188 | ;; JNZ LOCAL_UNLOCK ;AN000;;MS. no | ||
| 189 | |||
| 190 | CallInstall Net_Xlock,multNet,10 | ||
| 191 | JMP SHORT ValChk | ||
| 192 | LOCAL_UNLOCK: | ||
| 193 | if installed | ||
| 194 | Call JShare + 7 * 4 | ||
| 195 | else | ||
| 196 | Call clr_block | ||
| 197 | endif | ||
| 198 | ValChk: | ||
| 199 | JNC Lock_OK | ||
| 200 | lockerror: | ||
| 201 | transfer SYS_RET_ERR | ||
| 202 | Lock_OK: | ||
| 203 | MOV AX,[Temp_VAR] ;AN000;;MS. AX= number of bytes | ||
| 204 | transfer SYS_Ret_OK | ||
| 205 | DOS_Lock: | ||
| 206 | TEST ES:[DI.sf_flags],sf_isnet | ||
| 207 | JZ LOCAL_LOCK | ||
| 208 | ;; invoke OWN_SHARE ;AN000;;MS. IFS owns share ? | ||
| 209 | ;; JNZ LOCAL_LOCK ;AN000;;MS. no | ||
| 210 | CallInstall NET_XLock,multNet,10 | ||
| 211 | JMP ValChk | ||
| 212 | LOCAL_LOCK: | ||
| 213 | if installed | ||
| 214 | Call JShare + 6 * 4 | ||
| 215 | else | ||
| 216 | Call Set_Block | ||
| 217 | endif | ||
| 218 | JMP ValChk | ||
| 219 | |||
| 220 | EndProc $LockOper | ||
| 221 | |||
| 222 | BREAK <Set_Lock> | ||
| 223 | |||
| 224 | ; Input: | ||
| 225 | ; BP = Lock_Buffer addr | ||
| 226 | ; CX = lock length | ||
| 227 | ; Function: | ||
| 228 | ; set the lock | ||
| 229 | ; Output: | ||
| 230 | ; carry clear ,Lock is set | ||
| 231 | ; DS:DX = addr of | ||
| 232 | ; carry set Lock is not set | ||
| 233 | ; DS,DX,CX preserved | ||
| 234 | |||
| 235 | ; procedure Set_Lock,NEAR ;AN000; | ||
| 236 | ;ASSUME DS:NOTHING,ES:NOTHING ;AN000; | ||
| 237 | ;AN000; | ||
| 238 | ; PUSH DS ;MS. save regs ;AN000; | ||
| 239 | ; PUSH DX ;MS. ;AN000; | ||
| 240 | ; PUSH CX ;MS. ;AN000; | ||
| 241 | ; ;AN000; | ||
| 242 | ; PUSH CS ;MS. ;AN000; | ||
| 243 | ; POP DS ;MS. DS:DX poits to Lock_Buffer ;AN000; | ||
| 244 | ; MOV DX,BP ;MS. ;AN000; | ||
| 245 | ; PUSH BX ;MS. save handle ;AN000; | ||
| 246 | ; PUSH AX ;MS. save functions ;AN000; | ||
| 247 | ; MOV CX,1 ;MS. set one lock ;AN000; | ||
| 248 | ;if installed ;AN000; | ||
| 249 | ; Call JShare + 6 * 4 ;MS. call share set block ;AN000; | ||
| 250 | ;else ;AN000; | ||
| 251 | ; Call Set_Block ;MS. ;AN000; | ||
| 252 | ;endif ;AN000; | ||
| 253 | ; POP AX ;MS. restore regs ;AN000; | ||
| 254 | ; POP BX ;MS. ;AN000; | ||
| 255 | ; POP CX ;MS. ;AN000; | ||
| 256 | ; POP DX ;MS. ;AN000; | ||
| 257 | ; POP DS ;MS. ;AN000; | ||
| 258 | ; return ;MS. ;AN000; | ||
| 259 | ; ;AN000; | ||
| 260 | ;EndProc Set_Lock ;AN000; | ||
| 261 | |||
| 262 | BREAK <Set_Lock_Buffer> | ||
| 263 | |||
| 264 | ; Input: | ||
| 265 | ; ES:DI = addr of SFT | ||
| 266 | ; CX = lock length | ||
| 267 | ; Function: | ||
| 268 | ; set up the lock buffer | ||
| 269 | ; Output: | ||
| 270 | ; Lock_Buffer is filled with position and lock length | ||
| 271 | ; BP = Lock_Buffer addr | ||
| 272 | ; | ||
| 273 | |||
| 274 | ; procedure Set_Lock_Buffer,NEAR | ||
| 275 | ;ASSUME DS:NOTHING,ES:NOTHING | ||
| 276 | ; | ||
| 277 | ; MOV BP, OFFSET DOSGROUP:Lock_Buffer ;MS. move file position ;AN000; | ||
| 278 | ; MOV SI,WORD PTR ES:[DI.sf_position] ;MS. to DOS lock_buffer ;AN000; | ||
| 279 | ; MOV WORD PTR [BP.Lock_position],SI ;MS. ;AN000; | ||
| 280 | ; MOV SI,WORD PTR ES:[DI.sf_position+2] ;MS. ;AN000; | ||
| 281 | ; MOV WORD PTR [BP.Lock_position+2],SI ;MS. ;AN000; | ||
| 282 | ; MOV WORD PTR [BP.Lock_length],CX ;MS. move cx to lock_buffer ;AN000; | ||
| 283 | ; MOV WORD PTR [BP.Lock_length+2],0 ;MS. ;AN000; | ||
| 284 | ; return ;MS. ;AN000; | ||
| 285 | ; | ||
| 286 | ;EndProc Set_Lock_Buffer | ||
| 287 | |||
| 288 | ; Inputs: | ||
| 289 | ; Outputs of SETUP | ||
| 290 | ; [USER_ID] Set | ||
| 291 | ; [PROC_ID] Set | ||
| 292 | ; Function: | ||
| 293 | ; Check for lock violations on local I/O | ||
| 294 | ; Retries are attempted with sleeps in between | ||
| 295 | ; Outputs: | ||
| 296 | ; Carry clear | ||
| 297 | ; Operation is OK | ||
| 298 | ; Carry set | ||
| 299 | ; A lock violation detected | ||
| 300 | ; Outputs of SETUP preserved | ||
| 301 | |||
| 302 | procedure LOCK_CHECK,NEAR | ||
| 303 | DOSAssume CS,<DS>,"Lock_Check" | ||
| 304 | ASSUME ES:NOTHING | ||
| 305 | |||
| 306 | MOV BX,RetryCount ; Number retries | ||
| 307 | LockRetry: | ||
| 308 | SaveReg <BX,AX> ; MS. save regs ;AN000; | ||
| 309 | if installed | ||
| 310 | call JShare + 8 * 4 | ||
| 311 | else | ||
| 312 | Call chk_block | ||
| 313 | endif | ||
| 314 | RestoreReg <AX,BX> ; MS. restrore regs ;AN000; | ||
| 315 | retnc ; There are no locks | ||
| 316 | Invoke Idle ; wait a while | ||
| 317 | DEC BX ; remember a retry | ||
| 318 | JNZ LockRetry ; more retries left... | ||
| 319 | STC | ||
| 320 | return | ||
| 321 | EndProc LOCK_CHECK | ||
| 322 | |||
| 323 | ; Inputs: | ||
| 324 | ; [THISDPB] set | ||
| 325 | ; [READOP] indicates whether error on read or write | ||
| 326 | ; Function: | ||
| 327 | ; Handle Lock violation on compatibility (FCB) mode SFTs | ||
| 328 | ; Outputs: | ||
| 329 | ; Carry set if user says FAIL, causes error_lock_violation | ||
| 330 | ; Carry clear if user wants a retry | ||
| 331 | ; | ||
| 332 | ; DS, ES, DI, CX preserved, others destroyed | ||
| 333 | |||
| 334 | procedure LOCK_VIOLATION,NEAR | ||
| 335 | DOSAssume CS,<DS>,"Lock_Violation" | ||
| 336 | ASSUME ES:NOTHING | ||
| 337 | |||
| 338 | PUSH DS | ||
| 339 | PUSH ES | ||
| 340 | PUSH DI | ||
| 341 | PUSH CX | ||
| 342 | MOV AX,error_lock_violation | ||
| 343 | MOV [ALLOWED],allowed_FAIL + allowed_RETRY | ||
| 344 | LES BP,[THISDPB] | ||
| 345 | MOV DI,1 ; Fake some registers | ||
| 346 | MOV CX,DI | ||
| 347 | MOV DX,ES:[BP.dpb_first_sector] | ||
| 348 | invoke HARDERR | ||
| 349 | POP CX | ||
| 350 | POP DI | ||
| 351 | POP ES | ||
| 352 | POP DS | ||
| 353 | CMP AL,1 | ||
| 354 | retz ; 1 = retry, carry clear | ||
| 355 | STC | ||
| 356 | return | ||
| 357 | |||
| 358 | EndProc LOCK_VIOLATION | ||
| 359 | |||
| 360 | IF INSTALLED | ||
| 361 | ; | ||
| 362 | ; do a retz to return error | ||
| 363 | ; | ||
| 364 | Procedure CheckShare,NEAR | ||
| 365 | ASSUME CS:DOSGROUP,ES:NOTHING,DS:NOTHING,SS:NOTHING | ||
| 366 | CMP fShare,0 | ||
| 367 | return | ||
| 368 | EndProc CheckShare | ||
| 369 | ENDIF | ||
| 370 | |||
| 371 | CODE ENDS | ||
| 372 | END | ||