From bd2f678b7037a3cf14819082e1d9b948cbc099cd Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Wed, 28 Dec 2005 22:49:22 +0000 Subject: Patch #1392287 by Brandon Low - faster LCD update for H300 with ASM git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8293 a1c6a512-1295-4272-9138-f99709370657 --- docs/CREDITS | 1 + firmware/drivers/lcd-h300.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/CREDITS b/docs/CREDITS index 2bd8b2616b..e18ae81bd9 100644 --- a/docs/CREDITS +++ b/docs/CREDITS @@ -151,3 +151,4 @@ Jeong Taek In Anders Kagerin Peter D'Hoye Ben Basha +Brandon Low diff --git a/firmware/drivers/lcd-h300.c b/firmware/drivers/lcd-h300.c index bb2f9ec777..384490a29f 100644 --- a/firmware/drivers/lcd-h300.c +++ b/firmware/drivers/lcd-h300.c @@ -93,8 +93,37 @@ inline void lcd_begin_write_gram(void) inline void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR; inline void lcd_write_data(const unsigned short* p_bytes, int count) { - while(count--) + int precount = ((-(size_t)p_bytes) & 0xf) / 2; + count -= precount; + while(precount--) *(volatile unsigned short *)0xf0000002 = *p_bytes++; + while((count -= 8) >= 0) asm ( + "\n\tmovem.l (%[p_bytes]),%%d1-%%d4\ + \n\tswap %%d1\ + \n\tmove.w %%d1,(%[dest])\ + \n\tswap %%d1\ + \n\tmove.w %%d1,(%[dest])\ + \n\tswap %%d2\ + \n\tmove.w %%d2,(%[dest])\ + \n\tswap %%d2\ + \n\tmove.w %%d2,(%[dest])\ + \n\tswap %%d3\ + \n\tmove.w %%d3,(%[dest])\ + \n\tswap %%d3\ + \n\tmove.w %%d3,(%[dest])\ + \n\tswap %%d4\ + \n\tmove.w %%d4,(%[dest])\ + \n\tswap %%d4\ + \n\tmove.w %%d4,(%[dest])\ + \n\tlea.l (16,%[p_bytes]),%[p_bytes]" + : [p_bytes] "+a" (p_bytes) + : [dest] "a" ((volatile unsigned short *)0xf0000002) + : "d1", "d2", "d3", "d4", "memory"); + if (count != 0) { + count += 8; + while(count--) + *(volatile unsigned short *)0xf0000002 = *p_bytes++; + } } /*** hardware configuration ***/ -- cgit v1.2.3