2000-05-06 21:34:20 +02:00
|
|
|
;
|
|
|
|
; File:
|
|
|
|
; int2f.asm
|
|
|
|
; Description:
|
|
|
|
; multiplex interrupt support code
|
|
|
|
;
|
|
|
|
; Copyright (c) 1996, 1998
|
|
|
|
; Pasquale J. Villani
|
|
|
|
; All Rights Reserved
|
|
|
|
;
|
|
|
|
; This file is part of DOS-C.
|
|
|
|
;
|
|
|
|
; DOS-C is free software; you can redistribute it and/or
|
|
|
|
; modify it under the terms of the GNU General Public License
|
|
|
|
; as published by the Free Software Foundation; either version
|
|
|
|
; 2, or (at your option) any later version.
|
|
|
|
;
|
|
|
|
; DOS-C is distributed in the hope that it will be useful, but
|
|
|
|
; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
|
|
|
; the GNU General Public License for more details.
|
|
|
|
;
|
|
|
|
; You should have received a copy of the GNU General Public
|
|
|
|
; License along with DOS-C; see the file COPYING. If not,
|
|
|
|
; write to the Free Software Foundation, 675 Mass Ave,
|
|
|
|
; Cambridge, MA 02139, USA.
|
|
|
|
;
|
|
|
|
; $Logfile: D:/dos-c/src/kernel/int2f.asv $
|
|
|
|
;
|
|
|
|
; $Id$
|
|
|
|
;
|
|
|
|
; $Log$
|
2001-09-23 22:39:44 +02:00
|
|
|
; Revision 1.13 2001/09/23 20:39:44 bartoldeman
|
|
|
|
; FAT32 support, misc fixes, INT2F/AH=12 support, drive B: handling
|
|
|
|
;
|
2001-08-19 14:58:36 +02:00
|
|
|
; Revision 1.12 2001/08/19 12:58:36 bartoldeman
|
|
|
|
; Time and date fixes, Ctrl-S/P, findfirst/next, FCBs, buffers, tsr unloading
|
|
|
|
;
|
2001-07-28 20:13:06 +02:00
|
|
|
; Revision 1.11 2001/07/28 18:13:06 bartoldeman
|
|
|
|
; Fixes for FORMAT+SYS, FATFS, get current dir, kernel init memory situation.
|
|
|
|
;
|
2001-07-22 03:58:58 +02:00
|
|
|
; Revision 1.10 2001/07/22 01:58:58 bartoldeman
|
|
|
|
; Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
|
|
|
|
;
|
2001-07-10 00:19:33 +02:00
|
|
|
; Revision 1.9 2001/07/09 22:19:33 bartoldeman
|
|
|
|
; LBA/FCB/FAT/SYS/Ctrl-C/ioctl fixes + memory savings
|
|
|
|
;
|
2001-04-03 01:18:30 +02:00
|
|
|
; Revision 1.8 2001/04/02 23:18:30 bartoldeman
|
|
|
|
; Misc, zero terminated device names and redirector bugs fixed.
|
|
|
|
;
|
2001-03-21 03:56:26 +01:00
|
|
|
; Revision 1.7 2001/03/21 02:56:26 bartoldeman
|
|
|
|
; See history.txt for changes. Bug fixes and HMA support are the main ones.
|
|
|
|
;
|
2000-08-06 07:50:17 +02:00
|
|
|
; Revision 1.6 2000/08/06 05:50:17 jimtabor
|
|
|
|
; Add new files and update cvs with patches and changes
|
|
|
|
;
|
2000-06-21 20:16:46 +02:00
|
|
|
; Revision 1.5 2000/06/21 18:16:46 jimtabor
|
|
|
|
; Add UMB code, patch, and code fixes
|
|
|
|
;
|
2000-05-25 22:56:23 +02:00
|
|
|
; Revision 1.4 2000/05/25 20:56:21 jimtabor
|
|
|
|
; Fixed project history
|
|
|
|
;
|
2000-05-17 21:15:12 +02:00
|
|
|
; Revision 1.3 2000/05/17 19:15:12 jimtabor
|
|
|
|
; Cleanup, add and fix source.
|
|
|
|
;
|
2000-05-08 06:30:00 +02:00
|
|
|
; Revision 1.2 2000/05/08 04:30:00 jimtabor
|
|
|
|
; Update CVS to 2020
|
|
|
|
;
|
2000-05-25 22:56:23 +02:00
|
|
|
; Revision 1.1.1.1 2000/05/06 19:34:53 jhall1
|
|
|
|
; The FreeDOS Kernel. A DOS kernel that aims to be 100% compatible with
|
|
|
|
; MS-DOS. Distributed under the GNU GPL.
|
2000-05-17 21:15:12 +02:00
|
|
|
;
|
2000-05-08 06:30:00 +02:00
|
|
|
; Revision 1.4 2000/03/31 05:40:09 jtabor
|
|
|
|
; Added Eric W. Biederman Patches
|
2000-05-06 21:34:20 +02:00
|
|
|
;
|
|
|
|
; Revision 1.3 2000/03/09 06:07:11 kernel
|
|
|
|
; 2017f updates by James Tabor
|
|
|
|
;
|
|
|
|
; Revision 1.2 1999/08/10 17:57:12 jprice
|
|
|
|
; ror4 2011-02 patch
|
|
|
|
;
|
|
|
|
; Revision 1.1.1.1 1999/03/29 15:40:59 jprice
|
|
|
|
; New version without IPL.SYS
|
|
|
|
;
|
|
|
|
; Revision 1.4 1999/02/08 05:55:57 jprice
|
|
|
|
; Added Pat's 1937 kernel patches
|
|
|
|
;
|
|
|
|
; Revision 1.3 1999/02/01 01:48:41 jprice
|
|
|
|
; Clean up; Now you can use hex numbers in config.sys. added config.sys screen function to change screen mode (28 or 43/50 lines)
|
|
|
|
;
|
|
|
|
; Revision 1.2 1999/01/22 04:13:26 jprice
|
|
|
|
; Formating
|
|
|
|
;
|
|
|
|
; Revision 1.1.1.1 1999/01/20 05:51:01 jprice
|
|
|
|
; Imported sources
|
|
|
|
;
|
|
|
|
;
|
|
|
|
; Rev 1.2 06 Dec 1998 8:48:12 patv
|
|
|
|
; Bug fixes.
|
|
|
|
;
|
|
|
|
; Rev 1.1 29 May 1996 21:03:46 patv
|
|
|
|
; bug fixes for v0.91a
|
|
|
|
;
|
|
|
|
; Rev 1.0 19 Feb 1996 3:34:38 patv
|
|
|
|
; Initial revision.
|
|
|
|
; $EndLog$
|
|
|
|
;
|
|
|
|
|
|
|
|
%include "segs.inc"
|
2000-08-06 07:50:17 +02:00
|
|
|
%include "stacks.inc"
|
2000-05-06 21:34:20 +02:00
|
|
|
|
2001-03-21 03:56:26 +01:00
|
|
|
segment HMA_TEXT
|
2001-04-03 01:18:30 +02:00
|
|
|
extern _cu_psp:wrt DGROUP
|
2001-03-21 03:56:26 +01:00
|
|
|
extern _syscall_MUX14:wrt HMA_TEXT
|
2000-05-06 21:34:20 +02:00
|
|
|
|
2001-03-21 03:56:26 +01:00
|
|
|
global reloc_call_int2f_handler
|
|
|
|
reloc_call_int2f_handler:
|
2000-05-06 21:34:20 +02:00
|
|
|
sti ; Enable interrupts
|
|
|
|
cmp ah,11h ; Network interrupt?
|
|
|
|
jne Int2f3 ; No, continue
|
|
|
|
Int2f1:
|
|
|
|
or al,al ; Installation check?
|
|
|
|
jz FarTabRetn ; yes, just return
|
|
|
|
Int2f2:
|
2001-07-22 03:58:58 +02:00
|
|
|
mov ax,1 ; TE 07/13/01
|
|
|
|
; at least for redirected INT21/5F44
|
|
|
|
; --> 2f/111e
|
|
|
|
; the error code is AX=0001 = unknown function
|
2000-05-06 21:34:20 +02:00
|
|
|
stc
|
|
|
|
FarTabRetn:
|
|
|
|
retf 2 ; Return far
|
|
|
|
Int2f3:
|
|
|
|
cmp ah,16h
|
|
|
|
je FarTabRetn ; Win Hook return fast
|
|
|
|
cmp ah,12h
|
|
|
|
je IntDosCal ; Dos Internal calls
|
|
|
|
cmp ah,10h ; SHARE.EXE interrupt?
|
|
|
|
je Int2f1 ; yes, do installation check
|
|
|
|
cmp ah,14h ; NLSFUNC.EXE interrupt?
|
2000-08-06 07:50:17 +02:00
|
|
|
jne Int2f?iret ; yes, do installation check
|
|
|
|
Int2f?14: ;; MUX-14 -- NLSFUNC API
|
|
|
|
;; all functions are passed to syscall_MUX14
|
|
|
|
push bp ; Preserve BP later on
|
|
|
|
PUSH$ALL
|
|
|
|
call _syscall_MUX14
|
|
|
|
pop bp ; Discard incoming AX
|
|
|
|
push ax ; Correct stack for POP$ALL
|
|
|
|
POP$ALL
|
|
|
|
mov bp, sp
|
|
|
|
or ax, ax
|
|
|
|
jnz Int2f?14?1 ; must return set carry
|
|
|
|
;; -6 == -2 (CS), -2 (IP), -2 (flags)
|
|
|
|
;; current SP = on old_BP
|
|
|
|
and BYTE [bp-6], 0feh ; clear carry as no error condition
|
|
|
|
pop bp
|
|
|
|
iret
|
|
|
|
Int2f?14?1: or BYTE [bp-6], 1
|
|
|
|
pop bp
|
|
|
|
Int2f?iret:
|
|
|
|
iret
|
2000-05-06 21:34:20 +02:00
|
|
|
|
2001-08-19 14:58:36 +02:00
|
|
|
|
|
|
|
|
2001-09-23 22:39:44 +02:00
|
|
|
;***********************************************************
|
|
|
|
; internal doscalls INT2F/11xx - handled through C
|
|
|
|
;***********************************************************
|
|
|
|
IntDosCal:
|
|
|
|
; set up register frame
|
|
|
|
;struct int2f12regs
|
|
|
|
;{
|
|
|
|
; UWORD es,ds;
|
|
|
|
; UWORD di,si,bp,bx,dx,cx,ax;
|
|
|
|
; UWORD ip,cs,flags;
|
|
|
|
; UWORD callerARG1;
|
|
|
|
;};
|
|
|
|
push ax
|
|
|
|
push cx
|
|
|
|
push dx
|
|
|
|
push bx
|
|
|
|
push bp
|
|
|
|
push si
|
|
|
|
push di
|
|
|
|
push ds
|
|
|
|
push es
|
|
|
|
|
|
|
|
mov ax,DGROUP
|
|
|
|
mov ds,ax
|
|
|
|
extern _int2F_12_handler:wrt HGROUP
|
|
|
|
call _int2F_12_handler
|
|
|
|
|
|
|
|
pop es
|
|
|
|
pop ds
|
|
|
|
pop di
|
|
|
|
pop si
|
|
|
|
pop bp
|
|
|
|
pop bx
|
|
|
|
pop dx
|
|
|
|
pop cx
|
|
|
|
pop ax
|
|
|
|
|
|
|
|
iret
|
|
|
|
|
2001-08-19 14:58:36 +02:00
|
|
|
|
2000-05-06 21:34:20 +02:00
|
|
|
|
|
|
|
; Int 2F Multipurpose Remote System Calls
|
|
|
|
;
|
|
|
|
; added by James Tabor jimtabor@infohwy.com
|
|
|
|
;
|
|
|
|
; int_2f_Remote_call(ax,bx,cx,dx,[es:di],si, return data * ptr)
|
|
|
|
; assume ss == ds after setup of stack in entry
|
|
|
|
; sumtimes return data *ptr is the push stack word
|
|
|
|
;
|
|
|
|
global _int2f_Remote_call
|
|
|
|
_int2f_Remote_call:
|
|
|
|
push bp
|
|
|
|
mov bp,sp
|
|
|
|
push es
|
|
|
|
push ds
|
|
|
|
push si
|
|
|
|
push di
|
|
|
|
push dx
|
|
|
|
push cx
|
|
|
|
push bx
|
|
|
|
|
|
|
|
push ss ; hay, did I say assume
|
|
|
|
pop ds
|
|
|
|
|
|
|
|
mov si,[bp+16]
|
|
|
|
les di,[bp+12]
|
|
|
|
mov dx,[bp+10]
|
|
|
|
mov cx,[bp+8]
|
|
|
|
mov bx,[bp+6]
|
|
|
|
mov ax,[bp+4]
|
|
|
|
|
|
|
|
cmp al,08h ; R/W Remote File
|
|
|
|
je short int2f_r_1
|
|
|
|
cmp al,09h
|
|
|
|
jne short int2f_r_2
|
|
|
|
int2f_r_1:
|
|
|
|
call int2f_call
|
2000-05-17 21:15:12 +02:00
|
|
|
jnc short int2f_skip1
|
|
|
|
jmp int2f_rfner
|
|
|
|
int2f_skip1:
|
2000-06-21 20:16:46 +02:00
|
|
|
xor ax,ax
|
2000-05-06 21:34:20 +02:00
|
|
|
les di,[bp+18] ; do return data stuff
|
|
|
|
mov [es:di],cx
|
2001-04-03 01:18:30 +02:00
|
|
|
jmp int2f_rfner
|
2000-05-06 21:34:20 +02:00
|
|
|
int2f_r_2:
|
|
|
|
cmp al,0ch ; Get Remote DPB
|
|
|
|
jne short int2f_r_3
|
|
|
|
call int2f_call
|
|
|
|
jc int2f_rfner
|
|
|
|
les di,[bp+18]
|
|
|
|
mov [es:di+0],ax
|
|
|
|
mov [es:di+2],bx
|
|
|
|
mov [es:di+4],cx
|
|
|
|
mov [es:di+6],dx
|
2000-06-21 20:16:46 +02:00
|
|
|
xor ax,ax
|
2000-05-06 21:34:20 +02:00
|
|
|
jmp short int2f_rfner
|
|
|
|
int2f_r_3:
|
|
|
|
cmp al,0fh ; Get Remote File Attrib
|
|
|
|
jne short int2f_r_4
|
|
|
|
call int2f_call
|
|
|
|
jc short int2f_rfner
|
|
|
|
mov si,di
|
|
|
|
les di,[bp+18] ; pointer to struct
|
|
|
|
mov [es:di+0],ax
|
|
|
|
mov [es:di+2],si ; lo
|
|
|
|
mov [es:di+4],bx ; high
|
|
|
|
mov [es:di+6],cx
|
|
|
|
mov [es:di+8],dx
|
2000-06-21 20:16:46 +02:00
|
|
|
xor ax,ax
|
2000-05-06 21:34:20 +02:00
|
|
|
jmp short int2f_rfner
|
|
|
|
int2f_r_4:
|
|
|
|
cmp al,01eh
|
|
|
|
je short int2f_r_5
|
|
|
|
cmp al,01fh
|
|
|
|
jne short int2f_r_6
|
|
|
|
int2f_r_5:
|
|
|
|
push ds
|
|
|
|
push word [bp+20]
|
|
|
|
pop ds
|
|
|
|
call int2f_call
|
|
|
|
pop ds
|
2000-05-17 21:15:12 +02:00
|
|
|
jc short int2f_rfner
|
|
|
|
xor ax,ax
|
2000-05-06 21:34:20 +02:00
|
|
|
jmp short int2f_rfner
|
|
|
|
int2f_r_6:
|
2000-05-17 21:15:12 +02:00
|
|
|
cmp al,021h ; Lseek from eof
|
|
|
|
jne short int2f_r_7
|
|
|
|
call int2f_call
|
|
|
|
jc short int2f_rfner
|
|
|
|
les di,[bp+18]
|
|
|
|
mov [es:di],ax
|
|
|
|
mov [es:di+2],dx
|
|
|
|
xor ax,ax
|
|
|
|
jmp short int2f_rfner
|
|
|
|
int2f_r_7:
|
2001-04-03 01:18:30 +02:00
|
|
|
cmp al,022h ; Terminate process
|
|
|
|
jne short int2f_r_8
|
|
|
|
mov ds,[_cu_psp]
|
|
|
|
call int2f_call
|
|
|
|
jmp short int2f_rfner
|
2000-05-06 21:34:20 +02:00
|
|
|
;
|
|
|
|
; everything else goes through here.
|
|
|
|
;
|
2001-04-03 01:18:30 +02:00
|
|
|
int2f_r_8:
|
2000-05-06 21:34:20 +02:00
|
|
|
call int2f_call
|
2000-06-21 20:16:46 +02:00
|
|
|
jc int2f_rfner
|
|
|
|
xor ax,ax
|
2000-05-06 21:34:20 +02:00
|
|
|
int2f_rfner:
|
|
|
|
pop bx
|
|
|
|
pop cx
|
|
|
|
pop dx
|
|
|
|
pop di
|
|
|
|
pop si
|
|
|
|
pop ds
|
|
|
|
pop es
|
|
|
|
pop bp
|
|
|
|
ret
|
|
|
|
;
|
|
|
|
; Pull this one out of the Chain.
|
|
|
|
;
|
|
|
|
global _QRemote_Fn
|
|
|
|
_QRemote_Fn
|
|
|
|
push bp
|
|
|
|
mov bp,sp
|
|
|
|
push es
|
|
|
|
push ds
|
|
|
|
push si
|
|
|
|
push di
|
|
|
|
mov ax,1123h
|
|
|
|
lds si,[bp+4]
|
|
|
|
les di,[bp+8]
|
|
|
|
stc
|
|
|
|
int 2fh
|
2000-06-21 20:16:46 +02:00
|
|
|
mov ax,0xffff
|
2001-07-28 20:13:06 +02:00
|
|
|
jc QRemote_Fn_out
|
2000-06-21 20:16:46 +02:00
|
|
|
xor ax,ax
|
2000-05-08 06:30:00 +02:00
|
|
|
QRemote_Fn_out:
|
2000-05-06 21:34:20 +02:00
|
|
|
pop di
|
|
|
|
pop si
|
|
|
|
pop ds
|
|
|
|
pop es
|
|
|
|
pop bp
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
int2f_call:
|
|
|
|
push bp
|
|
|
|
push word [bp+18] ; very fakey, HaHa ;)
|
|
|
|
stc ; set to fail
|
|
|
|
int 2fh
|
|
|
|
pop bp
|
|
|
|
pop bp
|
|
|
|
ret
|
2001-07-22 03:58:58 +02:00
|
|
|
|
|
|
|
%if 0
|
|
|
|
; int_2f_111e_call(iregs FAR *iregs)
|
|
|
|
;
|
|
|
|
; set up all registers to the int21 entry registers
|
|
|
|
; call int2f/111e
|
|
|
|
; copy returned registers into int21 entry registers back
|
|
|
|
;
|
|
|
|
; disabled: does not work better than previous implementation
|
|
|
|
global _int_2f_111e_call
|
|
|
|
_int_2f_111e_call:
|
|
|
|
|
|
|
|
push bp
|
|
|
|
mov bp,sp
|
|
|
|
push si
|
|
|
|
push di
|
|
|
|
push ds
|
|
|
|
|
|
|
|
lds si, [bp+4] ; ds:si -> iregs
|
|
|
|
|
|
|
|
mov ax, [si ]
|
|
|
|
mov bx, [si+2]
|
|
|
|
mov cx, [si+4]
|
|
|
|
mov dx, [si+6]
|
|
|
|
push word [si+8] ; si
|
|
|
|
mov di, [si+10]
|
|
|
|
mov bp, [si+12]
|
|
|
|
mov es, [si+16]
|
|
|
|
mov ds, [si+14]
|
|
|
|
pop si
|
|
|
|
|
|
|
|
push ax
|
|
|
|
mov ax, 111eh
|
|
|
|
int 2fh
|
|
|
|
jc fault
|
|
|
|
pop ax ; restore orig value of ax if no errors
|
|
|
|
push ax
|
|
|
|
fault:
|
|
|
|
|
|
|
|
pushf
|
|
|
|
push ds
|
|
|
|
push si
|
|
|
|
push bp
|
|
|
|
|
|
|
|
mov bp,sp
|
|
|
|
lds si,[bp+4+6+10] ; 4=fun, 6=si,di,ds, 10 additional bytes on stack
|
|
|
|
|
|
|
|
pop word [si+12] ; bp
|
|
|
|
pop word [si+ 8] ; si
|
|
|
|
pop word [si+14] ; ds
|
|
|
|
pop word [si+22] ; flags
|
|
|
|
add sp,2 ; pushed function value
|
|
|
|
|
|
|
|
mov [si ],ax
|
|
|
|
|
|
|
|
cmp ax, 5f02h ; 5f02 is special: it manipulates the user stack directly
|
|
|
|
je skip5f02
|
|
|
|
mov [si+2],bx
|
|
|
|
mov [si+4],cx
|
|
|
|
skip5f02:
|
|
|
|
|
|
|
|
mov [si+6],dx
|
|
|
|
mov [si+10],di
|
|
|
|
mov [si+16],es
|
|
|
|
|
|
|
|
pop ds
|
|
|
|
pop di
|
|
|
|
pop si
|
|
|
|
pop bp
|
|
|
|
ret
|
|
|
|
%endif
|
|
|
|
|
2000-08-06 07:50:17 +02:00
|
|
|
;
|
|
|
|
; Test to see if a umb driver has been loaded.
|
2001-07-22 03:58:58 +02:00
|
|
|
; if so, retrieve largest available block+size
|
2000-08-06 07:50:17 +02:00
|
|
|
;
|
|
|
|
; From RB list and Dosemu xms.c.
|
|
|
|
;
|
|
|
|
; Call the XMS driver "Request upper memory block" function with:
|
|
|
|
; AH = 10h
|
|
|
|
; DX = size of block in paragraphs
|
|
|
|
; Return: AX = status
|
|
|
|
; 0001h success
|
|
|
|
; BX = segment address of UMB
|
|
|
|
; DX = actual size of block
|
|
|
|
; 0000h failure
|
|
|
|
; BL = error code (80h,B0h,B1h) (see #02775)
|
|
|
|
; DX = largest available block
|
|
|
|
;
|
|
|
|
; (Table 02775)
|
|
|
|
; Values for XMS error code returned in BL:
|
|
|
|
; 00h successful
|
|
|
|
; 80h function not implemented
|
|
|
|
; B0h only a smaller UMB is available
|
|
|
|
; B1h no UMB's are available
|
|
|
|
; B2h UMB segment number is invalid
|
|
|
|
;
|
|
|
|
;
|
2001-03-21 03:56:26 +01:00
|
|
|
|
2001-07-22 03:58:58 +02:00
|
|
|
|
2001-03-21 03:56:26 +01:00
|
|
|
segment INIT_TEXT
|
2001-07-22 03:58:58 +02:00
|
|
|
; int UMB_get_largest(UCOUNT *seg, UCOUNT *size);
|
|
|
|
global _UMB_get_largest
|
|
|
|
|
|
|
|
_UMB_get_largest:
|
2000-08-06 07:50:17 +02:00
|
|
|
push bp
|
|
|
|
mov bp,sp
|
|
|
|
|
2001-07-22 03:58:58 +02:00
|
|
|
sub sp,4 ; for the far call
|
2000-08-06 07:50:17 +02:00
|
|
|
|
|
|
|
mov ax,4300h ; is there a xms driver installed?
|
|
|
|
int 2fh
|
|
|
|
cmp al,80h
|
|
|
|
jne umbt_error
|
|
|
|
|
|
|
|
mov ax,4310h
|
|
|
|
int 2fh
|
|
|
|
|
|
|
|
|
2001-07-22 03:58:58 +02:00
|
|
|
mov [bp-2],es ; save driver entry point
|
|
|
|
mov [bp-4],bx
|
|
|
|
|
2001-04-03 01:18:30 +02:00
|
|
|
mov dx,0xffff ; go for broke!
|
|
|
|
mov ax,1000h ; get the umb's
|
2001-07-22 03:58:58 +02:00
|
|
|
call far [bp-4] ; Call the driver
|
2000-08-06 07:50:17 +02:00
|
|
|
;
|
|
|
|
; bl = 0xB0 and ax = 0 so do it again.
|
|
|
|
;
|
|
|
|
cmp bl,0xb0 ; fail safe
|
2001-07-22 03:58:58 +02:00
|
|
|
jne umbt_error
|
2000-08-06 07:50:17 +02:00
|
|
|
|
2001-07-22 03:58:58 +02:00
|
|
|
and dx,dx ; if it returns a size of zero.
|
|
|
|
je umbt_error
|
2000-08-06 07:50:17 +02:00
|
|
|
|
2001-04-03 01:18:30 +02:00
|
|
|
mov ax,1000h ; dx set with largest size
|
2001-07-22 03:58:58 +02:00
|
|
|
call far [bp-4] ; Call the driver
|
|
|
|
|
2000-08-06 07:50:17 +02:00
|
|
|
cmp ax,1
|
|
|
|
jne umbt_error
|
2001-07-22 03:58:58 +02:00
|
|
|
; now return the segment
|
|
|
|
; and the size
|
2000-08-06 07:50:17 +02:00
|
|
|
|
2001-07-22 03:58:58 +02:00
|
|
|
mov cx,bx ; *seg = segment
|
|
|
|
mov bx, [bp+4]
|
|
|
|
mov [bx],cx
|
2000-08-06 07:50:17 +02:00
|
|
|
|
2001-07-22 03:58:58 +02:00
|
|
|
mov bx, [bp+6] ; *size = size
|
|
|
|
mov [bx],dx
|
2000-08-06 07:50:17 +02:00
|
|
|
|
2001-07-22 03:58:58 +02:00
|
|
|
umbt_ret:
|
|
|
|
mov sp,bp
|
2000-08-06 07:50:17 +02:00
|
|
|
pop bp
|
2001-03-21 03:56:26 +01:00
|
|
|
ret ; this was called NEAR!!
|
2001-07-22 03:58:58 +02:00
|
|
|
|
|
|
|
umbt_error: xor ax,ax
|
|
|
|
jmp umbt_ret
|