U0 MemDemo()
{
	I64 i;
"$$HL,1$$$$BLACK$$
#define MEM_PAG_BITS			9
#define MEM_PAG_SIZE			(1 << MEM_PAG_BITS)
#define MEM_HEAP_HASH_SIZE		1024
#define MEM_FREE_PAG_HASH_SIZE	0x100
#define MEM_EXTRA_HASH2_PAGS	2

public class CBlkPool
{
	CMemBlk *free_pag_hash[MEM_FREE_PAG_HASH_SIZE], *free_pag_hash2[64 - MEM_PAG_BITS];
};

public class CHeapCtrl
{
	CBlkPool   *bp;
	CMemUnused *heap_hash[MEM_HEAP_HASH_SIZE / sizeof(U8 *)];
};

public class CTask //The Fs segment reg points to current CTask.
{
	CHeapCtrl *code_heap, *data_heap;
};
$$HL,0$$$$FG$$

";


	"$$PURPLE$$Chunks in increments of 8 bytes, owned by the task.$$FG$$\n";
	for (i = sizeof(CMemUnused); i < MEM_HEAP_HASH_SIZE; i += 8)
		if (i == 0x48)
			"...\n";
		else if (!(0x48 < i < 0x3C8))
			"Fs->data_heap->heap_hash[%X/8]"
			"$$BLACK$$ -->$$FG$$[X]$$BLACK$$ -->$$FG$$[X]$$BLACK$$ -->$$FG$$\n",i;
	"\n\n";

	"$$PURPLE$$Pages of 512 bytes, owned by the system.$$FG$$\n";
	for (i = MEM_HEAP_HASH_SIZE; i < MEM_FREE_PAG_HASH_SIZE * MEM_PAG_SIZE; i += MEM_PAG_SIZE)
		if (i == 0x1200)
			"...\n";
		else if (!(0x1200 < i < 0x1F200))
			"Fs->data_heap->bp->free_pag_hash[%X/512]"
			"$$BLACK$$ -->$$FG$$[X]$$BLACK$$ -->$$FG$$[X]$$BLACK$$ -->$$FG$$\n",i;
	"\n\n";

	"$$PURPLE$$Powers of two, owned by the system.$$FG$$\n";
	for (i = Bsf(MEM_FREE_PAG_HASH_SIZE * MEM_PAG_SIZE); i < 64; i++)
		if (i == 0x1A)
			"...\n";
		else if (!(0x1A <= i <= 0x36))
			"Fs->data_heap->bp->free_pag_hash2[%X] %016X"
			"$$BLACK$$ -->$$FG$$[X]$$BLACK$$ -->$$FG$$[X]$$BLACK$$ -->$$FG$$\n", i, 1 << i + MEM_EXTRA_HASH2_PAGS * MEM_PAG_SIZE;
	"\n\n";
}

MemDemo;


