Merge branch 'master' into genete_canvasview-revisited
[synfig.git] / gtkmm-osx / jpeg-6b / jmemdosa.asm
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