next up previous contents index
Next: global_dos_free Up: Functions and Procedures Previous: get_linear_addr

global_dos_alloc

   

Declaration:

Function global_dos_alloc (bytes : Longint) : Longint;

Description:

Allocates a block of DOS real mode memory

Parameters:

bytes:
size of requested real mode memory

Return values: The high word of the returned value contains the selector to the allocated DOS memory block, the low word the corresponding real mode segment value. The offset value is always zero.

This function allocates memory from DOS memory pool, i.e. memory below the 1 MB boundary that is controlled by DOS. Such memory blocks are typically used to exchange data with real mode programs, TSRs, or device drivers. The function returns both the real mode segment base address of the block and one descriptor that can be used by protected mode applications to access the block. This function should only used for temporary buffers to get real mode information (e.g. interrupts that need a data structure in ES:(E)DI), because every single block needs an unique selector. The returned selector should only be freed by a global_dos_free call.

Errors:

Check int31error variable

See also:

global_dos_free

Example
Program buffer;

uses go32;

procedure dosalloc(var selector : word; var segment : word; size : longint);
var res : longint;
begin
     res := global_dos_alloc(size);
     selector := word(res);
     segment := word(res shr 16);
end;

procedure dosfree(selector : word);
begin
     global_dos_free(selector);
end;

type VBEInfoBuf = record
                Signature : array[0..3] of char; 
                Version : Word;
                reserved : array[0..505] of byte; 
     end;

var selector,       
    segment : Word; 

    r : trealregs;  
    infobuf : VBEInfoBuf;

begin
     fillchar(r, sizeof(r), 0);
     fillchar(infobuf, sizeof(VBEInfoBuf), 0);
     dosalloc(selector, segment, sizeof(VBEInfoBuf));
     if (int31error<>0) then begin
        Writeln('Error while allocating real mode memory, halting');
        halt;
     end;
     infobuf.Signature := 'VBE2';
     dosmemput(segment, 0, infobuf, sizeof(infobuf));
     r.ax := $4f00; r.es := segment;
     realintr($10, r);
     dosmemget(segment, 0, infobuf, sizeof(infobuf));
     dosfree(selector);
     if (r.ax <> $4f) then begin
        Writeln('VBE BIOS extension not available, function call failed');
        halt;
     end;
     if (infobuf.signature[0] = 'V') and (infobuf.signature[1] = 'E') and
        (infobuf.signature[2] = 'S') and (infobuf.signature[3] = 'A') then begin
        Writeln('VBE version ', hi(infobuf.version), '.', lo(infobuf.version), ' detected');
     end;
end.



Michael Van Canneyt
Thu Sep 10 13:59:33 CEST 1998