|
|
1.1 root 1: ;/*
2: ; * File Dialog Library
3: ; * Created by Microsoft Corporation, 1989
4: ; */
5: .xlist
6: include cmacros.inc
7: .list
8:
9: errnz ?PLM-1 ; this module must use Pascal convention
10:
11: TRUE = 1
12:
13: externFP <WinCreateHeap, WinDestroyHeap>
14:
15: sBegin DATA
16: externW vhModule
17: externD vhheap
18: globalW __acrtused,0
19: sEnd DATA
20:
21: sBegin CODE
22:
23: assumes cs,CODE
24: assumes ds,NOTHING
25:
26: ; The following trick is to avoid any need for a DS where a constant
27: ; string is needed, any (PSZ)"foo" is replaced by (PSZ)szfoo with
28: ; szfoo created in the Code Selector. As we can't do that with C,
29: ; we do it with MASM.
30: ;
31: PUBLIC szStarStar
32: szStarStar LABEL BYTE
33: DB '*','.','*',0
34: PUBLIC szDot
35: szDot LABEL BYTE
36: DB '.',0
37:
38: ;======================================================
39: ; LCopyStruct(pbSrc, pbDst, cb)
40: ;
41: cProc LCopyStruct, <PUBLIC, NODATA, FAR>, <ds,si,di>
42: ParmD lpchSrc
43: ParmD lpchDst
44: ParmW cb
45:
46: cBegin
47: mov cx, cb
48: jcxz lcopydone ; all done if crc == 0
49: lds si, lpchSrc
50: les di, lpchDst
51: cmp si,di
52: jae lcopyok
53: mov ax,cx
54: dec ax
55: add si,ax
56: add di,ax
57: std
58: rep movsb
59: cld
60: jmp short lcopydone
61: lcopyok:
62: cld
63: rep movsb
64: lcopydone:
65:
66: cEnd
67:
68:
69: ;======================================================
70: ; LFillStruct(pbSrc, pbDst, cb)
71: ;
72: cProc LFillStruct, <PUBLIC, NODATA, FAR>, <di>
73: ParmD lpchDst
74: ParmW cb
75: ParmB fillByte
76:
77: cBegin
78: mov cx, cb
79: jcxz lfilldone ; all done if crc == 0
80: les di, lpchDst
81: cld
82: mov al,fillByte
83: rep stosb
84: lfilldone:
85: cEnd
86: ;======================================================
87: ;
88: ; lstrlen: Same as strlen except for taking long ptrs
89: ;
90:
91: cProc lstrlen,<PUBLIC, NODATA, FAR>
92: ; parmD pStr
93: cBegin nogen
94: mov bx,sp
95: push di
96: les di,ss:[bx+4]
97: cld
98: xor ax,ax ; get zero in ax
99: mov cx,-1 ; at most 64 k to move
100: repnz scasb ; look for end
101: mov ax,cx
102: neg ax
103: dec ax
104: dec ax
105: pop di
106: ret 4
107: cEnd nogen
108:
109:
110: lstrsetup:
111: pop dx
112: mov bx,sp
113:
114: push ds
115: push si
116: push di
117:
118: lds si,ss:[bx+4]
119: les di,ss:[bx+8]
120: regptr dssi,ds,si
121: regptr esdi,es,di
122: cld
123: jmp dx
124:
125: lstrfinish proc far
126: pop di
127: pop si
128: pop ds
129: ret 8
130: lstrfinish endp
131:
132:
133: ;======================================================
134: ;
135: ;lstrcpy: strcpy with long pointers
136: ;
137: cProc lstrcpy,<PUBLIC, NODATA, FAR>
138: ; parmD pDst ; [bx+8]
139: ; parmD pSrc ; [bx+4]
140:
141: cBegin nogen
142: call lstrsetup
143: lcp1: lodsb
144: stosb
145: or al,al
146: jnz lcp1
147: mov ax,di ; point at last byte copied
148: dec ax
149: mov dx,es ; and its segment
150: jmp lstrfinish
151: cEnd nogen
152:
153:
154: ;======================================================
155: ;
156: ;lstrcat: Same as strcat except with long ptrs.
157: ;
158: cProc lstrcat,<PUBLIC, NODATA, FAR>
159: ; parmD pDst
160: ; parmD pSrc
161:
162: cBegin nogen
163: call lstrsetup
164: xor ax,ax ; get zero in ax
165: mov cx,-1 ; at most 64 k to look
166: repnz scasb ; look for end
167: dec di ; Point at null byte
168: jmp lcp1 ; jump to lstrcpy loop
169: cEnd nogen
170:
171: ; convert lower case to upper, must preserve es,di,cx
172: public MyUpper
173: MyUpper:
174: cmp al,'a'
175: jb myu2
176: cmp al,'z'
177: jbe myu1
178: ja myu2
179: myu1: sub al,'a'-'A'
180: myu2: ret
181:
182: ; convert upper case to lower, must preserve es,di,cx
183: public MyLower
184: MyLower:
185: cmp al,'A'
186: jb myl2
187: cmp al,'Z'
188: jbe myl1
189:
190: ja myl2
191: myl1: add al,'a'-'A'
192: myl2: ret
193:
194: ;=========================================
195: ;
196: ;lstrcmp: long ptr lVersion of strcmp
197: ;
198: cProc lstrcmp,<PUBLIC, NODATA, FAR>
199: ; parmD ps1
200: ; parmD ps2
201: cBegin nogen
202: call lstrsetup
203: lcmploop:
204: xor ax,ax ; AH needs to be zero inside this loop
205: cmp byte ptr [si],al
206: je lsidone ; si is finished check for di finish
207: cmp es:byte ptr [di],al
208: je ldismall ; di finished before si
209: lodsb
210: mov bx,ax
211: mov al,es:[di]
212: inc di
213: cmp ax,bx
214: je lcmploop ; still equal
215: mov al,0 ; preverve flags
216: jb lsismall ; si is less than di
217: ldismall:
218: inc ax
219: jmp lstrfinish
220: lsidone:
221: cmp byte ptr es:[di],0
222: je lstrfinish
223: lsismall:
224: dec ax
225: jmp lstrfinish
226: cEnd nogen
227: sEnd CODE
228:
229:
230: createSeg _INIT,INIT,byte,public,CODE
231:
232: sBegin INIT
233: externNP <InitLibrary>
234: assumes CS,INIT
235: assumes DS,DATA
236:
237: ;======================================================
238: ; BOOL FAR PASCAL LibInit ()
239: ;
240: ; Initializes the library
241: ; int dataSelector /* DS = automatic data selector */
242: ; int wHeapSize; /* SI = heap size */
243: ; int hmod; /* DI = module handle */
244: ; {
245: ; vhModule = hmod;
246: ; if (!(vhheap = WinCreateHeap(dataSelector, wHeapsize, 0, 0, 0, 0)))
247: ; return FALSE;;
248: ; return (InitLibrary());
249: ; }
250: ;
251: ; DS already usSet
252: ;
253: cProc LibInit,<FAR, PUBLIC>
254: cBegin nogen
255: mov [vhModule],di ; Remember module handle
256:
257: sub ax,ax
258: cCall WinCreateHeap,<ds, si, ax, ax, ax, ax>
259: mov bx, ax
260: or ax, dx
261: jz loaddone ; Heap wasn't created
262: mov word ptr vhheap, bx
263: mov word ptr vhheap + 2, dx
264:
265: cCall InitLibrary ; continue initialization
266: or ax,ax
267: jnz loaddone ; OK, init done
268: cCall WinDestroyHeap,<vhheap> ; Non OK, destroy the heap
269: ;
270: ; Return non-zero to indicate successful initialization
271: ;
272: loaddone:
273: ret
274: cEnd
275:
276: sEnd INIT
277: END LibInit
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.