[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]

    {
     CF> Ok I know in pascal you can basiclly us up t0 64k for varibles.... But how
     CF> can I set it up to use... lets say 256k for varibles.  I mean, -XMS-
     CF> memeory?                                 =- Chris Forbis

    First, you may allocate 256k without XMS. Just using the following routines:

    function DosMaxAvail : longint;
    function MemAlloc(Size : longint) : pointer;
    function MemFree(P : pointer) : integer;
    function MemRealloc(P : pointer; NewSize : longint) : integer;
    }

    Function DosMaxAvail : longint; assembler;
    { Returns the size of the largest contiguous free memory block
      This function should be called ONLY when both HeapMin/HeapMax
      memory allocation parameters set to zero }
    Asm
      MOV BX,0FFFFh
      MOV AH,48h
      INT 21h
      MOV AX,BX
      MOV BX,16
      MUL BX
    End; { DosMaxAvail }

    Function MemAlloc(Size : longint) : pointer; assembler;
    { Creates a dynamic variable of the specified size and returns the pointer
      to it. This function should be called ONLY when both HeapMin/HeapMax
      memory allocation parameters set to zero }
    Asm
    @@1:
      MOV AX,WORD PTR [Size]
      MOV DX,WORD PTR [Size+2]
      MOV CX,16
      DIV CX
      INC AX
      MOV BX,AX
      MOV AH,48h
      INT 21h
      JNC @@2
      XOR AX,AX
    @@2:
      MOV DX,AX
      XOR AX,AX
    End; { MemAlloc }

    Procedure MemFree(P : pointer); assembler;
    { Disposes of a given dynamic variable. This function should be called ONLY
      when both HeapMin/HeapMax memory allocation parameters set to zero }
    Asm
      MOV ES,WORD PTR [P+2]
      MOV AH,49h
      INT 21h
    End; { MemFree }

    Function MemRealloc(P : pointer; NewSize : longint) : pointer; assembler;
    { Changes the size of en existed memory block. This function should be called
      ONLY when both HeapMin/HeapMax memory allocation parameters set to zero }
    Asm
    @@1:
      MOV AX,WORD PTR [NewSize]
      PUSH AX
      MOV DX,WORD PTR [NewSize+2]
      PUSH DX
      MOV CX,16
      DIV CX
      INC AX
      MOV BX,AX
      MOV AH,4Ah
      INT 21h
      POP DX
      POP AX
      JNC @@2
      XOR DX,DX
      XOR AX,AX
    @@2:
    End; { MemRealloc }

    { Okey, the main program: }

    {$M 4096,0,0}

    const MemToAlloc = 256 * 1024; { 256k }
    var MemoryBlock : pointer;
    Begin
      if DosMaxAvail >= MemToAlloc then
      begin
        WriteLn('Dos free memory before allocating ',
          MemToAlloc shr 10, 'kb: ', DosMaxAvail shr 10, 'kb.');
        MemoryBlock := MemAlloc(MemToAlloc);
        WriteLn('Dos free memory after allocating ',
          MemToAlloc shr 10, 'kb: ', DosMaxAvail shr 10, 'kb.');
        { if MemoryBlock = nil then report an error... }
        MemFree(MemoryBlock)
      end else WriteLn('Not enough memory. ',
        (MemToAlloc - DosMaxAvail) shr 10, 'kb more needed.')
    End.

[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]