summaryrefslogtreecommitdiff
path: root/v4.0/src/DOS/EXTATTR.ASM
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DOS/EXTATTR.ASM
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/DOS/EXTATTR.ASM')
-rw-r--r--v4.0/src/DOS/EXTATTR.ASM679
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 @@
1TITLE EXTATTR- Extended Attributes
2NAME 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;
33include dosseg.asm ;AN000;
34
35CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000;
36 ASSUME SS:DOSGROUP,CS:DOSGROUP ;AN000;
37
38.xcref
39INCLUDE DOSSYM.INC ;AN000;
40INCLUDE DEVSYM.INC ;AN000;
41include 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;
74BREAK <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;
94procedure 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
104getEAs: ;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
112notmax:
113 CMP [SAVE_CX],1 ;AN000;;FT. buffer size =1 ?
114 JNZ goodsiz ;AN000;;FT. no
115errout: ;AN000;
116 JMP insuff_space ;AN000;;FT. no error
117goodsiz: ;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.
143eaname:
144 CMP [XA_type],3 ;AN000;;FT. get EA name?`
145 JZ geteaname ;AN000;;FT. yes
146 JMP setea ;AN000;;FT.
147geteaname:
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
153set_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
158getsome: ;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.
200setea: ;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;
228OKexit: ;AN000;
229 return ;AN000;
230
231EndProc 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;
678CODE ENDS ;AN000;
679END ;AN000;