diff options
-rw-r--r-- | apps/plugins/grayscale.c | 6 | ||||
-rw-r--r-- | apps/plugins/jpeg.c | 4 | ||||
-rw-r--r-- | apps/plugins/lib/gray.h | 4 | ||||
-rw-r--r-- | apps/plugins/lib/gray_core.c | 132 | ||||
-rw-r--r-- | apps/plugins/lib/gray_draw.c | 58 | ||||
-rw-r--r-- | apps/plugins/lib/gray_scroll.c | 12 | ||||
-rw-r--r-- | apps/plugins/mandelbrot.c | 4 | ||||
-rw-r--r-- | firmware/drivers/lcd-h100.c | 31 |
8 files changed, 155 insertions, 96 deletions
diff --git a/apps/plugins/grayscale.c b/apps/plugins/grayscale.c index 3b86304123..cdb3f880e5 100644 --- a/apps/plugins/grayscale.c +++ b/apps/plugins/grayscale.c @@ -154,11 +154,11 @@ int main(void) 32 bitplanes for 33 shades of grey. H1x0: 160 pixels wide, 30 rows (120 pixels) high, (try to) reserve 32 bitplanes for 33 shades of grey. */ - shades = gray_init(rb, gbuf, gbuf_size, true, LCD_WIDTH, - (GFX_HEIGHT*LCD_DEPTH/8), 32, NULL) + 1; + shades = gray_init(rb, gbuf, gbuf_size, true, LCD_WIDTH, GFX_HEIGHT/8, + 32, NULL) + 1; /* place greyscale overlay 1 row down */ - gray_set_position(0, LCD_DEPTH); + gray_set_position(0, 1); rb->snprintf(pbuf, sizeof(pbuf), "Shades: %d", shades); rb->lcd_puts(0, 0, pbuf); diff --git a/apps/plugins/jpeg.c b/apps/plugins/jpeg.c index 1aac438e51..f9dcf2a63d 100644 --- a/apps/plugins/jpeg.c +++ b/apps/plugins/jpeg.c @@ -1822,8 +1822,8 @@ int main(char* filename) /* initialize the grayscale buffer: 32 bitplanes for 33 shades of gray. */ - grayscales = gray_init(rb, buf, buf_size, false, LCD_WIDTH, - (LCD_HEIGHT*LCD_DEPTH/8), 32, &graysize) + 1; + grayscales = gray_init(rb, buf, buf_size, false, LCD_WIDTH, LCD_HEIGHT/8, + 32, &graysize) + 1; buf += graysize; buf_size -= graysize; if (grayscales < 33 || buf_size <= 0) diff --git a/apps/plugins/lib/gray.h b/apps/plugins/lib/gray.h index 09ae73b8a6..f1007984b5 100644 --- a/apps/plugins/lib/gray.h +++ b/apps/plugins/lib/gray.h @@ -107,11 +107,7 @@ void gray_ub_scroll_down(int count); /*** Internal stuff ***/ -#if LCD_DEPTH == 1 #define _PBLOCK_EXP 3 -#elif LCD_DEPTH == 2 -#define _PBLOCK_EXP 2 -#endif #define _PBLOCK (1 << _PBLOCK_EXP) /* flag definitions */ diff --git a/apps/plugins/lib/gray_core.c b/apps/plugins/lib/gray_core.c index a4ef45d8c1..ecff53f1c5 100644 --- a/apps/plugins/lib/gray_core.c +++ b/apps/plugins/lib/gray_core.c @@ -81,10 +81,8 @@ static void _timer_isr(void) memory. Unbuffered operation provides only a subset of drawing functions. (only gray_bitmap drawing and scrolling) width = width in pixels (1..LCD_WIDTH) - bheight = height in LCD pixel-block units (8 pixels for b&w LCD, - 4 pixels for 4-grey LCD) (1..LCD_HEIGHT/block_size) - depth = number of bitplanes to use (1..32 for b&w LCD, 1..16 for - 4-grey LCD). + bheight = height in LCD pixel-block units (8 pixels) (1..LCD_HEIGHT/8) + depth = number of bitplanes to use (1..32). result: = depth if there was enough memory @@ -99,8 +97,7 @@ static void _timer_isr(void) deliver an enhancement over the native display. The number of displayable shades is calculated as follows: - b&w LCD: shades = depth + 1 - 4-grey LCD: shades = 3 * depth + 1 + shades = depth + 1 If you need info about the memory taken by the greyscale buffer, supply a long* as the last parameter. This long will then contain the number of bytes @@ -109,7 +106,7 @@ static void _timer_isr(void) shades * sizeof(long) (bitpatterns) + (width * bheight) * depth (bitplane data) + buffered ? (chunky front- & backbuffer) - (width * bheight * 8(4) * 2) : 0 + (width * bheight * 8 * 2) : 0 + 0..3 (longword alignment) */ int gray_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size, bool buffered, int width, int bheight, int depth, long *buf_taken) @@ -292,42 +289,41 @@ void gray_update_rect(int x, int y, int width, int height) #if (CONFIG_CPU == SH7034) && (LCD_DEPTH == 1) unsigned long pat_stack[8]; unsigned long *pat_ptr; - unsigned change, ofs; + unsigned char *cbuf, *bbuf; + unsigned change; + + cbuf = _gray_info.cur_buffer + srcofs_row; + bbuf = _gray_info.back_buffer + srcofs_row; - ofs = srcofs_row; asm volatile ( - "mov.l @(%[ofs],%[cbuf]),r1\n" - "mov.l @(%[ofs],%[bbuf]),r2\n" + "mov.l @%[cbuf]+,r1 \n" + "mov.l @%[bbuf]+,r2 \n" "xor r1,r2 \n" - "add #4,%[ofs] \n" - "mov.l @(%[ofs],%[cbuf]),r1\n" - "mov.l @(%[ofs],%[bbuf]),%[chg]\n" + "mov.l @%[cbuf],r1 \n" + "mov.l @%[bbuf],%[chg] \n" "xor r1,%[chg] \n" "or r2,%[chg] \n" : /* outputs */ - [ofs] "+z"(ofs), + [cbuf]"+r"(cbuf), + [bbuf]"+r"(bbuf), [chg] "=r"(change) : /* inputs */ - [cbuf]"r"(_gray_info.cur_buffer), - [bbuf]"r"(_gray_info.back_buffer) : /* clobbers */ "r1", "r2" ); if (change != 0) { - unsigned char *cbuf, *bbuf, *addr, *end; + unsigned char *addr, *end; unsigned mask; pat_ptr = &pat_stack[8]; - cbuf = _gray_info.cur_buffer; - bbuf = _gray_info.back_buffer; + cbuf = _gray_info.cur_buffer + srcofs_row; + bbuf = _gray_info.back_buffer + srcofs_row; /* precalculate the bit patterns with random shifts * for all 8 pixels and put them on an extra "stack" */ asm volatile ( - "add %[ofs],%[cbuf] \n" - "add %[ofs],%[bbuf] \n" "mov #8,r3 \n" /* loop count in r3: 8 pixels */ ".ur_pre_loop: \n" @@ -384,7 +380,6 @@ void gray_update_rect(int x, int y, int width, int height) [patp]"+r"(pat_ptr), [mask]"=&r"(mask) : /* inputs */ - [ofs] "[mask]"(srcofs_row), [dpth]"r"(_gray_info.depth), [bpat]"r"(_gray_info.bitpattern), [rmsk]"r"(_gray_info.randmask) @@ -473,36 +468,44 @@ void gray_update_rect(int x, int y, int width, int height) ); } #elif defined(CPU_COLDFIRE) && (LCD_DEPTH == 2) - unsigned long pat_stack[4]; + unsigned long pat_stack[8]; unsigned long *pat_ptr; + unsigned char *cbuf, *bbuf; unsigned change; + cbuf = _gray_info.cur_buffer + srcofs_row; + bbuf = _gray_info.back_buffer + srcofs_row; + asm volatile ( - "move.l (%[ofs]:l:1,%[cbuf]),%[chg] \n" - "sub.l (%[ofs]:l:1,%[bbuf]),%[chg] \n" + "move.l (%[cbuf])+,%%d0 \n" + "move.l (%[bbuf])+,%%d1 \n" + "eor.l %%d0,%%d1 \n" + "move.l (%[cbuf]),%%d0 \n" + "move.l (%[bbuf]),%[chg]\n" + "eor.l %%d0,%[chg] \n" + "or.l %%d1,%[chg] \n" : /* outputs */ + [cbuf]"+a"(cbuf), + [bbuf]"+a"(bbuf), [chg] "=&d"(change) : /* inputs */ - [cbuf]"a"(_gray_info.cur_buffer), - [bbuf]"a"(_gray_info.back_buffer), - [ofs] "d"(srcofs_row) + : /* clobbers */ + "d0", "d1" ); if (change != 0) { - unsigned char *cbuf, *bbuf, *addr, *end; + unsigned char *addr, *end; unsigned mask; - pat_ptr = &pat_stack[4]; - cbuf = _gray_info.cur_buffer; - bbuf = _gray_info.back_buffer; + pat_ptr = &pat_stack[8]; + cbuf = _gray_info.cur_buffer + srcofs_row; + bbuf = _gray_info.back_buffer + srcofs_row; /* precalculate the bit patterns with random shifts - * for all 4 pixels and put them on an extra "stack" */ + * for all 8 pixels and put them on an extra "stack" */ asm volatile ( - "add.l %[ofs],%[cbuf] \n" - "add.l %[ofs],%[bbuf] \n" - "moveq.l #4,%%d3 \n" /* loop count in d3: 4 pixels */ + "moveq.l #8,%%d3 \n" /* loop count in d3: 8 pixels */ "clr.l %[mask] \n" ".ur_pre_loop: \n" @@ -536,10 +539,10 @@ void gray_update_rect(int x, int y, int width, int height) "lsr.l %%d1,%%d2 \n" "or.l %%d0,%%d2 \n" /* rotated_pattern = d2 | d0 */ - "or.l #0x0300,%[mask] \n" /* set mask bit */ + "or.l #0x0100,%[mask] \n" /* set mask bit */ ".ur_skip: \n" - "lsr.l #2,%[mask] \n" /* shift mask */ + "lsr.l #1,%[mask] \n" /* shift mask */ "move.l %%d2,-(%[patp]) \n" /* push on pattern stack */ "subq.l #1,%%d3 \n" /* decrease loop count */ @@ -551,7 +554,6 @@ void gray_update_rect(int x, int y, int width, int height) [rnd] "+d"(_gray_random_buffer), [mask]"=&d"(mask) : /* inputs */ - [ofs] "[mask]"(srcofs_row), [bpat]"a"(_gray_info.bitpattern), [dpth]"d"(_gray_info.depth), [rmsk]"d"(_gray_info.randmask) @@ -562,11 +564,11 @@ void gray_update_rect(int x, int y, int width, int height) addr = dst_row; end = addr + MULU16(_gray_info.depth, _gray_info.plane_size); - /* set the bits for all 4 pixels in all bytes according to the + /* set the bits for all 8 pixels in all bytes according to the * precalculated patterns on the pattern stack */ asm volatile ( - "movem.l (%[patp]),%%d2-%%d5 \n" /* pop all 4 patterns */ - + "movem.l (%[patp]),%%d2-%%d6/%%a0-%%a2 \n" + /* pop all 8 patterns */ "not.l %[mask] \n" /* set mask -> keep mask */ "and.l #0xFF,%[mask] \n" "beq.b .ur_sloop \n" /* yes: jump to short loop */ @@ -575,18 +577,26 @@ void gray_update_rect(int x, int y, int width, int height) "clr.l %%d0 \n" "lsr.l #1,%%d2 \n" /* shift out mask bit */ "addx.l %%d0,%%d0 \n" /* puts bit into LSB, shifts left by 1 */ - "lsl.l #1,%%d0 \n" /* shift by another 1 for a total of 2 */ "lsr.l #1,%%d3 \n" "addx.l %%d0,%%d0 \n" - "lsl.l #1,%%d0 \n" "lsr.l #1,%%d4 \n" "addx.l %%d0,%%d0 \n" - "lsl.l #1,%%d0 \n" "lsr.l #1,%%d5 \n" "addx.l %%d0,%%d0 \n" - "move.l %%d0,%%d1 \n" /* duplicate bits 0, 2, 4, 6, ... */ - "lsl.l #1,%%d1 \n" /* to 1, 3, 5, 7, ... */ - "or.l %%d1,%%d0 \n" + "lsr.l #1,%%d6 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%a0,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a0 \n" + "move.l %%a1,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a1 \n" + "move.l %%a2,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a2 \n" "move.b (%[addr]),%%d1 \n" /* read old value */ "and.l %[mask],%%d1 \n" /* mask out unneeded bits */ @@ -603,18 +613,26 @@ void gray_update_rect(int x, int y, int width, int height) "clr.l %%d0 \n" "lsr.l #1,%%d2 \n" /* shift out mask bit */ "addx.l %%d0,%%d0 \n" /* puts bit into LSB, shifts left by 1 */ - "lsl.l #1,%%d0 \n" /* shift by another 1 for a total of 2 */ "lsr.l #1,%%d3 \n" "addx.l %%d0,%%d0 \n" - "lsl.l #1,%%d0 \n" "lsr.l #1,%%d4 \n" "addx.l %%d0,%%d0 \n" - "lsl.l #1,%%d0 \n" "lsr.l #1,%%d5 \n" "addx.l %%d0,%%d0 \n" - "move.l %%d0,%%d1 \n" /* duplicate bits 0, 2, 4, 6, ... */ - "lsl.l #1,%%d1 \n" /* to 1, 3, 5, 7, ... */ - "or.l %%d1,%%d0 \n" + "lsr.l #1,%%d6 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%a0,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a0 \n" + "move.l %%a1,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a1 \n" + "move.l %%a2,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a2 \n" "move.b %%d0,(%[addr]) \n" /* store byte to bitplane */ "add.l %[psiz],%[addr] \n" /* advance to next bitplane */ @@ -626,11 +644,11 @@ void gray_update_rect(int x, int y, int width, int height) [addr]"+a"(addr), [mask]"+d"(mask) : /* inputs */ - [psiz]"r"(_gray_info.plane_size), + [psiz]"a"(_gray_info.plane_size), [end] "a"(end), [patp]"a"(pat_ptr) : /* clobbers */ - "d0", "d1", "d2", "d3", "d4", "d5" + "d0", "d1", "d2", "d3", "d4", "d5", "d6", "a0", "a1", "a2" ); } #endif diff --git a/apps/plugins/lib/gray_draw.c b/apps/plugins/lib/gray_draw.c index ab1b286137..4b2237197c 100644 --- a/apps/plugins/lib/gray_draw.c +++ b/apps/plugins/lib/gray_draw.c @@ -754,13 +754,13 @@ static void _writearray(unsigned char *address, const unsigned char *src, _src = src; /* precalculate the bit patterns with random shifts - for all 4 pixels and put them on an extra "stack" */ + for all 8 pixels and put them on an extra "stack" */ asm volatile ( - "moveq.l #4,%%d3 \n" /* loop count in d3: 4 pixels */ + "moveq.l #8,%%d3 \n" /* loop count in d3: 4 pixels */ ".wa_loop: \n" /** load pattern for pixel **/ "clr.l %%d2 \n" /* pattern for skipped pixel must be 0 */ - "lsr.l #2,%[mask] \n" /* shift out 2 lsbs of mask */ + "lsr.l #1,%[mask] \n" /* shift out 2 lsbs of mask */ "bcc.b .wa_skip \n" /* skip this pixel */ "clr.l %%d0 \n" @@ -816,10 +816,10 @@ static void _writearray(unsigned char *address, const unsigned char *src, end = addr + MULU16(_gray_info.depth, _gray_info.plane_size); _mask = mask; - /* set the bits for all 4 pixels in all bytes according to the + /* set the bits for all 8 pixels in all bytes according to the * precalculated patterns on the pattern stack */ asm volatile ( - "movem.l (%[patp]),%%d2-%%d5 \n" /* pop all 4 patterns */ + "movem.l (%[patp]),%%d2-%%d6/%%a0-%%a2 \n" /* pop all 8 patterns */ "not.l %[mask] \n" /* "set" mask -> "keep" mask */ "and.l #0xFF,%[mask] \n" @@ -829,18 +829,26 @@ static void _writearray(unsigned char *address, const unsigned char *src, "clr.l %%d0 \n" "lsr.l #1,%%d2 \n" /* shift out mask bit */ "addx.l %%d0,%%d0 \n" /* puts bit into LSB, shifts left by 1 */ - "lsl.l #1,%%d0 \n" /* shift by another 1 for a total of 2 */ "lsr.l #1,%%d3 \n" "addx.l %%d0,%%d0 \n" - "lsl.l #1,%%d0 \n" "lsr.l #1,%%d4 \n" "addx.l %%d0,%%d0 \n" - "lsl.l #1,%%d0 \n" "lsr.l #1,%%d5 \n" "addx.l %%d0,%%d0 \n" - "move.l %%d0,%%d1 \n" /* duplicate bits 0, 2, 4, 6, ... */ - "lsl.l #1,%%d1 \n" /* to 1, 3, 5, 7, ... */ - "or.l %%d1,%%d0 \n" + "lsr.l #1,%%d6 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%a0,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a0 \n" + "move.l %%a1,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a1 \n" + "move.l %%a2,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a2 \n" "move.b (%[addr]),%%d1 \n" /* read old value */ "and.l %[mask],%%d1 \n" /* mask out unneeded bits */ @@ -857,18 +865,26 @@ static void _writearray(unsigned char *address, const unsigned char *src, "clr.l %%d0 \n" "lsr.l #1,%%d2 \n" /* shift out mask bit */ "addx.l %%d0,%%d0 \n" /* puts bit into LSB, shifts left by 1 */ - "lsl.l #1,%%d0 \n" /* shift by another 1 for a total of 2 */ "lsr.l #1,%%d3 \n" "addx.l %%d0,%%d0 \n" - "lsl.l #1,%%d0 \n" "lsr.l #1,%%d4 \n" "addx.l %%d0,%%d0 \n" - "lsl.l #1,%%d0 \n" "lsr.l #1,%%d5 \n" "addx.l %%d0,%%d0 \n" - "move.l %%d0,%%d1 \n" /* duplicate bits 0, 2, 4, 6, ... */ - "lsl.l #1,%%d1 \n" /* to 1, 3, 5, 7, ... */ - "or.l %%d1,%%d0 \n" + "lsr.l #1,%%d6 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%a0,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a0 \n" + "move.l %%a1,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a1 \n" + "move.l %%a2,%%d1 \n" + "lsr.l #1,%%d1 \n" + "addx.l %%d0,%%d0 \n" + "move.l %%d1,%%a2 \n" "move.b %%d0,(%[addr]) \n" /* store byte to bitplane */ "add.l %[psiz],%[addr] \n" /* advance to next bitplane */ @@ -880,11 +896,11 @@ static void _writearray(unsigned char *address, const unsigned char *src, [addr]"+a"(addr), [mask]"+d"(_mask) : /* inputs */ - [psiz]"r"(_gray_info.plane_size), + [psiz]"a"(_gray_info.plane_size), [end] "a"(end), [patp]"a"(pat_ptr) : /* clobbers */ - "d0", "d1", "d2", "d3", "d4", "d5" + "d0", "d1", "d2", "d3", "d4", "d5", "d6", "a0", "a1", "a2" ); #endif } @@ -938,8 +954,8 @@ void gray_ub_gray_bitmap_part(const unsigned char *src, int src_x, int src_y, + MULU16(_gray_info.width, y >> _PBLOCK_EXP); ny = height - 1 + shift; - mask = 0xFFu << (LCD_DEPTH * shift); - mask_bottom = 0xFFu >> (LCD_DEPTH * (~ny & (_PBLOCK-1))); + mask = 0xFFu << shift; + mask_bottom = 0xFFu >> (~ny & (_PBLOCK-1)); for (; ny >= _PBLOCK; ny -= _PBLOCK) { diff --git a/apps/plugins/lib/gray_scroll.c b/apps/plugins/lib/gray_scroll.c index f7ace0e47c..341024a67e 100644 --- a/apps/plugins/lib/gray_scroll.c +++ b/apps/plugins/lib/gray_scroll.c @@ -294,7 +294,9 @@ void gray_ub_scroll_up(int count) "extu.b r0,r1 \n" /* store data for next round */ ".su_shift6: \n" /* shift right by 0..7 bits */ - "shlr2 r0 \n" + "shll2 r0 \n" + "bra .su_shift0 \n" + "shlr8 r0 \n" ".su_shift4: \n" "shlr2 r0 \n" ".su_shift2: \n" @@ -378,7 +380,7 @@ void gray_ub_scroll_up(int count) [wide]"r"(_gray_info.width), [rows]"r"(_gray_info.bheight - shift), [addr]"a"(_gray_info.plane_data + _gray_info.plane_size - blockshift), - [cnt] "d"(2 * count) + [cnt] "d"(count) : /* clobbers */ "a0", "a1", "d0", "d1", "d2", "d3", "d4" ); @@ -474,7 +476,9 @@ void gray_ub_scroll_down(int count) "extu.b r0,r0 \n" /* extend unsigned */ ".sd_shift6: \n" /* shift left by 0..7 bits */ - "shll2 r0 \n" + "shll8 r0 \n" + "bra .sd_shift0 \n" + "shlr2 r0 \n" ".sd_shift4: \n" "shll2 r0 \n" ".sd_shift2: \n" @@ -557,7 +561,7 @@ void gray_ub_scroll_down(int count) [rows]"r"(_gray_info.bheight - shift), [psiz]"r"(_gray_info.plane_size), [addr]"a"(_gray_info.plane_data + blockshift), - [cnt] "d"(2 * count) + [cnt] "d"(count) : /* clobbers */ "a0", "a1", "d0", "d1", "d2", "d3", "d4" ); diff --git a/apps/plugins/mandelbrot.c b/apps/plugins/mandelbrot.c index d5fb0f2b04..88f48d3f2b 100644 --- a/apps/plugins/mandelbrot.c +++ b/apps/plugins/mandelbrot.c @@ -353,8 +353,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) /* initialize the grayscale buffer: * 8 bitplanes for 9 shades of gray.*/ - grayscales = gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, - (LCD_HEIGHT*LCD_DEPTH/8), 8, NULL) + 1; + grayscales = gray_init(rb, gbuf, gbuf_size, false, LCD_WIDTH, LCD_HEIGHT/8, + 8, NULL) + 1; if (grayscales != 9) { rb->snprintf(buff, sizeof(buff), "%d", grayscales); rb->lcd_puts(0, 1, buff); diff --git a/firmware/drivers/lcd-h100.c b/firmware/drivers/lcd-h100.c index bfdceedc35..df08dde6fb 100644 --- a/firmware/drivers/lcd-h100.c +++ b/firmware/drivers/lcd-h100.c @@ -211,16 +211,41 @@ void lcd_init(void) void lcd_blit(const unsigned char* data, int x, int by, int width, int bheight, int stride) { - /* Copy display bitmap to hardware */ + const unsigned char *src, *src_end; + unsigned char *dst_u, *dst_l; + unsigned char upper[LCD_WIDTH]; + unsigned char lower[LCD_WIDTH]; + unsigned int byte; + + by *= 2; + while (bheight--) { + src = data; + src_end = data + width; + dst_u = upper; + dst_l = lower; + do + { + byte = *src++; + *dst_u++ = dibits[byte & 0x0F]; + byte >>= 4; + *dst_l++ = dibits[byte & 0x0F]; + } + while (src < src_end); + lcd_write_command_ex(LCD_CNTL_PAGE, by++, -1); lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1); + lcd_write_command(LCD_CNTL_DATA_WRITE); + lcd_write_data(upper, width); + lcd_write_command_ex(LCD_CNTL_PAGE, by++, -1); + lcd_write_command_ex(LCD_CNTL_COLUMN, x, -1); lcd_write_command(LCD_CNTL_DATA_WRITE); - lcd_write_data(data, width); + lcd_write_data(lower, width); + data += stride; - } + } } |