/*
**    Name: rmagrow.c
**
**    Date: Sun Jan  5 16:31:45 2003
**
*/

#include "rmamem.h"
#include "osheap.h"
#include "kernel.h"

int rmamem_grow(int size)
    {
    _kernel_swi_regs regs;

    int new_size;

    if (rmamem_status == RMAMEM_DYNAMICAREA)
        {

        regs.r[0] = OSHeap_Describe;
        regs.r[1] = rmamem_details.base;

        if (_kernel_swi(XOS_Heap,&regs,&regs) != NULL)
            {
            return 1;
            }

        if (regs.r[2] < size)
            {

/* Calculate size required */

            regs.r[0] = rmamem_details.da;

            new_size = ((size - regs.r[2]) + 64) / 4096;
            new_size *= 4096;
            new_size += 4096;

            regs.r[1] = new_size;

            if (_kernel_swi(XOS_ChangeDynamicArea,&regs,&regs) != NULL)
                {
                return 1;
                }

/* Read new size of dynamic area */

            regs.r[0] = OSDynamicArea_Read;
            regs.r[1] = rmamem_details.da;
            if (_kernel_swi(XOS_DynamicArea,&regs,&regs) != NULL)
                {
                return 1;
                }

/* Set up heap */

            regs.r[0] = OSHeap_Resize;
            regs.r[3] = regs.r[2] - rmamem_details.heap_size;
            regs.r[1] = rmamem_details.base;
            rmamem_details.heap_size += regs.r[3];

            if (_kernel_swi(XOS_Heap,&regs,&regs) != NULL)
                {
                return 1;
                }

            }
        }

    return 0;
    }
