extern struct ExecBase * SysBase;

static __inline void*
AllocVec (unsigned long byteSize,unsigned long requirements)
{
  register void *_res  __asm("d0");
  register struct ExecBase *a6 __asm("a6") = SysBase;
  register unsigned long d0 __asm("d0") = byteSize;
  register unsigned long d1 __asm("d1") = requirements;
  __asm __volatile ("jsr a6@(-0x2ac)"
  : "=r" (_res)
  : "r" (a6), "r" (d0), "r" (d1)
  : "a0","a1","d0","d1", "memory");
  return _res;
}

static __inline void
FreeVec (void *memoryBlock)
{
  register struct ExecBase *a6 __asm("a6") = SysBase;
  register void *a1 __asm("a1") = memoryBlock;
  __asm __volatile ("jsr a6@(-0x2b2)"
  : /* no output */
  : "r" (a6), "r" (a1)
  : "a0","a1","d0","d1", "memory");
}

typedef void (*vfp)(void);

void default_new_handler ();

vfp __new_handler = default_new_handler;


void *__builtin_new(unsigned long Anz)
{
	register unsigned long *p=0;
	if(!Anz)Anz=1;

	if((p=AllocVec((Anz),0L)))
		return (void *)p;
	else
	    (*__new_handler) ();
	return (void *)p;
}

void __builtin_delete(unsigned long *p)
{
	if(p)
		FreeVec(p);
}

vfp __set_new_handler(vfp new_handler)
{
	vfp old_handler = __new_handler;
	  __new_handler = new_handler;

	return old_handler;
}
