diff --git a/src/Sprites.cpp b/src/Sprites.cpp index 49a4ee0..0b3dbe2 100644 --- a/src/Sprites.cpp +++ b/src/Sprites.cpp @@ -285,19 +285,23 @@ void Sprites::drawBitmap(int16_t x, int16_t y, // FIRST PAGE - "ld %[data], %a[buffer_ofs]\n" // if sRow >= 0 "tst %[sRow]\n" - "brmi end_first_page\n" + "brmi skip_first_page\n" + "ld %[data], %a[buffer_ofs]\n" // then "com %A[mask_data]\n" "and %[data], %A[mask_data]\n" "or %[data], %A[bitmap_data]\n" - - "end_first_page:\n" // update buffer, increment "st %a[buffer_ofs]+, %[data]\n" + "jmp end_first_page\n" + "skip_first_page:\n" + // since no ST Z+ when skipped we need to do this manually + "adiw %[buffer_ofs], 1\n" + + "end_first_page:\n" // "x_loop_next:\n" "dec %[xi]\n" @@ -330,9 +334,9 @@ void Sprites::drawBitmap(int16_t x, int16_t y, : [xi] "+&r" (xi), [yi] "+&r" (yi), [sRow] "+&d" (sRow), // CPI requires an upper register - [data] "+&r" (data), - [mask_data] "+&r" (mask_data), - [bitmap_data] "+&r" (bitmap_data) + [data] "=&r" (data), + [mask_data] "=&r" (mask_data), + [bitmap_data] "=&r" (bitmap_data) : [x_count] "r" (rendered_width), [y_count] "r" (loop_h), @@ -343,7 +347,10 @@ void Sprites::drawBitmap(int16_t x, int16_t y, [sprite_ofs_jump] "r" ((w-rendered_width)*2), [yOffset] "r" (yOffset), [mul_amt] "r" (mul_amt) - : + // declaring an extra high register clobber here for some reason + // prevents a compile error for some sketches: + // can't find a register in class 'LD_REGS' while reloading 'asm' + : "r24" ); break; }