Еще нашел проблему у ХС8. Теперь компилятор С как-то не правильно
считает константные выражения. Если записать вот так
void foo()
{
  PORTA=((unsigned char)(1u*15))/2;
}
 то все правильно получается
   367                           ;test.c: 5: PORTA=((unsigned char)(1u*15))/2;
   368                          
   369                           ;incstack = 0
   370                           ; Regs used in _foo: [wreg]
   371  07FD  3007                   movlw    7
   372  07FE  008C                   movwf    12    ;volatile
   373  07FF  0008                   return
 А если немного изменить
void foo()
{
  PORTA=((unsigned char)(1u*15))/2u;
}
То получаем
   367                           ;test.c: 5: PORTA=((unsigned char)(1u*15))/2u;
   368                          
   369                           ;incstack = 0
   370                           ; Regs used in _foo: [status,2]
   371  07FE  018C                   clrf    12    ;volatile
   372  07FF  0008                   return
 Вот так опять правильно получается
void foo()
{
  PORTA=((1u*15))/2u;
}
 Т.е. преобразование типов в выражениях проходит не всегда корректно.