/*  CardMemLast.c 
 *  Place card.resource memory last in memory list, so all other memory
 *  used in preference.
 *
 *  © E.F.Pritchard 1993.
 */

#include <exec/execbase.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <proto/exec.h>

#define CARDMEMNAME "card.resource"
#define CARDMEMOLDPRI  (-5)
#define CARDMEMNEWPRI  (-15)

#define __USESYSBASE

char *version="$VER: CardMemLast 1.0 (11-Apr-93)";

int cardmemlast(void)
{
  struct ExecBase *SysBase=(*((struct ExecBase **) 4));
  struct MemHeader *cardmemnode;
  long rc;

  Forbid();
  
  if(cardmemnode=(struct MemHeader *)FindName(&SysBase->MemList,
					      CARDMEMNAME)) {

    /* Nobble node */
    Remove((struct Node *)cardmemnode);

    /* Now do the biz... */

    if(cardmemnode->mh_Node.ln_Pri==CARDMEMNEWPRI) 
      /* Already demoted card memory, promote it again */
      cardmemnode->mh_Node.ln_Pri = CARDMEMOLDPRI,rc=RETURN_WARN;
    else
      /* Demote card memory */
      cardmemnode->mh_Node.ln_Pri = CARDMEMNEWPRI,rc=RETURN_OK;



    /* Insert in order */
    Enqueue(&SysBase->MemList,(struct Node *)cardmemnode);

  }
  else
    rc = RETURN_ERROR;


  Permit();

  return(rc);
}
