summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/lcd-2bit-horz.c39
-rw-r--r--firmware/drivers/lcd-h100-remote.c10
-rw-r--r--firmware/drivers/lcd-h100.c39
-rw-r--r--firmware/drivers/lcd-recorder.c10
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;
198static void bgblock(unsigned char *address, unsigned mask, unsigned bits) 198static 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
204static void fgblock(unsigned char *address, unsigned mask, unsigned bits) 205static void fgblock(unsigned char *address, unsigned mask, unsigned bits)
205 ICODE_ATTR; 206 ICODE_ATTR;
206static void fgblock(unsigned char *address, unsigned mask, unsigned bits) 207static 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
212static void solidblock(unsigned char *address, unsigned mask, unsigned bits) 214static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
213 ICODE_ATTR; 215 ICODE_ATTR;
214static void solidblock(unsigned char *address, unsigned mask, unsigned bits) 216static 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
220static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) 225static 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;
229static void bginvblock(unsigned char *address, unsigned mask, unsigned bits) 234static 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
235static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) 241static void fginvblock(unsigned char *address, unsigned mask, unsigned bits)
236 ICODE_ATTR; 242 ICODE_ATTR;
237static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) 243static 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
243static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) 250static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
244 ICODE_ATTR; 251 ICODE_ATTR;
245static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) 252static 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
251lcd_blockfunc_type* const lcd_blockfuncs[8] = { 261lcd_blockfunc_type* const lcd_blockfuncs[8] = {
@@ -255,7 +265,10 @@ lcd_blockfunc_type* const lcd_blockfuncs[8] = {
255 265
256static inline void setblock(unsigned char *address, unsigned mask, unsigned bits) 266static 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;
717static void solidblock(unsigned char *address, unsigned mask, unsigned bits) 717static 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
722static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) 725static 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;
745static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) 748static 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
750lcd_blockfunc_type* const lcd_remote_blockfuncs[8] = { 756lcd_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;
398static void bgblock(unsigned char *address, unsigned mask, unsigned bits) 398static 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
404static void fgblock(unsigned char *address, unsigned mask, unsigned bits) 405static void fgblock(unsigned char *address, unsigned mask, unsigned bits)
405 ICODE_ATTR; 406 ICODE_ATTR;
406static void fgblock(unsigned char *address, unsigned mask, unsigned bits) 407static 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
412static void solidblock(unsigned char *address, unsigned mask, unsigned bits) 414static void solidblock(unsigned char *address, unsigned mask, unsigned bits)
413 ICODE_ATTR; 415 ICODE_ATTR;
414static void solidblock(unsigned char *address, unsigned mask, unsigned bits) 416static 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
420static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) 425static 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;
429static void bginvblock(unsigned char *address, unsigned mask, unsigned bits) 434static 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
435static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) 441static void fginvblock(unsigned char *address, unsigned mask, unsigned bits)
436 ICODE_ATTR; 442 ICODE_ATTR;
437static void fginvblock(unsigned char *address, unsigned mask, unsigned bits) 443static 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
443static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) 450static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits)
444 ICODE_ATTR; 451 ICODE_ATTR;
445static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) 452static 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
451lcd_blockfunc_type* const lcd_blockfuncs[8] = { 461lcd_blockfunc_type* const lcd_blockfuncs[8] = {
@@ -455,7 +465,10 @@ lcd_blockfunc_type* const lcd_blockfuncs[8] = {
455 465
456static inline void setblock(unsigned char *address, unsigned mask, unsigned bits) 466static 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;
442static void solidblock(unsigned char *address, unsigned mask, unsigned bits) 442static 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
447static void flipinvblock(unsigned char *address, unsigned mask, unsigned bits) 450static 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;
470static void solidinvblock(unsigned char *address, unsigned mask, unsigned bits) 473static 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
475lcd_blockfunc_type* const lcd_blockfuncs[8] = { 481lcd_blockfunc_type* const lcd_blockfuncs[8] = {