;**************************************************************
;***    EMS570.ASM                                          ***
;***                                                        ***
;***    function    EMS_Ems.moveMemRegion40(                ***
;***                    var buffer:     EMS_MoveMemoryInfo) ***
;***                    : Boolean;                          ***
;***                                                        ***
;***    Moves memory region from source to destination      ***
;***    described in MoveMemoryInfo_type structure          ***
;***                                                        *** 
;***    Buffer Structure                                    ***
;***    ----------------                                    ***
;***    DWORD   length;       ; memory length               ***
;***    BYTE    srce_type;    ; 0=conventional,1=expanded   ***
;***    WORD    srce_handle;  ; source emeory handle        ***
;***    WORD    srce_offset;  ; source memory offset        ***
;***    WORD    srce_id;      ; source seg or phys page     ***
;***    BYTE    dest_type;    ; 0=conventional,1=expanded   ***
;***    WORD    dest_handle;  ; source emeory handle        ***
;***    WORD    dest_offset;  ; source memory offset        ***
;***    WORD    dest_id;      ; source seg or phys page     ***
;***                                                        ***
;***    Returns 0 if no error or an error code.             ***
;***                                                        ***
;***                                                        ***
;***                                                        ***
;***    (Ems Version 4.0)                                   ***
;**************************************************************

        .model  large,pascal   

        include emsdefs.asm 

        extrn   errno:WORD  

;
;   Define entry point
;
        public  EMS_Ems@moveMemRegion40

        .code

EMS_Ems@moveMemRegion40 proc buffer:Far Ptr Byte, self:DWord

        push    ds                      ; Save regs
        push    si

        lds     si,buffer               ; DS:SI gets move buffer address

        mov     ax,MoveMemRegion40      ; Do the EMS call
        int     Ems           

        or      ah,ah                   ; Set flags
        jnz     error

        xor     ax,ax                   ; Return OK
        pop     si                      ; Restore regs
        pop     ds
        ret         

error:
        pop     si                      ; Restore regs
        pop     ds

        mov     al,ah                   ; AL gets error code
        xor     ah,ah                   ; Zero extend
        mov     errno,ax                ; Save in errno too
        ret

EMS_Ems@moveMemRegion40 endp            ; End of procedure

        end                             ; End of source file
