⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jmemdosa.asm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -