I have a slight problem with the following code:
unsigned char code * code x[] = {"a", "b", "c"}; void main() { unsigned char a; for(;;) a = x[0][0]; }
I have found that sometimes the watch window can give misleading information and this turns out to be due to optimisation. It may be that some optimisation is possible with the Philips 8xC51MB2 that is not possible with the 8xC52. You may have to study the acual assembly code to see if this is the case. Try lowering the level of optimisation to see if that makes any difference.
The compiler is quite likely to have optimised your code: you assign values to 'a' in the loop, but never use those values - therefore the compiler considers this to be "dead" code, and removes it! Try making 'a' volatile