Bringing jpeg-8d into the main branch
[AROS.git] / workbench / libs / jpeg / jmemdosa.asm
blobecd43729fe5e286396b3d1cc4be28d27cca48867
2 ; jmemdosa.asm
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.
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.
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.
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.
21 ; Based on code contributed by Ge' Weijers.
24 JMEMDOSA_TXT segment byte public 'CODE'
26 assume cs:JMEMDOSA_TXT
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
39 ; short far jdos_open (short far * handle, char far * filename)
41 ; Create and open a temporary file
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
74 ; short far jdos_close (short handle)
76 ; Close the file handle
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
102 _jdos_close endp
106 ; short far jdos_seek (short handle, long offset)
108 ; Set file position
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
136 _jdos_seek endp
140 ; short far jdos_read (short handle, void far * buffer, unsigned short count)
142 ; Read from file
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
174 _jdos_read endp
178 ; short far jdos_write (short handle, void far * buffer, unsigned short count)
180 ; Write to file
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
212 _jdos_write endp
216 ; void far jxms_getdriver (XMSDRIVER far *)
218 ; Get the address of the XMS driver, or NULL if not available
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
253 _jxms_getdriver endp
257 ; void far jxms_calldriver (XMSDRIVER, XMScontext far *)
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.
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
294 _jxms_calldriver endp
298 ; short far jems_available (void)
300 ; Have we got an EMS driver? (this comes straight from the EMS 4.0 specs)
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
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
332 ASCII_device_name db "EMMXXXX0"
334 _jems_available endp
338 ; void far jems_calldriver (EMScontext far *)
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.
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
375 _jems_calldriver endp
377 JMEMDOSA_TXT ends