Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_tlsv12/sys/src/cmd/gs/jpeg/jmemdosa.asm – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
;
2
; jmemdosa.asm
3
;
4
; Copyright (C) 1992, Thomas G. Lane.
5
; This file is part of the Independent JPEG Group's software.
6
; For conditions of distribution and use, see the accompanying README file.
7
;
8
; This file contains low-level interface routines to support the MS-DOS
9
; backing store manager (jmemdos.c).  Routines are provided to access disk
10
; files through direct DOS calls, and to access XMS and EMS drivers.
11
;
12
; This file should assemble with Microsoft's MASM or any compatible
13
; assembler (including Borland's Turbo Assembler).  If you haven't got
14
; a compatible assembler, better fall back to jmemansi.c or jmemname.c.
15
;
16
; To minimize dependence on the C compiler's register usage conventions,
17
; we save and restore all 8086 registers, even though most compilers only
18
; require SI,DI,DS to be preserved.  Also, we use only 16-bit-wide return
19
; values, which everybody returns in AX.
20
;
21
; Based on code contributed by Ge' Weijers.
22
;
23
 
24
JMEMDOSA_TXT	segment byte public 'CODE'
25
 
26
		assume	cs:JMEMDOSA_TXT
27
 
28
		public	_jdos_open
29
		public	_jdos_close
30
		public	_jdos_seek
31
		public	_jdos_read
32
		public	_jdos_write
33
		public	_jxms_getdriver
34
		public	_jxms_calldriver
35
		public	_jems_available
36
		public	_jems_calldriver
37
 
38
;
39
; short far jdos_open (short far * handle, char far * filename)
40
;
41
; Create and open a temporary file
42
;
43
_jdos_open	proc	far
44
		push	bp			; linkage
45
		mov 	bp,sp
46
		push	si			; save all registers for safety
47
		push	di
48
		push	bx
49
		push	cx
50
		push	dx
51
		push	es
52
		push	ds
53
		mov	cx,0			; normal file attributes
54
		lds	dx,dword ptr [bp+10]	; get filename pointer
55
		mov	ah,3ch			; create file
56
		int	21h
57
		jc	open_err		; if failed, return error code
58
		lds	bx,dword ptr [bp+6]	; get handle pointer
59
		mov	word ptr [bx],ax	; save the handle
60
		xor	ax,ax			; return zero for OK
61
open_err:	pop	ds			; restore registers and exit
62
		pop	es
63
		pop	dx
64
		pop	cx
65
		pop	bx
66
		pop	di
67
		pop	si
68
		pop 	bp
69
		ret
70
_jdos_open	endp
71
 
72
 
73
;
74
; short far jdos_close (short handle)
75
;
76
; Close the file handle
77
;
78
_jdos_close	proc	far
79
		push	bp			; linkage
80
		mov 	bp,sp
81
		push	si			; save all registers for safety
82
		push	di
83
		push	bx
84
		push	cx
85
		push	dx
86
		push	es
87
		push	ds
88
		mov	bx,word ptr [bp+6]	; file handle
89
		mov	ah,3eh			; close file
90
		int	21h
91
		jc	close_err		; if failed, return error code
92
		xor	ax,ax			; return zero for OK
93
close_err:	pop	ds			; restore registers and exit
94
		pop	es
95
		pop	dx
96
		pop	cx
97
		pop	bx
98
		pop	di
99
		pop	si
100
		pop 	bp
101
		ret
102
_jdos_close	endp
103
 
104
 
105
;
106
; short far jdos_seek (short handle, long offset)
107
;
108
; Set file position
109
;
110
_jdos_seek	proc	far
111
		push	bp			; linkage
112
		mov 	bp,sp
113
		push	si			; save all registers for safety
114
		push	di
115
		push	bx
116
		push	cx
117
		push	dx
118
		push	es
119
		push	ds
120
		mov	bx,word ptr [bp+6]	; file handle
121
		mov	dx,word ptr [bp+8]	; LS offset
122
		mov	cx,word ptr [bp+10]	; MS offset
123
		mov	ax,4200h		; absolute seek
124
		int	21h
125
		jc	seek_err		; if failed, return error code
126
		xor	ax,ax			; return zero for OK
127
seek_err:	pop	ds			; restore registers and exit
128
		pop	es
129
		pop	dx
130
		pop	cx
131
		pop	bx
132
		pop	di
133
		pop	si
134
		pop 	bp
135
		ret
136
_jdos_seek	endp
137
 
138
 
139
;
140
; short far jdos_read (short handle, void far * buffer, unsigned short count)
141
;
142
; Read from file
143
;
144
_jdos_read	proc	far
145
		push	bp			; linkage
146
		mov 	bp,sp
147
		push	si			; save all registers for safety
148
		push	di
149
		push	bx
150
		push	cx
151
		push	dx
152
		push	es
153
		push	ds
154
		mov	bx,word ptr [bp+6]	; file handle
155
		lds	dx,dword ptr [bp+8]	; buffer address
156
		mov	cx,word ptr [bp+12]	; number of bytes
157
		mov	ah,3fh			; read file
158
		int	21h
159
		jc	read_err		; if failed, return error code
160
		cmp	ax,word ptr [bp+12]	; make sure all bytes were read
161
		je	read_ok
162
		mov	ax,1			; else return 1 for not OK
163
		jmp	short read_err
164
read_ok:	xor	ax,ax			; return zero for OK
165
read_err:	pop	ds			; restore registers and exit
166
		pop	es
167
		pop	dx
168
		pop	cx
169
		pop	bx
170
		pop	di
171
		pop	si
172
		pop 	bp
173
		ret
174
_jdos_read	endp
175
 
176
 
177
;
178
; short far jdos_write (short handle, void far * buffer, unsigned short count)
179
;
180
; Write to file
181
;
182
_jdos_write	proc	far
183
		push	bp			; linkage
184
		mov 	bp,sp
185
		push	si			; save all registers for safety
186
		push	di
187
		push	bx
188
		push	cx
189
		push	dx
190
		push	es
191
		push	ds
192
		mov	bx,word ptr [bp+6]	; file handle
193
		lds	dx,dword ptr [bp+8]	; buffer address
194
		mov	cx,word ptr [bp+12]	; number of bytes
195
		mov	ah,40h			; write file
196
		int	21h
197
		jc	write_err		; if failed, return error code
198
		cmp	ax,word ptr [bp+12]	; make sure all bytes written
199
		je	write_ok
200
		mov	ax,1			; else return 1 for not OK
201
		jmp	short write_err
202
write_ok:	xor	ax,ax			; return zero for OK
203
write_err:	pop	ds			; restore registers and exit
204
		pop	es
205
		pop	dx
206
		pop	cx
207
		pop	bx
208
		pop	di
209
		pop	si
210
		pop 	bp
211
		ret
212
_jdos_write	endp
213
 
214
 
215
;
216
; void far jxms_getdriver (XMSDRIVER far *)
217
;
218
; Get the address of the XMS driver, or NULL if not available
219
;
220
_jxms_getdriver	proc	far
221
		push	bp			; linkage
222
		mov 	bp,sp
223
		push	si			; save all registers for safety
224
		push	di
225
		push	bx
226
		push	cx
227
		push	dx
228
		push	es
229
		push	ds
230
		mov 	ax,4300h		; call multiplex interrupt with
231
		int	2fh			; a magic cookie, hex 4300
232
		cmp 	al,80h			; AL should contain hex 80
233
		je	xmsavail
234
		xor 	dx,dx			; no XMS driver available
235
		xor 	ax,ax			; return a nil pointer
236
		jmp	short xmsavail_done
237
xmsavail:	mov 	ax,4310h		; fetch driver address with
238
		int	2fh			; another magic cookie
239
		mov 	dx,es			; copy address to dx:ax
240
		mov 	ax,bx
241
xmsavail_done:	les 	bx,dword ptr [bp+6]	; get pointer to return value
242
		mov	word ptr es:[bx],ax
243
		mov	word ptr es:[bx+2],dx
244
		pop	ds			; restore registers and exit
245
		pop	es
246
		pop	dx
247
		pop	cx
248
		pop	bx
249
		pop	di
250
		pop	si
251
		pop	bp
252
		ret
253
_jxms_getdriver	endp
254
 
255
 
256
;
257
; void far jxms_calldriver (XMSDRIVER, XMScontext far *)
258
;
259
; The XMScontext structure contains values for the AX,DX,BX,SI,DS registers.
260
; These are loaded, the XMS call is performed, and the new values of the
261
; AX,DX,BX registers are written back to the context structure.
262
;
263
_jxms_calldriver 	proc	far
264
		push	bp			; linkage
265
		mov 	bp,sp
266
		push	si			; save all registers for safety
267
		push	di
268
		push	bx
269
		push	cx
270
		push	dx
271
		push	es
272
		push	ds
273
		les 	bx,dword ptr [bp+10]	; get XMScontext pointer
274
		mov 	ax,word ptr es:[bx]	; load registers
275
		mov 	dx,word ptr es:[bx+2]
276
		mov 	si,word ptr es:[bx+6]
277
		mov 	ds,word ptr es:[bx+8]
278
		mov 	bx,word ptr es:[bx+4]
279
		call	dword ptr [bp+6]	; call the driver
280
		mov	cx,bx			; save returned BX for a sec
281
		les 	bx,dword ptr [bp+10]	; get XMScontext pointer
282
		mov 	word ptr es:[bx],ax	; put back ax,dx,bx
283
		mov 	word ptr es:[bx+2],dx
284
		mov 	word ptr es:[bx+4],cx
285
		pop	ds			; restore registers and exit
286
		pop	es
287
		pop	dx
288
		pop	cx
289
		pop	bx
290
		pop	di
291
		pop	si
292
		pop 	bp
293
		ret
294
_jxms_calldriver 	endp
295
 
296
 
297
;
298
; short far jems_available (void)
299
;
300
; Have we got an EMS driver? (this comes straight from the EMS 4.0 specs)
301
;
302
_jems_available	proc	far
303
		push	si			; save all registers for safety
304
		push	di
305
		push	bx
306
		push	cx
307
		push	dx
308
		push	es
309
		push	ds
310
		mov	ax,3567h		; get interrupt vector 67h
311
		int	21h
312
		push	cs
313
		pop	ds
314
		mov	di,000ah		; check offs 10 in returned seg
315
		lea	si,ASCII_device_name	; against literal string
316
		mov	cx,8
317
		cld
318
		repe cmpsb
319
		jne	no_ems
320
		mov	ax,1			; match, it's there
321
		jmp	short avail_done
322
no_ems:		xor	ax,ax			; it's not there
323
avail_done:	pop	ds			; restore registers and exit
324
		pop	es
325
		pop	dx
326
		pop	cx
327
		pop	bx
328
		pop	di
329
		pop	si
330
		ret
331
 
332
ASCII_device_name	db	"EMMXXXX0"
333
 
334
_jems_available	endp
335
 
336
 
337
;
338
; void far jems_calldriver (EMScontext far *)
339
;
340
; The EMScontext structure contains values for the AX,DX,BX,SI,DS registers.
341
; These are loaded, the EMS trap is performed, and the new values of the
342
; AX,DX,BX registers are written back to the context structure.
343
;
344
_jems_calldriver	proc far
345
		push	bp			; linkage
346
		mov 	bp,sp
347
		push	si			; save all registers for safety
348
		push	di
349
		push	bx
350
		push	cx
351
		push	dx
352
		push	es
353
		push	ds
354
		les 	bx,dword ptr [bp+6]	; get EMScontext pointer
355
		mov 	ax,word ptr es:[bx]	; load registers
356
		mov 	dx,word ptr es:[bx+2]
357
		mov 	si,word ptr es:[bx+6]
358
		mov 	ds,word ptr es:[bx+8]
359
		mov 	bx,word ptr es:[bx+4]
360
		int	67h			; call the EMS driver
361
		mov	cx,bx			; save returned BX for a sec
362
		les 	bx,dword ptr [bp+6]	; get EMScontext pointer
363
		mov 	word ptr es:[bx],ax	; put back ax,dx,bx
364
		mov 	word ptr es:[bx+2],dx
365
		mov 	word ptr es:[bx+4],cx
366
		pop	ds			; restore registers and exit
367
		pop	es
368
		pop	dx
369
		pop	cx
370
		pop	bx
371
		pop	di
372
		pop	si
373
		pop 	bp
374
		ret
375
_jems_calldriver	endp
376
 
377
JMEMDOSA_TXT	ends
378
 
379
		end