Without the explicit cast, avr-gcc generates incorrect asm which sets
only the lower bytes of the u32, leading the upper bytes to be set to
0xFFFF when the input value has MSB set. This results in flashing past
32k bytes failing. Explicit casting corrects this behaviour in testing.
else if (Command == AVR109_COMMAND_SetCurrentAddress)
{
/* Set the current address to that given by the host (translate 16-bit word address to byte address) */
else if (Command == AVR109_COMMAND_SetCurrentAddress)
{
/* Set the current address to that given by the host (translate 16-bit word address to byte address) */
- CurrAddress = (FetchNextCommandByte() << 9);
- CurrAddress |= (FetchNextCommandByte() << 1);
+ CurrAddress = ((uint32_t)FetchNextCommandByte() << 9);
+ CurrAddress |= ((uint32_t)FetchNextCommandByte() << 1);
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');