170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; jmemdosa.asm
370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Copyright (C) 1992, Thomas G. Lane.
570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; This file is part of the Independent JPEG Group's software.
670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; For conditions of distribution and use, see the accompanying README file.
770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; This file contains low-level interface routines to support the MS-DOS
970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; backing store manager (jmemdos.c).  Routines are provided to access disk
1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; files through direct DOS calls, and to access XMS and EMS drivers.
1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; This file should assemble with Microsoft's MASM or any compatible
1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; assembler (including Borland's Turbo Assembler).  If you haven't got
1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; a compatible assembler, better fall back to jmemansi.c or jmemname.c.
1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; To minimize dependence on the C compiler's register usage conventions,
1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; we save and restore all 8086 registers, even though most compilers only
1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; require SI,DI,DS to be preserved.  Also, we use only 16-bit-wide return
1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; values, which everybody returns in AX.
2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Based on code contributed by Ge' Weijers.
2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineJMEMDOSA_TXT	segment byte public 'CODE'
2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		assume	cs:JMEMDOSA_TXT
2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jdos_open
2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jdos_close
3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jdos_seek
3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jdos_read
3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jdos_write
3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jxms_getdriver
3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jxms_calldriver
3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jems_available
3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		public	_jems_calldriver
3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; short far jdos_open (short far * handle, char far * filename)
4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Create and open a temporary file
4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_open	proc	far
4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bp			; linkage
4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bp,sp
4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	cx,0			; normal file attributes
5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		lds	dx,dword ptr [bp+10]	; get filename pointer
5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ah,3ch			; create file
5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	21h
5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jc	open_err		; if failed, return error code
5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		lds	bx,dword ptr [bp+6]	; get handle pointer
5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	word ptr [bx],ax	; save the handle
6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		xor	ax,ax			; return zero for OK
6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineopen_err:	pop	ds			; restore registers and exit
6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop 	bp
6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_open	endp
7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; short far jdos_close (short handle)
7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Close the file handle
7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_close	proc	far
7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bp			; linkage
8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bp,sp
8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	bx,word ptr [bp+6]	; file handle
8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ah,3eh			; close file
9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	21h
9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jc	close_err		; if failed, return error code
9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		xor	ax,ax			; return zero for OK
9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineclose_err:	pop	ds			; restore registers and exit
9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop 	bp
10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_close	endp
10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; short far jdos_seek (short handle, long offset)
10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Set file position
10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_seek	proc	far
11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bp			; linkage
11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bp,sp
11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	bx,word ptr [bp+6]	; file handle
12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	dx,word ptr [bp+8]	; LS offset
12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	cx,word ptr [bp+10]	; MS offset
12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ax,4200h		; absolute seek
12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	21h
12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jc	seek_err		; if failed, return error code
12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		xor	ax,ax			; return zero for OK
12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineseek_err:	pop	ds			; restore registers and exit
12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop 	bp
13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_seek	endp
13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; short far jdos_read (short handle, void far * buffer, unsigned short count)
14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Read from file
14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_read	proc	far
14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bp			; linkage
14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bp,sp
14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	bx,word ptr [bp+6]	; file handle
15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		lds	dx,dword ptr [bp+8]	; buffer address
15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	cx,word ptr [bp+12]	; number of bytes
15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ah,3fh			; read file
15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	21h
15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jc	read_err		; if failed, return error code
16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		cmp	ax,word ptr [bp+12]	; make sure all bytes were read
16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		je	read_ok
16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ax,1			; else return 1 for not OK
16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jmp	short read_err
16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_ok:	xor	ax,ax			; return zero for OK
16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_err:	pop	ds			; restore registers and exit
16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop 	bp
17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_read	endp
17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; short far jdos_write (short handle, void far * buffer, unsigned short count)
17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Write to file
18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_write	proc	far
18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bp			; linkage
18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bp,sp
18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	bx,word ptr [bp+6]	; file handle
19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		lds	dx,dword ptr [bp+8]	; buffer address
19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	cx,word ptr [bp+12]	; number of bytes
19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ah,40h			; write file
19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	21h
19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jc	write_err		; if failed, return error code
19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		cmp	ax,word ptr [bp+12]	; make sure all bytes written
19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		je	write_ok
20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ax,1			; else return 1 for not OK
20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jmp	short write_err
20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinewrite_ok:	xor	ax,ax			; return zero for OK
20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinewrite_err:	pop	ds			; restore registers and exit
20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop 	bp
21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jdos_write	endp
21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; void far jxms_getdriver (XMSDRIVER far *)
21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Get the address of the XMS driver, or NULL if not available
21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jxms_getdriver	proc	far
22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bp			; linkage
22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bp,sp
22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	ax,4300h		; call multiplex interrupt with
23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	2fh			; a magic cookie, hex 4300
23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		cmp 	al,80h			; AL should contain hex 80
23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		je	xmsavail
23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		xor 	dx,dx			; no XMS driver available
23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		xor 	ax,ax			; return a nil pointer
23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jmp	short xmsavail_done
23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinexmsavail:	mov 	ax,4310h		; fetch driver address with
23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	2fh			; another magic cookie
23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	dx,es			; copy address to dx:ax
24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	ax,bx
24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinexmsavail_done:	les 	bx,dword ptr [bp+6]	; get pointer to return value
24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	word ptr es:[bx],ax
24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	word ptr es:[bx+2],dx
24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	ds			; restore registers and exit
24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bp
25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jxms_getdriver	endp
25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; void far jxms_calldriver (XMSDRIVER, XMScontext far *)
25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; The XMScontext structure contains values for the AX,DX,BX,SI,DS registers.
26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; These are loaded, the XMS call is performed, and the new values of the
26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; AX,DX,BX registers are written back to the context structure.
26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jxms_calldriver 	proc	far
26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bp			; linkage
26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bp,sp
26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		les 	bx,dword ptr [bp+10]	; get XMScontext pointer
27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	ax,word ptr es:[bx]	; load registers
27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	dx,word ptr es:[bx+2]
27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	si,word ptr es:[bx+6]
27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	ds,word ptr es:[bx+8]
27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bx,word ptr es:[bx+4]
27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		call	dword ptr [bp+6]	; call the driver
28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	cx,bx			; save returned BX for a sec
28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		les 	bx,dword ptr [bp+10]	; get XMScontext pointer
28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	word ptr es:[bx],ax	; put back ax,dx,bx
28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	word ptr es:[bx+2],dx
28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	word ptr es:[bx+4],cx
28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	ds			; restore registers and exit
28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop 	bp
29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jxms_calldriver 	endp
29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; short far jems_available (void)
29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; Have we got an EMS driver? (this comes straight from the EMS 4.0 specs)
30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jems_available	proc	far
30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ax,3567h		; get interrupt vector 67h
31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	21h
31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cs
31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	ds
31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	di,000ah		; check offs 10 in returned seg
31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		lea	si,ASCII_device_name	; against literal string
31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	cx,8
31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		cld
31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		repe cmpsb
31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jne	no_ems
32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	ax,1			; match, it's there
32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		jmp	short avail_done
32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineno_ems:		xor	ax,ax			; it's not there
32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineavail_done:	pop	ds			; restore registers and exit
32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineASCII_device_name	db	"EMMXXXX0"
33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jems_available	endp
33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; void far jems_calldriver (EMScontext far *)
33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; The EMScontext structure contains values for the AX,DX,BX,SI,DS registers.
34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; These are loaded, the EMS trap is performed, and the new values of the
34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine; AX,DX,BX registers are written back to the context structure.
34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine;
34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jems_calldriver	proc far
34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bp			; linkage
34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bp,sp
34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	si			; save all registers for safety
34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	di
34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	bx
35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	cx
35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	dx
35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	es
35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		push	ds
35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		les 	bx,dword ptr [bp+6]	; get EMScontext pointer
35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	ax,word ptr es:[bx]	; load registers
35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	dx,word ptr es:[bx+2]
35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	si,word ptr es:[bx+6]
35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	ds,word ptr es:[bx+8]
35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	bx,word ptr es:[bx+4]
36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		int	67h			; call the EMS driver
36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov	cx,bx			; save returned BX for a sec
36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		les 	bx,dword ptr [bp+6]	; get EMScontext pointer
36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	word ptr es:[bx],ax	; put back ax,dx,bx
36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	word ptr es:[bx+2],dx
36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		mov 	word ptr es:[bx+4],cx
36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	ds			; restore registers and exit
36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	es
36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	dx
36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	cx
37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	bx
37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	di
37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop	si
37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		pop 	bp
37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		ret
37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine_jems_calldriver	endp
37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineJMEMDOSA_TXT	ends
37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		end
380