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;