109 lines
2.0 KiB
Plaintext
109 lines
2.0 KiB
Plaintext
|
|
||
|
; flat assembler interface for DOS
|
||
|
; Copyright (c) 1999-2022, Tomasz Grysztar.
|
||
|
; All rights reserved.
|
||
|
|
||
|
init_dpmi_memory:
|
||
|
mov ax,500h ; get free memory information
|
||
|
mov edi,[buffer_address]
|
||
|
int 31h
|
||
|
mov ebx,[edi]
|
||
|
allocate_dpmi_memory:
|
||
|
mov edx,[memory_setting]
|
||
|
shl edx,10
|
||
|
jz dpmi_memory_size_ok
|
||
|
cmp ebx,edx
|
||
|
jbe dpmi_memory_size_ok
|
||
|
mov ebx,edx
|
||
|
dpmi_memory_size_ok:
|
||
|
mov [memory_end],ebx
|
||
|
mov ecx,ebx
|
||
|
shr ebx,16
|
||
|
mov ax,501h
|
||
|
int 31h
|
||
|
jnc dpmi_memory_ok
|
||
|
mov ebx,[memory_end]
|
||
|
shr ebx,1
|
||
|
cmp ebx,4000h
|
||
|
jb out_of_memory
|
||
|
jmp allocate_dpmi_memory
|
||
|
dpmi_memory_ok:
|
||
|
shl ebx,16
|
||
|
mov bx,cx
|
||
|
sub ebx,[program_base]
|
||
|
jc out_of_memory
|
||
|
mov [memory_start],ebx
|
||
|
add [memory_end],ebx
|
||
|
mov ax,100h ; get free conventional memory size
|
||
|
mov bx,-1
|
||
|
int 31h
|
||
|
movzx ecx,bx
|
||
|
shl ecx,4
|
||
|
jecxz no_conventional_memory
|
||
|
mov ax,100h ; allocate all conventional memory
|
||
|
int 31h
|
||
|
movzx edi,ax
|
||
|
shl edi,4
|
||
|
sub edi,[program_base]
|
||
|
jc no_conventional_memory
|
||
|
mov [additional_memory],edi
|
||
|
mov [additional_memory_end],edi
|
||
|
add [additional_memory_end],ecx
|
||
|
mov eax,[memory_end]
|
||
|
sub eax,[memory_start]
|
||
|
shr eax,2
|
||
|
cmp eax,ecx
|
||
|
ja no_conventional_memory
|
||
|
ret
|
||
|
no_conventional_memory:
|
||
|
mov eax,[memory_end]
|
||
|
mov ebx,[memory_start]
|
||
|
sub eax,ebx
|
||
|
shr eax,2
|
||
|
mov [additional_memory],ebx
|
||
|
add ebx,eax
|
||
|
mov [additional_memory_end],ebx
|
||
|
mov [memory_start],ebx
|
||
|
ret
|
||
|
|
||
|
dpmi_dos_int:
|
||
|
mov [real_mode_segment],main
|
||
|
simulate_real_mode:
|
||
|
push 0 ; SS:SP (DPMI will allocate stack)
|
||
|
push 0 ; CS:IP (ignored)
|
||
|
push 0
|
||
|
push [real_mode_segment] ; DS
|
||
|
push [real_mode_segment] ; ES
|
||
|
stc
|
||
|
pushfw
|
||
|
push eax
|
||
|
push ecx
|
||
|
push edx
|
||
|
push ebx
|
||
|
push 0
|
||
|
push ebp
|
||
|
push esi
|
||
|
push edi
|
||
|
mov ax,300h
|
||
|
mov bx,21h
|
||
|
xor cx,cx
|
||
|
mov edi,esp
|
||
|
push es ss
|
||
|
pop es
|
||
|
int 31h
|
||
|
pop es
|
||
|
mov edi,[esp]
|
||
|
mov esi,[esp+4]
|
||
|
mov ebp,[esp+8]
|
||
|
mov ebx,[esp+10h]
|
||
|
mov edx,[esp+14h]
|
||
|
mov ecx,[esp+18h]
|
||
|
mov ah,[esp+20h]
|
||
|
sahf
|
||
|
mov eax,[esp+1Ch]
|
||
|
lea esp,[esp+32h]
|
||
|
ret
|
||
|
dpmi_dos_int_with_buffer:
|
||
|
mov [real_mode_segment],buffer
|
||
|
jmp simulate_real_mode
|