[Overview][Constants][Types][Procedures and functions][Variables][Index] | Reference for unit 'go32' (#rtl)

# global_dos_alloc

Allocate DOS real mode memory

## Declaration

Source position: go32.pp line 97

`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 low word of the returned value contains the selector to the allocated dos memory block, the high 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 the int31error variable.

## See also

global_dos_free |  | Free DOS memory block

## Example

    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 = packed 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.

Documentation generated on: Feb 26 2014