]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DOS/EXTATTR.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DOS / EXTATTR.ASM
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;