;**************************************************************
;***    EMS5B0.ASM                                          ***
;***                                                        ***
;***    function        EMS_Ems.getAltMapRegs40(            ***
;***                        var active_map: Byte;           ***
;***                        var regs_area:  Byte)           ***
;***                        : Boolean;                      ***
;***                                                        ***
;***    Gets alternate map registers to pointers.           ***
;***                                                        ***
;***    if (*active_map!=0)                                 ***
;***       ... alternate map set active                     ***
;***    if (*active_map==0)                                 ***
;***       ... regs_area holds alternate map save area      ***
;***                                                        ***
;***    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@getAltMapRegs40

        .code

EMS_Ems@getAltMapRegs40 proc activeMap:Far Ptr Word, regsArea:Far Ptr DWord, self:DWord

        push    di                      ; Save DI

        mov     ax,GetAltMapRegs40      ; Do the EMS call
        int     Ems           

        or      ah,ah                   ; Set flags
        jnz     error

;
;   ES:DI now has address of alternate map register set save area,
;   BL has the number of the current alternate register set
;
        push    es                      ; Save save area segment

        mov     al,bl                   ; Move curr alt reg set #
        xor     ah,ah                   ; Zero extend to word
        les     bx,activeMap            ; Return it
        mov     es:[bx],ax

        les     bx,regsArea             ; Return the save area address
        mov     es:[bx],di              ; ... offset
        pop     ax                      ; ... segment
        mov     es:[bx+2],ax

        xor     ax,ax                   ; Return OK
        pop     di                      ; Restore DI
        ret         

error:
        pop     di                      ; Restore DI

        mov     al,ah                   ; AL gets error code
        xor     ah,ah                   ; Zero extend
        mov     errno,ax                ; Save in errno too
        ret

EMS_Ems@getAltMapRegs40 endp            ; End of procedure

        end                             ; End of source file

