1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
;
; assembly support routines for FreeDOS MEM
;
group DGROUP _DATA
segment _DATA
extern _xms_drv:wrt DGROUP
segment _TEXT class=CODE
; struct xms_dx call_xms_driver_dx_bl_al(unsigned char ah, ushort dx)
global _call_xms_driver_dx_bl_al
_call_xms_driver_dx_bl_al:
mov bx, sp
mov ah, [bx+2]
mov dx, [bx+4]
call far [_xms_drv]
mov ah, bl
ret
; struct xms_bx call_xms_driver_bx(unsigned char ah, ushort dx)
global _call_xms_driver_bx_ax
_call_xms_driver_bx_ax:
mov bx, sp
mov ah, [bx+2]
mov dx, [bx+4]
call far [_xms_drv]
mov dx, bx
ret
; ulong cdecl call_xms_driver_edx(unsigned char rah, ushort rdx);
global _call_xms_driver_edx
_call_xms_driver_edx:
mov bx, sp
mov ah, [bx+2]
mov dx, [bx+4]
call far [_xms_drv]
xms_ext_common:
test bl, bl
je noerror
xor edx, edx
noerror:
mov ax, dx
shr edx, 0x10
ret
; ulong cdecl call_xms_driver_eax(unsigned char rah, ushort rdx);
global _call_xms_driver_eax
_call_xms_driver_eax:
mov bx, sp
mov ah, [bx+2]
mov dx, [bx+4]
call far [_xms_drv]
mov edx, eax
jmp short xms_ext_common
; int cdecl is_386_(void)
global _is_386_
_is_386_:
pushf
pushf
pop ax
or ax, 0x7000
push ax
popf
pushf
pop ax
popf
ret
; ulong check_e820(struct e820map far *e820map, ulong counter)
global _check_e820
_check_e820:
mov bx, sp
push di
push si
les di, [bx+2]
mov ax, [bx+6]
mov bx, [bx+8]
shl ebx, 0x10
mov bx, ax
mov eax, 0xe820
mov edx, 0x534d4150 ; SMAP
mov ecx, 0x14
int 0x15
jc no386
cmp eax, 0x534d4150 ; SMAP
je yes386
no386:
xor ebx, ebx
yes386:
mov ax, bx
shr ebx, 16
mov dx, bx
pop si
pop di
ret
|