;
;⮢  饭 p
;室: CF = 0 -  p室  饭 p
;       CF = 1 - 訡 ⮢
prepare_to_protect_mode:
        pusha
        call     init_prepare_to_protect_mode
init_prepare_to_protect_mode:
        pop      bp
        mov      ax,1687h                ;IS DPMI here ?
        int      2Fh
        or       ax,ax
        jnz      no_DPMI_present
        ;室: ES:DI - DPMI Entrypoint
        ;          SI - 쪮 p  pp DPMI  PRIVATE DATA
        mov      word ptr ds:[bp+dpmi_entrypoint-init_prepare_to_protect_mode],di
        mov      word ptr ds:[bp+dpmi_entrypoint-init_prepare_to_protect_mode+2],es
        ;p p p稪 INT 21
        mov      ax,3521h
        int      21h
        ;室: ES:BX - p p稪
        mov      word ptr ds:[bp+old_int21-init_prepare_to_protect_mode],bx
        mov      word ptr ds:[bp+old_int21-init_prepare_to_protect_mode+2],es
        ;⠭  p稪
        mov      ax,2521h
        lea      dx,[bp+our_int21-init_prepare_to_protect_mode]
        int      21h
        popa
        clc
        retn
no_DPMI_present:
        popa
        stc
        retn
;
back_to_real:
        pop      di
        mov      ax,4CFFh
        int      21h
;
our_int21:
        cmp      ax,4CFFh
        jnz      exit_int21
        add      sp,8h
        pusha
        push     ds
        push     cs
        pop      ds
        call     init_our_int21
init_our_int21:
        pop      bp
        mov      ax,2521h
        lds      dx,dword ptr ds:[bp+old_int21-init_our_int21]
        int      21h
        pop      ds
        popa
        push     di
        retn
exit_int21:
        db       0EAh
old_int21:
        dd       00000000h
;
DPMI_call:
        db       9Ah
dpmi_entrypoint:
        dd       00000000h
        retn
;
