I was struggling with the function pointer in Dallas 390 contiguous mode. It seems that the linker might not relocate the correct address in function pointer. Check the following code:
void Test(void) { UINT32 u32Tmp; u32Tmp = 0x12345678ul; TASK_PRN(("u32Func = %lx\n", u32Tmp)); u32Tmp = Test; TASK_PRN(("u32Func = %lx\n", u32Tmp)); }
Refer to the following KB article: http://www.keil.com/support/docs/2226.htm
And to the description for far pointers in the C51 Manual: http://www.keil.com/support/man/docs/c51/c51_le_far.htm
Based on this information and the address of your function (2D90EH), I would conclude that the far pointer to the function should contain 0x83D90E.
Jon