/********************************************************************************
	memory.h: Ultra 64 MARIO Brothers include file

	Copyright (c) 1995 Nintendo co., ltd.  All rights reserved

	January 25, 1985
 ********************************************************************************/

#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


	      /*
typedef struct {

	short    segment_number;
	uint     cpu_address;
	MemPtr   start_address;    
	MemPtr   end_address;    

} SegmentRecord,*SegmentPtr;
		*/
/*-------------------------------------------------------------------------------
 *	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	heap;						/* pointer to the heap memory			*/
	MemPtr	used;						/* pointer to the first block			*/
	MemPtr	free;						/* pointer to the first free block		*/
} 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;

typedef struct {
		unsigned char *address;
		uint romsize;
		uint ramsize;
		int  pad;
}  TextureInfo;

typedef struct {
	MemPtr	romtop;				/* top address on ROM				*/
	MemPtr	rombtm;				/* bottom address +1 on ROM			*/
	MemPtr	pkromtop;				/* bottom address +1 on ROM			*/
	MemPtr	pkrombtm;				/* bottom address +1 on ROM			*/
	MemPtr	extromtop;				/* bottom address +1 on ROM			*/
	MemPtr	extrombtm;				/* bottom address +1 on ROM			*/
	unsigned char *vertex;
	int     vertex_number; 
    /*	unsigned char *material;      */
    /*	int     material_number;      */
	unsigned char *gfx;
	int     gfx_size;
	TextureInfo     *texinfo;
	ushort   fogswitch;
} Mapinfo;
/********************************************************************************
 *
 *	Segment datas
 *
 ********************************************************************************/

#define	ROM_SEGMENTS		3



extern char	_codeSegmentEnd[];
extern char	_framebufferSegmentStart[], _framebufferSegmentEnd[];
extern char	_CommonDataSegmentRomStart[], _CommonDataSegmentRomEnd[];
extern char	_kartSegmentRomStart[], _kartSegmentRomEnd[];
extern char	_textureSegmentRomStart[], _textureSegmentRomEnd[];


extern char _codeSegmentEnd[];
extern char _staticSegmentEnd[],_staticSegmentStart[];
extern	char _static1SegmentRomStart[];
extern	char _static1SegmentRomEnd[];
extern	char _static2SegmentRomStart[];
extern	char _static2SegmentRomEnd[];
extern	char _mathtableSegmentRomStart[];
extern	char _mathtableSegmentRomEnd[];

enum {
	mmCommonData,		/* Common data segment		*/
	mmTitleData,		/* Title data segment		*/
	mmGameData			/* Game data segment		*/
};

/********************************************************************************
 *
 *	External works
 *
 ********************************************************************************/

//extern long	mainThreadStack[STACK_SIZE];	/* stack memory of the main thread	*/
//extern long	heapMemory[HEAP_SIZE];			/* heap memory						*/

/********************************************************************************
 *
 *	Function prototypes
 *
 ********************************************************************************/

/* RCP segment management */

extern uint		 free_memory_size;				/* unused memory size					*/
extern uint            last_memory_pointer;			/* fore-allocation pointer				*/
extern uint            free_memory_pointer;			/* fore-allocation pointer				*/
extern uint            map_memory_pointer;			/* fore-allocation pointer				*/
extern uint            static_memory_pointer;			/* fore-allocation pointer				*/



extern uint	 SetSegment(int number, void *cpuAddr);
extern void *GetSegment(int number);
extern void *SegmentToVirtual(void *cpuAddr);
extern void  StoreSegments(void);

extern MemPtr  decodeimage(uint romaddress,uint hight,uint width);
extern MemPtr  decodemapimage(uint romaddress,uint romsize,uint ramsize);
extern MemPtr  decodemapimage1(uint romaddress,uint romsize,uint ramsize);

/* Free zone management */

extern void  initial_free_memory(MemPtr topAddr, MemPtr btmAddr);
extern uint  set_segment_record(int number, void *cpuAddr);

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  load_data(char *romStart, char *romEnd);
extern MemPtr  transgfxdata(char *romStart,char *romEnd);

extern MemPtr LoadSegment(int number, char *romStart, char *romEnd, int mode);
extern MemPtr LoadData(char *romStart, char *romEnd, int mode);
extern MemPtr LoadSegmentIndex(int index, int mode);
extern void	  BootSegment(void);
extern MemPtr load_mapdata(int index);


/* 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);


/* Dynamic memory management */

extern void *AllocDynamic(int size);

#endif
