Blame gtkmm-osx/jpeg-6b/jmemdosa.asm

darco 56a656
;
darco 56a656
; jmemdosa.asm
darco 56a656
;
darco 56a656
; Copyright (C) 1992, Thomas G. Lane.
darco 56a656
; This file is part of the Independent JPEG Group's software.
darco 56a656
; For conditions of distribution and use, see the accompanying README file.
darco 56a656
;
darco 56a656
; This file contains low-level interface routines to support the MS-DOS
darco 56a656
; backing store manager (jmemdos.c).  Routines are provided to access disk
darco 56a656
; files through direct DOS calls, and to access XMS and EMS drivers.
darco 56a656
;
darco 56a656
; This file should assemble with Microsoft's MASM or any compatible
darco 56a656
; assembler (including Borland's Turbo Assembler).  If you haven't got
darco 56a656
; a compatible assembler, better fall back to jmemansi.c or jmemname.c.
darco 56a656
;
darco 56a656
; To minimize dependence on the C compiler's register usage conventions,
darco 56a656
; we save and restore all 8086 registers, even though most compilers only
darco 56a656
; require SI,DI,DS to be preserved.  Also, we use only 16-bit-wide return
darco 56a656
; values, which everybody returns in AX.
darco 56a656
;
darco 56a656
; Based on code contributed by Ge' Weijers.
darco 56a656
;
darco 56a656
darco 56a656
JMEMDOSA_TXT	segment byte public 'CODE'
darco 56a656
darco 56a656
		assume	cs:JMEMDOSA_TXT
darco 56a656
darco 56a656
		public	_jdos_open
darco 56a656
		public	_jdos_close
darco 56a656
		public	_jdos_seek
darco 56a656
		public	_jdos_read
darco 56a656
		public	_jdos_write
darco 56a656
		public	_jxms_getdriver
darco 56a656
		public	_jxms_calldriver
darco 56a656
		public	_jems_available
darco 56a656
		public	_jems_calldriver
darco 56a656
darco 56a656
;
darco 56a656
; short far jdos_open (short far * handle, char far * filename)
darco 56a656
;
darco 56a656
; Create and open a temporary file
darco 56a656
;
darco 56a656
_jdos_open	proc	far
darco 56a656
		push	bp			; linkage
darco 56a656
		mov 	bp,sp
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		mov	cx,0			; normal file attributes
darco 56a656
		lds	dx,dword ptr [bp+10]	; get filename pointer
darco 56a656
		mov	ah,3ch			; create file
darco 56a656
		int	21h
darco 56a656
		jc	open_err		; if failed, return error code
darco 56a656
		lds	bx,dword ptr [bp+6]	; get handle pointer
darco 56a656
		mov	word ptr [bx],ax	; save the handle
darco 56a656
		xor	ax,ax			; return zero for OK
darco 56a656
open_err:	pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		pop 	bp
darco 56a656
		ret
darco 56a656
_jdos_open	endp
darco 56a656
darco 56a656
darco 56a656
;
darco 56a656
; short far jdos_close (short handle)
darco 56a656
;
darco 56a656
; Close the file handle
darco 56a656
;
darco 56a656
_jdos_close	proc	far
darco 56a656
		push	bp			; linkage
darco 56a656
		mov 	bp,sp
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		mov	bx,word ptr [bp+6]	; file handle
darco 56a656
		mov	ah,3eh			; close file
darco 56a656
		int	21h
darco 56a656
		jc	close_err		; if failed, return error code
darco 56a656
		xor	ax,ax			; return zero for OK
darco 56a656
close_err:	pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		pop 	bp
darco 56a656
		ret
darco 56a656
_jdos_close	endp
darco 56a656
darco 56a656
darco 56a656
;
darco 56a656
; short far jdos_seek (short handle, long offset)
darco 56a656
;
darco 56a656
; Set file position
darco 56a656
;
darco 56a656
_jdos_seek	proc	far
darco 56a656
		push	bp			; linkage
darco 56a656
		mov 	bp,sp
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		mov	bx,word ptr [bp+6]	; file handle
darco 56a656
		mov	dx,word ptr [bp+8]	; LS offset
darco 56a656
		mov	cx,word ptr [bp+10]	; MS offset
darco 56a656
		mov	ax,4200h		; absolute seek
darco 56a656
		int	21h
darco 56a656
		jc	seek_err		; if failed, return error code
darco 56a656
		xor	ax,ax			; return zero for OK
darco 56a656
seek_err:	pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		pop 	bp
darco 56a656
		ret
darco 56a656
_jdos_seek	endp
darco 56a656
darco 56a656
darco 56a656
;
darco 56a656
; short far jdos_read (short handle, void far * buffer, unsigned short count)
darco 56a656
;
darco 56a656
; Read from file
darco 56a656
;
darco 56a656
_jdos_read	proc	far
darco 56a656
		push	bp			; linkage
darco 56a656
		mov 	bp,sp
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		mov	bx,word ptr [bp+6]	; file handle
darco 56a656
		lds	dx,dword ptr [bp+8]	; buffer address
darco 56a656
		mov	cx,word ptr [bp+12]	; number of bytes
darco 56a656
		mov	ah,3fh			; read file
darco 56a656
		int	21h
darco 56a656
		jc	read_err		; if failed, return error code
darco 56a656
		cmp	ax,word ptr [bp+12]	; make sure all bytes were read
darco 56a656
		je	read_ok
darco 56a656
		mov	ax,1			; else return 1 for not OK
darco 56a656
		jmp	short read_err
darco 56a656
read_ok:	xor	ax,ax			; return zero for OK
darco 56a656
read_err:	pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		pop 	bp
darco 56a656
		ret
darco 56a656
_jdos_read	endp
darco 56a656
darco 56a656
darco 56a656
;
darco 56a656
; short far jdos_write (short handle, void far * buffer, unsigned short count)
darco 56a656
;
darco 56a656
; Write to file
darco 56a656
;
darco 56a656
_jdos_write	proc	far
darco 56a656
		push	bp			; linkage
darco 56a656
		mov 	bp,sp
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		mov	bx,word ptr [bp+6]	; file handle
darco 56a656
		lds	dx,dword ptr [bp+8]	; buffer address
darco 56a656
		mov	cx,word ptr [bp+12]	; number of bytes
darco 56a656
		mov	ah,40h			; write file
darco 56a656
		int	21h
darco 56a656
		jc	write_err		; if failed, return error code
darco 56a656
		cmp	ax,word ptr [bp+12]	; make sure all bytes written
darco 56a656
		je	write_ok
darco 56a656
		mov	ax,1			; else return 1 for not OK
darco 56a656
		jmp	short write_err
darco 56a656
write_ok:	xor	ax,ax			; return zero for OK
darco 56a656
write_err:	pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		pop 	bp
darco 56a656
		ret
darco 56a656
_jdos_write	endp
darco 56a656
darco 56a656
darco 56a656
;
darco 56a656
; void far jxms_getdriver (XMSDRIVER far *)
darco 56a656
;
darco 56a656
; Get the address of the XMS driver, or NULL if not available
darco 56a656
;
darco 56a656
_jxms_getdriver	proc	far
darco 56a656
		push	bp			; linkage
darco 56a656
		mov 	bp,sp
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		mov 	ax,4300h		; call multiplex interrupt with
darco 56a656
		int	2fh			; a magic cookie, hex 4300
darco 56a656
		cmp 	al,80h			; AL should contain hex 80
darco 56a656
		je	xmsavail
darco 56a656
		xor 	dx,dx			; no XMS driver available
darco 56a656
		xor 	ax,ax			; return a nil pointer
darco 56a656
		jmp	short xmsavail_done
darco 56a656
xmsavail:	mov 	ax,4310h		; fetch driver address with
darco 56a656
		int	2fh			; another magic cookie
darco 56a656
		mov 	dx,es			; copy address to dx:ax
darco 56a656
		mov 	ax,bx
darco 56a656
xmsavail_done:	les 	bx,dword ptr [bp+6]	; get pointer to return value
darco 56a656
		mov	word ptr es:[bx],ax
darco 56a656
		mov	word ptr es:[bx+2],dx
darco 56a656
		pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		pop	bp
darco 56a656
		ret
darco 56a656
_jxms_getdriver	endp
darco 56a656
darco 56a656
darco 56a656
;
darco 56a656
; void far jxms_calldriver (XMSDRIVER, XMScontext far *)
darco 56a656
;
darco 56a656
; The XMScontext structure contains values for the AX,DX,BX,SI,DS registers.
darco 56a656
; These are loaded, the XMS call is performed, and the new values of the
darco 56a656
; AX,DX,BX registers are written back to the context structure.
darco 56a656
;
darco 56a656
_jxms_calldriver 	proc	far
darco 56a656
		push	bp			; linkage
darco 56a656
		mov 	bp,sp
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		les 	bx,dword ptr [bp+10]	; get XMScontext pointer
darco 56a656
		mov 	ax,word ptr es:[bx]	; load registers
darco 56a656
		mov 	dx,word ptr es:[bx+2]
darco 56a656
		mov 	si,word ptr es:[bx+6]
darco 56a656
		mov 	ds,word ptr es:[bx+8]
darco 56a656
		mov 	bx,word ptr es:[bx+4]
darco 56a656
		call	dword ptr [bp+6]	; call the driver
darco 56a656
		mov	cx,bx			; save returned BX for a sec
darco 56a656
		les 	bx,dword ptr [bp+10]	; get XMScontext pointer
darco 56a656
		mov 	word ptr es:[bx],ax	; put back ax,dx,bx
darco 56a656
		mov 	word ptr es:[bx+2],dx
darco 56a656
		mov 	word ptr es:[bx+4],cx
darco 56a656
		pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		pop 	bp
darco 56a656
		ret
darco 56a656
_jxms_calldriver 	endp
darco 56a656
darco 56a656
darco 56a656
;
darco 56a656
; short far jems_available (void)
darco 56a656
;
darco 56a656
; Have we got an EMS driver? (this comes straight from the EMS 4.0 specs)
darco 56a656
;
darco 56a656
_jems_available	proc	far
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		mov	ax,3567h		; get interrupt vector 67h
darco 56a656
		int	21h
darco 56a656
		push	cs
darco 56a656
		pop	ds
darco 56a656
		mov	di,000ah		; check offs 10 in returned seg
darco 56a656
		lea	si,ASCII_device_name	; against literal string
darco 56a656
		mov	cx,8
darco 56a656
		cld
darco 56a656
		repe cmpsb
darco 56a656
		jne	no_ems
darco 56a656
		mov	ax,1			; match, it's there
darco 56a656
		jmp	short avail_done
darco 56a656
no_ems:		xor	ax,ax			; it's not there
darco 56a656
avail_done:	pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		ret
darco 56a656
darco 56a656
ASCII_device_name	db	"EMMXXXX0"
darco 56a656
darco 56a656
_jems_available	endp
darco 56a656
darco 56a656
darco 56a656
;
darco 56a656
; void far jems_calldriver (EMScontext far *)
darco 56a656
;
darco 56a656
; The EMScontext structure contains values for the AX,DX,BX,SI,DS registers.
darco 56a656
; These are loaded, the EMS trap is performed, and the new values of the
darco 56a656
; AX,DX,BX registers are written back to the context structure.
darco 56a656
;
darco 56a656
_jems_calldriver	proc far
darco 56a656
		push	bp			; linkage
darco 56a656
		mov 	bp,sp
darco 56a656
		push	si			; save all registers for safety
darco 56a656
		push	di
darco 56a656
		push	bx
darco 56a656
		push	cx
darco 56a656
		push	dx
darco 56a656
		push	es
darco 56a656
		push	ds
darco 56a656
		les 	bx,dword ptr [bp+6]	; get EMScontext pointer
darco 56a656
		mov 	ax,word ptr es:[bx]	; load registers
darco 56a656
		mov 	dx,word ptr es:[bx+2]
darco 56a656
		mov 	si,word ptr es:[bx+6]
darco 56a656
		mov 	ds,word ptr es:[bx+8]
darco 56a656
		mov 	bx,word ptr es:[bx+4]
darco 56a656
		int	67h			; call the EMS driver
darco 56a656
		mov	cx,bx			; save returned BX for a sec
darco 56a656
		les 	bx,dword ptr [bp+6]	; get EMScontext pointer
darco 56a656
		mov 	word ptr es:[bx],ax	; put back ax,dx,bx
darco 56a656
		mov 	word ptr es:[bx+2],dx
darco 56a656
		mov 	word ptr es:[bx+4],cx
darco 56a656
		pop	ds			; restore registers and exit
darco 56a656
		pop	es
darco 56a656
		pop	dx
darco 56a656
		pop	cx
darco 56a656
		pop	bx
darco 56a656
		pop	di
darco 56a656
		pop	si
darco 56a656
		pop 	bp
darco 56a656
		ret
darco 56a656
_jems_calldriver	endp
darco 56a656
darco 56a656
JMEMDOSA_TXT	ends
darco 56a656
darco 56a656
		end