[Overview][Constants][Types][Procedures and functions][Variables][Index] |
Allocate DOS real mode memory
Source position: go32.pp line 108
function global_dos_alloc( |
bytes: LongInt |
):LongInt; |
Allocates a block of dos real mode memory.
Parameters:
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.
Check the int31error variable.
|
Free DOS memory block |
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.