/********************************************************************************
	memory.h: Ultra 64 MARIO Brothers include file

	Copyright (c) 1996 Nintendo co., ltd.  All rights reserved

	February 27, 1986
 ********************************************************************************/

#ifndef MEMORY_H
#define	MEMORY_H

#define	MM_ALLOC_FORE	0
#define	MM_ALLOC_BACK	1

#define	MM_DATA_SEGMENT	0
#define	MM_BOOT_SEGMENT	1

#define	MM_RSRC_COMMON	0
#define	MM_RSRC_EACH	1



#ifndef ASSEMBLER

/********************************************************************************
 *
 *	Type definition.
 *
 ********************************************************************************/


/*-------------------------------------------------------------------------------
 *	Arena memory managiment record.
 */
typedef struct {
	int			size;					/* size of the arena memory				*/
	int			used;					/* size of used memory					*/
	MemPtr		buff;					/* pointer to the arena memory			*/
	MemPtr		free;					/* pointer to the free memory			*/
} ArenaRecord, *ArenaPtr;

/*-------------------------------------------------------------------------------
 *	Heap memory managiment record.
 */
typedef struct {
	int		size;						/* size of the heap memory				*/
	MemPtr	buff;						/* pointer to the heap memory			*/
	MemPtr	free;						/* pointer to the free memory block		*/
	long	reserved;
} HeapRecord, *HeapPtr;

/*-------------------------------------------------------------------------------
 *	Segment information record.
 */
typedef struct {
	short	flags;						/* flags								*/
	short	number;						/* segment number						*/			
	MemPtr	romtop;						/* top address on ROM					*/
	MemPtr	rombtm;						/* bottom address +1 on ROM				*/
	MemPtr	memory;						/* top address on virtual memory		*/
} SegmentInfo;

/*-------------------------------------------------------------------------------
 *	Memory partition table.
 */
typedef struct {
	ulong	nitems;						/* number of items						*/
	MemPtr	topaddr;					/* pointer to the top of data			*/
	struct {
		ulong	offset;					/* data offset							*/
		ulong	length;					/* data length							*/
	} item[1];							/* item table (variable length)			*/
} Partition;

/*-------------------------------------------------------------------------------
 *	Partial memory management record.
 */
typedef struct {
	Partition	*ptable;				/* pointer to the partition table		*/
	MemPtr		last;					/* pointer to the last access memory	*/
	MemPtr		buffer;					/* pointer to the buffer memory			*/
} PartialRecord, *PartialPtr;

/*-------------------------------------------------------------------------------
 *	Resource management record.
 */
typedef struct {
	Partition	*ptable;				/* pointer to the partition table		*/
	MemPtr		loadmap[1];				/* pointer to the load map				*/
} ResourceRecord, *ResourcePtr;



extern HeapPtr		systemHeap;			/* pointer to the system heap memory	*/


/********************************************************************************
 *
 *	Function prototypes
 *
 ********************************************************************************/

/* RCP segment management */

extern uint	 SetSegment(int number, void *cpuAddr);
extern void *GetSegment(int number);
extern void *SegmentToVirtual(void *cpuAddr);
extern void *VirtualToSegment(int number, void *cpuAddr);
extern void  StoreSegments(void);

/* Free zone management */

extern void  InitFreeZone(MemPtr topAddr, MemPtr btmAddr);
extern void *AllocFreeZone(uint size, int mode);
extern uint  PurgeFreeZone(void *address);
extern void *ResizeFreeZone(void *address, uint size);
extern uint	 FreeZoneSize(void);

extern uint LinkFreeZone(void);
extern uint UnlinkFreeZone(void);

/* Static data loader */

extern MemPtr
LoadSegment(int number, char *romStart, char *romEnd, int mode);

extern MemPtr
LoadData(char *romStart, char *romEnd, int mode);

extern MemPtr
LoadProgram(char *ramAddr, char *romStart, char *romEnd);

extern MemPtr
LoadCompressed(int number, char *romStart, char *romEnd);

extern MemPtr
LoadPressTexture(int number, char *romStart, char *romEnd);

extern void
LoadUserLibrary(void);


/* Arena memory management */

extern ArenaPtr InitArena(int size, int mode);
extern void		*AllocArena(ArenaPtr arena, int size);
extern void		*ResizeArena(ArenaPtr arena, int size);


/* Heap memory management */

extern HeapPtr InitHeap(int size, int mode);
extern void	   *AllocHeap(HeapPtr heap, int memsize);
extern void	   *FreeHeap(HeapPtr heap, void *memory);


/* Dynamic memory management */

extern void *AllocDynamic(int size);



extern Partition *
LoadPartitionTable(MemPtr romAddr);

extern void
InitPartial(PartialPtr partial, MemPtr romAddr, MemPtr buffer);

extern int
ReadPartialData(PartialPtr partial, int index);


#endif
#endif
