mirror of https://github.com/MLXXXp/Arduboy2.git
Merge pull request #13 from yyyc514/sprites_assembly_buffer_underflow
Fix buffer underflow in drawPlusMask
This commit is contained in:
commit
78de8a439b
|
@ -285,19 +285,23 @@ void Sprites::drawBitmap(int16_t x, int16_t y,
|
||||||
|
|
||||||
|
|
||||||
// FIRST PAGE
|
// FIRST PAGE
|
||||||
"ld %[data], %a[buffer_ofs]\n"
|
|
||||||
// if sRow >= 0
|
// if sRow >= 0
|
||||||
"tst %[sRow]\n"
|
"tst %[sRow]\n"
|
||||||
"brmi end_first_page\n"
|
"brmi skip_first_page\n"
|
||||||
|
"ld %[data], %a[buffer_ofs]\n"
|
||||||
// then
|
// then
|
||||||
"com %A[mask_data]\n"
|
"com %A[mask_data]\n"
|
||||||
"and %[data], %A[mask_data]\n"
|
"and %[data], %A[mask_data]\n"
|
||||||
"or %[data], %A[bitmap_data]\n"
|
"or %[data], %A[bitmap_data]\n"
|
||||||
|
|
||||||
"end_first_page:\n"
|
|
||||||
// update buffer, increment
|
// update buffer, increment
|
||||||
"st %a[buffer_ofs]+, %[data]\n"
|
"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"
|
// "x_loop_next:\n"
|
||||||
"dec %[xi]\n"
|
"dec %[xi]\n"
|
||||||
|
@ -330,9 +334,9 @@ void Sprites::drawBitmap(int16_t x, int16_t y,
|
||||||
: [xi] "+&r" (xi),
|
: [xi] "+&r" (xi),
|
||||||
[yi] "+&r" (yi),
|
[yi] "+&r" (yi),
|
||||||
[sRow] "+&d" (sRow), // CPI requires an upper register
|
[sRow] "+&d" (sRow), // CPI requires an upper register
|
||||||
[data] "+&r" (data),
|
[data] "=&r" (data),
|
||||||
[mask_data] "+&r" (mask_data),
|
[mask_data] "=&r" (mask_data),
|
||||||
[bitmap_data] "+&r" (bitmap_data)
|
[bitmap_data] "=&r" (bitmap_data)
|
||||||
:
|
:
|
||||||
[x_count] "r" (rendered_width),
|
[x_count] "r" (rendered_width),
|
||||||
[y_count] "r" (loop_h),
|
[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),
|
[sprite_ofs_jump] "r" ((w-rendered_width)*2),
|
||||||
[yOffset] "r" (yOffset),
|
[yOffset] "r" (yOffset),
|
||||||
[mul_amt] "r" (mul_amt)
|
[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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue