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 register 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;