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/DOS/EXTATTR.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/DOS/EXTATTR.ASM')
| -rw-r--r-- | v4.0/src/DOS/EXTATTR.ASM | 679 |
1 files changed, 679 insertions, 0 deletions
diff --git a/v4.0/src/DOS/EXTATTR.ASM b/v4.0/src/DOS/EXTATTR.ASM new file mode 100644 index 0000000..1cc1d32 --- /dev/null +++ b/v4.0/src/DOS/EXTATTR.ASM | |||
| @@ -0,0 +1,679 @@ | |||
| 1 | TITLE EXTATTR- Extended Attributes | ||
| 2 | NAME EXTATTR | ||
| 3 | ; | ||
| 4 | ; Get or Set Extended Attributes by handle | ||
| 5 | ; | ||
| 6 | ; | ||
| 7 | ; GetSetEA | ||
| 8 | ; Set_Output | ||
| 9 | ; Search_EA | ||
| 10 | ; Copy_QEA | ||
| 11 | ; Set_one_EA | ||
| 12 | ; Get_one_EA | ||
| 13 | ; Get_Value | ||
| 14 | ; GSetDevCdpg | ||
| 15 | ; Get_max_EA_size | ||
| 16 | ; | ||
| 17 | ; Revision history | ||
| 18 | ; | ||
| 19 | ; A000 version 4.00 Jan. 1988 | ||
| 20 | ; | ||
| 21 | ; | ||
| 22 | ; | ||
| 23 | ; | ||
| 24 | ; | ||
| 25 | ; | ||
| 26 | ; | ||
| 27 | |||
| 28 | .xlist | ||
| 29 | ; | ||
| 30 | ; | ||
| 31 | ; get the appropriate segment definitions | ||
| 32 | ; | ||
| 33 | include dosseg.asm ;AN000; | ||
| 34 | |||
| 35 | CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000; | ||
| 36 | ASSUME SS:DOSGROUP,CS:DOSGROUP ;AN000; | ||
| 37 | |||
| 38 | .xcref | ||
| 39 | INCLUDE DOSSYM.INC ;AN000; | ||
| 40 | INCLUDE DEVSYM.INC ;AN000; | ||
| 41 | include EA.inc ;AN000; | ||
| 42 | .cref | ||
| 43 | .list | ||
| 44 | .sall | ||
| 45 | |||
| 46 | |||
| 47 | ; I_need XA_from,BYTE ;AN000; | ||
| 48 | |||
| 49 | ; I_need XA_TABLE,BYTE ;AN000; | ||
| 50 | ; I_need XA_TEMP,WORD ;AN000; | ||
| 51 | ; I_need XA_COUNT,WORD ;AN000; | ||
| 52 | ; I_need XA_DEVICE,BYTE ;AN000; | ||
| 53 | I_need XA_TYPE,BYTE ;AN000; | ||
| 54 | I_need SAVE_ES,WORD ;AN000; | ||
| 55 | I_need SAVE_DI,WORD ;AN000; | ||
| 56 | I_need SAVE_DS,WORD ;AN000; | ||
| 57 | I_need SAVE_SI,WORD ;AN000; | ||
| 58 | I_need SAVE_CX,WORD ;AN000; | ||
| 59 | I_need SAVE_BX,WORD ;AN000; | ||
| 60 | ; I_need XA_handle,WORD ;AN000; | ||
| 61 | ; I_need CPSWFLAG,BYTE ;AN000; | ||
| 62 | ; I_need XA_PACKET,BYTE ;AN000; | ||
| 63 | ; I_need MAX_EA_SIZE,WORD ;AN000; | ||
| 64 | ; I_need MAX_EANAME_SIZE,WORD ;AN000; | ||
| 65 | ; I_need THISSFT,DWORD ;AN000; | ||
| 66 | ;IF DBCS ;AN000; | ||
| 67 | ; I_need DBCS_PACKET,BYTE ;AN000; ;AN000; | ||
| 68 | ;ENDIF ;AN000; ;AN000; | ||
| 69 | ;AN000; | ||
| 70 | ;AN000; | ||
| 71 | ;AN000; | ||
| 72 | ;AN000; | ||
| 73 | ;AN000; | ||
| 74 | BREAK <GetSet_EA get or set extended attributes by handle> ;AN000; | ||
| 75 | ;AN000; | ||
| 76 | ; Input: [XA_type] = function code, (e.g., get,set) ;AN000; | ||
| 77 | ; [ThisSFT] points to SFT ;AN000; | ||
| 78 | ; ES:BP points to drive parameter block ;AN000; | ||
| 79 | ; [XA_from] = By_Create or By_EA ;AN000; | ||
| 80 | ; [SAVE_ES]:[SAVE_DI] points to get/set list ;AN000; | ||
| 81 | ; [SAVE_DS]:[SAVE_SI] points to get query list ;AN000; | ||
| 82 | ; [SAVE_CX] = size of buffer | ||
| 83 | ; [XA_device]= 1 device, 0 file ;AN000; | ||
| 84 | ; [XA_handle] for device ;AN000; | ||
| 85 | ; Function: Get or Set extended attributes by handle ;AN000; | ||
| 86 | ; Output: carry set: error ;AN000; | ||
| 87 | ; carry clear: extended attributes are successfully get/set ;AN000; | ||
| 88 | ; extended attribute cluster may be created ;AN000; | ||
| 89 | ; ;AN000; | ||
| 90 | ; ;AN000; | ||
| 91 | ; ;AN000; | ||
| 92 | ;AN000; | ||
| 93 | ;AN000; | ||
| 94 | procedure GetSet_XA,near ;AN000; | ||
| 95 | ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 96 | |||
| 97 | |||
| 98 | LES DI,DWORD PTR [SAVE_DI] ;AN000;;FT. ES:DI -> query list | ||
| 99 | ;; MOV [SAVE_BX],2 ;AN000;;FT. size returned | ||
| 100 | ;; XOR DX,DX ;AN000;;FT. dx=0, codepage id | ||
| 101 | |||
| 102 | CMP [XA_type],2 ;AN000;;FT. get EA ? | ||
| 103 | JNZ eaname ;AN000;;FT. no | ||
| 104 | getEAs: ;AN000; | ||
| 105 | CMP [SAVE_CX],0 ;AN000;;FT. get max data size | ||
| 106 | JNZ notmax ;AN000;;FT. no | ||
| 107 | ;; CALL Get_max_EA_size ;AN000;;FT. | ||
| 108 | |||
| 109 | MOV CX,2 ;AN000;;FT. FAKE FAKE.............. | ||
| 110 | JNC set_user_cx ;AN000;;FT. | ||
| 111 | JMP OKexit ;AN000;;FT. error | ||
| 112 | notmax: | ||
| 113 | CMP [SAVE_CX],1 ;AN000;;FT. buffer size =1 ? | ||
| 114 | JNZ goodsiz ;AN000;;FT. no | ||
| 115 | errout: ;AN000; | ||
| 116 | JMP insuff_space ;AN000;;FT. no error | ||
| 117 | goodsiz: ;AN000; | ||
| 118 | MOV WORD PTR ES:[DI],0 ;AN000;FT. FAKE FAKE ............... | ||
| 119 | MOV CX,2 ;AN000;FT. FAKE FAKE ............... | ||
| 120 | JMP set_user_cx ;AN000;FT. FAKE FAKE ............... | ||
| 121 | |||
| 122 | ; SUB [SAVE_CX],2 ;AN000;;FT. minus count size | ||
| 123 | ; CMP [SAVE_SI],-1 ;AN000;;FT. get all ? | ||
| 124 | ; JNZ getsome ;AN000;;FT. no | ||
| 125 | ; PUSH CS ;AN000;;FT. ds:si-> EA entry addr | ||
| 126 | ; POP DS ;AN000;;FT. | ||
| 127 | ; INC DI ;AN000;;FT. | ||
| 128 | ; INC DI ;AN000;;FT. es:di -> address after count | ||
| 129 | ; MOV SI,OFFSET DOSGROUP:XA_TABLE ;AN000;FT. | ||
| 130 | ; MOV CX,XA_COUNT ;AN000;;FT. cx= number of EA entries | ||
| 131 | ;;;;;; | ||
| 132 | ;getone: | ||
| 133 | ; CALL GET_ONE_EA ;AN000;;FT. get EA | ||
| 134 | ; JC setout ;AN000;;FT. insufficient memory | ||
| 135 | ; INC DX ;AN000;;FT. next EA ID | ||
| 136 | ; LOOP getone ;AN000;;FT. next one | ||
| 137 | ;setout: ;AN000; | ||
| 138 | ; CALL Set_Output ;AN000;;FT. | ||
| 139 | ; OR CX,CX ;AN000;;FT. | ||
| 140 | ; JNZ errout ;AN000;;FT. | ||
| 141 | ; | ||
| 142 | ; JMP OKexit ;AN000;;FT. | ||
| 143 | eaname: | ||
| 144 | CMP [XA_type],3 ;AN000;;FT. get EA name?` | ||
| 145 | JZ geteaname ;AN000;;FT. yes | ||
| 146 | JMP setea ;AN000;;FT. | ||
| 147 | geteaname: | ||
| 148 | ; MOV [SAVE_SI],-1 ;AN000;;FT. make get all | ||
| 149 | CMP [SAVE_CX],0 ;AN000;;FT. get max data size | ||
| 150 | JNZ notmax ;AN000;;FT. no | ||
| 151 | MOV CX,2 ;AN000;;FT. FAKE FAKE ...................... | ||
| 152 | ;; MOV CX,[MAX_EANAME_SIZE] ;AN000;;FT. get name size | ||
| 153 | set_user_cx: ;AN000; | ||
| 154 | invoke get_user_stack ;AN000;;FT. get user stack | ||
| 155 | MOV [SI.user_CX],CX ;AN000;;FT. | ||
| 156 | JMP OKexit ;AN000;;FT. exit | ||
| 157 | |||
| 158 | getsome: ;AN000; | ||
| 159 | ; LDS SI,DWORD PTR [SAVE_SI] ;AN000;;FT. | ||
| 160 | ; LODSW ;AN000;;FT. | ||
| 161 | ; MOV CX,AX ;AN000;;FT. cx=number of query entries | ||
| 162 | ; JCXZ setout ;AN000;;FT. yes | ||
| 163 | ; STOSW ;AN000;;FT. es:di -> EA | ||
| 164 | ;get_next_EA: ;AN000; | ||
| 165 | ; PUSH DS ;AN000;;FT. save ds:si | ||
| 166 | ; PUSH SI ;AN000;;FT. es:di | ||
| 167 | ; PUSH ES ;AN000;;FT. | ||
| 168 | ; PUSH DI ;AN000;;FT. | ||
| 169 | ; CALL Search_EA ;AN000;;FT. search query EA from table | ||
| 170 | ; JC EAnotFound ;AN000;;FT. EA not found | ||
| 171 | ; PUSH ES ;AN000;;FT. | ||
| 172 | ; POP DS ;AN000;;FT. | ||
| 173 | ; MOV SI,DI ;AN000;;FT. ds:si -> found EA | ||
| 174 | ; POP DI ;AN000;;FT. es:di -> buffer | ||
| 175 | ; POP ES ;AN000;;FT. | ||
| 176 | ; CALL GET_ONE_EA ;AN000;;FT. copy to buffer | ||
| 177 | ; POP SI ;AN000;;FT. | ||
| 178 | ; POP DS ;AN000;;FT. | ||
| 179 | ; JC setfinal ;AN000;;FT. memory not enough | ||
| 180 | ; MOV AL,[SI.QEA_NAMELEN] ;AN000;;FT. | ||
| 181 | ; XOR AH,AH ;AN000;;FT. | ||
| 182 | ; ADD AX,QEA_NAME ;AN000;;FT. | ||
| 183 | ; ADD SI,AX ;AN000;;FT. ds:si -> next query entry | ||
| 184 | ;testend: ;AN000; | ||
| 185 | ; LOOP get_next_EA ;AN000;;FT. do next | ||
| 186 | ;setfinal: ;AN000; | ||
| 187 | ; LDS SI,DWORD PTR [SAVE_SI] ;AN000;;FT. | ||
| 188 | ; MOV DX,[SI] ;AN000;;FT. | ||
| 189 | ; SUB DX,CX ;AN000;;FT. dx= returned count | ||
| 190 | ; JMP setout ;AN000;;FT. | ||
| 191 | ;EAnotFound: ;AN000; | ||
| 192 | ; POP DI ;AN000;;FT. restore regs | ||
| 193 | ; POP ES ;AN000;;FT. | ||
| 194 | ; POP SI ;AN000;;FT. | ||
| 195 | ; POP DS ;AN000;;FT. | ||
| 196 | ; | ||
| 197 | ; CALL COPY_QEA ;AN000;;FT. copy query EA to buffer | ||
| 198 | ; JC setfinal ;AN000;;FT. not enough memory | ||
| 199 | ; JMP testend ;AN000;;FT. | ||
| 200 | setea: ;AN000; | ||
| 201 | JMP OKexit ;AN000;;FT. FAKE FAKE .......... | ||
| 202 | ; LDS SI,DWORD PTR [SAVE_DI] ;AN000;;FT. | ||
| 203 | ; LODSW ;AN000;;FT. | ||
| 204 | ; MOV CX,AX ;AN000;;FT. cx=number of query entries | ||
| 205 | ; OR CX,CX ;AN000;;FT. cx=0 ? | ||
| 206 | ; JZ OKexit ;AN000;;FT. yes | ||
| 207 | ;set_next: ;AN000; | ||
| 208 | ; CALL Search_EA ;AN000;;FT. | ||
| 209 | ; JNC toset ;AN000;;FT. | ||
| 210 | ;set_reason: ;AN000; | ||
| 211 | ; CLC ;AN000;;FT. clear acrry | ||
| 212 | ; MOV [SI.EA_RC],AL ;AN000;;FT. set reason code | ||
| 213 | ; DEC CX ;AN000;;FT. end of set ? | ||
| 214 | ; JZ OKexit ;AN000;;FT. yes | ||
| 215 | |||
| 216 | ; MOV AL,[SI.EA_NAMELEN] ;AN000;;FT. | ||
| 217 | ; XOR AH,AH ;AN000;;FT. | ||
| 218 | ; ADD AX,[SI.EA_VALLEN] ;AN000;;FT. | ||
| 219 | ; ADD SI,EA_NAME ;AN000;;FT. | ||
| 220 | ; ADD SI,AX ;AN000;;FT. es:di -> next EA entry | ||
| 221 | ; JMP set_next ;AN000;;FT. | ||
| 222 | ;toset: ;AN000; | ||
| 223 | ; CALL SET_ONE_EA ;AN000;;FT. set it | ||
| 224 | ; JMP set_reason ;AN000;;FT. | ||
| 225 | insuff_space: ;AN000;;FT. | ||
| 226 | ; MOV AX,error_not_enough_memory ;AN000;FT. insufficient memory err | ||
| 227 | ; STC ;AN000; | ||
| 228 | OKexit: ;AN000; | ||
| 229 | return ;AN000; | ||
| 230 | |||
| 231 | EndProc GetSet_XA ;AN000; | ||
| 232 | |||
| 233 | |||
| 234 | ; Input: [SAVE_ES]:[SAVE_DI] points to buffer | ||
| 235 | ; [SAVE_BX]= returned size | ||
| 236 | ; DX= returned count | ||
| 237 | ; Function: set returned size and count ;AN000; | ||
| 238 | ; Output: none | ||
| 239 | ;AN000; | ||
| 240 | ;procedure Set_Output,NEAR ;AN000; | ||
| 241 | ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 242 | ; ;AN000; | ||
| 243 | ; LES DI,DWORD PTR [SAVE_DI] ;FT. es:di -> count ;AN000; | ||
| 244 | ; MOV ES:[DI],DX ;FT. ;AN000; | ||
| 245 | ; MOV BX,[SAVE_BX] ;FT. cx=size returned ;AN000; | ||
| 246 | ; invoke get_user_stack ;FT. get user stack ;AN000; | ||
| 247 | ; MOV [SI.user_CX],BX ;FT. ;AN000; | ||
| 248 | ; return ;FT. ;AN000; | ||
| 249 | ; ;AN000; | ||
| 250 | ;EndProc Set_Output ;AN000; | ||
| 251 | |||
| 252 | |||
| 253 | ; Input: DS:SI= query EA addr ;AN000; | ||
| 254 | ; Function: search the EA ;AN000; | ||
| 255 | ; Output: carry clear | ||
| 256 | ; DX= EA ID (0 codpage, 1 Filetype, etc.) | ||
| 257 | ; ES:DI points to found entry | ||
| 258 | ; carry set, not found, AL= reason code ;AN000; | ||
| 259 | ;AN000; | ||
| 260 | ;procedure Search_EA,NEAR ;AN000; | ||
| 261 | ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 262 | ; ;AN000; | ||
| 263 | ; PUSH CX ;FT. save entry count ;AN000; | ||
| 264 | ; MOV AL,EARCNOTFOUND ;FT. preset error code ;AN000; | ||
| 265 | ; MOV BL,[SI.QEA_NAMELEN] ;FT. ? ;AN000; | ||
| 266 | ; CMP [XA_TYPE],4 ;FT. set ? ;AN000; | ||
| 267 | ; JNZ gettyp ;FT. no ;AN000; | ||
| 268 | ; MOV BL,[SI.EA_NAMELEN] ;FT. ? ;AN000; | ||
| 269 | ;gettyp: | ||
| 270 | ; OR BL,BL ;FT. ;AN000; | ||
| 271 | ; JZ not_found ;FT. ;AN000; | ||
| 272 | ; PUSH CS ;FT. ds:si-> EA entry addr ;AN000; | ||
| 273 | ; POP ES ;FT. ;AN000; | ||
| 274 | ; MOV DI,OFFSET DOSGROUP:XA_TABLE ;FT. ;AN000; | ||
| 275 | ; MOV CX,XA_COUNT ;FT. cx= number of EA entries ;AN000; | ||
| 276 | ; XOR DX,DX ;FT. dx=0, codepage id ;AN000; | ||
| 277 | ; | ||
| 278 | ;start_find: | ||
| 279 | ; PUSH CX ;FT. save entry count ;AN000; | ||
| 280 | ; MOV CL,BL ;FT. ;AN000; | ||
| 281 | ; XOR CH,CH ;FT. get name len ;AN000; | ||
| 282 | ; PUSH SI ;FT. ;AN000; | ||
| 283 | ; PUSH DI ;FT. ;AN000; | ||
| 284 | ; CMP [XA_TYPE],4 ;FT. set ? ;AN000; | ||
| 285 | ; JNZ gettyp2 ;FT. no ;AN000; | ||
| 286 | ; ADD SI,EA_NAME ;FT. ;AN000; | ||
| 287 | ; JMP short updi ;FT. ;AN000; | ||
| 288 | ;gettyp2: | ||
| 289 | ; ADD SI,QEA_NAME ;FT. compare EA names ;AN000; | ||
| 290 | ;updi: | ||
| 291 | ; ADD DI,EA_NAME ;FT. ;AN000; | ||
| 292 | ; REP CMPSB ;FT. ;AN000; | ||
| 293 | ; POP DI ;FT. ;AN000; | ||
| 294 | ; POP SI ;FT. ;AN000; | ||
| 295 | ; POP CX ;FT. ;AN000; | ||
| 296 | ; JNZ not_matched ;FT. name not matched ;AN000; | ||
| 297 | ; MOV AL,EARCDEFBAD ;FT. preset error code ;AN000; | ||
| 298 | ; PUSH SI ;FT. ;AN000; | ||
| 299 | ; PUSH DI ;FT. ;AN000; | ||
| 300 | ; CMPSB ;FT. compare type ;AN000; | ||
| 301 | ; JNZ not_matched2 ;FT. type not matched ;AN000; | ||
| 302 | ; CMPSW ;FT. compare flags ;AN000; | ||
| 303 | ; JNZ not_matched2 ;FT. flag not matched ;AN000; | ||
| 304 | ; POP DI ;FT. ;AN000; | ||
| 305 | ; POP SI ;FT. found one ;AN000; | ||
| 306 | ; JMP SHORT found_one ;FT. ;AN000; | ||
| 307 | ;not_matched: | ||
| 308 | ; DEC CX ;FT. end of table ;AN000; | ||
| 309 | ; JZ not_found ;FT. yes ;AN000; | ||
| 310 | ; MOV AL,ES:[DI.EA_NAMELEN] ;FT. ;AN000; | ||
| 311 | ; XOR AH,AH ;FT. ;AN000; | ||
| 312 | ; | ||
| 313 | ; ADD DI,EA_NAME ;FT. ;AN000; | ||
| 314 | ; ADD DI,AX ;FT. es:di -> next EA entry ;AN000; | ||
| 315 | ; INC DX ;FT. increment EA ID ;AN000; | ||
| 316 | ; JMP start_find ;FT. ;AN000; | ||
| 317 | ;not_matched2: | ||
| 318 | ; POP DI ;FT. ;AN000; | ||
| 319 | ; POP SI ;FT. ;AN000; | ||
| 320 | ; JMP not_matched ;FT. ;AN000; | ||
| 321 | ;not_found: | ||
| 322 | ; STC ;FT. ;AN000; | ||
| 323 | ;found_one: | ||
| 324 | ; POP CX ;FT. ;AN000; | ||
| 325 | ; return ;FT. ;AN000; | ||
| 326 | ;AN000; | ||
| 327 | ;EndProc Search_EA ;AN000; | ||
| 328 | ;AN000; | ||
| 329 | ; Input: ES:DI= buffer address ;AN000; | ||
| 330 | ; DS:SI= EA entry address | ||
| 331 | ; [SAVE_CX]= buffer size | ||
| 332 | ; AL = reason code | ||
| 333 | ; Function: move one query entry to buffer ;AN000; | ||
| 334 | ; Output: carry clear | ||
| 335 | ; DS:SI points to next entry | ||
| 336 | ; ES:DI points to next entry | ||
| 337 | ; [SAVE_CX],[SAVE_BX], updated ;AN000; | ||
| 338 | ; carry set, insufficient memory error ;AN000; | ||
| 339 | ;AN000; | ||
| 340 | ;procedure COPY_QEA,NEAR ;AN000; | ||
| 341 | ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 342 | ; ;AN000; | ||
| 343 | ; PUSH CX ;FT. ;AN000; | ||
| 344 | ; MOV DL,AL ;FT. ;AN000; | ||
| 345 | ; MOV CX,EA_NAME -EA_TYPE ;FT. ;AN000; | ||
| 346 | ; | ||
| 347 | ; MOV BL,[SI.QEA_NAMELEN] ;FT. ;AN000; | ||
| 348 | ; XOR BH,BH ;FT. ;AN000; | ||
| 349 | ; ADD CX,BX ;FT. cx= query EA size ;AN000; | ||
| 350 | ; CMP CX,[SAVE_CX] ;FT. > buffer size ;AN000; | ||
| 351 | ; JA sizeshort2 ;FT. yes ;AN000; | ||
| 352 | ; PUSH CX ;FT. ;AN000; | ||
| 353 | ; LODSB ;FT. move type ;AN000; | ||
| 354 | ; STOSB ;FT. ;AN000; | ||
| 355 | ; LODSW ;FT. ;AN000; | ||
| 356 | ; STOSW ;FT. move flag ;AN000; | ||
| 357 | ; MOV AL,DL ;FT. move RC ;AN000; | ||
| 358 | ; STOSB ;FT. ;AN000; | ||
| 359 | ; | ||
| 360 | ; LODSB ;FT. move name len ;AN000; | ||
| 361 | ; MOV CL,AL ;FT. ;AN000; | ||
| 362 | ; STOSB ;FT. ;AN000; | ||
| 363 | ; XOR AX,AX ;FT. zero value length ;AN000; | ||
| 364 | ; STOSW ;FT. ;AN000; | ||
| 365 | ; OR CL,CL ;FT. ;AN000; | ||
| 366 | ; JZ zeroname ;FT. ;AN000; | ||
| 367 | ; XOR CH,CH ;FT. ;AN000; | ||
| 368 | ; | ||
| 369 | ; REP MOVSB ;FT. move EA to buffer ;AN000; | ||
| 370 | ;zeroname: | ||
| 371 | ; POP CX ;FT. ;AN000; | ||
| 372 | ; ADD [SAVE_BX],CX ;FT. bx=bx+entry size ;AN000; | ||
| 373 | ; SUB [SAVE_CX],CX ;FT. update buffer size ;AN000; | ||
| 374 | ; CLC ;FT. ;AN000; | ||
| 375 | ; JMP SHORT okget2 ;FT. ;AN000; | ||
| 376 | ; | ||
| 377 | ;sizeshort2: | ||
| 378 | ; MOV AX,error_not_enough_memory ;FT. error ;AN000; | ||
| 379 | ; STC ;FT. ;AN000; | ||
| 380 | ;okget2: | ||
| 381 | ; POP CX ;FT. ;AN000; | ||
| 382 | ; return ;FT. ;AN000; | ||
| 383 | ; ;AN000; | ||
| 384 | ;EndProc COPY_QEA ;AN000; | ||
| 385 | ;AN000; | ||
| 386 | ; Input: ES:DI= found EA entry addr ;AN000; | ||
| 387 | ; DS:SI= source EA entry address | ||
| 388 | ; DX= EA ID (0 codpage, 1 Filetype, etc.) | ||
| 389 | ; Function: set one EA ;AN000; | ||
| 390 | ; Output: carry clear | ||
| 391 | ; EA set | ||
| 392 | ; carry set, AL= reason code ;AN000; | ||
| 393 | ;AN000; | ||
| 394 | ;procedure SET_ONE_EA,NEAR ;AN000; | ||
| 395 | ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 396 | ; ;AN000; | ||
| 397 | ; PUSH CX ;FT. ;AN000; | ||
| 398 | ; MOV AL,EARCDEFBAD ;FT. prseet error code ;AN000; | ||
| 399 | ; MOV BX,[SI.EA_VALLEN] ;FT. ;AN000; | ||
| 400 | ; CMP BX,ES:[DI.EA_VALLEN] ;FT. length equal ? ;AN000; | ||
| 401 | ; JNZ notset ;FT. no ;AN000; | ||
| 402 | ; PUSH DS ;FT. ;AN000; | ||
| 403 | ; PUSH SI ;FT. ;AN000; | ||
| 404 | ; MOV AL,[SI.EA_NAMELEN] ;FT. ;AN000; | ||
| 405 | ; XOR AH,AH ;FT. ;AN000; | ||
| 406 | ; ADD SI,EA_NAME ;FT. ;AN000; | ||
| 407 | ; ADD SI,AX ;FT. ;AN000; | ||
| 408 | ; CMP DX,0 ;FT. ;AN000; | ||
| 409 | ; JNZ set_filetyp ;FT. ;AN000; | ||
| 410 | ; LODSW ;FT. ;AN000; | ||
| 411 | ; CMP [XA_DEVICE],0 ;FT. device ? ;AN000; | ||
| 412 | ; JZ notdevice ;FT. no ;AN000; | ||
| 413 | ; OR AX,AX ;FT. code page 0 ? ;AN000; | ||
| 414 | ; JZ NORM0 ;FT. yes ;AN000; | ||
| 415 | ; | ||
| 416 | ; CALL GSetDevCdPg ;FT. ;AN000; | ||
| 417 | ; JNC welldone ;FT. ;AN000; | ||
| 418 | ; CMP [CPSWFLAG],0 ;FT. code page matching on ;AN000; | ||
| 419 | ; JZ NORM0 ;FT. no ;AN000; | ||
| 420 | ; invoke SAVE_WORLD ;FT. save all regs ;AN000; | ||
| 421 | ; LDS SI,[THISSFT] ;FT. ds:si -> sft ;AN000; | ||
| 422 | ; LDS SI,[SI.sf_devptr] ;FT. ds:si -> device header ;AN000; | ||
| 423 | ; MOV BP,DS ;FT. save all regs ;AN000; | ||
| 424 | ; invoke Code_Page_Mismatched_Error ;FT. ;AN000; | ||
| 425 | ; CMP AL,0 ;FT. ignore ? ;AN000; | ||
| 426 | ; JZ NORM1 ;FT. ;AN000; | ||
| 427 | ; invoke RESTORE_WORLD ;FT. save all regs ;AN000; | ||
| 428 | ;NORM0: | ||
| 429 | ; MOV AL,EARCDEVERROR ;FT. ;AN000; | ||
| 430 | ; STC ;FT. ;AN000; | ||
| 431 | ; JMP SHORT sdone ;FT. ;AN000; | ||
| 432 | ;NORM1: | ||
| 433 | ; invoke RESTORE_WORLD ;FT. save all regs ;AN000; | ||
| 434 | ; JMP SHORT welldone ;FT. ;AN000; | ||
| 435 | ;notdevice: | ||
| 436 | ; LDS SI,[THISSFT] ;FT. ;AN000; | ||
| 437 | ; MOV [SI.sf_CodePage],AX ;FT. set codepege ;AN000; | ||
| 438 | ; JMP SHORT welldone ;FT. | ||
| 439 | ;set_filetyp: | ||
| 440 | ; LODSB ;FT. ;AN000; | ||
| 441 | ; LDS SI,[THISSFT] ;FT. set filtype ;AN000; | ||
| 442 | ; MOV [SI.sf_ATTR_HI],AL ;FT. ;AN000; | ||
| 443 | ; | ||
| 444 | ;welldone: | ||
| 445 | ; XOR AL,AL ;FT. success ;AN000; | ||
| 446 | ;sdone: | ||
| 447 | ; POP SI ;FT. ;AN000; | ||
| 448 | ; POP DS ;FT. ;AN000; | ||
| 449 | ;notset: | ||
| 450 | ; POP CX ;FT. ;AN000; | ||
| 451 | ; return ;FT. ;AN000; | ||
| 452 | ;AN000; | ||
| 453 | ;EndProc SET_ONE_EA ;AN000; | ||
| 454 | ;AN000; | ||
| 455 | ; Input: ES:DI= buffer address ;AN000; | ||
| 456 | ; DS:SI= EA entry address | ||
| 457 | ; [SAVE_CX]= buffer size available | ||
| 458 | ; [SAVE_BX]= size returned | ||
| 459 | ; DX= EA ID (0 codpage, 1 Filetype, etc.) | ||
| 460 | ; Function: move one EA entry to the buffer ;AN000; | ||
| 461 | ; Output: carry clear | ||
| 462 | ; DS:SI points to next entry | ||
| 463 | ; ES:DI points to next entry | ||
| 464 | ; [SAVE_CX],BX, updated ;AN000; | ||
| 465 | ; carry set, insufficient memory error ;AN000; | ||
| 466 | ;AN000; | ||
| 467 | ;procedure GET_ONE_EA,NEAR ;AN000; | ||
| 468 | ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 469 | ; ;AN000; | ||
| 470 | ; PUSH CX ;FT. ;AN000; | ||
| 471 | ; CMP [XA_TYPE],2 ;FT. type 2 ? ;AN000; | ||
| 472 | ; JZ gtyp2 ;FT. yes ;AN000; | ||
| 473 | ; MOV CX,QEA_NAME - QEA_TYPE ;FT. ;AN000; | ||
| 474 | ; JMP SHORT addnmlen ;FT. | ||
| 475 | ;gtyp2: | ||
| 476 | ; MOV CX,EA_NAME - EA_TYPE ;FT. cx = EA entry size ;AN000; | ||
| 477 | ; ADD CX,[SI.EA_VALLEN] ;FT. ;AN000; | ||
| 478 | ;addnmlen: | ||
| 479 | ; MOV AL,[SI.EA_NAMELEN] ;FT. | ||
| 480 | ; XOR AH,AH ;FT. ;AN000; | ||
| 481 | ; ADD CX,AX ;FT. ;AN000; | ||
| 482 | ; CMP CX,[SAVE_CX] ;FT. > buffer size ;AN000; | ||
| 483 | ; JA sizeshort ;FT. yes ;AN000; | ||
| 484 | ; PUSH CX ;FT. ;AN000; | ||
| 485 | ; LODSB ;FT. move type ;AN000; | ||
| 486 | ; STOSB ;FT. ;AN000; | ||
| 487 | ; LODSW ;FT. ;AN000; | ||
| 488 | ; STOSW ;FT. move flag ;AN000; | ||
| 489 | ; LODSB ;FT. EA list need RC ;AN000; | ||
| 490 | ; CMP [XA_TYPE],2 ;FT. ;AN000; | ||
| 491 | ; JNZ norc ;FT. ;AN000; | ||
| 492 | ; STOSB ;FT. ;AN000; | ||
| 493 | ;norc: | ||
| 494 | ; LODSB ;FT. move name len ;AN000; | ||
| 495 | ; STOSB ;FT. ;AN000; | ||
| 496 | ; MOV CL,AL ;FT. ;AN000; | ||
| 497 | ; XOR CH,CH ;FT. ;AN000; | ||
| 498 | ; LODSW ;FT. EA list need value len ;AN000; | ||
| 499 | ; CMP [XA_TYPE],2 ;FT. ;AN000; | ||
| 500 | ; JNZ novalen ;FT. ;AN000; | ||
| 501 | ; STOSW ;FT. ;AN000; | ||
| 502 | ;novalen: | ||
| 503 | ; | ||
| 504 | ; REP MOVSB ;FT. move EA to buffer ;AN000; | ||
| 505 | ; CMP [XA_TYPE],2 ;FT. ;AN000; | ||
| 506 | ; JNZ novalue ;FT. ;AN000; | ||
| 507 | ; CALL GET_VALUE ;FT. get value for type 2 ;AN000; | ||
| 508 | ;novalue: | ||
| 509 | ; POP CX ;FT. ;AN000; | ||
| 510 | ; ADD [SAVE_BX],CX ;FT. add entry size ;AN000; | ||
| 511 | ; LES DI,DWORD PTR [SAVE_DI] ;FT. ;AN000; | ||
| 512 | ; ADD DI,[SAVE_BX] ;FT. es:di -> next entry ;AN000; | ||
| 513 | ; SUB [SAVE_CX],CX ;FT. update buffer size ;AN000; | ||
| 514 | ; CLC ;FT. ;AN000; | ||
| 515 | ; JMP SHORT okget ;FT. ;AN000; | ||
| 516 | ; | ||
| 517 | ;sizeshort: | ||
| 518 | ; MOV AX,error_not_enough_memory ;FT. error ;AN000; | ||
| 519 | ; STC ;FT. ;AN000; | ||
| 520 | ;okget: | ||
| 521 | ; POP CX ;FT. ;AN000; | ||
| 522 | ; return ;FT. ;AN000; | ||
| 523 | ; ;AN000; | ||
| 524 | ;EndProc GET_ONE_EA ;AN000; | ||
| 525 | ;AN000; | ||
| 526 | ;AN000; | ||
| 527 | ; Input: DX= EA ID (0 codpage, 1 Filetype, etc.) | ||
| 528 | ; [THISSFT]= points to SFT | ||
| 529 | ; ES:DI= buffer address of EA value | ||
| 530 | ; [XA_DEVICE]=0 file, 1 device | ||
| 531 | ; Function: get attribute ;AN000; | ||
| 532 | ; Output: none ;AN000; | ||
| 533 | ; ;AN000; | ||
| 534 | ;AN000; | ||
| 535 | ;procedure GET_VALUE,NEAR ;AN000; | ||
| 536 | ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 537 | ; ;AN000; | ||
| 538 | ; PUSH DS ;FT. save ds:si ;AN000; | ||
| 539 | ; PUSH SI ;FT. ;AN000; | ||
| 540 | ; LDS SI,[ThisSFT] ;FT. ds:si -> SFT ;AN000; | ||
| 541 | ; | ||
| 542 | ; CMP DX,0 ;FT. code page ? ;AN000; | ||
| 543 | ; JNZ eafiltyp ;FT. no ;AN000; | ||
| 544 | ; CMP [XA_DEVICE],0 ;FT. device ? ;AN000; | ||
| 545 | ; JZ notdev ;FT. no ;AN000; | ||
| 546 | ; CALL GSetDevCdPg ;FT. do ioctl invoke ;AN000; | ||
| 547 | ; JNC okcdpg ;FT. error ? ;AN000; | ||
| 548 | ; PUSH DI ;FT. ;AN000; | ||
| 549 | ; XOR AX,AX ;FT. make code page 0 ;AN000; | ||
| 550 | ; LES DI,DWORD PTR [SAVE_DI] ;FT. ;AN000; | ||
| 551 | ; ADD DI,[SAVE_BX] ;FT. es:di -> beginning of entry ;AN000; | ||
| 552 | ; MOV ES:[DI.EA_RC],EARCNOTFOUND ;FT. ;AN000; | ||
| 553 | ; POP DI ;FT. ;AN000; | ||
| 554 | ; JMP SHORT okcdpg ;FT. ;AN000; | ||
| 555 | ;notdev: | ||
| 556 | ; MOV AX,[SI.sf_CodePage] ;FT. get code page from sft ;AN000; | ||
| 557 | ;okcdpg: | ||
| 558 | ; STOSW ;FT. put in buffer ;AN000; | ||
| 559 | ; JMP SHORT gotea ;FT. ;AN000; | ||
| 560 | ;eafiltyp: | ||
| 561 | ; MOV AL,[SI.sf_ATTR_HI] ;FT. get high attribute ;AN000; | ||
| 562 | ; STOSB ;FT. put in buffer ;AN000; | ||
| 563 | ; | ||
| 564 | ;gotea: | ||
| 565 | ; POP SI ;FT. retore regs ;AN000; | ||
| 566 | ; POP DS ;FT. ;AN000; | ||
| 567 | ; return ;FT. ;AN000; | ||
| 568 | ;EndProc GET_VALUE ;AN000; | ||
| 569 | ;AN000; | ||
| 570 | ;AN000; | ||
| 571 | ; Input: [XA_handle] = device handle ;AN000; | ||
| 572 | ; [XA_type] = 4 , set ;AN000; | ||
| 573 | ; AX= code page (set) | ||
| 574 | ; 2,3 get ;AN000; | ||
| 575 | ; Function: get or set device code page ;AN000; | ||
| 576 | ; Output: carry clear, AX= device code page (get) ;AN000; | ||
| 577 | ; carry set, error ;AN000; | ||
| 578 | ;AN000; | ||
| 579 | ;procedure GSetDevCdPg,near ;AN000; | ||
| 580 | ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 581 | ; ;AN000; | ||
| 582 | ; invoke SAVE_WORLD ;FT. save all regs ;AN000; | ||
| 583 | ; CMP [XA_type],4 ;FT. set ? ;AN000; | ||
| 584 | ; JZ setpg ;FT. yes ;AN000; | ||
| 585 | ; MOV CX,6AH ;FT. get selected code page ;AN000; | ||
| 586 | ; JMP SHORT dogset ;FT. ;AN000; | ||
| 587 | ;setpg: ;AN000; | ||
| 588 | ; MOV CX,4AH ;FT. set code page ;AN000; | ||
| 589 | ;IF DBCS | ||
| 590 | ; | ||
| 591 | ; invoke Save_World ;FT. save all regs ;AN000; | ||
| 592 | ; MOV BX,AX ;FT. bx= code page id ;AN000; | ||
| 593 | ; MOV AL,7 ;FT. get DBCS vectors ;AN000; | ||
| 594 | ; MOV DX,-1 ;FT. get current country ;AN000; | ||
| 595 | ; MOV CX,5 ;FT. minimum size ;AN000; | ||
| 596 | ; MOV DI,OFFSET DOSGROUP:DBCS_PACKET ;FT. ;AN000; | ||
| 597 | ; PUSH CS ;FT. ;AN000; | ||
| 598 | ; POP ES ;FT. ;AN000; | ||
| 599 | ; invoke $GetExtCntry ;FT. get DBCS vectors ;AN000; | ||
| 600 | ; JC nlsfunc_err ;FT. error ;AN000; | ||
| 601 | ; LDS SI,DWORD PTR DBCS_PACKET+1 ;FT. ;AN000; | ||
| 602 | ; LODSW ;FT. get vector length ;AN000; | ||
| 603 | ; MOV CX,AX ;FT. cx=length ;AN000; | ||
| 604 | ; | ||
| 605 | ; MOV DI,OFFSET DOSGROUP:XA_PACKET+4 ;FT. ;AN000; | ||
| 606 | ; PUSH CS ;FT. ;AN000; | ||
| 607 | ; POP ES ;FT. ;AN000; | ||
| 608 | ; REP MOVSB ;FT. ;AN000; | ||
| 609 | ; CLC ;FT. ;AN000; | ||
| 610 | ;nlsfunc_err: | ||
| 611 | ; invoke RESTORE_WORLD ;FT. restore all regs ;AN000; | ||
| 612 | ; JC deverr ;FT. ;AN000; | ||
| 613 | ; | ||
| 614 | ;ENDIF | ||
| 615 | ; MOV WORD PTR [XA_PACKET+2],AX ;FT. ;AN000; | ||
| 616 | ;dogset: ;AN000; | ||
| 617 | ; MOV BX,[XA_handle] ;FT. set up handle ;AN000; | ||
| 618 | ; PUSH CS ;FT. ds:dx -> packet ;AN000; | ||
| 619 | ; POP DS ;FT. ;AN000; | ||
| 620 | ; MOV DX,OFFSET DOSGROUP:XA_PACKET ;FT. ;AN000; | ||
| 621 | ; MOV AX,440CH ;FT. IOCTL to char device by handle ;AN000; | ||
| 622 | ; invoke $IOCTL ;FT. issue get code page ;AN000; | ||
| 623 | ; JC deverr ;FT. error ;AN000; | ||
| 624 | ; invoke RESTORE_WORLD ;FT. restore all regs ;AN000; | ||
| 625 | ; MOV AX,WORD PTR [XA_PACKET+2] ;FT. get code page ;AN000; | ||
| 626 | ; return ;FT. ;AN000; | ||
| 627 | ;deverr: ;AN000; | ||
| 628 | ; invoke RESTORE_WORLD ;FT. restore all regs ;AN000; | ||
| 629 | ; return ;FT. exit ;AN000; | ||
| 630 | ; ;AN000; | ||
| 631 | ;EndProc GSetDevCdPg ;AN000; | ||
| 632 | ;AN000; | ||
| 633 | |||
| 634 | ; Input: DS:SI -> query list | ||
| 635 | ; | ||
| 636 | ; Function: get max size ;AN000; | ||
| 637 | ; Output: CX= size | ||
| 638 | ; carry set error | ||
| 639 | ;AN000; | ||
| 640 | ;procedure Get_max_EA_size,NEAR ;AN000; | ||
| 641 | ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000; | ||
| 642 | ; ;AN000; | ||
| 643 | ; CMP [SAVE_SI],0FFFFH ;FT. get all ? ;AN000; | ||
| 644 | ; JNZ scan_query ;FT. no ;AN000; | ||
| 645 | ; MOV CX,[MAX_EA_SIZE] ;FT. get max EA size ;AN000; | ||
| 646 | ; JMP SHORT gotit ;FT. | ||
| 647 | ;scan_query: | ||
| 648 | ; LDS SI,DWORD PTR [SAVE_SI] ;FT. ds:si -> query list ;AN000; | ||
| 649 | ; LODSW ;FT. ax= number of entries ;AN000; | ||
| 650 | ; MOV [SAVE_CX],AX ;FT. ;AN000; | ||
| 651 | ; XOR CX,CX ;FT. set initial size to 0 ;AN000; | ||
| 652 | ; OR AX,AX ;FT. if no entris ;AN000; | ||
| 653 | ; JZ gotit ;FT. then return ;AN000; | ||
| 654 | ; MOV CX,2 ;FT. at lesat 2 ;AN000; | ||
| 655 | ;NEXT_QEA: | ||
| 656 | ; CALL Search_EA ;FT. search EA ;AN000; | ||
| 657 | ; JC serror ;FT. wrong EA ;AN000; | ||
| 658 | ; ADD CX,size EA ;FT. get EA size ;AN000; | ||
| 659 | ; ADD CL,ES:[DI.EA_NAMELEN] ;FT. ;AN000; | ||
| 660 | ; ADC CH,0 ;FT. ;AN000; | ||
| 661 | ; ADD CX,ES:[DI.EA_VALLEN] ;FT. ;AN000; | ||
| 662 | ; DEC CX ;FT. ;AN000; | ||
| 663 | ; DEC [SAVE_CX] ;FT. end of entris ;AN000; | ||
| 664 | ; JZ gotit ;FT. no ;AN000; | ||
| 665 | ; MOV AL,[SI.QEA_NAMELEN] ;FT. update to next QEA ;AN000; | ||
| 666 | ; XOR AH,AH ;FT. update to next QEA ;AN000; | ||
| 667 | ; ADD SI,AX ;FT. update to next QEA ;AN000; | ||
| 668 | ; ADD SI,size QEA ;FT. ;AN000; | ||
| 669 | ; DEC SI ;FT. ;AN000; | ||
| 670 | ; JMP next_QEA ;FT. do next ;AN000; | ||
| 671 | ;serror: | ||
| 672 | ; MOV AX,error_invalid_data ;FT. set initial size to 0 ;AN000; | ||
| 673 | ;gotit: ;FT. ;AN000; | ||
| 674 | ; return ;FT. exit ;AN000;;FT. exit ;AN000; | ||
| 675 | ; | ||
| 676 | ;EndProc Get_max_EA_size ;FT. exit ;AN000; ;AN000; | ||
| 677 | ;AN000; | ||
| 678 | CODE ENDS ;AN000; | ||
| 679 | END ;AN000; | ||