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