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;