/***************************************************************************
*	NAME:  MEMINIT.C
**	COPYRIGHT:
**	"Copyright (c) 1992, by FORTE
**
**       "This software is furnished under a license and may be used,
**       copied, or disclosed only in accordance with the terms of such
**       license and with the inclusion of the above copyright notice.
**       This software or any other copies thereof may not be provided or
**       otherwise made available to any other person. No title to and
**       ownership of the software is hereby transfered."
****************************************************************************
*  CREATION DATE: 11/18/92
*--------------------------------------------------------------------------*
*     VERSION	DATE	   NAME		DESCRIPTION
*>	1.0	11/18/92		Original
***************************************************************************/
#include <conio.h>
#include <dos.h>

#include "forte.h"
#include "gf1proto.h"
#include "osproto.h"
#include "gf1hware.h"
#include "gf1os.h"
#include "ultraerr.h"

extern ULTRA_DATA _gf1_data;

#ifdef METAWARE
#pragma Off (BEHAVED)
#endif

#define POOL_SIZE (unsigned long)((256L*1024L)-32L)

void
UltraPokeLong(unsigned long location,unsigned long value)
{
unsigned char far *ptr;
unsigned int port;
int i;

port = _gf1_data.base_port;

ptr = (unsigned char far *)&value;

for (i=0;i<4;i++)
	UltraPokeData(port,location++,*ptr++);
}

unsigned long
UltraPeekLong(unsigned long location)
{
unsigned long ret;
unsigned char far *ptr;
unsigned int port;
int i;

port = _gf1_data.base_port;

ptr = (unsigned char far *)&ret;

for (i=0;i<4;i++)
	*ptr++ = UltraPeekData(port,location++);

return(ret);
}

int
UltraMemInit(void)
{
unsigned long pool_len;
unsigned long location;
int size;

if (_gf1_data.reserved_dram > (unsigned long)(256L*1024L))
	_gf1_data.reserved_dram = 32;

/* size of DRAM in bytes ... */
size = UltraSizeDram();

pool_len = (((unsigned long)size*1024L)-32L)-_gf1_data.reserved_dram;

_gf1_data.free_mem = _gf1_data.reserved_dram;

UltraPokeLong(_gf1_data.reserved_dram+NEXT_OFFSET,0L);
UltraPokeLong(_gf1_data.reserved_dram+PREV_OFFSET,0L);
UltraPokeLong(_gf1_data.reserved_dram+SIZE_OFFSET,pool_len);

/* This section is necessary to split the DRAM into pools that */
/* do not cross 256K boundaries. the GF1 cannot play 16 bit data */
/* across 256K boundaries */

if (pool_len > (unsigned long)(256L*1024L))
	{
	UltraMemAlloc(pool_len,(unsigned long far *)&location);
	if (pool_len > (unsigned long)(256L*3L*1024L))
		{
		UltraMemFree(POOL_SIZE,(unsigned long)(256L*3L*1024L)+32L);
		}
	if (pool_len > (unsigned long)(256L*2L*1024L))
		{
		UltraMemFree(POOL_SIZE,(unsigned long)(256L*2L*1024L)+32L);
		}
	UltraMemFree(POOL_SIZE,(unsigned long)(256L*1L*1024L)+32L);
	UltraMemFree((unsigned long)(256L*1024L)-_gf1_data.reserved_dram,_gf1_data.reserved_dram);
	}
return(size);
}

