diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/lcd-2bit-horz.c | 39 | ||||
-rw-r--r-- | firmware/drivers/lcd-h100-remote.c | 10 | ||||
-rw-r--r-- | firmware/drivers/lcd-h100.c | 39 | ||||
-rw-r--r-- | firmware/drivers/lcd-recorder.c | 10 |
4 files changed, 68 insertions, 30 deletions
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c index 14bf952bb2..e70df3fb84 100644 --- a/firmware/drivers/lcd-2bit-horz.c +++ b/firmware/drivers/lcd-2bit-horz.c | |||
@@ -197,24 +197,29 @@ static void bgblock(unsigned char *address, unsigned mask, unsigned bits) | |||
197 | ICODE_ATTR; | 197 | ICODE_ATTR; |
198 | static void bgblock(unsigned char *address, unsigned mask, unsigned bits) | 198 | static void bgblock(unsigned char *address, unsigned mask, unsigned bits) |
199 | { | 199 | { |
200 | mask &= ~bits; | 200 | unsigned data = *address; |
201 | *address = (*address & ~mask) | (bg_pattern & mask); | 201 | |
202 | *address = data ^ ((data ^ bg_pattern) & mask & ~bits); | ||
202 | } | 203 | } |
203 | 204 | ||
204 | static void fgblock(unsigned char *address, unsigned mask, unsigned bits) | 205 | static void fgblock(unsigned char *address, unsigned mask, unsigned bits) |
205 | ICODE_ATTR; | 206 | ICODE_ATTR; |
206 | static void fgblock(unsigned char *address, unsigned mask, unsigned bits) | 207 | static void fgblock(unsigned char *address, unsigned mask, unsigned bits) |
207 | { | 208 | { |
208 | mask &= bits; | 209 | unsigned data = *address; |
209 | *address = (*address & ~mask) | (fg_pattern & mask); | 210 | |
211 | *address = data ^ ((data ^ fg_pattern) & mask & bits); | ||
210 | } | 212 | } |
211 | 213 | ||
212 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) | 214 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) |
213 | ICODE_ATTR; | 215 | ICODE_ATTR; |
214 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) | 216 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) |
215 | { | 217 | { |
216 | *address = (*address & ~mask) | (bits & mask & fg_pattern) | 218 | unsigned data = *address; |
217 | | (~bits & mask & bg_pattern); | 219 | unsigned bgp = bg_pattern; |
220 | |||
221 | bits = bgp ^ ((bgp ^ fg_pattern) & bits); | ||
222 | *address = data ^ ((data ^ bits) & mask); | ||
218 | } | 223 | } |
219 | 224 | ||
220 | static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) | 225 | static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) |
@@ -228,24 +233,29 @@ static void bginvblock(unsigned char *address, unsigned mask, unsigned bits) | |||
228 | ICODE_ATTR; | 233 | ICODE_ATTR; |
229 | static void bginvblock(unsigned char *address, unsigned mask, unsigned bits) | 234 | static void bginvblock(unsigned char *address, unsigned mask, unsigned bits) |
230 | { | 235 | { |
231 | mask &= bits; | 236 | unsigned data = *address; |
232 | *address = (*address & ~mask) | (bg_pattern & mask); | 237 | |
238 | *address = data ^ ((data ^ bg_pattern) & mask & bits); | ||
233 | } | 239 | } |
234 | 240 | ||
235 | static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) | 241 | static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) |
236 | ICODE_ATTR; | 242 | ICODE_ATTR; |
237 | static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) | 243 | static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) |
238 | { | 244 | { |
239 | mask &= ~bits; | 245 | unsigned data = *address; |
240 | *address = (*address & ~mask) | (fg_pattern & mask); | 246 | |
247 | *address = data ^ ((data ^ fg_pattern) & mask & ~bits); | ||
241 | } | 248 | } |
242 | 249 | ||
243 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) | 250 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) |
244 | ICODE_ATTR; | 251 | ICODE_ATTR; |
245 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) | 252 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) |
246 | { | 253 | { |
247 | *address = (*address & ~mask) | (~bits & mask & fg_pattern) | 254 | unsigned data = *address; |
248 | | (bits & mask & bg_pattern); | 255 | unsigned fgp = fg_pattern; |
256 | |||
257 | bits = fgp ^ ((fgp ^ bg_pattern) & bits); | ||
258 | *address = data ^ ((data ^ bits) & mask); | ||
249 | } | 259 | } |
250 | 260 | ||
251 | lcd_blockfunc_type* const lcd_blockfuncs[8] = { | 261 | lcd_blockfunc_type* const lcd_blockfuncs[8] = { |
@@ -255,7 +265,10 @@ lcd_blockfunc_type* const lcd_blockfuncs[8] = { | |||
255 | 265 | ||
256 | static inline void setblock(unsigned char *address, unsigned mask, unsigned bits) | 266 | static inline void setblock(unsigned char *address, unsigned mask, unsigned bits) |
257 | { | 267 | { |
258 | *address = (*address & ~mask) | (bits & mask); | 268 | unsigned data = *address; |
269 | |||
270 | bits ^= data; | ||
271 | *address = data ^ (bits & mask); | ||
259 | } | 272 | } |
260 | 273 | ||
261 | /*** drawing functions ***/ | 274 | /*** drawing functions ***/ |
diff --git a/firmware/drivers/lcd-h100-remote.c b/firmware/drivers/lcd-h100-remote.c index 4d58db9a56..f7b3c21f48 100644 --- a/firmware/drivers/lcd-h100-remote.c +++ b/firmware/drivers/lcd-h100-remote.c | |||
@@ -716,7 +716,10 @@ static void solidblock(unsigned char *address, unsigned mask, unsigned bits) | |||
716 | ICODE_ATTR; | 716 | ICODE_ATTR; |
717 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) | 717 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) |
718 | { | 718 | { |
719 | *address = (*address & ~mask) | (bits & mask); | 719 | unsigned data = *address; |
720 | |||
721 | bits ^= data; | ||
722 | *address = data ^ (bits & mask); | ||
720 | } | 723 | } |
721 | 724 | ||
722 | static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) | 725 | static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) |
@@ -744,7 +747,10 @@ static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) | |||
744 | ICODE_ATTR; | 747 | ICODE_ATTR; |
745 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) | 748 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) |
746 | { | 749 | { |
747 | *address = (*address & ~mask) | (~bits & mask); | 750 | unsigned data = *address; |
751 | |||
752 | bits = ~bits ^ data; | ||
753 | *address = data ^ (bits & mask); | ||
748 | } | 754 | } |
749 | 755 | ||
750 | lcd_blockfunc_type* const lcd_remote_blockfuncs[8] = { | 756 | lcd_blockfunc_type* const lcd_remote_blockfuncs[8] = { |
diff --git a/firmware/drivers/lcd-h100.c b/firmware/drivers/lcd-h100.c index 42bf13a888..f460165534 100644 --- a/firmware/drivers/lcd-h100.c +++ b/firmware/drivers/lcd-h100.c | |||
@@ -397,24 +397,29 @@ static void bgblock(unsigned char *address, unsigned mask, unsigned bits) | |||
397 | ICODE_ATTR; | 397 | ICODE_ATTR; |
398 | static void bgblock(unsigned char *address, unsigned mask, unsigned bits) | 398 | static void bgblock(unsigned char *address, unsigned mask, unsigned bits) |
399 | { | 399 | { |
400 | mask &= ~bits; | 400 | unsigned data = *address; |
401 | *address = (*address & ~mask) | (bg_pattern & mask); | 401 | |
402 | *address = data ^ ((data ^ bg_pattern) & mask & ~bits); | ||
402 | } | 403 | } |
403 | 404 | ||
404 | static void fgblock(unsigned char *address, unsigned mask, unsigned bits) | 405 | static void fgblock(unsigned char *address, unsigned mask, unsigned bits) |
405 | ICODE_ATTR; | 406 | ICODE_ATTR; |
406 | static void fgblock(unsigned char *address, unsigned mask, unsigned bits) | 407 | static void fgblock(unsigned char *address, unsigned mask, unsigned bits) |
407 | { | 408 | { |
408 | mask &= bits; | 409 | unsigned data = *address; |
409 | *address = (*address & ~mask) | (fg_pattern & mask); | 410 | |
411 | *address = data ^ ((data ^ fg_pattern) & mask & bits); | ||
410 | } | 412 | } |
411 | 413 | ||
412 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) | 414 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) |
413 | ICODE_ATTR; | 415 | ICODE_ATTR; |
414 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) | 416 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) |
415 | { | 417 | { |
416 | *address = (*address & ~mask) | (bits & mask & fg_pattern) | 418 | unsigned data = *address; |
417 | | (~bits & mask & bg_pattern); | 419 | unsigned bgp = bg_pattern; |
420 | |||
421 | bits = bgp ^ ((bgp ^ fg_pattern) & bits); | ||
422 | *address = data ^ ((data ^ bits) & mask); | ||
418 | } | 423 | } |
419 | 424 | ||
420 | static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) | 425 | static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) |
@@ -428,24 +433,29 @@ static void bginvblock(unsigned char *address, unsigned mask, unsigned bits) | |||
428 | ICODE_ATTR; | 433 | ICODE_ATTR; |
429 | static void bginvblock(unsigned char *address, unsigned mask, unsigned bits) | 434 | static void bginvblock(unsigned char *address, unsigned mask, unsigned bits) |
430 | { | 435 | { |
431 | mask &= bits; | 436 | unsigned data = *address; |
432 | *address = (*address & ~mask) | (bg_pattern & mask); | 437 | |
438 | *address = data ^ ((data ^ bg_pattern) & mask & bits); | ||
433 | } | 439 | } |
434 | 440 | ||
435 | static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) | 441 | static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) |
436 | ICODE_ATTR; | 442 | ICODE_ATTR; |
437 | static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) | 443 | static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) |
438 | { | 444 | { |
439 | mask &= ~bits; | 445 | unsigned data = *address; |
440 | *address = (*address & ~mask) | (fg_pattern & mask); | 446 | |
447 | *address = data ^ ((data ^ fg_pattern) & mask & ~bits); | ||
441 | } | 448 | } |
442 | 449 | ||
443 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) | 450 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) |
444 | ICODE_ATTR; | 451 | ICODE_ATTR; |
445 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) | 452 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) |
446 | { | 453 | { |
447 | *address = (*address & ~mask) | (~bits & mask & fg_pattern) | 454 | unsigned data = *address; |
448 | | (bits & mask & bg_pattern); | 455 | unsigned fgp = fg_pattern; |
456 | |||
457 | bits = fgp ^ ((fgp ^ bg_pattern) & bits); | ||
458 | *address = data ^ ((data ^ bits) & mask); | ||
449 | } | 459 | } |
450 | 460 | ||
451 | lcd_blockfunc_type* const lcd_blockfuncs[8] = { | 461 | lcd_blockfunc_type* const lcd_blockfuncs[8] = { |
@@ -455,7 +465,10 @@ lcd_blockfunc_type* const lcd_blockfuncs[8] = { | |||
455 | 465 | ||
456 | static inline void setblock(unsigned char *address, unsigned mask, unsigned bits) | 466 | static inline void setblock(unsigned char *address, unsigned mask, unsigned bits) |
457 | { | 467 | { |
458 | *address = (*address & ~mask) | (bits & mask); | 468 | unsigned data = *address; |
469 | |||
470 | bits ^= data; | ||
471 | *address = data ^ (bits & mask); | ||
459 | } | 472 | } |
460 | 473 | ||
461 | /*** drawing functions ***/ | 474 | /*** drawing functions ***/ |
diff --git a/firmware/drivers/lcd-recorder.c b/firmware/drivers/lcd-recorder.c index d75b989dd2..22bfebe289 100644 --- a/firmware/drivers/lcd-recorder.c +++ b/firmware/drivers/lcd-recorder.c | |||
@@ -441,7 +441,10 @@ static void solidblock(unsigned char *address, unsigned mask, unsigned bits) | |||
441 | ICODE_ATTR; | 441 | ICODE_ATTR; |
442 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) | 442 | static void solidblock(unsigned char *address, unsigned mask, unsigned bits) |
443 | { | 443 | { |
444 | *address = (*address & ~mask) | (bits & mask); | 444 | unsigned data = *(char*)address; |
445 | |||
446 | bits ^= data; | ||
447 | *address = data ^ (bits & mask); | ||
445 | } | 448 | } |
446 | 449 | ||
447 | static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) | 450 | static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) |
@@ -469,7 +472,10 @@ static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) | |||
469 | ICODE_ATTR; | 472 | ICODE_ATTR; |
470 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) | 473 | static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) |
471 | { | 474 | { |
472 | *address = (*address & ~mask) | (~bits & mask); | 475 | unsigned data = *(char *)address; |
476 | |||
477 | bits = ~bits ^ data; | ||
478 | *address = data ^ (bits & mask); | ||
473 | } | 479 | } |
474 | 480 | ||
475 | lcd_blockfunc_type* const lcd_blockfuncs[8] = { | 481 | lcd_blockfunc_type* const lcd_blockfuncs[8] = { |