OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [services/] [gfx/] [mw/] [v2_0/] [src/] [jpeg-6b/] [jmemdosa.asm] - Blame information for rev 27

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 27 unneback
;
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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.