~ubuntu-branches/ubuntu/saucy/argyll/saucy

« back to all changes in this revision

Viewing changes to jpg/jmemdosa.asm

  • Committer: Package Import Robot
  • Author(s): Christian Marillat
  • Date: 2012-04-25 07:46:07 UTC
  • mfrom: (1.2.2) (13.1.15 sid)
  • Revision ID: package-import@ubuntu.com-20120425074607-yjqadetw8kum9skc
Tags: 1.4.0-4
Should Build-Depends on libusb-dev (Closes: #670329).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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