summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-2bit-vi.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/lcd-2bit-vi.c')
-rw-r--r--firmware/drivers/lcd-2bit-vi.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/firmware/drivers/lcd-2bit-vi.c b/firmware/drivers/lcd-2bit-vi.c
index 697d1a7783..8dc746f521 100644
--- a/firmware/drivers/lcd-2bit-vi.c
+++ b/firmware/drivers/lcd-2bit-vi.c
@@ -40,13 +40,17 @@
40#define LCDFN(fn) lcd_ ## fn 40#define LCDFN(fn) lcd_ ## fn
41#define FBFN(fn) fb_ ## fn 41#define FBFN(fn) fb_ ## fn
42#define LCDM(ma) LCD_ ## ma 42#define LCDM(ma) LCD_ ## ma
43#define FBSIZE FRAMEBUFFER_SIZE
43#define LCDNAME "lcd_" 44#define LCDNAME "lcd_"
45#define LCDFB(x,y) FBADDR(x, y)
44#define MAIN_LCD 46#define MAIN_LCD
45#endif 47#endif
46 48
47/*** globals ***/ 49/*** globals ***/
48 50
49FBFN(data) LCDFN(framebuffer)[LCDM(FBHEIGHT)][LCDM(FBWIDTH)] IRAM_LCDFRAMEBUFFER; 51FBFN(data) LCDFN(static_framebuffer)[LCDM(FBHEIGHT)][LCDM(FBWIDTH)] IRAM_LCDFRAMEBUFFER;
52FBFN(data) *LCDFN(framebuffer) = &LCDFN(static_framebuffer)[0][0];
53
50 54
51static const FBFN(data) patterns[4] = {0xFFFF, 0xFF00, 0x00FF, 0x0000}; 55static const FBFN(data) patterns[4] = {0xFFFF, 0xFF00, 0x00FF, 0x0000};
52 56
@@ -214,7 +218,7 @@ int LCDFN(getstringsize)(const unsigned char *str, int *w, int *h)
214static void setpixel(int x, int y) 218static void setpixel(int x, int y)
215{ 219{
216 unsigned mask = 0x0101 << (y & 7); 220 unsigned mask = 0x0101 << (y & 7);
217 FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x]; 221 FBFN(data) *address = LCDFB(x,y>>3);
218 unsigned data = *address; 222 unsigned data = *address;
219 223
220 *address = data ^ ((data ^ fg_pattern) & mask); 224 *address = data ^ ((data ^ fg_pattern) & mask);
@@ -223,7 +227,7 @@ static void setpixel(int x, int y)
223static void clearpixel(int x, int y) 227static void clearpixel(int x, int y)
224{ 228{
225 unsigned mask = 0x0101 << (y & 7); 229 unsigned mask = 0x0101 << (y & 7);
226 FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x]; 230 FBFN(data) *address = LCDFB(x,y>>3);
227 unsigned data = *address; 231 unsigned data = *address;
228 232
229 *address = data ^ ((data ^ bg_pattern) & mask); 233 *address = data ^ ((data ^ bg_pattern) & mask);
@@ -232,7 +236,7 @@ static void clearpixel(int x, int y)
232static void clearimgpixel(int x, int y) 236static void clearimgpixel(int x, int y)
233{ 237{
234 unsigned mask = 0x0101 << (y & 7); 238 unsigned mask = 0x0101 << (y & 7);
235 FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x]; 239 FBFN(data) *address = LCDFB(x,y>>3);
236 unsigned data = *address; 240 unsigned data = *address;
237 241
238 *address = data ^ ((data ^ *(FBFN(data) *)((long)address 242 *address = data ^ ((data ^ *(FBFN(data) *)((long)address
@@ -242,7 +246,7 @@ static void clearimgpixel(int x, int y)
242static void flippixel(int x, int y) 246static void flippixel(int x, int y)
243{ 247{
244 unsigned mask = 0x0101 << (y & 7); 248 unsigned mask = 0x0101 << (y & 7);
245 FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x]; 249 FBFN(data) *address = LCDFB(x,y>>3);
246 250
247 *address ^= mask; 251 *address ^= mask;
248} 252}
@@ -420,15 +424,15 @@ void LCDFN(clear_display)(void)
420 if (default_vp.drawmode & DRMODE_INVERSEVID) 424 if (default_vp.drawmode & DRMODE_INVERSEVID)
421 { 425 {
422 memset(LCDFN(framebuffer), patterns[default_vp.fg_pattern & 3], 426 memset(LCDFN(framebuffer), patterns[default_vp.fg_pattern & 3],
423 sizeof LCDFN(framebuffer)); 427 FBSIZE);
424 } 428 }
425 else 429 else
426 { 430 {
427 if (backdrop) 431 if (backdrop)
428 memcpy(LCDFN(framebuffer), backdrop, sizeof LCDFN(framebuffer)); 432 memcpy(LCDFN(framebuffer), backdrop, FBSIZE);
429 else 433 else
430 memset(LCDFN(framebuffer), patterns[default_vp.bg_pattern & 3], 434 memset(LCDFN(framebuffer), patterns[default_vp.bg_pattern & 3],
431 sizeof LCDFN(framebuffer)); 435 FBSIZE);
432 } 436 }
433 437
434 LCDFN(scroll_info).lines = 0; 438 LCDFN(scroll_info).lines = 0;
@@ -611,7 +615,7 @@ void LCDFN(hline)(int x1, int x2, int y)
611 width = x2 - x1 + 1; 615 width = x2 - x1 + 1;
612 616
613 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 617 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
614 dst = &LCDFN(framebuffer)[y>>3][x1]; 618 dst = LCDFB(x1,y>>3);
615 mask = 0x0101 << (y & 7); 619 mask = 0x0101 << (y & 7);
616 620
617 dst_end = dst + width; 621 dst_end = dst + width;
@@ -667,7 +671,7 @@ void LCDFN(vline)(int x, int y1, int y2)
667#endif 671#endif
668 672
669 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 673 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
670 dst = &LCDFN(framebuffer)[y1>>3][x]; 674 dst = LCDFB(x,y1>>3);
671 ny = y2 - (y1 & ~7); 675 ny = y2 - (y1 & ~7);
672 mask = (0xFFu << (y1 & 7)) & 0xFFu; 676 mask = (0xFFu << (y1 & 7)) & 0xFFu;
673 mask |= mask << 8; 677 mask |= mask << 8;
@@ -776,7 +780,7 @@ void LCDFN(fillrect)(int x, int y, int width, int height)
776 } 780 }
777 } 781 }
778 bfunc = LCDFN(blockfuncs)[current_vp->drawmode]; 782 bfunc = LCDFN(blockfuncs)[current_vp->drawmode];
779 dst = &LCDFN(framebuffer)[y>>3][x]; 783 dst = LCDFB(x,y>>3);
780 ny = height - 1 + (y & 7); 784 ny = height - 1 + (y & 7);
781 mask = (0xFFu << (y & 7)) & 0xFFu; 785 mask = (0xFFu << (y & 7)) & 0xFFu;
782 mask |= mask << 8; 786 mask |= mask << 8;
@@ -890,7 +894,7 @@ void ICODE_ATTR LCDFN(mono_bitmap_part)(const unsigned char *src, int src_x,
890 src += stride * (src_y >> 3) + src_x; /* move starting point */ 894 src += stride * (src_y >> 3) + src_x; /* move starting point */
891 src_y &= 7; 895 src_y &= 7;
892 y -= src_y; 896 y -= src_y;
893 dst = &LCDFN(framebuffer)[y>>3][x]; 897 dst = LCDFB(x,y>>3);
894 shift = y & 7; 898 shift = y & 7;
895 ny = height - 1 + shift + src_y; 899 ny = height - 1 + shift + src_y;
896 900
@@ -1058,7 +1062,7 @@ void ICODE_ATTR LCDFN(bitmap_part)(const FBFN(data) *src, int src_x,
1058 src += stride * (src_y >> 3) + src_x; /* move starting point */ 1062 src += stride * (src_y >> 3) + src_x; /* move starting point */
1059 src_y &= 7; 1063 src_y &= 7;
1060 y -= src_y; 1064 y -= src_y;
1061 dst = &LCDFN(framebuffer)[y>>3][x]; 1065 dst = LCDFB(x,y>>3);
1062 shift = y & 7; 1066 shift = y & 7;
1063 ny = height - 1 + shift + src_y; 1067 ny = height - 1 + shift + src_y;
1064 1068