Why the following bitwise & doesn't work?

unsigned char tp;
unsigned char volatile pdata HOSTCFG2 _at_ 0x0020;
// HOSTCFG2=0x40 at this point
tp=HOSTCFG2 & 0x40;

//!!! tp is 0x00 instead of 0x40 which is expected

//Corresponding Disassembly:

C:0x08F1    7820     MOV      R0,#HOSTCFG2(0x20)
C:0x08F3    E2       MOVX     A,@R0
C:0x08F4    5440     ANL      A,#HPWRSTATE(0x40)
//Why it refers 0x40 as an address instead of a constant here?
C:0x08F6    F508     MOV      0x08,A
   189:         if ((HOSTCFG2 & 0x40)==0x00)


Thanks.

More questions in this forum