summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2007-03-26 07:52:13 +0000
committerJens Arnold <amiconn@rockbox.org>2007-03-26 07:52:13 +0000
commitad4e3d665734b14a28f1ba5fa874663772dab3e7 (patch)
treebff44652495f1319a4d11ed63b3d4e90cb11197f
parent165f62d0cd771660e4b8d2ba7475e14d0d6f2e9f (diff)
downloadrockbox-ad4e3d665734b14a28f1ba5fa874663772dab3e7.tar.gz
rockbox-ad4e3d665734b14a28f1ba5fa874663772dab3e7.tar.bz2
rockbox-ad4e3d665734b14a28f1ba5fa874663772dab3e7.zip
First step of charcell LCD code rework: * Make it fully unicode aware so that adding non-ISO8859-1 scripts becomes possible (limited by the LCD capabilities of course). * Make the API more similar to the bitmap LCD code's API. * Moved hardware dependent parts to target tree. * Simplified code. * Jumpscroll temporarily non-functional.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12916 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/gui/icon.h4
-rw-r--r--apps/player/icons.h4
-rw-r--r--apps/player/keyboard.c66
-rw-r--r--apps/plugin.c6
-rw-r--r--apps/plugin.h22
-rw-r--r--apps/plugins/euroconverter.c35
-rw-r--r--apps/plugins/flipit.c2
-rw-r--r--apps/plugins/jackpot.c12
-rw-r--r--apps/plugins/lib/playergfx.c2
-rw-r--r--apps/plugins/nim.c20
-rw-r--r--apps/screen_access.c40
-rw-r--r--apps/screen_access.h21
-rw-r--r--apps/screens.c26
-rw-r--r--firmware/SOURCES5
-rw-r--r--firmware/drivers/lcd-charcell.c612
-rw-r--r--firmware/drivers/lcd-charset-player.c594
-rw-r--r--firmware/drivers/lcd-player-charset.c751
-rw-r--r--firmware/drivers/lcd-player.c830
-rw-r--r--firmware/export/config-player.h9
-rw-r--r--firmware/export/lcd-charcell.h41
-rw-r--r--firmware/export/lcd-player-charset.h27
-rw-r--r--firmware/export/lcd.h63
-rw-r--r--firmware/target/sh/archos/player/lcd-player.c235
-rwxr-xr-xtools/configure2
-rw-r--r--uisimulator/common/lcd-playersim.c9
-rw-r--r--uisimulator/sdl/lcd-charcell.c20
26 files changed, 1652 insertions, 1806 deletions
diff --git a/apps/gui/icon.h b/apps/gui/icon.h
index e21db7a133..9ceda9e933 100644
--- a/apps/gui/icon.h
+++ b/apps/gui/icon.h
@@ -26,13 +26,13 @@
typedef const unsigned char * ICON;
#define NOICON NULL
#else
-typedef short ICON;
+typedef long ICON;
#define NOICON -1
#endif
#define Icon_NOICON -1
-#define CURSOR_CHAR 0x92
+#define CURSOR_CHAR 0xe10c
#define CURSOR_WIDTH 6
#define CURSOR_HEIGHT 8
diff --git a/apps/player/icons.h b/apps/player/icons.h
index 32a6adf75a..5df94b09e3 100644
--- a/apps/player/icons.h
+++ b/apps/player/icons.h
@@ -30,8 +30,8 @@
enum {
Icon_Queued = 'Q',
Icon_Moving = 'M',
- Icon_Unknown = 0x90,
- Icon_Bookmark = 0x16,
+ Icon_Unknown = 0xe100,
+ Icon_Bookmark,
Icon_Plugin,
Icon_Folder,
Icon_Firmware,
diff --git a/apps/player/keyboard.c b/apps/player/keyboard.c
index 380edd5e95..791693f9fe 100644
--- a/apps/player/keyboard.c
+++ b/apps/player/keyboard.c
@@ -31,53 +31,46 @@
#include "misc.h"
#include "rbunicode.h"
+#define KBD_BUF_SIZE 64
#define KEYBOARD_PAGES 3
-extern unsigned short *lcd_ascii;
-
-static unsigned char* kbd_setupkeys(int page, int* len)
+static unsigned short *kbd_setupkeys(int page, int* len)
{
- static unsigned char lines[128];
-
- unsigned ch;
+ static unsigned short kbdline[KBD_BUF_SIZE];
+ const unsigned char *p;
int i = 0;
- switch (page)
+ switch (page)
{
case 0: /* Capitals */
- for (ch = 'A'; ch <= 'Z'; ch++)
- lines[i++] = ch;
- for (ch = 0xc0; ch <= 0xdd; ch++)
- if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD)
- lines[i++] = ch;
+ p = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅ"
+ "ÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÝ";
break;
case 1: /* Small */
- for (ch = 'a'; ch <= 'z'; ch++)
- lines[i++] = ch;
- for (ch = 0xdf; ch <= 0xff; ch++)
- if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD)
- lines[i++] = ch;
+ p = "abcdefghijklmnopqrstuvwxyzßàáâãä"
+ "åçèéêëìíîïñòóôöøùúûüýÿ";
break;
- case 2: /* Others */
- for (ch = ' '; ch <= '@'; ch++)
- lines[i++] = ch;
+ default: /* Others */
+ p = " !\"#$%&'()*+,-./0123456789:;<=>?@[]_{}~";
break;
}
- lines[i] = 0;
+ while (*p)
+ p = utf8decode(p, &kbdline[i++]);
+
*len = i;
- return lines;
+ return kbdline;
}
/* Delimiters for highlighting the character selected for insertion */
-#define KEYBOARD_INSERT_LEFT 0x81
-#define KEYBOARD_INSERT_RIGHT 0x82
+#define KEYBOARD_INSERT_LEFT 0xe110
+#define KEYBOARD_INSERT_RIGHT 0xe10f
#define KEYBOARD_CURSOR 0x7f
-#define KEYBOARD_ARROW 0x92
+#define KEYBOARD_ARROW 0xe10c
/* helper function to spell a char if voice UI is enabled */
static void kbd_spellchar(char c)
@@ -101,9 +94,8 @@ int kbd_input(char* text, int buflen)
int len, len_utf8, i, j;
int editpos, curpos, leftpos;
- unsigned char *line = kbd_setupkeys(page, &linelen);
+ unsigned short *line = kbd_setupkeys(page, &linelen);
unsigned char temptext[36];
- unsigned char tmp;
unsigned char *utf8;
int button, lastbutton = 0;
@@ -130,20 +122,14 @@ int kbd_input(char* text, int buflen)
lcd_putc(0, 0, KEYBOARD_ARROW);
lcd_putc(0, 1, ' ');
}
-
- /* Draw insert chars */
- utf8 = temptext;
- tmp = KEYBOARD_INSERT_LEFT;
- utf8 = iso_decode(&tmp, utf8, 0, 1);
- utf8 = iso_decode(&line[x], utf8, 0, 1);
- tmp = KEYBOARD_INSERT_RIGHT;
- utf8 = iso_decode(&tmp, utf8, 0, 1);
+
+ lcd_putc(1, 0, KEYBOARD_INSERT_LEFT);
+ lcd_putc(2, 0, line[x]);
+ lcd_putc(3, 0, KEYBOARD_INSERT_RIGHT);
for (i = 1; i < 8; i++)
{
- utf8 = iso_decode(&line[(x+i)%linelen], utf8, 0, 1);
+ lcd_putc(i + 3, 0, line[(x+i)%linelen]);
}
- *utf8 = 0;
- lcd_puts(1, 0, temptext);
/* write out the text */
curpos = MIN(MIN(editpos, 10 - MIN(len_utf8 - editpos, 3)), 9);
@@ -175,7 +161,7 @@ int kbd_input(char* text, int buflen)
lcd_remove_cursor();
lcd_puts(1, 1, temptext);
lcd_put_cursor(curpos + 1, 1, KEYBOARD_CURSOR);
-
+
gui_syncstatusbar_draw(&statusbars, true);
}
@@ -270,7 +256,7 @@ int kbd_input(char* text, int buflen)
}
else /* inserts the selected char */
{
- utf8 = iso_decode((unsigned char*)&line[x], temptext, 0, 1);
+ utf8 = utf8encode(line[x], temptext);
*utf8 = 0;
j = strlen(temptext);
if (len + j < buflen)
diff --git a/apps/plugin.c b/apps/plugin.c
index 7a2ce00e23..de04269a89 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -67,6 +67,9 @@ static const struct plugin_api rockbox_api = {
/* lcd */
lcd_set_contrast,
lcd_clear_display,
+ lcd_setmargins,
+ lcd_getstringsize,
+ lcd_putsxy,
lcd_puts,
lcd_puts_scroll,
lcd_stop_scroll,
@@ -80,11 +83,9 @@ static const struct plugin_api rockbox_api = {
PREFIX(lcd_icon),
lcd_double_height,
#else
- lcd_setmargins,
lcd_set_drawmode,
lcd_get_drawmode,
lcd_setfont,
- lcd_getstringsize,
lcd_drawpixel,
lcd_drawline,
lcd_hline,
@@ -109,7 +110,6 @@ static const struct plugin_api rockbox_api = {
bidi_l2v,
font_get_bits,
font_load,
- lcd_putsxy,
lcd_puts_style,
lcd_puts_scroll_style,
&lcd_framebuffer[0][0],
diff --git a/apps/plugin.h b/apps/plugin.h
index dbe79368da..7688057d86 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -29,7 +29,7 @@
#define MEM 2
#endif
-#include <stdbool.h>
+#include <stdbool.h>
#include <sys/types.h>
#include <stdarg.h>
#include <stdio.h>
@@ -110,12 +110,12 @@
#define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 49
+#define PLUGIN_API_VERSION 50
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */
-#define PLUGIN_MIN_API_VERSION 47
+#define PLUGIN_MIN_API_VERSION 50
/* plugin return codes */
enum plugin_status {
@@ -135,24 +135,25 @@ struct plugin_api {
/* lcd */
void (*lcd_set_contrast)(int x);
void (*lcd_clear_display)(void);
+ void (*lcd_setmargins)(int x, int y);
+ int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h);
+ void (*lcd_putsxy)(int x, int y, const unsigned char *string);
void (*lcd_puts)(int x, int y, const unsigned char *string);
void (*lcd_puts_scroll)(int x, int y, const unsigned char* string);
void (*lcd_stop_scroll)(void);
#ifdef HAVE_LCD_CHARCELLS
- void (*lcd_define_pattern)(int which,const char *pattern);
- unsigned char (*lcd_get_locked_pattern)(void);
- void (*lcd_unlock_pattern)(unsigned char pat);
- void (*lcd_putc)(int x, int y, unsigned short ch);
- void (*lcd_put_cursor)(int x, int y, char cursor_char);
+ void (*lcd_define_pattern)(unsigned long ucs, const char *pattern);
+ unsigned long (*lcd_get_locked_pattern)(void);
+ void (*lcd_unlock_pattern)(unsigned long ucs);
+ void (*lcd_putc)(int x, int y, unsigned long ucs);
+ void (*lcd_put_cursor)(int x, int y, unsigned long ucs);
void (*lcd_remove_cursor)(void);
void (*PREFIX(lcd_icon))(int icon, bool enable);
void (*lcd_double_height)(bool on);
#else
- void (*lcd_setmargins)(int x, int y);
void (*lcd_set_drawmode)(int mode);
int (*lcd_get_drawmode)(void);
void (*lcd_setfont)(int font);
- int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h);
void (*lcd_drawpixel)(int x, int y);
void (*lcd_drawline)(int x1, int y1, int x2, int y2);
void (*lcd_hline)(int x1, int x2, int y);
@@ -184,7 +185,6 @@ struct plugin_api {
unsigned short *(*bidi_l2v)( const unsigned char *str, int orientation );
const unsigned char *(*font_get_bits)( struct font *pf, unsigned short char_code );
struct font* (*font_load)(const char *path);
- void (*lcd_putsxy)(int x, int y, const unsigned char *string);
void (*lcd_puts_style)(int x, int y, const unsigned char *str, int style);
void (*lcd_puts_scroll_style)(int x, int y, const unsigned char* string,
int style);
diff --git a/apps/plugins/euroconverter.c b/apps/plugins/euroconverter.c
index 3cf36affea..97ec21dd98 100644
--- a/apps/plugins/euroconverter.c
+++ b/apps/plugins/euroconverter.c
@@ -138,7 +138,7 @@ static unsigned char *abbrev_str[12] = {
};
-static unsigned char heuro,hhome; /*Handles for the new patterns*/
+static unsigned long heuro,hhome; /*Handles for the new patterns*/
static struct plugin_api* rb;
@@ -239,7 +239,6 @@ static void round(longlong_t* i, longlong_t* f, int n)
*/
static void display(longlong_t euro, longlong_t home, bool pos)
{
- char c1,c2;
longlong_t i,f;
unsigned char str[20];
unsigned char s1[20];
@@ -247,52 +246,50 @@ static void display(longlong_t euro, longlong_t home, bool pos)
if (pos)
{ /*Edit the second line*/
- c1=0x20;
- rb->strcpy(s1,"%c%c%6d.%02d");
- c2=0x81;
+ rb->strcpy(s1," %6d.%02d");
if (nb_digit[country]==2)
- rb->strcpy(s2,"%c%c%06d.%02d");
+ rb->strcpy(s2,"\xee\x84\x90%06d.%02d");
else
- rb->strcpy(s2,"%c%c%09d");
+ rb->strcpy(s2,"\xee\x84\x90%09d");
}
else
{
- c1=0x81;
- rb->strcpy(s1,"%c%c%06d.%02d");
- c2=0x20;
+ rb->strcpy(s1,"\xee\x84\x90%06d.%02d");
if (nb_digit[country]==2)
- rb->strcpy(s2,"%c%c%6d.%02d");
+ rb->strcpy(s2," %6d.%02d");
else
- rb->strcpy(s2,"%c%c%9d");
+ rb->strcpy(s2," %9d");
}
rb->lcd_remove_cursor();
/*First line*/
+ rb->lcd_putc(0,0,heuro);
split(euro,&i,&f);
if (pos)
round(&i,&f,2);
- rb->snprintf(str,sizeof(str),s1,heuro,c1,(int)i,(int)f);
+ rb->snprintf(str,sizeof(str),s1,(int)i,(int)f);
if (!pos)
{
- rb->lcd_puts(0,0,str);
+ rb->lcd_puts(1,0,str);
rb->lcd_put_cursor(10-cur_pos,0,0x5F);
}
else
- rb->lcd_puts_scroll(0,0,str);
+ rb->lcd_puts_scroll(1,0,str);
/*Second line*/
+ rb->lcd_putc(0,1,hhome);
split(home,&i,&f);
if (!pos)
round(&i,&f,nb_digit[country]);
- rb->snprintf(str,sizeof(str),s2,hhome,c2,(int)i,(int)f);
+ rb->snprintf(str,sizeof(str),s2,(int)i,(int)f);
if (pos)
{
- rb->lcd_puts(0,1,str);
+ rb->lcd_puts(1,1,str);
rb->lcd_put_cursor(10-cur_pos,1,0x5F);
}
else
- rb->lcd_puts_scroll(0,1,str);
+ rb->lcd_puts_scroll(1,1,str);
}
@@ -363,7 +360,7 @@ static int euro_menu(void)
rb->lcd_clear_display();
rb->lcd_puts(0,0," Currency");
rb->lcd_puts(0,1," Exit");
- rb->lcd_putc(0,c,0x81);
+ rb->lcd_putc(0,c,0xe110);
switch (rb->button_get(true))
{
diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c
index fd02bc4789..91afc9eca7 100644
--- a/apps/plugins/flipit.c
+++ b/apps/plugins/flipit.c
@@ -203,7 +203,7 @@ static const unsigned char tk_pat[4][7] = {
};
static unsigned char cur_pat[7];
-static unsigned char gfx_chars[5];
+static unsigned long gfx_chars[5];
static void release_gfx(void)
{
diff --git a/apps/plugins/jackpot.c b/apps/plugins/jackpot.c
index a2ebb81f5c..37ee4514e7 100644
--- a/apps/plugins/jackpot.c
+++ b/apps/plugins/jackpot.c
@@ -47,7 +47,7 @@ static unsigned char pattern[]={
};
static unsigned char str[12]; /*Containt the first line*/
-static unsigned char h1,h2,h3; /*Handle for the pattern*/
+static unsigned long h1,h2,h3; /*Handle for the pattern*/
/* here is a global api struct pointer. while not strictly necessary,
it's nice not to have to pass the api pointer in all function calls
@@ -109,10 +109,12 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
rb->lcd_define_pattern(h1, pattern);
rb->lcd_define_pattern(h2, pattern+7);
rb->lcd_define_pattern(h3, pattern+28);
- rb->snprintf(str,sizeof(str),"%c%cJackpot%c%c",h1,h2,h2,h1);
- rb->lcd_puts(0,0,str);
- rb->snprintf(str,sizeof(str)," %c V1.1 %c",h3,h3);
- rb->lcd_puts(0,1,str);
+
+ rb->lcd_puts(0,0," Jackpot ");
+ rb->lcd_putc(0,0,h1); rb->lcd_putc(1,0,h2);
+ rb->lcd_putc(9,0,h2); rb->lcd_putc(10,0,h1);
+ rb->lcd_puts(0,1," V1.1 ");
+ rb->lcd_putc(1,1,h3); rb->lcd_putc(9,1,h3);
rb->sleep(HZ*2);
rb->lcd_clear_display();
diff --git a/apps/plugins/lib/playergfx.c b/apps/plugins/lib/playergfx.c
index 1df7a3be4c..0e0a5d3788 100644
--- a/apps/plugins/lib/playergfx.c
+++ b/apps/plugins/lib/playergfx.c
@@ -31,7 +31,7 @@ static int char_width;
static int char_height;
static int pixel_height;
static int pixel_width;
-static unsigned char gfx_chars[8];
+static unsigned long gfx_chars[8];
static unsigned char gfx_buffer[56];
static int drawmode = DRMODE_SOLID;
diff --git a/apps/plugins/nim.c b/apps/plugins/nim.c
index b309e296c0..9089cad00a 100644
--- a/apps/plugins/nim.c
+++ b/apps/plugins/nim.c
@@ -56,7 +56,7 @@ static unsigned char pattern2[]={0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}; /*2
static unsigned char pattern1[]={0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}; /*1 part*/
static unsigned char str[12]; /*String use to display the first line*/
-static unsigned char hsmile,hcry,h1,h2; /*Handle for the new pattern*/
+static unsigned long hsmile,hcry,h1,h2; /*Handle for the new pattern*/
static bool end; /*If true game is finished*/
static struct plugin_api* rb;
@@ -74,8 +74,8 @@ static void impossible(void)
static void lose(void)
{
rb->lcd_define_pattern(hsmile,smile);
- rb->snprintf(str,sizeof(str),"You Win!!%c",hsmile);
- rb->lcd_puts(0,1,str);
+ rb->lcd_puts(0,1,"You Win!!");
+ rb->lcd_putc(8,1,hsmile);
end=true;
rb->sleep(HZ*2);
return;
@@ -86,8 +86,8 @@ static void lose(void)
static void win(void)
{
rb->lcd_define_pattern(hcry,cry);
- rb->snprintf(str,sizeof(str),"You Lose!!%c",hcry);
- rb->lcd_puts(0,1,str);
+ rb->lcd_puts(0,1,"You Lose!!");
+ rb->lcd_putc(9,1,hcry);
end=true;
rb->sleep(HZ*2);
return;
@@ -100,22 +100,22 @@ static void display_first_line(int x)
int i;
rb->snprintf(str,sizeof(str)," =%d",x);
+ rb->lcd_puts(0,0,str);
rb->lcd_define_pattern(h1,pattern3);
- for(i=0;i<x/3;i++)
- str[i]=h1;
+ for (i=0;i<x/3;i++)
+ rb->lcd_putc(i,0,h1);
if (x%3==2)
{
rb->lcd_define_pattern(h2,pattern2);
- str[i]=h2;
+ rb->lcd_putc(i,0,h2);
}
if (x%3==1)
{
rb->lcd_define_pattern(h2,pattern1);
- str[i]=h2;
+ rb->lcd_putc(i,0,h2);
}
- rb->lcd_puts(0,0,str);
}
/* Call when the program end */
diff --git a/apps/screen_access.c b/apps/screen_access.c
index 00db92769b..6728c4ea2a 100644
--- a/apps/screen_access.c
+++ b/apps/screen_access.c
@@ -41,16 +41,15 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
screen->depth=LCD_REMOTE_DEPTH;
screen->has_disk_led=false;
-#if 1 /* all remote LCDs are bitmapped so far */
screen->width=LCD_REMOTE_WIDTH;
screen->height=LCD_REMOTE_HEIGHT;
screen->setmargins=&lcd_remote_setmargins;
screen->getymargin=&lcd_remote_getymargin;
screen->getxmargin=&lcd_remote_getxmargin;
+ screen->getstringsize=&lcd_remote_getstringsize;
+#if 1 /* all remote LCDs are bitmapped so far */
screen->setfont=&lcd_remote_setfont;
screen->setfont(FONT_UI);
- screen->getstringsize=&lcd_remote_getstringsize;
- screen->putsxy=&lcd_remote_putsxy;
screen->mono_bitmap=&lcd_remote_mono_bitmap;
screen->mono_bitmap_part=&lcd_remote_mono_bitmap_part;
screen->set_drawmode=&lcd_remote_set_drawmode;
@@ -70,20 +69,14 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
screen->drawline=&lcd_remote_drawline;
screen->vline=&lcd_remote_vline;
screen->hline=&lcd_remote_hline;
- screen->scroll_speed=&lcd_remote_scroll_speed;
- screen->scroll_delay=&lcd_remote_scroll_delay;
screen->scroll_step=&lcd_remote_scroll_step;
screen->invertscroll=&lcd_remote_invertscroll;
-#endif /* LCD_REMOTE_DEPTH > 1 */
- screen->puts_offset=&lcd_remote_puts_offset;
screen->puts_style_offset=&lcd_remote_puts_style_offset;
screen->puts_scroll_style=&lcd_remote_puts_scroll_style;
- screen->puts_scroll_offset=&lcd_remote_puts_scroll_offset;
screen->puts_scroll_style_offset=&lcd_remote_puts_scroll_style_offset;
+#endif /* 1 */
#if 0 /* no charcell remote LCDs so far */
- screen->width=11;
- screen->height=2;
screen->double_height=&lcd_remote_double_height;
screen->putc=&lcd_remote_putc;
screen->get_locked_pattern=&lcd_remote_get_locked_pattern;
@@ -96,11 +89,16 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
#endif /* 0 */
screen->init=&lcd_remote_init;
+ screen->putsxy=&lcd_remote_putsxy;
+ screen->puts=&lcd_remote_puts;
+ screen->puts_offset=&lcd_remote_puts_offset;
screen->puts_scroll=&lcd_remote_puts_scroll;
+ screen->puts_scroll_offset=&lcd_remote_puts_scroll_offset;
+ screen->scroll_speed=&lcd_remote_scroll_speed;
+ screen->scroll_delay=&lcd_remote_scroll_delay;
screen->stop_scroll=&lcd_remote_stop_scroll;
screen->clear_display=&lcd_remote_clear_display;
screen->update=&lcd_remote_update;
- screen->puts=&lcd_remote_puts;
screen->backlight_on=&remote_backlight_on;
screen->backlight_off=&remote_backlight_off;
screen->is_backlight_on=&is_remote_backlight_on;
@@ -116,16 +114,15 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
#elif defined(HAVE_REMOTE_LCD)
screen->has_disk_led=true;
#endif
-#ifdef HAVE_LCD_BITMAP
screen->width=LCD_WIDTH;
screen->height=LCD_HEIGHT;
screen->setmargins=&lcd_setmargins;
screen->getymargin=&lcd_getymargin;
screen->getxmargin=&lcd_getxmargin;
+ screen->getstringsize=&lcd_getstringsize;
+#ifdef HAVE_LCD_BITMAP
screen->setfont=&lcd_setfont;
screen->setfont(FONT_UI);
- screen->getstringsize=&lcd_getstringsize;
- screen->putsxy=&lcd_putsxy;
screen->mono_bitmap=&lcd_mono_bitmap;
screen->mono_bitmap_part=&lcd_mono_bitmap_part;
screen->set_drawmode=&lcd_set_drawmode;
@@ -147,7 +144,7 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
screen->get_foreground=&lcd_get_foreground;
screen->set_background=&lcd_set_background;
screen->set_foreground=&lcd_set_foreground;
-#endif
+#endif /* LCD_DEPTH > 1 */
screen->update_rect=&lcd_update_rect;
screen->fillrect=&lcd_fillrect;
screen->drawrect=&lcd_drawrect;
@@ -155,20 +152,14 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
screen->drawline=&lcd_drawline;
screen->vline=&lcd_vline;
screen->hline=&lcd_hline;
- screen->scroll_speed=&lcd_scroll_speed;
- screen->scroll_delay=&lcd_scroll_delay;
screen->scroll_step=&lcd_scroll_step;
screen->invertscroll=&lcd_invertscroll;
- screen->puts_offset=&lcd_puts_offset;
screen->puts_style_offset=&lcd_puts_style_offset;
screen->puts_scroll_style=&lcd_puts_scroll_style;
- screen->puts_scroll_offset=&lcd_puts_scroll_offset;
screen->puts_scroll_style_offset=&lcd_puts_scroll_style_offset;
#endif /* HAVE_LCD_BITMAP */
#ifdef HAVE_LCD_CHARCELLS
- screen->width=11; /* width in characters instead of pixels */
- screen->height=2;
screen->double_height=&lcd_double_height;
screen->putc=&lcd_putc;
screen->get_locked_pattern=&lcd_get_locked_pattern;
@@ -181,13 +172,18 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
#endif /* HAVE_LCD_CHARCELLS */
screen->init=&lcd_init;
+ screen->putsxy=&lcd_putsxy;
+ screen->puts=&lcd_puts;
+ screen->puts_offset=&lcd_puts_offset;
screen->puts_scroll=&lcd_puts_scroll;
+ screen->puts_scroll_offset=&lcd_puts_scroll_offset;
+ screen->scroll_speed=&lcd_scroll_speed;
+ screen->scroll_delay=&lcd_scroll_delay;
screen->stop_scroll=&lcd_stop_scroll;
screen->clear_display=&lcd_clear_display;
#if defined(HAVE_LCD_BITMAP) || defined(SIMULATOR)
screen->update=&lcd_update;
#endif
- screen->puts=&lcd_puts;
screen->backlight_on=&backlight_on;
screen->backlight_off=&backlight_off;
screen->is_backlight_on=&is_backlight_on;
diff --git a/apps/screen_access.h b/apps/screen_access.h
index 54f2d64fdb..c1d8b5f9b8 100644
--- a/apps/screen_access.h
+++ b/apps/screen_access.h
@@ -60,24 +60,19 @@ struct screen
#ifdef HAS_BUTTONBAR
bool has_buttonbar;
#endif
-
-#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) /* always bitmap */
void (*setmargins)(int x, int y);
int (*getxmargin)(void);
int (*getymargin)(void);
- void (*setfont)(int newfont);
int (*getstringsize)(const unsigned char *str, int *w, int *h);
- void (*putsxy)(int x, int y, const unsigned char *str);
+#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) /* always bitmap */
+ void (*setfont)(int newfont);
void (*scroll_step)(int pixels);
- void (*puts_offset)(int x, int y, const unsigned char *str, int offset);
void (*puts_style_offset)(int x, int y, const unsigned char *str,
int style, int offset);
void (*puts_scroll_style)(int x, int y, const unsigned char *string,
int style);
- void (*puts_scroll_offset)(int x, int y, const unsigned char *string,
- int offset);
void (*puts_scroll_style_offset)(int x, int y, const unsigned char *string,
int style, int offset);
void (*mono_bitmap)(const unsigned char *src,
@@ -114,17 +109,22 @@ struct screen
#ifdef HAVE_LCD_CHARCELLS /* no charcell remote LCDs so far */
void (*double_height)(bool on);
- void (*putc)(int x, int y, unsigned short ch);
+ void (*putc)(int x, int y, unsigned long ucs);
void (*icon)(int icon, bool enable);
+ unsigned long (*get_locked_pattern)(void);
+ void (*define_pattern)(unsigned long ucs, const char *pattern);
#endif
void (*init)(void);
+ void (*putsxy)(int x, int y, const unsigned char *str);
+ void (*puts)(int x, int y, const unsigned char *str);
+ void (*puts_offset)(int x, int y, const unsigned char *str, int offset);
void (*puts_scroll)(int x, int y, const unsigned char *string);
+ void (*puts_scroll_offset)(int x, int y, const unsigned char *string,
+ int offset);
void (*scroll_speed)(int speed);
void (*scroll_delay)(int ms);
void (*stop_scroll)(void);
void (*clear_display)(void);
- unsigned char (*get_locked_pattern)(void);
- void (*define_pattern)(int pat, const char *pattern);
#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) || defined(SIMULATOR)
void (*update)(void);
#endif
@@ -132,7 +132,6 @@ struct screen
void (*backlight_off)(void);
bool (*is_backlight_on)(void);
void (*backlight_set_timeout)(int index);
- void (*puts)(int x, int y, const unsigned char *str);
};
/*
diff --git a/apps/screens.c b/apps/screens.c
index df1d59109b..f6def2fd89 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -254,12 +254,12 @@ static void charging_display_info(bool animate)
}
#else /* not HAVE_LCD_BITMAP */
-static unsigned char logo_chars[5];
+static unsigned long logo_chars[4];
static const unsigned char logo_pattern[] = {
- 0x07, 0x04, 0x1c, 0x14, 0x1c, 0x04, 0x07, /* char 1 */
- 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, /* char 2 */
- 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, /* char 3 */
- 0x1f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1f, /* char 4 */
+ 0x07, 0x04, 0x1c, 0x14, 0x1c, 0x04, 0x07, 0, /* char 1 */
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0, /* char 2 */
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0, /* char 3 */
+ 0x1f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1f, 0, /* char 4 */
};
static void logo_lock_patterns(bool on)
@@ -270,7 +270,6 @@ static void logo_lock_patterns(bool on)
{
for (i = 0; i < 4; i++)
logo_chars[i] = lcd_get_locked_pattern();
- logo_chars[4] = '\0';
}
else
{
@@ -284,19 +283,20 @@ static void charging_display_info(bool animate)
int battv;
unsigned i, ypos;
static unsigned phase = 3;
- char buf[28];
+ char buf[32];
battv = battery_voltage();
- snprintf(buf, sizeof(buf), "%s %d.%02dV", logo_chars,
- battv / 100, battv % 100);
- lcd_puts(0, 1, buf);
+ snprintf(buf, sizeof(buf), " %d.%02dV", battv / 100, battv % 100);
+ lcd_puts(4, 1, buf);
- memcpy(buf, logo_pattern, 28); /* copy logo patterns */
+ memcpy(buf, logo_pattern, 32); /* copy logo patterns */
if (!animate) /* build the screen */
{
lcd_double_height(false);
lcd_puts(0, 0, "[Charging]");
+ for (i = 0; i < 4; i++)
+ lcd_putc(i, 1, logo_chars[i]);
}
else /* animate the logo */
{
@@ -307,14 +307,14 @@ static void charging_display_info(bool animate)
ypos = (phase + i/5) % 9; /* "bounce" effect */
if (ypos > 4)
ypos = 8 - ypos;
- buf[5 - ypos + 7 * (i/5)] |= 0x10 >> (i%5);
+ buf[5 - ypos + 8 * (i/5)] |= 0x10 >> (i%5);
}
}
phase++;
}
for (i = 0; i < 4; i++)
- lcd_define_pattern(logo_chars[i], buf + 7 * i);
+ lcd_define_pattern(logo_chars[i], buf + 8 * i);
}
#endif /* (not) HAVE_LCD_BITMAP */
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 65ae84b45d..9ec97c191e 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -59,8 +59,8 @@ common/unicode.c
/* Display */
#ifdef HAVE_LCD_CHARCELLS
-drivers/lcd-player-charset.c
-drivers/lcd-player.c
+drivers/lcd-charcell.c
+drivers/lcd-charset-player.c
#endif /* HAVE_LCD_CHARCELLS */
#ifdef HAVE_LCD_BITMAP
@@ -317,6 +317,7 @@ target/sh/archos/ata-archos.c
target/sh/archos/ata-as-archos.S
target/sh/archos/player/button-player.c
target/sh/archos/player/lcd-as-player.S
+target/sh/archos/player/lcd-player.c
#endif /* SIMULATOR */
#endif /* ARCHOS_PLAYER */
diff --git a/firmware/drivers/lcd-charcell.c b/firmware/drivers/lcd-charcell.c
new file mode 100644
index 0000000000..ce0eca94ca
--- /dev/null
+++ b/firmware/drivers/lcd-charcell.c
@@ -0,0 +1,612 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2007 by Jens Arnold
+ * Based on the work of Alan Korr, Kjell Ericson and others
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include "hwcompat.h"
+
+#include "lcd.h"
+#include "kernel.h"
+#include "thread.h"
+#include <string.h>
+#include <stdlib.h>
+#include "file.h"
+#include "debug.h"
+#include "system.h"
+#include "lcd-charcell.h"
+#include "rbunicode.h"
+
+/** definitions **/
+
+#define SCROLLABLE_LINES LCD_HEIGHT
+#define VARIABLE_XCHARS 16 /* number of software user-definable characters */
+
+#define NO_PATTERN (-1)
+
+#define SCROLL_MODE_OFF 0
+#define SCROLL_MODE_RUN 1
+
+/* track usage of user-definable characters */
+struct pattern_info {
+ short count;
+ unsigned short xchar;
+};
+
+struct cursor_info {
+ unsigned char hw_char;
+ bool enabled;
+ bool visible;
+ int x;
+ int y;
+ int divider;
+ int downcount;
+};
+
+static int find_xchar(unsigned long ucs);
+
+/** globals **/
+
+/* The "frame"buffer */
+static unsigned char lcd_buffer[LCD_WIDTH][LCD_HEIGHT];
+#ifdef SIMULATOR
+unsigned char hardware_buffer_lcd[LCD_WIDTH][LCD_HEIGHT];
+#endif
+
+static int xmargin = 0;
+static int ymargin = 0;
+
+static unsigned char xfont_variable[VARIABLE_XCHARS][(HW_PATTERN_SIZE+3)&~3];
+ /* round up pattern size to a multiple of 4 bytes for faster access */
+static bool xfont_variable_locked[VARIABLE_XCHARS];
+static struct pattern_info hw_pattern[MAX_HW_PATTERNS];
+static struct cursor_info cursor;
+
+/* scrolling */
+static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */
+static void scroll_thread(void);
+static char scroll_stack[DEFAULT_STACK_SIZE];
+static const char scroll_name[] = "scroll";
+static int scroll_ticks = 12; /* # of ticks between updates */
+static int scroll_delay = HZ/2; /* delay before starting scroll */
+static int bidir_limit = 50; /* percent */
+static int jump_scroll_delay = HZ/4; /* delay between jump scroll jumps */
+static int jump_scroll = 0; /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */
+static struct scrollinfo scroll[SCROLLABLE_LINES];
+
+static const char scroll_tick_table[16] = {
+ /* Hz values:
+ 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */
+ 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3
+};
+
+/* LCD init */
+void lcd_init (void)
+{
+ lcd_init_device();
+ lcd_charset_init();
+ memset(hw_pattern, 0, sizeof(hw_pattern));
+ memset(lcd_buffer, xchar_info[find_xchar(' ')].hw_char, sizeof(lcd_buffer));
+
+ create_thread(scroll_thread, scroll_stack,
+ sizeof(scroll_stack), scroll_name
+ IF_PRIO(, PRIORITY_USER_INTERFACE)
+ IF_COP(, CPU, false));
+}
+
+/** parameter handling **/
+
+void lcd_setmargins(int x, int y)
+{
+ xmargin = x;
+ ymargin = y;
+}
+
+int lcd_getxmargin(void)
+{
+ return xmargin;
+}
+
+int lcd_getymargin(void)
+{
+ return ymargin;
+}
+
+int lcd_getstringsize(const unsigned char *str, int *w, int *h)
+{
+ int width = utf8length(str);
+
+ if (w)
+ *w = width;
+ if (h)
+ *h = 1;
+
+ return width;
+}
+
+/** low-level functions **/
+
+static int find_xchar(unsigned long ucs)
+{
+ int low = 0;
+ int high = xchar_info_size - 1;
+
+ do
+ {
+ int probe = (low + high) >> 1;
+
+ if (xchar_info[probe].ucs < ucs)
+ low = probe + 1;
+ else if (xchar_info[probe].ucs > ucs)
+ high = probe - 1;
+ else
+ return probe;
+ }
+ while (low <= high);
+
+ /* Not found: return index of no-char symbol (last symbol, hardcoded). */
+ return xchar_info_size - 1;
+}
+
+static int xchar_to_pat(int xchar)
+{
+ int i;
+
+ for (i = 0; i < hw_pattern_count; i++)
+ if (hw_pattern[i].xchar == xchar)
+ return i;
+
+ return NO_PATTERN;
+}
+
+static const unsigned char *xchar_to_glyph(int xchar)
+{
+ unsigned index = xchar_info[xchar].glyph;
+
+ if (index & 0x8000)
+ return xfont_variable[index & 0x7fff];
+ else
+ return xfont_fixed[index];
+}
+
+static void lcd_free_pat(int xchar)
+{
+ int x, y;
+ unsigned char substitute;
+ int pat = xchar_to_pat(xchar);
+
+ if (pat != NO_PATTERN)
+ {
+ substitute = xchar_info[xchar].hw_char;
+
+ for (x = 0; x < LCD_WIDTH; x++)
+ {
+ for (y = 0; y < LCD_HEIGHT; y++)
+ {
+ if (pat == lcd_buffer[x][y])
+ {
+ lcd_buffer[x][y] = substitute;
+#ifdef SIMULATOR
+ hardware_buffer_lcd[x][y] = substitute;
+#else
+ lcd_put_hw_char(x, y, substitute);
+#endif
+ }
+ }
+ }
+ if (cursor.enabled && pat == cursor.hw_char)
+ cursor.hw_char = substitute;
+
+ hw_pattern[pat].count = 0;
+#ifdef SIMULATOR
+ lcd_update();
+#endif
+ }
+}
+
+static int lcd_get_free_pat(int xchar)
+{
+ static int last_used_pat = 0;
+
+ int pat = last_used_pat; /* start from last used pattern */
+ int least_pat = pat; /* pattern with least priority */
+ int least_priority = xchar_info[hw_pattern[pat].xchar].priority;
+ int i;
+
+ for (i = 0; i < hw_pattern_count; i++)
+ {
+ if (++pat >= hw_pattern_count) /* Keep 'pat' within limits */
+ pat = 0;
+
+ if (hw_pattern[pat].count == 0)
+ {
+ hw_pattern[pat].xchar = xchar;
+ last_used_pat = pat;
+ return pat;
+ }
+ if (xchar_info[hw_pattern[pat].xchar].priority < least_priority)
+ {
+ least_priority = xchar_info[hw_pattern[pat].xchar].priority;
+ least_pat = pat;
+ }
+ }
+ if (xchar_info[xchar].priority > least_priority) /* prioritized char */
+ {
+ lcd_free_pat(hw_pattern[least_pat].xchar);
+ hw_pattern[least_pat].xchar = xchar;
+ last_used_pat = least_pat;
+ return least_pat;
+ }
+ return NO_PATTERN;
+}
+
+static int map_xchar(int xchar)
+{
+ int pat;
+
+ if (xchar_info[xchar].priority > 0) /* soft char */
+ {
+ pat = xchar_to_pat(xchar);
+
+ if (pat == NO_PATTERN) /* not yet mapped */
+ {
+ pat = lcd_get_free_pat(xchar); /* try to map */
+ if (pat == NO_PATTERN) /* failed: just use substitute */
+ return xchar_info[xchar].hw_char;
+ else /* define pattern */
+ lcd_define_hw_pattern(pat, xchar_to_glyph(xchar));
+ }
+ hw_pattern[pat].count++; /* increase reference count */
+ return pat;
+ }
+ else /* hardware char */
+ return xchar_info[xchar].hw_char;
+}
+
+static void lcd_putxchar(int x, int y, int xchar)
+{
+ int lcd_char = lcd_buffer[x][y];
+
+ if (lcd_char < hw_pattern_count) /* old char was soft */
+ hw_pattern[lcd_char].count--; /* decrease old reference count */
+
+ lcd_buffer[x][y] = lcd_char = map_xchar(xchar);
+#ifdef SIMULATOR
+ hardware_buffer_lcd[x][y] = lcd_char;
+ lcd_update();
+#else
+ lcd_put_hw_char(x, y, lcd_char);
+#endif
+}
+
+/** user-definable pattern handling **/
+
+unsigned long lcd_get_locked_pattern(void)
+{
+ int i = 0;
+
+ for (i = 0; i < VARIABLE_XCHARS; i++)
+ {
+ if (!xfont_variable_locked[i])
+ {
+ xfont_variable_locked[i] = true;
+ return 0xe000 + i; /* hard-coded */
+ }
+ }
+ return 0;
+}
+
+void lcd_unlock_pattern(unsigned long ucs)
+{
+ int xchar = find_xchar(ucs);
+ int index = xchar_info[xchar].glyph;
+
+ if (index & 0x8000) /* variable extended char */
+ {
+ lcd_free_pat(xchar);
+ xfont_variable_locked[index & 0x7fff] = false;
+ }
+}
+
+void lcd_define_pattern(unsigned long ucs, const char *pattern)
+{
+ int xchar = find_xchar(ucs);
+ int index = xchar_info[xchar].glyph;
+ int pat;
+
+ if (index & 0x8000) /* variable extended char */
+ {
+ memcpy(xfont_variable[index & 0x7fff], pattern, HW_PATTERN_SIZE);
+ pat = xchar_to_pat(xchar);
+ if (pat != NO_PATTERN)
+ lcd_define_hw_pattern(pat, pattern);
+ }
+}
+
+/** output functions **/
+
+/* Clear the whole display */
+void lcd_clear_display(void)
+{
+ int x, y;
+ int xchar = find_xchar(' ');
+
+ lcd_stop_scroll();
+ lcd_remove_cursor();
+
+ for (x = 0; x < LCD_WIDTH; x++)
+ for (y = 0; y < LCD_HEIGHT; y++)
+ lcd_putxchar(x, y, xchar);
+}
+
+/* Put an unicode character at the given position */
+void lcd_putc(int x, int y, unsigned long ucs)
+{
+ if ((unsigned)x >= LCD_WIDTH || (unsigned)y >= LCD_HEIGHT)
+ return;
+
+ lcd_putxchar(x, y, find_xchar(ucs));
+}
+
+/* Show cursor (alternating with existing character) at the given position */
+void lcd_put_cursor(int x, int y, unsigned long cursor_ucs)
+{
+ if ((unsigned)x >= LCD_WIDTH || (unsigned)y >= LCD_HEIGHT
+ || cursor.enabled)
+ return;
+
+ cursor.enabled = true;
+ cursor.visible = false;
+ cursor.hw_char = map_xchar(find_xchar(cursor_ucs));
+ cursor.x = x;
+ cursor.y = y;
+ cursor.downcount = 0;
+ cursor.divider = 4;
+}
+
+/* Remove the cursor */
+void lcd_remove_cursor(void)
+{
+ if (cursor.enabled)
+ {
+ if (cursor.hw_char < hw_pattern_count) /* soft char, unmap */
+ hw_pattern[cursor.hw_char].count--;
+
+ cursor.enabled = false;
+#ifdef SIMULATOR
+ hardware_buffer_lcd[cursor.x][cursor.y] = lcd_buffer[cursor.x][cursor.y];
+#else
+ lcd_put_hw_char(cursor.x, cursor.y, lcd_buffer[cursor.x][cursor.y]);
+#endif
+ }
+}
+
+/* Put a string at a given position, skipping first ofs chars */
+static int lcd_putsxyofs(int x, int y, int ofs, const unsigned char *str)
+{
+ unsigned short ucs;
+ const unsigned char *utf8 = str;
+
+ while (*utf8 && x < LCD_WIDTH)
+ {
+ utf8 = utf8decode(utf8, &ucs);
+
+ if (ofs > 0)
+ {
+ ofs--;
+ continue;
+ }
+ lcd_putc(x++, y, ucs);
+ }
+ return x;
+}
+
+/* Put a string at a given position */
+void lcd_putsxy(int x, int y, const unsigned char *str)
+{
+ lcd_putsxyofs(x, y, 0, str);
+}
+
+/*** Line oriented text output ***/
+
+/* Put a string at a given char position */
+void lcd_puts(int x, int y, const unsigned char *str)
+{
+ lcd_puts_offset(x, y, str, 0);
+}
+
+/* Put a string at a given char position, skipping first offset chars */
+void lcd_puts_offset(int x, int y, const unsigned char *str, int offset)
+{
+ /* make sure scrolling is turned off on the line we are updating */
+ scrolling_lines &= ~(1 << y);
+
+ x += xmargin;
+ y += ymargin;
+
+ x = lcd_putsxyofs(x, y, offset, str);
+ while (x < LCD_WIDTH)
+ lcd_putc(x++, y, ' ');
+}
+
+/** scrolling **/
+
+void lcd_stop_scroll(void)
+{
+ scrolling_lines=0;
+}
+
+void lcd_scroll_speed(int speed)
+{
+ scroll_ticks = scroll_tick_table[speed];
+}
+
+void lcd_scroll_delay(int ms)
+{
+ scroll_delay = ms / (HZ / 10);
+}
+
+void lcd_bidir_scroll(int percent)
+{
+ bidir_limit = percent;
+}
+
+void lcd_jump_scroll(int mode) /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */
+{
+ jump_scroll = mode;
+}
+
+void lcd_jump_scroll_delay(int ms)
+{
+ jump_scroll_delay = ms / (HZ / 10);
+}
+
+void lcd_puts_scroll(int x, int y, const unsigned char *string)
+{
+ lcd_puts_scroll_offset(x, y, string, 0);
+}
+
+void lcd_puts_scroll_offset(int x, int y, const unsigned char *string,
+ int offset)
+{
+ struct scrollinfo* s;
+ int len;
+
+ s = &scroll[y];
+
+ s->start_tick = current_tick + scroll_delay;
+
+ lcd_puts_offset(x, y, string, offset);
+ len = utf8length(string);
+
+ if (LCD_WIDTH - xmargin < len)
+ {
+ /* prepare scroll line */
+ char *end;
+
+ memset(s->line, 0, sizeof s->line);
+ strcpy(s->line, string);
+
+ /* get width */
+ s->len = utf8length(s->line);
+
+ /* scroll bidirectional or forward only depending on the string width */
+ if (bidir_limit)
+ {
+ s->bidir = s->len < (LCD_WIDTH - xmargin) * (100 + bidir_limit) / 100;
+ }
+ else
+ s->bidir = false;
+
+ if (!s->bidir) /* add spaces if scrolling in the round */
+ {
+ strcat(s->line, " ");
+ /* get new width incl. spaces */
+ s->len += SCROLL_SPACING;
+ }
+
+ end = strchr(s->line, '\0');
+ strncpy(end, string, LCD_WIDTH);
+
+ s->offset = offset;
+ s->startx = xmargin + x;
+ s->backward = false;
+ scrolling_lines |= (1<<y);
+ }
+ else
+ /* force a bit switch-off since it doesn't scroll */
+ scrolling_lines &= ~(1<<y);
+}
+
+static void scroll_thread(void)
+{
+ struct scrollinfo* s;
+ int index;
+ int xpos, ypos;
+
+ /* initialize scroll struct array */
+ scrolling_lines = 0;
+
+ while (1)
+ {
+ for (index = 0; index < SCROLLABLE_LINES; index++)
+ {
+ /* really scroll? */
+ if (!(scrolling_lines&(1<<index)))
+ continue;
+
+ s = &scroll[index];
+
+ /* check pause */
+ if (TIME_BEFORE(current_tick, s->start_tick))
+ continue;
+
+ if (s->backward)
+ s->offset--;
+ else
+ s->offset++;
+
+ xpos = s->startx;
+ ypos = ymargin + index;
+
+ if (s->bidir) /* scroll bidirectional */
+ {
+ if (s->offset <= 0)
+ {
+ /* at beginning of line */
+ s->offset = 0;
+ s->backward = false;
+ s->start_tick = current_tick + scroll_delay * 2;
+ }
+ if (s->offset >= s->len - (LCD_WIDTH - xpos))
+ {
+ /* at end of line */
+ s->offset = s->len - (LCD_WIDTH - xpos);
+ s->backward = true;
+ s->start_tick = current_tick + scroll_delay * 2;
+ }
+ }
+ else /* scroll forward the whole time */
+ {
+ if (s->offset >= s->len)
+ s->offset -= s->len;
+ }
+ lcd_putsxyofs(xpos, ypos, s->offset, s->line);
+ }
+ if (cursor.enabled)
+ {
+ if (--cursor.downcount < 0)
+ {
+ int lcd_char;
+
+ cursor.downcount = cursor.divider;
+ cursor.visible = !cursor.visible;
+ lcd_char = cursor.visible ? cursor.hw_char
+ : lcd_buffer[cursor.x][cursor.y];
+#ifdef SIMULATOR
+ hardware_buffer_lcd[cursor.x][cursor.y] = lcd_char;
+#else
+ lcd_put_hw_char(cursor.x, cursor.y, lcd_char);
+#endif
+ }
+ }
+#ifdef SIMULATOR
+ lcd_update();
+#endif
+ sleep(scroll_ticks);
+ }
+}
diff --git a/firmware/drivers/lcd-charset-player.c b/firmware/drivers/lcd-charset-player.c
new file mode 100644
index 0000000000..1276f2840d
--- /dev/null
+++ b/firmware/drivers/lcd-charset-player.c
@@ -0,0 +1,594 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2007 by Jens Arnold
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "config.h"
+#include "hwcompat.h"
+
+#include "lcd-charcell.h"
+
+int hw_pattern_count; /* actual number of user-definable hw patterns */
+
+const struct xchar_info *xchar_info;
+int xchar_info_size; /* number of entries */
+
+static const struct xchar_info xchar_info_newlcd[] = {
+ /* Standard ascii */
+ { 0x20, 0, 0, 0x20 }, /* */
+ { 0x21, 0, 0, 0x21 }, /* ! */
+ { 0x22, 0, 0, 0x22 }, /* " */
+ { 0x23, 0, 0, 0x23 }, /* # */
+ { 0x24, 0, 0, 0x24 }, /* $ */
+ { 0x25, 0, 0, 0x25 }, /* % */
+ { 0x26, 0, 0, 0x26 }, /* & */
+ { 0x27, 0, 0, 0x27 }, /* ' */
+ { 0x28, 0, 0, 0x28 }, /* ( */
+ { 0x29, 0, 0, 0x29 }, /* ) */
+ { 0x2a, 0, 0, 0x2a }, /* * */
+ { 0x2b, 0, 0, 0x2b }, /* + */
+ { 0x2c, 0, 0, 0x2c }, /* , */
+ { 0x2d, 0, 0, 0x2d }, /* - */
+ { 0x2e, 0, 0, 0x2e }, /* . */
+ { 0x2f, 0, 0, 0x2f }, /* / */
+ { 0x30, 0, 0, 0x30 }, /* 0 */
+ { 0x31, 0, 0, 0x31 }, /* 1 */
+ { 0x32, 0, 0, 0x32 }, /* 2 */
+ { 0x33, 0, 0, 0x33 }, /* 3 */
+ { 0x34, 0, 0, 0x34 }, /* 4 */
+ { 0x35, 0, 0, 0x35 }, /* 5 */
+ { 0x36, 0, 0, 0x36 }, /* 6 */
+ { 0x37, 0, 0, 0x37 }, /* 7 */
+ { 0x38, 0, 0, 0x38 }, /* 8 */
+ { 0x39, 0, 0, 0x39 }, /* 9 */
+ { 0x3a, 0, 0, 0x3a }, /* : */
+ { 0x3b, 0, 0, 0x3b }, /* ; */
+ { 0x3c, 0, 0, 0x3c }, /* < */
+ { 0x3d, 0, 0, 0x3d }, /* = */
+ { 0x3e, 0, 0, 0x3e }, /* > */
+ { 0x3f, 0, 0, 0x3f }, /* ? */
+ { 0x40, 0, 0, 0x40 }, /* @ */
+ { 0x41, 0, 0, 0x41 }, /* A */
+ { 0x42, 0, 0, 0x42 }, /* B */
+ { 0x43, 0, 0, 0x43 }, /* C */
+ { 0x44, 0, 0, 0x44 }, /* D */
+ { 0x45, 0, 0, 0x45 }, /* E */
+ { 0x46, 0, 0, 0x46 }, /* F */
+ { 0x47, 0, 0, 0x47 }, /* G */
+ { 0x48, 0, 0, 0x48 }, /* H */
+ { 0x49, 0, 0, 0x49 }, /* I */
+ { 0x4a, 0, 0, 0x4a }, /* J */
+ { 0x4b, 0, 0, 0x4b }, /* K */
+ { 0x4c, 0, 0, 0x4c }, /* L */
+ { 0x4d, 0, 0, 0x4d }, /* M */
+ { 0x4e, 0, 0, 0x4e }, /* N */
+ { 0x4f, 0, 0, 0x4f }, /* O */
+ { 0x50, 0, 0, 0x50 }, /* P */
+ { 0x51, 0, 0, 0x51 }, /* Q */
+ { 0x52, 0, 0, 0x52 }, /* R */
+ { 0x53, 0, 0, 0x53 }, /* S */
+ { 0x54, 0, 0, 0x54 }, /* T */
+ { 0x55, 0, 0, 0x55 }, /* U */
+ { 0x56, 0, 0, 0x56 }, /* V */
+ { 0x57, 0, 0, 0x57 }, /* W */
+ { 0x58, 0, 0, 0x58 }, /* X */
+ { 0x59, 0, 0, 0x59 }, /* Y */
+ { 0x5a, 0, 0, 0x5a }, /* Z */
+ { 0x5b, 0, 0, 0x5b }, /* [ */
+ { 0x5c, 0, 0, 0x12 }, /* \ */
+ { 0x5d, 0, 0, 0x5d }, /* ] */
+ { 0x5e, 0, 0, 0x5e }, /* ^ */
+ { 0x5f, 0, 0, 0x5f }, /* _ */
+ { 0x60, 0, 0, 0x60 }, /* ` */
+ { 0x61, 0, 0, 0x61 }, /* a */
+ { 0x62, 0, 0, 0x62 }, /* b */
+ { 0x63, 0, 0, 0x63 }, /* c */
+ { 0x64, 0, 0, 0x64 }, /* d */
+ { 0x65, 0, 0, 0x65 }, /* e */
+ { 0x66, 0, 0, 0x66 }, /* f */
+ { 0x67, 0, 0, 0x67 }, /* g */
+ { 0x68, 0, 0, 0x68 }, /* h */
+ { 0x69, 0, 0, 0x69 }, /* i */
+ { 0x6a, 0, 0, 0x6a }, /* j */
+ { 0x6b, 0, 0, 0x6b }, /* k */
+ { 0x6c, 0, 0, 0x6c }, /* l */
+ { 0x6d, 0, 0, 0x6d }, /* m */
+ { 0x6e, 0, 0, 0x6e }, /* n */
+ { 0x6f, 0, 0, 0x6f }, /* o */
+ { 0x70, 0, 0, 0x70 }, /* p */
+ { 0x71, 0, 0, 0x71 }, /* q */
+ { 0x72, 0, 0, 0x72 }, /* r */
+ { 0x73, 0, 0, 0x73 }, /* s */
+ { 0x74, 0, 0, 0x74 }, /* t */
+ { 0x75, 0, 0, 0x75 }, /* u */
+ { 0x76, 0, 0, 0x76 }, /* v */
+ { 0x77, 0, 0, 0x77 }, /* w */
+ { 0x78, 0, 0, 0x78 }, /* x */
+ { 0x79, 0, 0, 0x79 }, /* y */
+ { 0x7a, 0, 0, 0x7a }, /* z */
+ { 0x7b, 0, 0, 0x7b }, /* { */
+ { 0x7c, 0, 0, 0x7c }, /* | */
+ { 0x7d, 0, 0, 0x7d }, /* } */
+ { 0x7e, 0, 0, 0xf0 }, /* ~ */
+ { 0x7f, 0, 0, 0xfe }, /* (full grid) */
+
+#ifndef BOOTLOADER /* bootloader only supports pure ASCII */
+ /* Latin 1 */
+ { 0xa0, 0, 0, 0x20 }, /* (non-breaking space) */
+
+ { 0xa3, 0x000f, 1, 0x4c }, /* (pound sign) */
+
+ { 0xa5, 0, 0, 0x5c }, /* (yen sign) */
+
+ { 0xa7, 0, 0, 0x15 }, /* (paragraph sign) */
+
+ { 0xab, 0, 0, 0x9e }, /* (left double-angle quotation mark) */
+
+ { 0xaf, 0x0010, 1, 0x2d }, /* (macron) */
+
+ { 0xb1, 0, 0, 0x95 }, /* (plus-minus sign) */
+ { 0xb2, 0, 0, 0x99 }, /* (superscript 2) */
+ { 0xb3, 0, 0, 0x9a }, /* (superscript 3) */
+
+ { 0xb5, 0, 0, 0xe6 }, /* (micro sign) */
+ { 0xb6, 0, 0, 0x14 }, /* (pilcrow sign) */
+ { 0xb7, 0, 0, 0xa5 }, /* (middle dot) */
+
+ { 0xbb, 0, 0, 0x9f }, /* (right double-angle quotation mark) */
+ { 0xbc, 0, 0, 0x9c }, /* (one quarter) */
+ { 0xbd, 0, 0, 0x9b }, /* (one half) */
+ { 0xbe, 0, 0, 0x9d }, /* (three quarters) */
+ { 0xbf, 0x0011, 1, 0x3f }, /* (inverted ?) */
+ { 0xc0, 0x0012, 1, 0x41 }, /* (A grave) */
+ { 0xc1, 0x0013, 1, 0x41 }, /* (A acute) */
+ { 0xc2, 0x0014, 1, 0x41 }, /* (A circumflex) */
+ { 0xc3, 0x0015, 1, 0x41 }, /* (A tilde) */
+ { 0xc4, 0x0016, 1, 0x41 }, /* (A dieresis) */
+ { 0xc5, 0x0017, 1, 0x41 }, /* (A with ring above) */
+ { 0xc6, 0x0018, 1, 0x41 }, /* (AE ligature) */
+ { 0xc7, 0x0019, 1, 0x43 }, /* (C cedilla) */
+ { 0xc8, 0x001a, 1, 0x45 }, /* (E grave) */
+ { 0xc9, 0x001b, 1, 0x45 }, /* (E acute) */
+ { 0xca, 0x001c, 1, 0x45 }, /* (E circumflex) */
+ { 0xcb, 0x001d, 1, 0x45 }, /* (E dieresis) */
+ { 0xcc, 0x001e, 1, 0x49 }, /* (I grave) */
+ { 0xcd, 0x001f, 1, 0x49 }, /* (I acute) */
+ { 0xce, 0, 0, 0x49 }, /* (I circumflex) */
+ { 0xcf, 0, 0, 0x49 }, /* (I dieresis) */
+ { 0xd0, 0x0020, 1, 0x44 }, /* (ETH) */
+ { 0xd1, 0x0021, 1, 0x4e }, /* (N tilde) */
+ { 0xd2, 0x0022, 1, 0x4f }, /* (O grave) */
+ { 0xd3, 0x0023, 1, 0x4f }, /* (O acute) */
+ { 0xd4, 0x0024, 1, 0x4f }, /* (O circumflex) */
+ { 0xd5, 0x0025, 1, 0x4f }, /* (O tilde) */
+ { 0xd6, 0x0026, 1, 0x4f }, /* (O dieresis) */
+ { 0xd7, 0, 0, 0x96 }, /* (multiplication sign) */
+ { 0xd8, 0x0027, 1, 0x4f }, /* (O stroke) */
+ { 0xd9, 0x0028, 1, 0x55 }, /* (U grave) */
+ { 0xda, 0x0029, 1, 0x55 }, /* (U acute) */
+ { 0xdb, 0, 0, 0x55 }, /* (U circumflex) */
+ { 0xdc, 0x002a, 1, 0x55 }, /* (U dieresis) */
+ { 0xdd, 0, 0, 0x59 }, /* (Y acute) */
+
+ { 0xdf, 0, 0, 0xe1 }, /* (sharp s) */
+ { 0xe0, 0x002b, 1, 0x61 }, /* (a grave) */
+ { 0xe1, 0x002c, 1, 0x61 }, /* (a acute) */
+ { 0xe2, 0x002d, 1, 0x61 }, /* (a circumflex) */
+ { 0xe3, 0x002e, 1, 0x61 }, /* (a tilde) */
+ { 0xe4, 0x002f, 1, 0x61 }, /* (a dieresis) */
+ { 0xe5, 0x0030, 1, 0x61 }, /* (a with ring above) */
+
+ { 0xe7, 0x0031, 1, 0x63 }, /* (c cedilla) */
+ { 0xe8, 0x0032, 1, 0x65 }, /* (e grave) */
+ { 0xe9, 0x0033, 1, 0x65 }, /* (e acute) */
+ { 0xea, 0x0034, 1, 0x65 }, /* (e circumflex) */
+ { 0xeb, 0x0035, 1, 0x65 }, /* (e dieresis) */
+ { 0xec, 0, 0, 0x69 }, /* (i grave) */
+ { 0xed, 0x0036, 1, 0x69 }, /* (i acute) */
+ { 0xee, 0x0037, 1, 0x69 }, /* (i circumflex) */
+ { 0xef, 0x0038, 1, 0x69 }, /* (i dieresis) */
+
+ { 0xf1, 0x0039, 1, 0x6e }, /* (n tilde) */
+ { 0xf2, 0x003a, 1, 0x6f }, /* (o grave) */
+ { 0xf3, 0x003b, 1, 0x6f }, /* (o acute) */
+ { 0xf4, 0x003c, 1, 0x6f }, /* (o circumflex) */
+ { 0xf5, 0x003d, 1, 0x6f }, /* (o tilde) */
+ { 0xf6, 0x003e, 1, 0x6f }, /* (o dieresis) */
+ { 0xf7, 0, 0, 0x97 }, /* (division sign) */
+ { 0xf8, 0x003f, 1, 0x6f }, /* (o slash) */
+ { 0xf9, 0x0040, 1, 0x75 }, /* (u grave) */
+ { 0xfa, 0x0041, 1, 0x75 }, /* (u acute) */
+ { 0xfb, 0, 0, 0x75 }, /* (u circumflex) */
+ { 0xfc, 0x0042, 1, 0x75 }, /* (u dieresis) */
+ { 0xfd, 0x0043, 1, 0x79 }, /* (y acute) */
+
+ { 0xff, 0, 0, 0x79 }, /* (y dieresis) */
+
+ /* Runtime-definable characters */
+ { 0xe000, 0x8000, 15, 0x20 }, /* variable character 0 */
+ { 0xe001, 0x8001, 15, 0x20 }, /* variable character 1 */
+ { 0xe002, 0x8002, 15, 0x20 }, /* variable character 2 */
+ { 0xe003, 0x8003, 15, 0x20 }, /* variable character 3 */
+ { 0xe004, 0x8004, 15, 0x20 }, /* variable character 4 */
+ { 0xe005, 0x8005, 15, 0x20 }, /* variable character 5 */
+ { 0xe006, 0x8006, 15, 0x20 }, /* variable character 6 */
+ { 0xe007, 0x8007, 15, 0x20 }, /* variable character 7 */
+ { 0xe008, 0x8008, 15, 0x20 }, /* variable character 8 */
+ { 0xe009, 0x8009, 15, 0x20 }, /* variable character 9 */
+ { 0xe00a, 0x800a, 15, 0x20 }, /* variable character 10 */
+ { 0xe00b, 0x800b, 15, 0x20 }, /* variable character 11 */
+ { 0xe00c, 0x800c, 15, 0x20 }, /* variable character 12 */
+ { 0xe00d, 0x800d, 15, 0x20 }, /* variable character 13 */
+ { 0xe00e, 0x800e, 15, 0x20 }, /* variable character 14 */
+ { 0xe00f, 0x800f, 15, 0x20 }, /* variable character 15 */
+
+ /* Icons and special symbols */
+ { 0xe100, 0x0004, 14, 0x3f }, /* unknown icon (mirrored ?) */
+ { 0xe101, 0x0005, 14, 0x94 }, /* bookmark icon */
+ { 0xe102, 0x0006, 14, 0x29 }, /* plugin icon */
+ { 0xe103, 0x0007, 14, 0x91 }, /* folder icon */
+ { 0xe104, 0x0008, 14, 0x78 }, /* firmware icon */
+ { 0xe105, 0x0009, 14, 0x2b }, /* language icon */
+ { 0xe106, 0x000a, 14, 0x13 }, /* audio icon (note) */
+ { 0xe107, 0x000b, 14, 0x94 }, /* wps icon */
+ { 0xe108, 0x000c, 14, 0xd0 }, /* playlist icon */
+ { 0xe109, 0x000d, 14, 0xd0 }, /* text file icon */
+ { 0xe10a, 0x000e, 14, 0xd0 }, /* config icon */
+ { 0xe10b, 0, 0, 0x7f }, /* left arrow */
+ { 0xe10c, 0, 0, 0x7e }, /* right arrow */
+ { 0xe10d, 0, 0, 0x18 }, /* up arrow */
+ { 0xe10e, 0, 0, 0x19 }, /* down arrow */
+ { 0xe10f, 0, 0, 0x11 }, /* filled left arrow */
+ { 0xe110, 0, 0, 0x10 }, /* filled right arrow */
+ { 0xe111, 0, 0, 0x1f }, /* filled up arrow */
+ { 0xe112, 0, 0, 0x1e }, /* filled down arrow */
+ { 0xe113, 0, 0, 0x20 }, /* level 0/7 */
+ { 0xe114, 0, 0, 0x80 }, /* level 1/7 */
+ { 0xe115, 0, 0, 0x81 }, /* level 2/7 */
+ { 0xe116, 0, 0, 0x82 }, /* level 3/7 */
+ { 0xe117, 0, 0, 0x83 }, /* level 4/7 */
+ { 0xe118, 0, 0, 0x84 }, /* level 5/7 */
+ { 0xe119, 0, 0, 0x85 }, /* level 6/7 */
+ { 0xe11a, 0, 0, 0x86 }, /* level 7/7 */
+#endif /* !BOOTLOADER */
+
+ /* no-char symbol */
+ { 0xfffd, 0, 0, 0x91 },
+};
+
+static const struct xchar_info xchar_info_oldlcd[] = {
+ /* Standard ascii */
+ { 0x20, 0, 0, 0x24 }, /* */
+ { 0x21, 0, 0, 0x25 }, /* ! */
+ { 0x22, 0, 0, 0x26 }, /* " */
+ { 0x23, 0, 0, 0x27 }, /* # */
+ { 0x24, 0, 0, 0x28 }, /* $ */
+ { 0x25, 0, 0, 0x29 }, /* % */
+ { 0x26, 0, 0, 0x2a }, /* & */
+ { 0x27, 0, 0, 0x2b }, /* ' */
+ { 0x28, 0, 0, 0x2c }, /* ( */
+ { 0x29, 0, 0, 0x2d }, /* ) */
+ { 0x2a, 0, 0, 0x2e }, /* * */
+ { 0x2b, 0, 0, 0x2f }, /* + */
+ { 0x2c, 0, 0, 0x30 }, /* , */
+ { 0x2d, 0, 0, 0x31 }, /* - */
+ { 0x2e, 0, 0, 0x32 }, /* . */
+ { 0x2f, 0, 0, 0x33 }, /* / */
+ { 0x30, 0, 0, 0x34 }, /* 0 */
+ { 0x31, 0, 0, 0x35 }, /* 1 */
+ { 0x32, 0, 0, 0x36 }, /* 2 */
+ { 0x33, 0, 0, 0x37 }, /* 3 */
+ { 0x34, 0, 0, 0x38 }, /* 4 */
+ { 0x35, 0, 0, 0x39 }, /* 5 */
+ { 0x36, 0, 0, 0x3a }, /* 6 */
+ { 0x37, 0, 0, 0x3b }, /* 7 */
+ { 0x38, 0, 0, 0x3c }, /* 8 */
+ { 0x39, 0, 0, 0x3d }, /* 9 */
+ { 0x3a, 0, 0, 0x3e }, /* : */
+ { 0x3b, 0, 0, 0x3f }, /* ; */
+ { 0x3c, 0, 0, 0x40 }, /* < */
+ { 0x3d, 0, 0, 0x41 }, /* = */
+ { 0x3e, 0, 0, 0x42 }, /* > */
+ { 0x3f, 0, 0, 0x43 }, /* ? */
+ { 0x40, 0, 0, 0x04 }, /* @ */
+ { 0x41, 0, 0, 0x45 }, /* A */
+ { 0x42, 0, 0, 0x46 }, /* B */
+ { 0x43, 0, 0, 0x47 }, /* C */
+ { 0x44, 0, 0, 0x48 }, /* D */
+ { 0x45, 0, 0, 0x49 }, /* E */
+ { 0x46, 0, 0, 0x4a }, /* F */
+ { 0x47, 0, 0, 0x4b }, /* G */
+ { 0x48, 0, 0, 0x4c }, /* H */
+ { 0x49, 0, 0, 0x4d }, /* I */
+ { 0x4a, 0, 0, 0x4e }, /* J */
+ { 0x4b, 0, 0, 0x4f }, /* K */
+ { 0x4c, 0, 0, 0x50 }, /* L */
+ { 0x4d, 0, 0, 0x51 }, /* M */
+ { 0x4e, 0, 0, 0x52 }, /* N */
+ { 0x4f, 0, 0, 0x53 }, /* O */
+ { 0x50, 0, 0, 0x54 }, /* P */
+ { 0x51, 0, 0, 0x55 }, /* Q */
+ { 0x52, 0, 0, 0x56 }, /* R */
+ { 0x53, 0, 0, 0x57 }, /* S */
+ { 0x54, 0, 0, 0x58 }, /* T */
+ { 0x55, 0, 0, 0x59 }, /* U */
+ { 0x56, 0, 0, 0x5a }, /* V */
+ { 0x57, 0, 0, 0x5b }, /* W */
+ { 0x58, 0, 0, 0x5c }, /* X */
+ { 0x59, 0, 0, 0x5d }, /* Y */
+ { 0x5a, 0, 0, 0x5e }, /* Z */
+ { 0x5b, 0, 0, 0xa9 }, /* [ */
+ { 0x5c, 0x0000, 2, 0x33 }, /* \ */
+ { 0x5d, 0, 0, 0xce }, /* ] */
+
+ { 0x5f, 0, 0, 0x15 }, /* _ */
+ { 0x60, 0x0001, 2, 0x2b }, /* ` */
+ { 0x61, 0, 0, 0x65 }, /* a */
+ { 0x62, 0, 0, 0x66 }, /* b */
+ { 0x63, 0, 0, 0x67 }, /* c */
+ { 0x64, 0, 0, 0x68 }, /* d */
+ { 0x65, 0, 0, 0x69 }, /* e */
+ { 0x66, 0, 0, 0x6a }, /* f */
+ { 0x67, 0, 0, 0x6b }, /* g */
+ { 0x68, 0, 0, 0x6c }, /* h */
+ { 0x69, 0, 0, 0x6d }, /* i */
+ { 0x6a, 0, 0, 0x6e }, /* j */
+ { 0x6b, 0, 0, 0x6f }, /* k */
+ { 0x6c, 0, 0, 0x70 }, /* l */
+ { 0x6d, 0, 0, 0x71 }, /* m */
+ { 0x6e, 0, 0, 0x72 }, /* n */
+ { 0x6f, 0, 0, 0x73 }, /* o */
+ { 0x70, 0, 0, 0x74 }, /* p */
+ { 0x71, 0, 0, 0x75 }, /* q */
+ { 0x72, 0, 0, 0x76 }, /* r */
+ { 0x73, 0, 0, 0x77 }, /* s */
+ { 0x74, 0, 0, 0x78 }, /* t */
+ { 0x75, 0, 0, 0x79 }, /* u */
+ { 0x76, 0, 0, 0x7a }, /* v */
+ { 0x77, 0, 0, 0x7b }, /* w */
+ { 0x78, 0, 0, 0x7c }, /* x */
+ { 0x79, 0, 0, 0x7d }, /* y */
+ { 0x7a, 0, 0, 0x7e }, /* z */
+ { 0x7b, 0, 0, 0x2c }, /* { (hard-coded ( ) */
+ { 0x7c, 0x0002, 2, 0x25 }, /* | */
+ { 0x7d, 0, 0, 0x2d }, /* } (hard-coded ) ) */
+ { 0x7e, 0x0003, 2, 0x31 }, /* ~ */
+ { 0x7f, 0, 0, 0x8b }, /* (full grid) */
+
+#ifndef BOOTLOADER /* bootloader only supports pure ASCII */
+ /* Latin 1 */
+ { 0xa0, 0, 0, 0x24 }, /* (non-breaking space) */
+ { 0xa1, 0, 0, 0x44 }, /* (inverted !) */
+ { 0xa2, 0, 0, 0xa8 }, /* (cent sign) */
+ { 0xa3, 0, 0, 0x05 }, /* (pound sign) */
+ { 0xa4, 0, 0, 0x28 }, /* (currency sign) */
+ { 0xa5, 0, 0, 0x07 }, /* (yen sign) */
+
+ { 0xa7, 0, 0, 0x63 }, /* (paragraph sign) */
+
+ { 0xaf, 0, 0, 0xee }, /* (macron) */
+
+ { 0xbf, 0, 0, 0x64 }, /* (inverted ?) */
+ { 0xc0, 0, 0, 0x8c }, /* (A grave) */
+ { 0xc1, 0, 0, 0x8d }, /* (A acute) */
+ { 0xc2, 0, 0, 0x8e }, /* (A circumflex) */
+ { 0xc3, 0, 0, 0x8f }, /* (A tilde) */
+ { 0xc4, 0, 0, 0x5f }, /* (A dieresis) */
+ { 0xc5, 0, 0, 0x12 }, /* (A with ring above) */
+ { 0xc6, 0, 0, 0x20 }, /* (AE ligature) */
+ { 0xc7, 0, 0, 0x0d }, /* (C cedilla) */
+ { 0xc8, 0, 0, 0x90 }, /* (E grave) */
+ { 0xc9, 0, 0, 0x23 }, /* (E acute) */
+ { 0xca, 0, 0, 0x91 }, /* (E circumflex) */
+ { 0xcb, 0, 0, 0x92 }, /* (E dieresis) */
+ { 0xcc, 0, 0, 0x93 }, /* (I grave) */
+ { 0xcd, 0, 0, 0x94 }, /* (I acute) */
+ { 0xce, 0, 0, 0x4d }, /* (I circumflex) */
+ { 0xcf, 0, 0, 0x4d }, /* (I dieresis) */
+ { 0xd0, 0, 0, 0x95 }, /* (ETH) */
+ { 0xd1, 0, 0, 0x61 }, /* (N tilde) */
+ { 0xd2, 0, 0, 0x96 }, /* (O grave) */
+ { 0xd3, 0, 0, 0x97 }, /* (O acute) */
+ { 0xd4, 0, 0, 0x98 }, /* (O circumflex) */
+ { 0xd5, 0, 0, 0x99 }, /* (O tilde) */
+ { 0xd6, 0, 0, 0x60 }, /* (O dieresis) */
+ { 0xd7, 0, 0, 0xde }, /* (multiplication sign) */
+ { 0xd8, 0, 0, 0x0f }, /* (O stroke) */
+ { 0xd9, 0, 0, 0x9a }, /* (U grave) */
+ { 0xda, 0, 0, 0x9b }, /* (U acute) */
+ { 0xdb, 0, 0, 0x59 }, /* (U circumflex) */
+ { 0xdc, 0, 0, 0x62 }, /* (U dieresis) */
+ { 0xdd, 0, 0, 0x5d }, /* (Y acute) */
+
+ { 0xdf, 0, 0, 0x22 }, /* (sharp s) */
+ { 0xe0, 0, 0, 0x83 }, /* (a grave) */
+ { 0xe1, 0, 0, 0x9c }, /* (a acute) */
+ { 0xe2, 0, 0, 0x9d }, /* (a circumflex) */
+ { 0xe3, 0, 0, 0x9e }, /* (a tilde) */
+ { 0xe4, 0, 0, 0x7f }, /* (a dieresis) */
+ { 0xe5, 0, 0, 0x13 }, /* (a with ring above) */
+
+ { 0xe7, 0, 0, 0x84 }, /* (c cedilla) */
+ { 0xe8, 0, 0, 0x08 }, /* (e grave) */
+ { 0xe9, 0, 0, 0x09 }, /* (e acute) */
+ { 0xea, 0, 0, 0x9f }, /* (e circumflex) */
+ { 0xeb, 0, 0, 0xa0 }, /* (e dieresis) */
+ { 0xec, 0, 0, 0x6d }, /* (i grave) */
+ { 0xed, 0, 0, 0xa1 }, /* (i acute) */
+ { 0xee, 0, 0, 0xa2 }, /* (i circumflex) */
+ { 0xef, 0, 0, 0xa3 }, /* (i dieresis) */
+
+ { 0xf1, 0, 0, 0x81 }, /* (n tilde) */
+ { 0xf2, 0, 0, 0x0c }, /* (o grave) */
+ { 0xf3, 0, 0, 0xa4 }, /* (o acute) */
+ { 0xf4, 0, 0, 0xa5 }, /* (o circumflex) */
+ { 0xf5, 0, 0, 0xa6 }, /* (o tilde) */
+ { 0xf6, 0, 0, 0x80 }, /* (o dieresis) */
+
+ { 0xf8, 0, 0, 0x10 }, /* (o slash) */
+ { 0xf9, 0, 0, 0x0a }, /* (u grave) */
+ { 0xfa, 0, 0, 0xa7 }, /* (u acute) */
+ { 0xfb, 0, 0, 0x79 }, /* (u circumflex) */
+ { 0xfc, 0, 0, 0xa2 }, /* (u dieresis) */
+ { 0xfd, 0, 0, 0xaf }, /* (y acute) */
+
+ { 0xff, 0, 0, 0x7d }, /* (y dieresis) */
+
+ /* Runtime-definable characters */
+ { 0xe000, 0x8000, 15, 0x24 }, /* variable character 0 */
+ { 0xe001, 0x8001, 15, 0x24 }, /* variable character 1 */
+ { 0xe002, 0x8002, 15, 0x24 }, /* variable character 2 */
+ { 0xe003, 0x8003, 15, 0x24 }, /* variable character 3 */
+ { 0xe004, 0x8004, 15, 0x24 }, /* variable character 4 */
+ { 0xe005, 0x8005, 15, 0x24 }, /* variable character 5 */
+ { 0xe006, 0x8006, 15, 0x24 }, /* variable character 6 */
+ { 0xe007, 0x8007, 15, 0x24 }, /* variable character 7 */
+ { 0xe008, 0x8008, 15, 0x24 }, /* variable character 8 */
+ { 0xe009, 0x8009, 15, 0x24 }, /* variable character 9 */
+ { 0xe00a, 0x800a, 15, 0x24 }, /* variable character 10 */
+ { 0xe00b, 0x800b, 15, 0x24 }, /* variable character 11 */
+ { 0xe00c, 0x800c, 15, 0x24 }, /* variable character 12 */
+ { 0xe00d, 0x800d, 15, 0x24 }, /* variable character 13 */
+ { 0xe00e, 0x800e, 15, 0x24 }, /* variable character 14 */
+ { 0xe00f, 0x800f, 15, 0x24 }, /* variable character 15 */
+
+ /* Icons and special symbols */
+ { 0xe100, 0x0004, 14, 0x43 }, /* unknown icon (mirrored ?) */
+ { 0xe101, 0x0005, 14, 0xd4 }, /* bookmark icon */
+ { 0xe102, 0x0006, 14, 0x2d }, /* plugin icon */
+ { 0xe103, 0x0007, 14, 0x34 }, /* folder icon */
+ { 0xe104, 0x0008, 14, 0x7c }, /* firmware icon */
+ { 0xe105, 0x0009, 14, 0x2f }, /* language icon */
+ { 0xe106, 0, 0, 0xfc }, /* audio icon (note) */
+ { 0xe107, 0x000b, 14, 0xd4 }, /* wps icon */
+ { 0xe108, 0x000c, 14, 0xfa }, /* playlist icon */
+ { 0xe109, 0x000f, 14, 0xfa }, /* text file icon */
+ { 0xe10a, 0x000e, 14, 0xfa }, /* config icon */
+ { 0xe10b, 0, 0, 0x88 }, /* left arrow */
+ { 0xe10c, 0, 0, 0x89 }, /* right arrow */
+ { 0xe10d, 0, 0, 0x86 }, /* up arrow */
+ { 0xe10e, 0, 0, 0x87 }, /* down arrow */
+ { 0xe10f, 0, 0, 0x88 }, /* filled left arrow */
+ { 0xe110, 0, 0, 0x89 }, /* filled right arrow */
+ { 0xe111, 0, 0, 0x86 }, /* filled up arrow */
+ { 0xe112, 0, 0, 0x87 }, /* filled down arrow */
+ { 0xe113, 0, 0, 0x24 }, /* level 0/7 */
+ { 0xe114, 0, 0, 0x15 }, /* level 1/7 */
+ { 0xe115, 0, 0, 0xdf }, /* level 2/7 */
+ { 0xe116, 0, 0, 0xe0 }, /* level 3/7 */
+ { 0xe117, 0, 0, 0xe1 }, /* level 4/7 */
+ { 0xe118, 0, 0, 0xe2 }, /* level 5/7 */
+ { 0xe119, 0, 0, 0xe3 }, /* level 6/7 */
+ { 0xe11a, 0, 0, 0xec }, /* level 7/7 */
+#endif /* !BOOTLOADER */
+
+ /* no-char symbol */
+ { 0xfffd, 0, 0, 0xd8 },
+};
+
+const unsigned char xfont_fixed[][8] = {
+ /* Standard ascii */
+ { 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00}, /* 0x000 \ */
+ { 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0x001 ` */
+ { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, /* 0x002 | */
+ { 0x00, 0x00, 0x08, 0x15, 0x02, 0x00, 0x00, 0x00}, /* 0x003 ~ */
+
+#ifndef BOOTLOADER /* bootloader only supports pure ASCII */
+ /* Icons and special symbols */
+ { 0x0c, 0x12, 0x12, 0x08, 0x08, 0x00, 0x08, 0x00}, /* 0x004 unknown icon */
+ { 0x00, 0x03, 0x07, 0x0e, 0x1c, 0x08, 0x00, 0x00}, /* 0x005 bookmark icon */
+ { 0x04, 0x1e, 0x07, 0x1f, 0x05, 0x01, 0x06, 0x00}, /* 0x006 plugin icon */
+ { 0x0c, 0x13, 0x11, 0x11, 0x11, 0x11, 0x1f, 0x00}, /* 0x007 folder icon */
+ { 0x1f, 0x11, 0x1b, 0x15, 0x1b, 0x11, 0x1f, 0x00}, /* 0x008 firmware icon */
+ { 0x00, 0x1f, 0x15, 0x1f, 0x15, 0x1f, 0x00, 0x00}, /* 0x009 language icon */
+ { 0x03, 0x05, 0x09, 0x09, 0x0b, 0x1b, 0x18, 0x00}, /* 0x00a audio icon (note) */
+ { 0x01, 0x01, 0x02, 0x02, 0x14, 0x0c, 0x04, 0x00}, /* 0x00b wps icon */
+ { 0x17, 0x00, 0x17, 0x00, 0x17, 0x00, 0x17, 0x00}, /* 0x00c playlist icon */
+ { 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00}, /* 0x00d text file icon */
+ { 0x0b, 0x10, 0x0b, 0x00, 0x1f, 0x00, 0x1f, 0x00}, /* 0x00e config icon */
+ /* Latin 1 */
+ { 0x06, 0x09, 0x08, 0x1e, 0x08, 0x08, 0x1f, 0x00}, /* 0x00f (pound sign) */
+ { 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0x010 (macron) */
+ { 0x04, 0x00, 0x04, 0x08, 0x10, 0x11, 0x0e, 0x00}, /* 0x011 (inverted ?) */
+ { 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 0x012 (A grave) */
+ { 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 0x013 (A acute) */
+ { 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 0x014 (a circumflex) */
+ { 0x0d, 0x12, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 0x015 (A tilde) */
+ { 0x0a, 0x00, 0x04, 0x0a, 0x11, 0x1f, 0x11, 0x00}, /* 0x016 (A dieresis) */
+ { 0x04, 0x0a, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x00}, /* 0x017 (A with ring above) */
+ { 0x0f, 0x14, 0x14, 0x1f, 0x14, 0x14, 0x17, 0x00}, /* 0x018 (AE ligature) */
+ { 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x02, 0x0e, 0x00}, /* 0x019 (C cedilla) */
+ { 0x08, 0x04, 0x1f, 0x10, 0x1e, 0x10, 0x1f, 0x00}, /* 0x01a (E grave) */
+ { 0x02, 0x04, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 0x01b (E acute) */
+ { 0x04, 0x0a, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 0x01c (E circumflex) */
+ { 0x0a, 0x00, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 0x01d (E dieresis)*/
+ { 0x08, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e, 0x00}, /* 0x01e (I grave) */
+ { 0x02, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e, 0x00}, /* 0x01f (I acute) */
+ { 0x0c, 0x0a, 0x09, 0x1d, 0x09, 0x0a, 0x0c, 0x00}, /* 0x020 (ETH) */
+ { 0x0d, 0x12, 0x00, 0x19, 0x15, 0x13, 0x11, 0x00}, /* 0x021 (N tilde) */
+ { 0x08, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x022 (O grave) */
+ { 0x02, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x023 (O acute) */
+ { 0x04, 0x0a, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x024 (O circumflex) */
+ { 0x0d, 0x12, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x025 (O tilde) */
+ { 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x026 (O dieresis) */
+ { 0x01, 0x0e, 0x13, 0x15, 0x19, 0x0e, 0x10, 0x00}, /* 0x027 (O stroke) */
+ { 0x08, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x028 (U grave) */
+ { 0x02, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x029 (U acute) */
+ { 0x0a, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x02a (U dieresis) */
+ { 0x08, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02b (a grave) */
+ { 0x02, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02c (a acute) */
+ { 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02d (a circumflex) */
+ { 0x0d, 0x12, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02e (a tilde) */
+ { 0x0a, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02f (a dieresis) */
+ { 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x030 (a with ring above) */
+ { 0x00, 0x0f, 0x10, 0x10, 0x0f, 0x02, 0x04, 0x00}, /* 0x031 (c cedilla) */
+ { 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 0x032 (e grave) */
+ { 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 0x033 (e acute) */
+ { 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 0x034 (e circumflex) */
+ { 0x0a, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 0x035 (e dieresis) */
+ { 0x02, 0x04, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 0x036 (i acute) */
+ { 0x04, 0x0a, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 0x037 (i circumflex) */
+ { 0x0a, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 0x038 (i dieresis) */
+ { 0x0d, 0x12, 0x00, 0x16, 0x19, 0x11, 0x11, 0x00}, /* 0x039 (n tilde) */
+ { 0x08, 0x04, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03a (o grave) */
+ { 0x02, 0x04, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03b (o acute) */
+ { 0x04, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03c (o circumflex) */
+ { 0x0d, 0x12, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03d (o tilde) */
+ { 0x00, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03e (o dieresis) */
+ { 0x00, 0x02, 0x0e, 0x15, 0x15, 0x0e, 0x08, 0x00}, /* 0x03f (o slash) */
+ { 0x08, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 0x040 (u grave) */
+ { 0x02, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 0x041 (u acute) */
+ { 0x00, 0x0a, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 0x042 (u dieresis) */
+ { 0x02, 0x04, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00}, /* 0x043 (y acute) */
+#endif /* !BOOTLOADER */
+};
+
+void lcd_charset_init(void)
+{
+ if (is_new_player())
+ {
+ hw_pattern_count = 8;
+ xchar_info = xchar_info_newlcd;
+ xchar_info_size = sizeof(xchar_info_newlcd)/sizeof(struct xchar_info);
+ }
+ else /* old lcd */
+ {
+ hw_pattern_count = 4;
+ xchar_info = xchar_info_oldlcd;
+ xchar_info_size = sizeof(xchar_info_oldlcd)/sizeof(struct xchar_info);
+ }
+}
diff --git a/firmware/drivers/lcd-player-charset.c b/firmware/drivers/lcd-player-charset.c
deleted file mode 100644
index 790f0df1c4..0000000000
--- a/firmware/drivers/lcd-player-charset.c
+++ /dev/null
@@ -1,751 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2003 by Kjell Ericson
- *
- * All files in this archive are subject to the GNU General Public License.
- * See the file COPYING in the source tree root for full license agreement.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-#ifndef __CONFIG_H__
-/* to easier allow this source file to be used even from tools when config.h
- cannot be included safely */
-#include "config.h"
-#endif
-
-#ifdef HAVE_LCD_CHARCELLS
-
-#include "lcd-player-charset.h"
-
-unsigned short new_lcd_rocklatin1_to_xlcd[] =
-{
- NOCHAR_NEW, /* 0x00 reserved never to be used */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- 0x216, /* 0x16 .. "bookmark" icon */
- 0x217, /* 0x17 .. "plugin" icon */
- 0x218, /* 0x18 .. "folder" icon */
- 0x219, /* 0x19 .. "MOD/AJZ" icon (winlatin o (dote in the middle) */
- 0x21a, /* 0x1a .. "language" icon (winlatin - (a bit longer minus sign) */
- 0x21b, /* 0x1b .. "note" icon */
- 0x21c, /* 0x1c .. "WPS" icon */
- 0x21d, /* 0x1d .. "playlist" icon */
- 0x21e, /* 0x1e .. "text file" icon (winlatin - (much longer minus sign) */
- 0x21f, /* 0x1f .. "config file" icon (winlatin ~) */
-
- 0x020, /* 0x20 .. */
- 0x021, /* 0x21 .. ! */
- 0x022, /* 0x22 .. " */
- 0x023, /* 0x23 .. # */
- 0x024, /* 0x24 .. $ */
- 0x025, /* 0x25 .. % */
- 0x026, /* 0x26 .. & */
- 0x027, /* 0x27 .. ' */
- 0x028, /* 0x28 .. ( */
- 0x029, /* 0x29 .. ) */
- 0x02a, /* 0x2a .. * */
- 0x02b, /* 0x2b .. + */
- 0x02c, /* 0x2c .. , */
- 0x02d, /* 0x2d .. - */
- 0x02e, /* 0x2e .. . */
- 0x02f, /* 0x2f .. / */
- 0x030, /* 0x30 .. 0 */
- 0x031, /* 0x31 .. 1 */
- 0x032, /* 0x32 .. 2 */
- 0x033, /* 0x33 .. 3 */
- 0x034, /* 0x34 .. 4 */
- 0x035, /* 0x35 .. 5 */
- 0x036, /* 0x36 .. 6 */
- 0x037, /* 0x37 .. 7 */
- 0x038, /* 0x38 .. 8 */
- 0x039, /* 0x39 .. 9 */
- 0x03a, /* 0x3a .. : */
- 0x03b, /* 0x3b .. ; */
- 0x03c, /* 0x3c .. < */
- 0x03d, /* 0x3d .. = */
- 0x03e, /* 0x3e .. > */
- 0x03f, /* 0x3f .. ? */
- 0x040, /* 0x40 .. @ */
- 0x041, /* 0x41 .. A */
- 0x042, /* 0x42 .. B */
- 0x043, /* 0x43 .. C */
- 0x044, /* 0x44 .. D */
- 0x045, /* 0x45 .. E */
- 0x046, /* 0x46 .. F */
- 0x047, /* 0x47 .. G */
- 0x048, /* 0x48 .. H */
- 0x049, /* 0x49 .. I */
- 0x04a, /* 0x4a .. J */
- 0x04b, /* 0x4b .. K */
- 0x04c, /* 0x4c .. L */
- 0x04d, /* 0x4d .. M */
- 0x04e, /* 0x4e .. N */
- 0x04f, /* 0x4f .. O */
- 0x050, /* 0x50 .. P */
- 0x051, /* 0x51 .. Q */
- 0x052, /* 0x52 .. R */
- 0x053, /* 0x53 .. S */
- 0x054, /* 0x54 .. T */
- 0x055, /* 0x55 .. U */
- 0x056, /* 0x56 .. V */
- 0x057, /* 0x57 .. W */
- 0x058, /* 0x58 .. X */
- 0x059, /* 0x59 .. Y */
- 0x05a, /* 0x5a .. Z */
- 0x05b, /* 0x5b .. [ */
- 0x012, /* 0x5c .. \ */
- 0x05d, /* 0x5d .. ] */
- 0x05e, /* 0x5e .. ^ */
- 0x05f, /* 0x5f .. _ */
- 0x060, /* 0x60 .. ` */
- 0x061, /* 0x00 97 .. a */
- 0x062, /* 0x00 98 .. b */
- 0x063, /* 0x00 99 .. c */
- 0x064, /* 0x64 .. d */
- 0x065, /* 0x65 .. e */
- 0x066, /* 0x66 .. f */
- 0x067, /* 0x67 .. g */
- 0x068, /* 0x68 .. h */
- 0x069, /* 0x69 .. i */
- 0x06a, /* 0x6a .. j */
- 0x06b, /* 0x6b .. k */
- 0x06c, /* 0x6c .. l */
- 0x06d, /* 0x6d .. m */
- 0x06e, /* 0x6e .. n */
- 0x06f, /* 0x6f .. o */
- 0x070, /* 0x70 .. p */
- 0x071, /* 0x71 .. q */
- 0x072, /* 0x72 .. r */
- 0x073, /* 0x73 .. s */
- 0x074, /* 0x74 .. t */
- 0x075, /* 0x75 .. u */
- 0x076, /* 0x76 .. v */
- 0x077, /* 0x77 .. w */
- 0x078, /* 0x78 .. x */
- 0x079, /* 0x79 .. y */
- 0x07a, /* 0x7a .. z */
- 0x07b, /* 0x7b ..*/ /* Old LCD hardcoded to "(" */
- 0x07c, /* 0x7c .. | */
- 0x07d, /* 0x7d .. } */ /* Old LCD hardcoded to ")" */
- 0x0f0, /* 0x7e .. ~ */
- 0x0fe, /* 0x7f .. full grid */
- NOCHAR_NEW, /* 0x80 winlatin Eurosign */
- 0x010, /* 0x81 filled-left-arrow (winlatin undefined) */
- 0x011, /* 0x82 filled-right-arrow (winlatin comma) */
- 0x01e, /* 0x83 filled-up-arrow (winlatin f) */
- 0x01f, /* 0x84 filled-up-arrow (winlatin ") */
- 0x224, /* 0x85 .. (three dots) */
- 0x081, /* 0x86 meter level 2 (winlatin undefined) */
- 0x082, /* 0x87 meter level 3 (winlatin undefined) */
- 0x083, /* 0x88 meter level 4 (winlatin undefined) */
- 0x084, /* 0x89 meter level 5 (winlatin Promille) */
- 0x085, /* 0x8a meter level 6 (winlatin 'S' with upside down ^) */
- 0x086, /* 0x8b meter level 7 (full) (winlatin '<') */
- NOCHAR_NEW, /* 0x8c .. CE */
- NOCHAR_NEW, /* 0x8d .. */
- 0x225, /* 0x8e .. 'Z' with upside down ^ */
- NOCHAR_NEW, /* 0x8f .. */
- 0x25d, /* 0x90 "unknown" icon */
- 0x094, /* 0x91 .. */
- 0x07e, /* 0x92 .. */
- 0x091, /* 0x93 .. folder icon susbstitute */
- 0x013, /* 0x94 .. note icon substitute */
- 0x0d0, /* 0x95 .. text/language/config icon substitute (winlatin o (dote in the middle) */
- NOCHAR_NEW, /* 0x96 .. (winlatin - (a bit longer minus sign) */
- NOCHAR_NEW, /* 0x97 .. (winlatin - (much longer minus sign) */
- NOCHAR_NEW, /* 0x98 .. (winlatin ~) */
- NOCHAR_NEW, /* 0x99 .. (winlatin TM) */
- NOCHAR_NEW, /* 0x9a .. 's' with upside down ^ */
- NOCHAR_NEW, /* 0x9b .. > */
- NOCHAR_NEW, /* 0x9c .. oe */
- NOCHAR_NEW, /* 0x9d .. */
- 0x225, /* 0x9e .. 'z' with upside down ^ */
- 0x059, /* 0x9f .. Large (Y with two dots) */
- NOCHAR_NEW, /* 0xa0 .. */
- NOCHAR_NEW, /* 0xa1 .. */
- NOCHAR_NEW, /* 0xa2 .. */
- 0x226, /* 0xa3 .. */
- NOCHAR_NEW, /* 0xa4 .. */
- NOCHAR_NEW, /* 0xa5 .. */
- NOCHAR_NEW, /* 0xa6 .. */
- 0x015, /* 0xa7 .. */
- NOCHAR_NEW, /* 0xa8 .. */
- NOCHAR_NEW, /* 0xa9 .. (copyright) */
- NOCHAR_NEW, /* 0xaa .. */
- NOCHAR_NEW, /* 0xab .. "<<" */
- NOCHAR_NEW, /* 0xac .. (unknown) */
- NOCHAR_NEW, /* 0xad .. (unkown1 */
- NOCHAR_NEW, /* 0xae .. (register)*/
- 0x228, /* 0xaf .. */
- NOCHAR_NEW, /* 0xb0 .. */
- NOCHAR_NEW, /* 0xb1 .. */
- NOCHAR_NEW, /* 0xb2 .. */
- NOCHAR_NEW, /* 0xb3 .. */
- NOCHAR_NEW, /* 0xb4 .. */
- NOCHAR_NEW, /* 0xb5 .. */
- NOCHAR_NEW, /* 0xb6 .. 1 */
- NOCHAR_NEW, /* 0xb7 .. */
- NOCHAR_NEW, /* 0xb8 .. */
- NOCHAR_NEW, /* 0xb9 .. */
- NOCHAR_NEW, /* 0xba .. */
- NOCHAR_NEW, /* 0xbb .. " */
- NOCHAR_NEW, /* 0xbc .. */
- NOCHAR_NEW, /* 0xbd .. */
- NOCHAR_NEW, /* 0xbe .. */
- 0x229, /* 0xbf .. */
- 0x22a, /* 0xc0 .. */
- 0x22b, /* 0xc1 .. */
- 0x22c, /* 0xc2 .. */
- 0x22d, /* 0xc3 .. */
- 0x22e, /* 0xc4 .. */
- 0x22f, /* 0xc5 .. */
- 0x230, /* 0xc6 .. */
- 0x231, /* 0xc7 .. */
- 0x232, /* 0xc8 .. */
- 0x233, /* 0xc9 .. */
- 0x234, /* 0xca .. */
- 0x235, /* 0xcb .. */
- 0x236, /* 0xcc .. */
- 0x237, /* 0xcd .. */
- 0x049, /* 0xce .. */
- 0x049, /* 0xcf .. */
- 0x238, /* 0xd0 .. */
- 0x239, /* 0xd1 .. */
- 0x23a, /* 0xd2 .. */
- 0x23b, /* 0xd3 .. */
- 0x23c, /* 0xd4 .. */
- 0x23d, /* 0xd5 .. */
- 0x23e, /* 0xd6 .. */
- 0x23f, /* 0xd7 .. */
- 0x240, /* 0xd8 .. */
- 0x241, /* 0xd9 .. */
- 0x242, /* 0xda .. */
- 0x055, /* 0xdb .. */
- 0x243, /* 0xdc .. */
- 0x059, /* 0xdd .. */
- NOCHAR_NEW, /* 0xde .. */
- 0x244, /* 0xdf .. */
- 0x245, /* 0xe0 .. */
- 0x246, /* 0xe1 .. */
- 0x247, /* 0xe2 .. */
- 0x248, /* 0xe3 .. */
- 0x249, /* 0xe4 .. */
- 0x24a, /* 0xe5 .. */
- NOCHAR_NEW, /* 0xe6 .. */
- 0x24b, /* 0xe7 .. */
- 0x24c, /* 0xe8 .. */
- 0x24d, /* 0xe9 .. */
- 0x24e, /* 0xea .. */
- 0x24f, /* 0xeb .. */
- 0x069, /* 0xec .. */
- 0x250, /* 0xed .. */
- 0x251, /* 0xee .. */
- 0x252, /* 0xef .. */
- NOCHAR_NEW, /* 0xf0 .. */
- 0x253, /* 0xf1 .. */
- 0x23a, /* 0xf2 .. */
- 0x254, /* 0xf3 .. */
- 0x255, /* 0xf4 .. */
- 0x256, /* 0xf5 .. */
- 0x257, /* 0xf6 .. */
- NOCHAR_NEW, /* 0xf7 .. */
- 0x258, /* 0xf8 .. */
- 0x259, /* 0xf9 .. */
- 0x25a, /* 0xfa .. */
- 0x075, /* 0xfb .. */
- 0x25b, /* 0xfc .. */
- 0x25c, /* 0xfd .. */
- NOCHAR_NEW, /* 0xfe .. */
- 0x079, /* 0xff .. */
-};
-
-unsigned short old_lcd_rocklatin1_to_xlcd[] =
-{
- /* OLD LCD */
- NOCHAR_OLD, /* 0x00 reserved never to be used */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- RESERVED_CHAR, /* reserved */
- 0x216, /* 0x16 .. "bookmark" icon */
- 0x217, /* 0x17 .. "plugin" icon */
- 0x218, /* 0x18 .. "folder" icon */
- 0x219, /* 0x19 .. "MOD/AJZ" icon (winlatin o (dote in the middle) */
- 0x21a, /* 0x1a .. "language" icon (winlatin - (a bit longer minus sign) */
- 0x0fc, /* 0x1b .. "note" icon */
- 0x0d4, /* 0x1c .. "WPS" icon */
- 0x21d, /* 0x1d .. "playlist" icon */
- 0x21e, /* 0x1e .. "text file" icon (winlatin - (much longer minus sign) */
- 0x21f, /* 0x1f .. "config file" icon (winlatin ~) */
- 0x024, /* 0x20 .. */
- 0x025, /* 0x21 .. ! */
- 0x026, /* 0x22 .. " */
- 0x027, /* 0x23 .. # */
- 0x006, /* 0x24 .. $ */
- 0x029, /* 0x25 .. % */
- 0x02a, /* 0x26 .. & */
- 0x02b, /* 0x27 .. ' */
- 0x02c, /* 0x28 .. ( */
- 0x02d, /* 0x29 .. ) */
- 0x02e, /* 0x2a .. * */
- 0x02f, /* 0x2b .. + */
- 0x030, /* 0x2c .. , */
- 0x031, /* 0x2d .. - */
- 0x032, /* 0x2e .. . */
- 0x033, /* 0x2f .. / */
- 0x034, /* 0x30 .. 0 */
- 0x035, /* 0x31 .. 1 */
- 0x036, /* 0x32 .. 2 */
- 0x037, /* 0x33 .. 3 */
- 0x038, /* 0x34 .. 4 */
- 0x039, /* 0x35 .. 5 */
- 0x03a, /* 0x36 .. 6 */
- 0x03b, /* 0x37 .. 7 */
- 0x03c, /* 0x38 .. 8 */
- 0x03d, /* 0x39 .. 9 */
- 0x03e, /* 0x3a .. : */
- 0x03f, /* 0x3b .. ; */
- 0x040, /* 0x3c .. < */
- 0x041, /* 0x3d .. = */
- 0x042, /* 0x3e .. > */
- 0x043, /* 0x3f .. ? */
- 0x004, /* 0x40 .. @ */
- 0x045, /* 0x41 .. A */
- 0x046, /* 0x42 .. B */
- 0x047, /* 0x43 .. C */
- 0x048, /* 0x44 .. D */
- 0x049, /* 0x45 .. E */
- 0x04a, /* 0x46 .. F */
- 0x04b, /* 0x47 .. G */
- 0x04c, /* 0x48 .. H */
- 0x04d, /* 0x49 .. I */
- 0x04e, /* 0x4a .. J */
- 0x04f, /* 0x4b .. K */
- 0x050, /* 0x4c .. L */
- 0x051, /* 0x4d .. M */
- 0x052, /* 0x4e .. N */
- 0x053, /* 0x4f .. O */
- 0x054, /* 0x50 .. P */
- 0x055, /* 0x51 .. Q */
- 0x056, /* 0x52 .. R */
- 0x057, /* 0x53 .. S */
- 0x058, /* 0x54 .. T */
- 0x059, /* 0x55 .. U */
- 0x05a, /* 0x56 .. V */
- 0x05b, /* 0x57 .. W */
- 0x05c, /* 0x58 .. X */
- 0x05d, /* 0x59 .. Y */
- 0x05e, /* 0x5a .. Z */
- 0x0a9, /* 0x5b .. [ */ /* New LCD hardcoded to "(" */
- 0x220, /* 0x5c .. \ */
- 0x0ce, /* 0x5d .. ] */ /* New LCD hardcoded to ")" */
- NOCHAR_OLD, /* 0x5e .. ^ */
- 0x015, /* 0x5f .. _ */
- 0x221, /* 0x60 .. ` */
- 0x065, /* 0x00 97 .. a */
- 0x066, /* 0x00 98 .. b */
- 0x067, /* 0x00 99 .. c */
- 0x068, /* 0x64 .. d */
- 0x069, /* 0x65 .. e */
- 0x06a, /* 0x66 .. f */
- 0x06b, /* 0x67 .. g */
- 0x06c, /* 0x68 .. h */
- 0x06d, /* 0x69 .. i */
- 0x06e, /* 0x6a .. j */
- 0x06f, /* 0x6b .. k */
- 0x070, /* 0x6c .. l */
- 0x071, /* 0x6d .. m */
- 0x072, /* 0x6e .. n */
- 0x073, /* 0x6f .. o */
- 0x074, /* 0x70 .. p */
- 0x075, /* 0x71 .. q */
- 0x076, /* 0x72 .. r */
- 0x077, /* 0x73 .. s */
- 0x078, /* 0x74 .. t */
- 0x079, /* 0x75 .. u */
- 0x07a, /* 0x76 .. v */
- 0x07b, /* 0x77 .. w */
- 0x07c, /* 0x78 .. x */
- 0x07d, /* 0x79 .. y */
- 0x07e, /* 0x7a .. z */
- 0x02c, /* 0x7b ..*/ /* Old LCD hardcoded to "(" */
- 0x222, /* 0x7c .. | */
- 0x02d, /* 0x7d .. } */ /* Old LCD hardcoded to ")" */
- 0x223, /* 0x7e .. ~ */
- 0x08b, /* 0x7f full grid */
- NOCHAR_OLD, /* 0x80 winlatin Eurosign */
- 0x089, /* 0x81 filled-left-arrow (winlatin undefined) */
- 0x088, /* 0x82 filled-right-arrow (winlatin comma) */
- 0x087, /* 0x83 filled-up-arrow (winlatin f) */
- 0x086, /* 0x84 filled-up-arrow (winlatin ") */
- 0x085, /* 0x85 .. (three dots) */
- 0x0df, /* 0x86 meter level 2 (winlatin undefined) */
- 0x0e0, /* 0x87 meter level 3 (winlatin undefined) */
- 0x0e1, /* 0x88 meter level 4 (winlatin undefined) */
- 0x0e2, /* 0x89 meter level 5 (winlatin Promille) */
- 0x0e3, /* 0x8a meter level 6 (winlatin 'S' with upside down ^) */
- 0x0ec, /* 0x8a meter level 7 (full) (winlatin '<') */
- NOCHAR_OLD, /* 0x8c .. CE */
- NOCHAR_OLD, /* 0x8d .. */
- 0x0bd, /* 0x8e .. 'Z' with upside down ^ */
- NOCHAR_OLD, /* 0x8f .. */
- 0x25d, /* 0x90 "unknown" icon */
- 0x0d4, /* 0x91 .. */
- 0x089, /* 0x92 .. */
- 0x034, /* 0x93 .. folder icon substitute */
- 0x0fc, /* 0x94 .. note icon substitute */
- 0x0fa, /* 0x95 .. text/language/config icon substitute (winlatin o (dote in the middle) */
- NOCHAR_OLD, /* 0x96 .. (winlatin - (a bit longer minus sign) */
- NOCHAR_OLD, /* 0x97 .. (winlatin - (much longer minus sign) */
- NOCHAR_OLD, /* 0x98 .. (winlatin ~) */
- NOCHAR_OLD, /* 0x99 .. (winlatin TM) */
- NOCHAR_OLD, /* 0x9a .. 's' with upside down ^ */
- NOCHAR_OLD, /* 0x9b .. > */
- NOCHAR_OLD, /* 0x9c .. oe */
- NOCHAR_OLD, /* 0x9d .. */
- 0x0bd, /* 0x9e .. 'z' with upside down ^ */
- NOCHAR_OLD, /* 0x9f .. Large (Y with two dots) */
- NOCHAR_OLD, /* 0xa0 .. */
- NOCHAR_OLD, /* 0xa1 .. */
- NOCHAR_OLD, /* 0xa2 .. */
- 0x005, /* 0xa3 .. */
- NOCHAR_OLD, /* 0xa4 .. */
- NOCHAR_OLD, /* 0xa5 .. */
- NOCHAR_OLD, /* 0xa6 .. */
- 0x063, /* 0xa7 .. */
- NOCHAR_OLD, /* 0xa8 .. */
- NOCHAR_OLD, /* 0xa9 .. (copyright) */
- NOCHAR_OLD, /* 0xaa .. */
- NOCHAR_OLD, /* 0xab .. "<<" */
- NOCHAR_OLD, /* 0xac .. (unknown) */
- NOCHAR_OLD, /* 0xad .. (unkown1 */
- NOCHAR_OLD, /* 0xae .. (register)*/
- 0x0ee, /* 0xaf .. */
- NOCHAR_OLD, /* 0xb0 .. */
- NOCHAR_OLD, /* 0xb1 .. */
- NOCHAR_OLD, /* 0xb2 .. */
- NOCHAR_OLD, /* 0xb3 .. */
- NOCHAR_OLD, /* 0xb4 .. */
- NOCHAR_OLD, /* 0xb5 .. */
- NOCHAR_OLD, /* 0xb6 .. 1 */
- NOCHAR_OLD, /* 0xb7 .. */
- NOCHAR_OLD, /* 0xb8 .. */
- NOCHAR_OLD, /* 0xb9 .. */
- NOCHAR_OLD, /* 0xba .. */
- NOCHAR_OLD, /* 0xbb .. " */
- NOCHAR_OLD, /* 0xbc .. */
- NOCHAR_OLD, /* 0xbd .. */
- NOCHAR_OLD, /* 0xbe .. */
- 0x064, /* 0xbf .. */
- 0x08c, /* 0xc0 .. */
- 0x08d, /* 0xc1 .. */
- 0x08e, /* 0xc2 .. */
- 0x08f, /* 0xc3 .. */
- 0x05f, /* 0xc4 .. */
- 0x012, /* 0xc5 .. */
- 0x020, /* 0xc6 .. */
- 0x00d, /* 0xc7 .. */
- 0x090, /* 0xc8 .. */
- 0x023, /* 0xc9 .. */
- 0x091, /* 0xca .. */
- 0x092, /* 0xcb .. */
- 0x093, /* 0xcc .. */
- 0x094, /* 0xcd .. */
- 0x049, /* 0xce .. */
- 0x049, /* 0xcf .. */
- 0x095, /* 0xd0 .. */
- 0x061, /* 0xd1 .. */
- 0x096, /* 0xd2 .. */
- 0x097, /* 0xd3 .. */
- 0x098, /* 0xd4 .. */
- 0x099, /* 0xd5 .. */
- 0x060, /* 0xd6 .. */
- 0x0de, /* 0xd7 .. */
- 0x00f, /* 0xd8 .. */
- 0x09a, /* 0xd9 .. */
- 0x09b, /* 0xda .. */
- 0x059, /* 0xdb .. */
- 0x062, /* 0xdc .. */
- 0x0af, /* 0xdd .. */
- NOCHAR_OLD, /* 0xde .. */
- 0x022, /* 0xdf .. */
- 0x083, /* 0xe0 .. */
- 0x09c, /* 0xe1 .. */
- 0x09d, /* 0xe2 .. */
- 0x09e, /* 0xe3 .. */
- 0x07f, /* 0xe4 .. */
- 0x09d, /* 0xe5 .. */
- NOCHAR_OLD, /* 0xe6 .. */
- 0x084, /* 0xe7 .. */
- 0x008, /* 0xe8 .. */
- 0x009, /* 0xe9 .. */
- 0x09f, /* 0xea .. */
- 0x0a0, /* 0xeb .. */
- 0x06d, /* 0xec .. */
- 0x0a1, /* 0xed .. */
- 0x0a2, /* 0xee .. */
- 0x0a3, /* 0xef .. */
- NOCHAR_OLD, /* 0xf0 .. */
- 0x081, /* 0xf1 .. */
- 0x096, /* 0xf2 .. */
- 0x0a4, /* 0xf3 .. */
- 0x0a5, /* 0xf4 .. */
- 0x0a6, /* 0xf5 .. */
- 0x080, /* 0xf6 .. */
- NOCHAR_OLD, /* 0xf7 .. */
- 0x010, /* 0xf8 .. */
- 0x00a, /* 0xf9 .. */
- 0x0a7, /* 0xfa .. */
- 0x079, /* 0xfb .. */
- 0x082, /* 0xfc .. */
- 0x0af, /* 0xfd .. */
- NOCHAR_OLD, /* 0xfe .. */
- 0x07d, /* 0xff .. */
-};
-
-/* second table -- substitute */
-const unsigned char
- lcd_player_extended_lcd_to_rocklatin1[NO_EXTENDED_LCD_CHARS] =
-{
-/* 00 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 01 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 02 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 03 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 04 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 05 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 06 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 07 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 08 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 09 */ NOCHAR_NEW, /* 0-16 user defined */
-/* 0a */ NOCHAR_NEW, /* 0-16 user defined */
-/* 0b */ NOCHAR_NEW, /* 0-16 user defined */
-/* 0c */ NOCHAR_NEW, /* 0-16 user defined */
-/* 0d */ NOCHAR_NEW, /* 0-16 user defined */
-/* 0e */ NOCHAR_NEW, /* 0-16 user defined */
-/* 0f */ NOCHAR_NEW, /* 0-16 user defined */
-/* 10 */ NOCHAR_NEW, /* reserved */
-/* 11 */ NOCHAR_NEW, /* reserved */
-/* 12 */ NOCHAR_NEW, /* reserved */
-/* 13 */ NOCHAR_NEW, /* reserved */
-/* 14 */ NOCHAR_NEW, /* reserved */
-/* 15 */ NOCHAR_NEW, /* reserved */
-/* 16 */ 0x91, /* bookmark icon */
-/* 17 */ 0x29, /* plugin icon */
-/* 18 */ 0x93, /* folder icon */
-/* 19 */ 'x', /* MOD/AJZ icon */
-/* 1a */ '+', /* language icon */
-/* 1b */ 0x94, /* note icon */
-/* 1c */ 0x91, /* WPS icon */
-/* 1d */ 0x95, /* playlist icon */
-/* 1e */ 0x95, /* text file icon */
-/* 1f */ 0x95, /* config file icon */
-/* 20 */ '/', /* substitute char for old lcd \ */
-/* 21 */ '\'', /* substitute char for old lcd ` */
-/* 22 */ '!', /* substitute char for old lcd | */
-/* 23 */ '-', /* substitute char for old lcd ~ */
-/* 24 */ '.', /* substitute char for new lcd (three dots) */
-/* 25 */ 'z', /* substitue char for new lcd (0x0bd) 'z' with upside down ^ */
-/* 26 */ 'L', /* substitue char for new lcd (0x005) */
-/* 27 */ NOCHAR_NEW, /* empty */
-/* 28 */ '-', /* substitue char for new lcd (0x0ee) */
-/* 29 */ '?', /* substitue char for new lcd (0x064) */
-/* 2a */ 'A', /* substitue char for new lcd (0x08c) */
-/* 2b */ 'A', /* substitue char for new lcd (0x08d) */
-/* 2c */ 'A', /* substitue char for new lcd (0x08e) */
-/* 2d */ 'A', /* substitue char for new lcd (0x08e) */
-/* 2e */ 'A', /* substitue char for new lcd (0x05f) */
-/* 2f */ 'A', /* substitue char for new lcd (0x012) */
-/* 30 */ 'A', /* substitue char for new lcd (0x020) */
-/* 31 */ 'C', /* substitue char for new lcd (0x00d) */
-/* 32 */ 'E', /* substitue char for new lcd (0x090) */
-/* 33 */ 'E', /* substitue char for new lcd (0x023) */
-/* 34 */ 'E', /* substitue char for new lcd (0x091) */
-/* 35 */ 'E', /* substitue char for new lcd (0x092) */
-/* 36 */ 'I', /* substitue char for new lcd (0x093) */
-/* 37 */ 'I', /* substitue char for new lcd (0x094) */
-/* 38 */ 'D', /* substitue char for new lcd (0x095) */
-/* 39 */ 'N', /* substitue char for new lcd (0x061) */
-/* 3a */ 'O', /* substitue char for new lcd (0x096) */
-/* 3b */ 'O', /* substitue char for new lcd (0x097) */
-/* 3c */ 'O', /* substitue char for new lcd (0x098) */
-/* 3d */ 'O', /* substitue char for new lcd (0x099) */
-/* 3e */ 'O', /* substitue char for new lcd (0x060) */
-/* 3f */ 'x', /* substitue char for new lcd (0x0de) */
-/* 40 */ '0', /* substitue char for new lcd (0x00f) */
-/* 41 */ 'U', /* substitue char for new lcd (0x09a) */
-/* 42 */ 'U', /* substitue char for new lcd (0x09b) */
-/* 43 */ 'U', /* substitue char for new lcd (0x062) */
-/* 44 */ 'B', /* substitue char for new lcd (0x022) */
-/* 45 */ 'a', /* substitue char for new lcd (0x083) */
-/* 46 */ 'a', /* substitue char for new lcd (0x09c) */
-/* 47 */ 'a', /* substitue char for new lcd (0x09d) */
-/* 48 */ 'a', /* substitue char for new lcd (0x09e) */
-/* 49 */ 'a', /* substitue char for new lcd (0x07f) */
-/* 4a */ 'a', /* substitue char for new lcd (0x09d) */
-/* 4b */ 'c', /* substitue char for new lcd (0x084) */
-/* 4c */ 'e', /* substitue char for new lcd (0x008) */
-/* 4d */ 'e', /* substitue char for new lcd (0x009) */
-/* 4e */ 'e', /* substitue char for new lcd (0x09f) */
-/* 4f */ 'e', /* substitue char for new lcd (0x0a0) */
-/* 50 */ 'i', /* substitue char for new lcd (0x0a1) */
-/* 51 */ 'i', /* substitue char for new lcd (0x0a2) */
-/* 52 */ 'i', /* substitue char for new lcd (0x0a3) */
-/* 53 */ 'n', /* substitue char for new lcd (0x081) */
-/* 54 */ 'o', /* substitue char for new lcd (0x0a4) */
-/* 55 */ 'o', /* substitue char for new lcd (0x0a5) */
-/* 56 */ 'o', /* substitue char for new lcd (0x0a6) */
-/* 57 */ 'o', /* substitue char for new lcd (0x080) */
-/* 58 */ 'o', /* substitue char for new lcd (0x010) */
-/* 59 */ 'u', /* substitue char for new lcd (0x00a) */
-/* 5a */ 'u', /* substitue char for new lcd (0x0a7) */
-/* 5b */ 'u', /* substitue char for new lcd (0x082) */
-/* 5c */ 'y', /* substitue char for new lcd (0x0af) */
-/* 5d */ '?', /* unknown icon */
-
-};
-
-unsigned char extended_font_player[NO_EXTENDED_LCD_CHARS][8] = {
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 00 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 01 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 02 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 03 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 04 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 05 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 06 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 07 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 08 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 09 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0a */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0b */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0c */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0d */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0e */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0f */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 10 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 11 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 12 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 13 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 14 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 15 */
- { 0x00, 0x03, 0x07, 0x0e, 0x1c, 0x08, 0x00, 0x00}, /* 16 Bookmark icon */
- { 0x04, 0x1e, 0x07, 0x1f, 0x05, 0x01, 0x06, 0x00}, /* 17 Plugin file icon */
- { 0x0c, 0x13, 0x11, 0x11, 0x11, 0x11, 0x1f, 0x00}, /* 18 Folder icon */
- { 0x1f, 0x11, 0x1b, 0x15, 0x1b, 0x11, 0x1f, 0x00}, /* 19 MOD/AJZ icon */
- { 0x00, 0x1f, 0x15, 0x1f, 0x15, 0x1f, 0x00, 0x00}, /* 1a Language icon */
- { 0x03, 0x05, 0x09, 0x09, 0x0b, 0x1b, 0x18, 0x00}, /* 1b note icon */
- { 0x01, 0x01, 0x02, 0x02, 0x14, 0x0c, 0x04, 0x00}, /* 1c WPS icon */
- { 0x17, 0x00, 0x17, 0x00, 0x17, 0x00, 0x17, 0x00}, /* 1d Playlist icon */
- { 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00}, /* 1e Text file icon */
- { 0x0b, 0x10, 0x0b, 0x00, 0x1f, 0x00, 0x1f, 0x00}, /* 1f Config file icon */
-
- /* Unprioritized chars follows below, least prioritized char last */
- { 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00}, /* 20 '\' new lcd 0x12 */
- { 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 21 '`' new lcd 0x60 */
- { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, /* 22 '|' new lcd 0x7c */
- { 0x00, 0x00, 0x08, 0x15, 0x02, 0x00, 0x00, 0x00}, /* 23 '~' new lcd 0xf0 */
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00}, /* 24 old lcd 0x85 */
- { 0x0a, 0x04, 0x1f, 0x02, 0x04, 0x08, 0x1f, 0x00}, /* 25 old lcd 0xbd */
- { 0x06, 0x09, 0x08, 0x1e, 0x08, 0x08, 0x1f, 0x00}, /* 26 old lcd 0x05 */
- { 0x0e, 0x10, 0x0e, 0x11, 0x0e, 0x01, 0x0e, 0x00}, /* 27 old lcd 0x63 */
- { 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 28 old lcd 0xee */
- { 0x04, 0x00, 0x04, 0x08, 0x10, 0x11, 0x0e, 0x00}, /* 29 old lcd 0x64 */
- { 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 2a old lcd 0x8c */
- { 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 2b old lcd 0x8d */
- { 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 2c old lcd 0x8e */
- { 0x0d, 0x12, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 2d old lcd 0x8f */
- { 0x0a, 0x00, 0x04, 0x0a, 0x11, 0x1f, 0x11, 0x00}, /* 2e old lcd 0x5f */
- { 0x04, 0x0a, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x00}, /* 2f old lcd 0x12 */
- { 0x0f, 0x14, 0x14, 0x1f, 0x14, 0x14, 0x17, 0x00}, /* 30 old lcd 0x20 */
- { 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x02, 0x0e, 0x00}, /* 31 old lcd 0x0d */
- { 0x08, 0x04, 0x1f, 0x10, 0x1e, 0x10, 0x1f, 0x00}, /* 32 old lcd 0x90 */
- { 0x02, 0x04, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 33 old lcd 0x23 */
- { 0x04, 0x0a, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 34 old lcd 0x91 */
- { 0x0a, 0x00, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 35 old lcd 0x92 */
- { 0x08, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e, 0x00}, /* 36 old lcd 0x93 */
- { 0x02, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e, 0x00}, /* 37 old lcd 0x94 */
- { 0x0c, 0x0a, 0x09, 0x1d, 0x09, 0x0a, 0x0c, 0x00}, /* 38 old lcd 0x95 */
- { 0x0d, 0x12, 0x00, 0x19, 0x15, 0x13, 0x11, 0x00}, /* 39 old lcd 0x61 */
- { 0x08, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3a old lcd 0x96 */
- { 0x02, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3b old lcd 0x97 */
- { 0x04, 0x0a, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3c old lcd 0x98 */
- { 0x0d, 0x12, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3d old lcd 0x99 */
- { 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3e old lcd 0x60 */
- { 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x0a, 0x00}, /* 3f old lcd 0xde */
- { 0x01, 0x0e, 0x13, 0x15, 0x19, 0x0e, 0x10, 0x00}, /* 40 old lcd 0x0f */
- { 0x08, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 41 old lcd 0x9a */
- { 0x02, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 42 old lcd 0x9b */
- { 0x0a, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 43 old lcd 0x62 */
- { 0x0c, 0x12, 0x16, 0x11, 0x11, 0x16, 0x10, 0x00}, /* 44 old lcd 0x22 */
- { 0x08, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 45 old lcd 0x83 */
- { 0x02, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 46 old lcd 0x9c */
- { 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 47 old lcd 0x9d */
- { 0x0d, 0x12, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 48 old lcd 0x9e */
- { 0x0a, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 49 old lcd 0x7f */
- { 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 4a old lcd 0x9d */
- { 0x00, 0x0f, 0x10, 0x10, 0x0f, 0x02, 0x04, 0x00}, /* 4b old lcd 0x84 */
- { 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 4c old lcd 0x08 */
- { 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 4d old lcd 0x09 */
- { 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 4e old lcd 0x9f */
- { 0x0a, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 4f old lcd 0xa0 */
- { 0x02, 0x04, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 50 old lcd 0xa1 */
- { 0x04, 0x0a, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 51 old lcd 0xa2 */
- { 0x0a, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 52 old lcd 0xa3 */
- { 0x0d, 0x12, 0x00, 0x16, 0x19, 0x11, 0x11, 0x00}, /* 53 old lcd 0x81 */
- { 0x02, 0x04, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 54 old lcd 0xa4 */
- { 0x04, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 55 old lcd 0xa5 */
- { 0x0d, 0x12, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 56 old lcd 0xa6 */
- { 0x00, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 57 old lcd 0x80 */
- { 0x00, 0x02, 0x0e, 0x15, 0x15, 0x0e, 0x08, 0x00}, /* 58 old lcd 0x10 */
- { 0x08, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 59 old lcd 0x0a */
- { 0x02, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 5a old lcd 0xa7 */
- { 0x00, 0x0a, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 5b old lcd 0x82 */
- { 0x02, 0x04, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00}, /* 5c old lcd 0xaf */
- { 0x0c, 0x12, 0x12, 0x08, 0x08, 0x00, 0x08, 0x00}, /* 5d Unknown icon */
-};
-
-#endif /* HAVE_LCD_CHARCELLS */
diff --git a/firmware/drivers/lcd-player.c b/firmware/drivers/lcd-player.c
deleted file mode 100644
index dd99246611..0000000000
--- a/firmware/drivers/lcd-player.c
+++ /dev/null
@@ -1,830 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2002 by Alan Korr
- *
- * All files in this archive are subject to the GNU General Public License.
- * See the file COPYING in the source tree root for full license agreement.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-#include "config.h"
-#include "hwcompat.h"
-
-#ifdef HAVE_LCD_CHARCELLS
-
-#include "lcd.h"
-#include "kernel.h"
-#include "thread.h"
-#include <string.h>
-#include <stdlib.h>
-#include "file.h"
-#include "debug.h"
-#include "system.h"
-#include "font.h"
-#include "lcd-player-charset.h"
-#include "rbunicode.h"
-
-/*** definitions ***/
-
-#define OLD_LCD_CONTRAST_SET ((char)0xA8)
-#define OLD_LCD_CRAM ((char)0xB0) /* Characters */
-#define OLD_LCD_PRAM ((char)0x80) /* Patterns */
-#define OLD_LCD_IRAM ((char)0xE0) /* Icons */
-
-#define NEW_LCD_CONTRAST_SET ((char)0x50)
-#define NEW_LCD_CRAM ((char)0x80) /* Characters */
-#define NEW_LCD_PRAM ((char)0xC0) /* Patterns */
-#define NEW_LCD_IRAM ((char)0x40) /* Icons */
-#define NEW_LCD_FUNCTION_SET ((char)0x10)
-#define NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET ((char)0x0c)
-#define NEW_LCD_POWER_CONTROL_REGISTER_SET ((char)0x20)
-#define NEW_LCD_DISPLAY_CONTROL_SET ((char)0x28)
-
-#define LCD_CURSOR(x,y) ((char)(lcd_cram+((y)*16+(x))))
-#define LCD_ICON(i) ((char)(lcd_iram+i))
-
-#define SCROLLABLE_LINES 2
-
-#define SCROLL_MODE_OFF 0
-#define SCROLL_MODE_PAUSE 1
-#define SCROLL_MODE_RUN 2
-
-extern unsigned short new_lcd_rocklatin1_to_xlcd[];
-extern unsigned short old_lcd_rocklatin1_to_xlcd[];
-extern const unsigned char lcd_player_extended_lcd_to_rocklatin1[];
-extern unsigned char extended_font_player[NO_EXTENDED_LCD_CHARS][8];
-
-/*** generic code ***/
-
-#define MAX_CURSOR_CHARS 8
-struct cursorinfo {
- int len;
- char text[MAX_CURSOR_CHARS];
- int textpos;
- int y_pos;
- int x_pos;
- int divider;
- int downcount;
-} cursor;
-
-static void scroll_thread(void);
-static char scroll_stack[DEFAULT_STACK_SIZE];
-static const char scroll_name[] = "scroll";
-static int scroll_ticks = 12; /* # of ticks between updates */
-static int scroll_delay = HZ/2; /* delay before starting scroll */
-static int jump_scroll_delay = HZ/4; /* delay between jump scroll jumps */
-static int scroll_spacing = 3; /* spaces between end and start of text */
-static int bidir_limit = 50; /* percent */
-static int jump_scroll = 0; /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */
-
-static struct scrollinfo scroll[SCROLLABLE_LINES];
-
-static char extended_chars_mapped[NO_EXTENDED_LCD_CHARS];
-static char extended_pattern_content[8]; /* Which char is mapped in pattern */
-static char extended_pattern_usage[8]; /* Counting number of times used */
-static char pattern_size; /* Last pattern, 3 for old LCD, 7 for new LCD */
-
-static bool new_lcd;
-
-unsigned short *lcd_ascii;
-static char lcd_contrast_set;
-static char lcd_cram;
-static char lcd_pram;
-static char lcd_iram;
-
-unsigned short buffer_xlcd[11][2];
-unsigned short buffer_lcd_mirror[11][2];
-
-#ifdef SIMULATOR
-unsigned char hardware_buffer_lcd[11][2];
-#endif
-
-#define NO_CHAR -1
-
-static void lcd_free_pat(int map_ch)
-{
- int x, y;
- unsigned char substitute_char;
-
- int pat;
- pat=extended_chars_mapped[map_ch];
- if (pat!=NO_CHAR) {
-
- substitute_char=lcd_player_extended_lcd_to_rocklatin1[map_ch];
-
- /* TODO: use a define for the screen width! */
- for (x=0; x<11; x++) {
- /* TODO: use a define for the screen height! */
- for (y=0; y<2; y++) {
- if (map_ch==lcd_ascii[buffer_xlcd[x][y]]-512) {
- buffer_xlcd[x][y]=substitute_char;
- buffer_lcd_mirror[x][y]=substitute_char;
-#ifdef SIMULATOR
- hardware_buffer_lcd[x][y]=substitute_char;
-#else
- lcd_write_command_e(LCD_CURSOR(x, y), substitute_char);
-#endif
- }
- }
- }
- extended_chars_mapped[map_ch]=NO_CHAR;
- extended_pattern_content[pat]=NO_CHAR;
- extended_pattern_usage[pat]=0;
- }
-#ifdef SIMULATOR
- lcd_update();
-#endif
-}
-
-static int lcd_get_free_pat(int ch)
-{
- int pat;
- int last_pat=0;
- static int last_used_pat=0;
- int loop;
-
- pat=last_used_pat;
- for (loop=0; loop<=pattern_size; loop++) {
- pat=(pat+1)&pattern_size; /* Keep 'pat' within limits */
- if (extended_pattern_usage[pat]==0) {
- int map_ch=extended_pattern_content[pat];
- if (map_ch != NO_CHAR) {
- extended_chars_mapped[map_ch]=NO_CHAR;
- extended_pattern_content[pat]=NO_CHAR;
- }
- last_used_pat=pat;
- return pat;
- }
- if (extended_pattern_content[pat]>extended_pattern_content[last_pat])
- last_pat=pat;
- }
- if (ch<32) { /* Prioritized char */
- /* Remove last_pat */
- lcd_free_pat(extended_pattern_content[last_pat]);
- last_used_pat=last_pat;
- return last_pat;
- }
- return NO_CHAR;
-
-}
-
-void xlcd_update(void)
-{
- int x, y;
- for (x=0; x<11; x++) {
- for (y=0; y<2; y++) {
- unsigned short ch=buffer_xlcd[x][y];
- unsigned char hw_ch=0xff;
- if (ch==buffer_lcd_mirror[x][y])
- continue; /* No need to redraw */
- buffer_lcd_mirror[x][y]=ch;
- if (ch>=256 && ch<512) {
- hw_ch=ch-256;
- } else {
- int map_ch=lcd_ascii[ch];
- if (map_ch<512) {
- hw_ch=map_ch;
- }
- else {
- map_ch=map_ch-512;
- if (extended_chars_mapped[map_ch]!=NO_CHAR) {
- hw_ch=extended_chars_mapped[map_ch];
- extended_pattern_usage[hw_ch]++;
- }
- else {
- int pat;
- pat=lcd_get_free_pat(map_ch);
- if (pat<0) {
- /* Find substitute char */
- map_ch=
- lcd_player_extended_lcd_to_rocklatin1[map_ch];
- hw_ch=lcd_ascii[map_ch];
- } else {
-#ifdef DEBUG
- if (extended_pattern_usage[pat]!=0) {
- DEBUGF("***Pattern %d is not zero!\n", pat);
- }
-#endif
- extended_chars_mapped[map_ch]=pat;
- extended_pattern_content[pat]=map_ch;
- extended_pattern_usage[pat]=1;
- lcd_define_hw_pattern(pat*8,
- extended_font_player[map_ch],
- 8);
- hw_ch=pat;
- }
- }
- }
- }
-#ifdef SIMULATOR
- hardware_buffer_lcd[x][y]=hw_ch;
-#else
- lcd_write_command_e(LCD_CURSOR(x,y), hw_ch);
-#endif
- }
- }
- lcd_update();
-}
-
-bool lcdx_putc(int x, int y, unsigned short ch)
-{
- int lcd_char;
- if (buffer_xlcd[x][y]==ch)
- return false; /* Same char, ignore any update */
- lcd_char=lcd_ascii[buffer_xlcd[x][y]];
- if (lcd_char>=512) {
- /* The removed char is a defined pattern, count down the reference. */
- extended_pattern_usage[(int)extended_chars_mapped[lcd_char-512]]--;
-#ifdef DEBUG
- if (extended_pattern_usage[(int)extended_chars_mapped[lcd_char]]<0) {
- DEBUGF("**** Mapped char %02x is less than 0!\n", lcd_char);
- }
-#endif
- }
-
- buffer_xlcd[x][y]=ch;
-
- lcd_char=lcd_ascii[ch];
- if (lcd_char>=256)
- return true; /* Caller shall call xlcd_update() when done */
-
- buffer_lcd_mirror[x][y]=lcd_char;
-#ifdef SIMULATOR
- hardware_buffer_lcd[x][y]=lcd_char;
-#else
- lcd_write_command_e(LCD_CURSOR(x, y), lcd_char);
-#endif
- return false;
-}
-
-void lcd_clear_display(void)
-{
- int i;
- bool update=false;
- lcd_stop_scroll();
- cursor.len=0; /* Stop cursor */
- for (i=0;i<22;i++)
- update|=lcdx_putc(i%11, i/11, ' ');
- if (update)
- xlcd_update();
-}
-
-static void lcd_puts_cont_scroll(int x, int y, const unsigned char *string)
-{
- bool update=false;
-
- for (; *string && x<11; x++)
- {
- /* We should check if char is over 256 */
- update|=lcdx_putc(x, y, *(unsigned char*)string++);
- }
-
- for (; x<11; x++)
- update|=lcdx_putc(x, y, ' ');
- if (update)
- xlcd_update();
-#ifdef SIMULATOR
- lcd_update();
-#endif
-}
-void lcd_puts(int x, int y, const unsigned char *string)
-{
- int i=0;
- unsigned short ucs;
- const unsigned char *utf8 = string;
- unsigned char tmp[12];
-
- while (*utf8 && i<11) {
- utf8 = utf8decode(utf8, &ucs);
- if (ucs < 256)
- tmp[i++] = ucs;
- else
- tmp[i++] = '?';
- }
-
- tmp[i] = 0;
-
- scroll[y].mode=SCROLL_MODE_OFF;
- return lcd_puts_cont_scroll(x, y, tmp);
-}
-
-void lcd_put_cursor(int x, int y, char cursor_char)
-{
- if (cursor.len == 0) {
- cursor.text[0]=buffer_xlcd[x][y];
- cursor.text[1]=cursor_char;
- cursor.len=2;
- cursor.textpos=0;
- cursor.y_pos=y;
- cursor.x_pos=x;
- cursor.downcount=0;
- cursor.divider=4;
- }
-}
-
-void lcd_remove_cursor(void)
-{
- if (cursor.len!=0) {
- bool up;
- cursor.len=0;
- up = lcdx_putc(cursor.x_pos, cursor.y_pos, cursor.text[0]);
-#ifdef SIMULATOR
- if(up)
- lcd_update();
-#endif
- }
-}
-
-void lcd_putc(int x, int y, unsigned short ch)
-{
- bool update;
- if (x<0 || y<0) {
- return;
- }
- update=lcdx_putc(x, y, ch);
-
- if (update)
- xlcd_update();
-}
-
-unsigned char lcd_get_locked_pattern(void)
-{
- unsigned char pat=1;
- while (pat<LAST_RESERVED_CHAR) {
- if (lcd_ascii[pat]==RESERVED_CHAR) {
- lcd_ascii[pat]=0x200+pat;
- return pat;
- }
- pat++;
- }
- return 0;
-}
-
-void lcd_unlock_pattern(unsigned char pat)
-{
- lcd_ascii[pat]=RESERVED_CHAR;
- lcd_free_pat(pat);
-}
-
-void lcd_define_pattern(int pat, const char *pattern)
-{
- int i;
- for (i=0; i<7; i++) {
- extended_font_player[pat][i]=pattern[i];
- }
- if (extended_chars_mapped[pat]!=NO_CHAR) {
- lcd_define_hw_pattern(extended_chars_mapped[pat]*8, pattern, 7);
- }
-}
-
-#ifndef SIMULATOR
-void lcd_define_hw_pattern (int which,const char *pattern,int length)
-{
- lcd_write_command(lcd_pram | which);
- lcd_write_data(pattern, length);
-}
-
-void lcd_double_height(bool on)
-{
- if(new_lcd)
- lcd_write_command(on?9:8);
-}
-
-static const char icon_pos[] =
-{
- 0, 0, 0, 0, /* Battery */
- 2, /* USB */
- 3, /* Play */
- 4, /* Record */
- 5, /* Pause */
- 5, /* Audio */
- 6, /* Repeat */
- 7, /* 1 */
- 9, /* Volume */
- 9, /* Volume 1 */
- 9, /* Volume 2 */
- 10, /* Volume 3 */
- 10, /* Volume 4 */
- 10, /* Volume 5 */
- 10, /* Param */
-};
-
-static const char icon_mask[] =
-{
- 0x02, 0x08, 0x04, 0x10, /* Battery */
- 0x04, /* USB */
- 0x10, /* Play */
- 0x10, /* Record */
- 0x02, /* Pause */
- 0x10, /* Audio */
- 0x02, /* Repeat */
- 0x01, /* 1 */
- 0x04, /* Volume */
- 0x02, /* Volume 1 */
- 0x01, /* Volume 2 */
- 0x08, /* Volume 3 */
- 0x04, /* Volume 4 */
- 0x01, /* Volume 5 */
- 0x10, /* Param */
-};
-
-void lcd_icon(int icon, bool enable)
-{
- static unsigned char icon_mirror[11] = {0};
- int pos, mask;
-
- pos = icon_pos[icon];
- mask = icon_mask[icon];
-
- if(enable)
- icon_mirror[pos] |= mask;
- else
- icon_mirror[pos] &= ~mask;
-
- lcd_write_command_e(LCD_ICON(pos), icon_mirror[pos]);
-}
-
-int lcd_default_contrast(void)
-{
- return 30;
-}
-
-void lcd_set_contrast(int val)
-{
- lcd_write_command_e(lcd_contrast_set, 31 - val);
-}
-#endif /* SIMULATOR */
-
-void lcd_init (void)
-{
- unsigned char data_vector[64];
-
- (void)data_vector;
-
- new_lcd = is_new_player();
- memset(extended_chars_mapped, NO_CHAR, sizeof(extended_chars_mapped));
- memset(extended_pattern_content, NO_CHAR,sizeof(extended_pattern_content));
- memset(extended_pattern_usage, 0, sizeof(extended_pattern_usage));
-
- if(new_lcd) {
- lcd_ascii = new_lcd_rocklatin1_to_xlcd;
- lcd_contrast_set = NEW_LCD_CONTRAST_SET;
- lcd_cram = NEW_LCD_CRAM;
- lcd_pram = NEW_LCD_PRAM;
- lcd_iram = NEW_LCD_IRAM;
- pattern_size=7; /* Last pattern, 7 for new LCD */
-
-#ifndef SIMULATOR
- /* LCD init for cold start */
- PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */
- or_b(0x0f, &PBIORL); /* ... output */
- or_b(0x0f, &PBDRL); /* ... and high */
-
- lcd_write_command(NEW_LCD_FUNCTION_SET + 1); /* CGRAM selected */
- lcd_write_command_e(NEW_LCD_CONTRAST_SET, 0x08);
- lcd_write_command(NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET + 2);
- /* oscillator on */
- lcd_write_command(NEW_LCD_POWER_CONTROL_REGISTER_SET + 7);
- /* opamp buffer + voltage booster on*/
-
- memset(data_vector, 0x20, 64);
- lcd_write_command(NEW_LCD_CRAM); /* Set DDRAM address */
- lcd_write_data(data_vector, 64); /* all spaces */
-
- memset(data_vector, 0, 64);
- lcd_write_command(NEW_LCD_PRAM); /* Set CGRAM address */
- lcd_write_data(data_vector, 64); /* zero out */
- lcd_write_command(NEW_LCD_IRAM); /* Set ICONRAM address */
- lcd_write_data(data_vector, 16); /* zero out */
-
- lcd_write_command(NEW_LCD_DISPLAY_CONTROL_SET + 1); /* display on */
-#endif /* !SIMULATOR */
- }
- else {
- lcd_ascii = old_lcd_rocklatin1_to_xlcd;
- lcd_contrast_set = OLD_LCD_CONTRAST_SET;
- lcd_cram = OLD_LCD_CRAM;
- lcd_pram = OLD_LCD_PRAM;
- lcd_iram = OLD_LCD_IRAM;
- pattern_size=3; /* Last pattern, 3 for old LCD */
-
-#ifndef SIMULATOR
-#if 1
- /* LCD init for cold start */
- PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */
- or_b(0x0f, &PBIORL); /* ... output */
- or_b(0x0f, &PBDRL); /* ... and high */
-
- lcd_write_command(0x61);
- lcd_write_command(0x42);
- lcd_write_command(0x57);
-
- memset(data_vector, 0x24, 13);
- lcd_write_command(OLD_LCD_CRAM); /* Set DDRAM address */
- lcd_write_data(data_vector, 13); /* all spaces */
- lcd_write_command(OLD_LCD_CRAM + 0x10);
- lcd_write_data(data_vector, 13);
- lcd_write_command(OLD_LCD_CRAM + 0x20);
- lcd_write_data(data_vector, 13);
-
- memset(data_vector, 0, 32);
- lcd_write_command(OLD_LCD_PRAM); /* Set CGRAM address */
- lcd_write_data(data_vector, 32); /* zero out */
- lcd_write_command(OLD_LCD_IRAM); /* Set ICONRAM address */
- lcd_write_data(data_vector, 13); /* zero out */
- lcd_write_command(OLD_LCD_IRAM + 0x10);
- lcd_write_data(data_vector, 13);
-
- lcd_write_command(0x31);
-#else
- /* archos look-alike code, left here for reference. As soon as the
- * rockbox version is confirmed working, this will go away */
- {
- int i;
-
- PBCR2 &= 0xc000;
- PBIOR |= 0x000f;
- PBDR |= 0x0002;
- PBDR |= 0x0001;
- PBDR |= 0x0004;
- PBDR |= 0x0008;
-
- for (i=0; i<200; i++) asm volatile ("nop"); /* wait 100 us */
-
- PBDR &= 0xfffd; /* CS low (assert) */
-
- for (i=0; i<100; i++) asm volatile ("nop"); /* wait 50 us */
-
- lcd_write_command(0x61);
- lcd_write_command(0x42);
- lcd_write_command(0x57);
-
- memset(data_vector, 0x24, 13);
- lcd_write_command(0xb0); /* Set DDRAM address */
- lcd_write_data(data_vector, 13); /* all spaces */
- lcd_write_command(0xc0);
- lcd_write_data(data_vector, 13);
- lcd_write_command(0xd0);
- lcd_write_data(data_vector, 13);
-
- memset(data_vector, 0, 32);
- lcd_write_command(0x80); /* Set CGRAM address */
- lcd_write_data(data_vector, 32); /* zero out */
- lcd_write_command(0xe0); /* Set ICONRAM address */
- lcd_write_data(data_vector, 13); /* zero out */
- lcd_write_command(0xf0);
- lcd_write_data(data_vector, 13);
-
- for (i=0; i<300000; i++) asm volatile ("nop"); /* wait 150 ms */
-
- lcd_write_command(0x31);
- lcd_write_command_e(0xa8, 0); /* Set contrast control */
- }
-#endif
-#endif /* !SIMULATOR */
- }
-
- lcd_set_contrast(lcd_default_contrast());
-
- create_thread(scroll_thread, scroll_stack,
- sizeof(scroll_stack), scroll_name IF_PRIO(, PRIORITY_USER_INTERFACE)
- IF_COP(, CPU, false));
-}
-
-void lcd_jump_scroll (int mode) /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */
-{
- jump_scroll=mode;
-}
-
-void lcd_bidir_scroll(int percent)
-{
- bidir_limit = percent;
-}
-
-void lcd_puts_scroll(int x, int y, const unsigned char* string )
-{
- struct scrollinfo* s;
- int i=0;
- unsigned short ucs;
- const unsigned char *utf8 = string;
- unsigned char tmp[utf8length(string)+1];
-
- while (*utf8) {
- utf8 = utf8decode(utf8, &ucs);
- if (ucs < 256)
- tmp[i++] = ucs;
- else
- tmp[i++] = '?';
- }
-
- tmp[i] = 0;
-
-
- s = &scroll[y];
-
- lcd_puts_cont_scroll(x,y,tmp);
- s->textlen = strlen(tmp);
-
- if ( s->textlen > 11-x ) {
- s->mode = SCROLL_MODE_RUN;
- s->scroll_start_tick = current_tick + scroll_delay;
- s->offset=0;
- s->startx=x;
- s->starty=y;
- s->direction=+1;
- s->jump_scroll=0;
- s->jump_scroll_steps=0;
- if (jump_scroll && jump_scroll_delay<scroll_ticks*(s->textlen-11+x)) {
- s->jump_scroll_steps=11-x;
- s->jump_scroll=jump_scroll;
- }
- strncpy(s->text,tmp,sizeof s->text);
- s->turn_offset=-1;
- if (bidir_limit && (s->textlen < ((11-x)*(100+bidir_limit))/100)) {
- s->turn_offset=s->textlen+x-11;
- }
- else {
- for (i=0; i<scroll_spacing &&
- s->textlen<(int)sizeof(s->text); i++) {
- s->text[s->textlen++]=' ';
- }
- }
- if (s->textlen<(int)sizeof(s->text))
- s->text[s->textlen]=' ';
- s->text[sizeof s->text - 1] = 0;
- }
- else
- s->mode = SCROLL_MODE_OFF;
-}
-
-void lcd_stop_scroll(void)
-{
- struct scrollinfo* s;
- int index;
-
- for ( index = 0; index < SCROLLABLE_LINES; index++ ) {
- s = &scroll[index];
- if ( s->mode == SCROLL_MODE_RUN ||
- s->mode == SCROLL_MODE_PAUSE ) {
- /* restore scrolled row */
- lcd_puts(s->startx, s->starty, s->text);
- }
- }
-
- lcd_update();
-}
-
-static const char scroll_tick_table[16] = {
- /* Hz values:
- 1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */
- 100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3
-};
-
-void lcd_scroll_speed(int speed)
-{
- scroll_ticks = scroll_tick_table[speed];
-}
-
-void lcd_scroll_delay(int ms)
-{
- scroll_delay = ms / (HZ / 10);
-}
-
-void lcd_jump_scroll_delay(int ms)
-{
- jump_scroll_delay = ms / (HZ / 10);
-}
-
-static void scroll_thread(void)
-{
- struct scrollinfo* s;
- int index;
- int i, o;
- bool update;
-
- /* initialize scroll struct array */
- for (index = 0; index < SCROLLABLE_LINES; index++) {
- scroll[index].mode = SCROLL_MODE_OFF;
- }
-
- while ( 1 ) {
-
- update = false;
-
- for ( index = 0; index < SCROLLABLE_LINES; index++ ) {
- s = &scroll[index];
- if ( s->mode == SCROLL_MODE_RUN ) {
- if ( TIME_AFTER(current_tick, s->scroll_start_tick) ) {
- char buffer[12];
- int jumping_scroll=s->jump_scroll;
- update = true;
- if (s->jump_scroll) {
-
- /* Find new position to start jump scroll by
- * finding last white space within
- * jump_scroll_steps */
- int i;
- o = s->offset = s->offset + s->jump_scroll_steps;
- for (i = 0; i < s->jump_scroll_steps; i++, o--) {
- if (o < s->textlen &&
- ((0x20 <= s->text[o] && s->text[o] <= 0x2f) || s->text[o] == '_'))
- {
- s->offset = o;
- break;
- }
- }
-
- s->scroll_start_tick = current_tick +
- jump_scroll_delay;
- /* Eat space */
- while (s->offset < s->textlen &&
- ((0x20 <= s->text[s->offset] && s->text[s->offset] <= 0x2f) ||
- s->text[s->offset] == '_')) {
- s->offset++;
- }
- if (s->offset >= s->textlen) {
- s->offset=0;
- s->scroll_start_tick = current_tick +
- scroll_delay;
- if (s->jump_scroll != JUMP_SCROLL_ALWAYS) {
- s->jump_scroll--;
- s->direction=1;
- }
- }
- } else {
- if ( s->offset < s->textlen-1 ) {
- s->offset+=s->direction;
- if (s->offset==0) {
- s->direction=+1;
- s->scroll_start_tick = current_tick +
- scroll_delay;
- } else {
- if (s->offset == s->turn_offset) {
- s->direction=-1;
- s->scroll_start_tick = current_tick +
- scroll_delay;
- }
- }
- }
- else {
- s->offset = 0;
- }
- }
-
- i=0;
- o=s->offset;
- while (i<11) {
- buffer[i++]=s->text[o++];
- if (o==s->textlen /* || (jump_scroll && buffer[i-1] == ' ') */)
- break;
- }
- o=0;
- if (s->turn_offset == -1 && !jumping_scroll) {
- while (i<11) {
- buffer[i++]=s->text[o++];
- }
- } else {
- while (i<11) {
- buffer[i++]=' ';
- }
- }
- buffer[11]=0;
-
- lcd_puts_cont_scroll(s->startx, s->starty, buffer);
- }
- }
- if (cursor.len>0) {
- if (cursor.downcount--<0) {
- cursor.downcount=cursor.divider;
- cursor.textpos++;
- if (cursor.textpos>=cursor.len)
- cursor.textpos=0;
-#ifdef SIMULATOR
- lcdx_putc(cursor.x_pos, cursor.y_pos,
- cursor.text[cursor.textpos]);
- update=true;
-#else
- update|=lcdx_putc(cursor.x_pos, cursor.y_pos,
- cursor.text[cursor.textpos]);
-#endif
- }
- }
- if (update) {
- lcd_update();
- }
- }
-
- sleep(scroll_ticks);
- }
-}
-
-#endif /* HAVE_LCD_CHARCELLS */
diff --git a/firmware/export/config-player.h b/firmware/export/config-player.h
index ef5eedef79..e462ef2d8e 100644
--- a/firmware/export/config-player.h
+++ b/firmware/export/config-player.h
@@ -4,10 +4,11 @@
/* define this if you would like tagcache to build on this target */
#define HAVE_TAGCACHE
-/* LCD dimensions (for the simulator) */
-#define LCD_WIDTH 132 /* Display width in pixels */
-#define LCD_HEIGHT 64 /* Display height in pixels */
-#define LCD_DEPTH 1
+#define LCD_WIDTH 11
+#define LCD_HEIGHT 2
+#define LCD_DEPTH 1
+#define SIM_LCD_WIDTH 132 /* pixels */
+#define SIM_LCD_HEIGHT 64 /* pixels */
/* define this if you have the Player's keyboard */
#define CONFIG_KEYPAD PLAYER_PAD
diff --git a/firmware/export/lcd-charcell.h b/firmware/export/lcd-charcell.h
new file mode 100644
index 0000000000..2676056e63
--- /dev/null
+++ b/firmware/export/lcd-charcell.h
@@ -0,0 +1,41 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: lcd-player.c 12835 2007-03-18 17:58:49Z amiconn $
+ *
+ * Copyright (C) 2007 by Jens Arnold
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* map unicode characters to hardware or extended lcd characters */
+struct xchar_info {
+ unsigned short ucs;
+ unsigned short glyph;
+ /* 0x0000..0x7fff: fixed extended characters
+ * 0x8000..0xffff: variable extended characters
+ * Dontcare if priority == 0 */
+ unsigned char priority;
+ unsigned char hw_char; /* direct or substitute */
+};
+
+/* target dependent - to be adjusted for other charcell targets */
+#define HW_PATTERN_SIZE 7 /* number of bytes per pattern */
+#define MAX_HW_PATTERNS 8 /* max. number of user-definable hw patterns */
+extern int hw_pattern_count; /* actual number of user-definable hw patterns */
+
+extern const struct xchar_info *xchar_info;
+extern int xchar_info_size; /* number of entries */
+extern const unsigned char xfont_fixed[][8];
+
+void lcd_charset_init(void);
+
diff --git a/firmware/export/lcd-player-charset.h b/firmware/export/lcd-player-charset.h
deleted file mode 100644
index c94fab8f3b..0000000000
--- a/firmware/export/lcd-player-charset.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- * $Id$
- *
- * Copyright (C) 2003 by Kjell Ericson
- *
- * All files in this archive are subject to the GNU General Public License.
- * See the file COPYING in the source tree root for full license agreement.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-#ifdef HAVE_LCD_CHARCELLS
-
-#define NO_EXTENDED_LCD_CHARS 0x5e
-#define RESERVED_CHAR 0xff
-#define LAST_RESERVED_CHAR 0x16
-#define NOCHAR_OLD 0x24
-#define NOCHAR_NEW 0x20
-
-#endif
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index 1b7dbb4795..0d56389480 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -59,12 +59,21 @@ extern void lcd_init_device(void);
extern void lcd_backlight(bool on);
extern int lcd_default_contrast(void);
extern void lcd_set_contrast(int val);
+extern void lcd_setmargins(int xmargin, int ymargin);
+extern int lcd_getxmargin(void);
+extern int lcd_getymargin(void);
+extern int lcd_getstringsize(const unsigned char *str, int *w, int *h);
extern void lcd_clear_display(void);
+extern void lcd_putsxy(int x, int y, const unsigned char *string);
extern void lcd_puts(int x, int y, const unsigned char *string);
extern void lcd_puts_style(int x, int y, const unsigned char *string, int style);
-extern void lcd_putc(int x, int y, unsigned short ch);
+extern void lcd_puts_offset(int x, int y, const unsigned char *str, int offset);
+extern void lcd_puts_scroll_offset(int x, int y, const unsigned char *string,
+ int offset);
+extern void lcd_putc(int x, int y, unsigned long ucs);
extern void lcd_stop_scroll(void);
+extern void lcd_bidir_scroll(int threshold);
extern void lcd_scroll_speed(int speed);
extern void lcd_scroll_delay(int ms);
extern void lcd_puts_scroll(int x, int y, const unsigned char* string);
@@ -123,14 +132,14 @@ enum
ICON_PARAM
};
-extern void lcd_double_height(bool on);
-extern void lcd_define_hw_pattern(int which,const char *pattern,int length);
-extern void lcd_define_pattern(int which,const char *pattern);
-unsigned char lcd_get_locked_pattern(void);
-void lcd_unlock_pattern(unsigned char pat);
-void lcd_put_cursor(int x, int y, char cursor_char);
+void lcd_double_height(bool on);
+void lcd_put_hw_char(int x, int y, unsigned char hw_char);
+void lcd_define_hw_pattern(int which, const char *pattern);
+void lcd_define_pattern(unsigned long ucs, const char *pattern);
+unsigned long lcd_get_locked_pattern(void);
+void lcd_unlock_pattern(unsigned long ucs);
+void lcd_put_cursor(int x, int y, unsigned long cursor_ucs);
void lcd_remove_cursor(void);
-extern void lcd_bidir_scroll(int threshold);
#define JUMP_SCROLL_ALWAYS 5
extern void lcd_jump_scroll(int mode); /* 0=off, 1=once, ..., ALWAYS */
extern void lcd_jump_scroll_delay(int ms);
@@ -303,17 +312,10 @@ extern void lcd_set_flip(bool yesno);
extern void lcd_set_drawmode(int mode);
extern int lcd_get_drawmode(void);
-extern void lcd_setmargins(int xmargin, int ymargin);
-extern int lcd_getxmargin(void);
-extern int lcd_getymargin(void);
extern void lcd_setfont(int font);
-extern int lcd_getstringsize(const unsigned char *str, int *w, int *h);
-extern void lcd_puts_offset(int x, int y, const unsigned char *str, int offset);
extern void lcd_puts_style_offset(int x, int y, const unsigned char *str,
int style, int offset);
-extern void lcd_puts_scroll_offset(int x, int y, const unsigned char *string,
- int offset);
extern void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string,
int style, int offset);
@@ -338,10 +340,8 @@ extern void lcd_bitmap_part(const fb_data *src, int src_x, int src_y,
int stride, int x, int y, int width, int height);
extern void lcd_bitmap(const fb_data *src, int x, int y, int width,
int height);
-extern void lcd_putsxy(int x, int y, const unsigned char *string);
extern void lcd_invertscroll(int x, int y);
-extern void lcd_bidir_scroll(int threshold);
extern void lcd_scroll_step(int pixels);
#if LCD_DEPTH > 1
@@ -380,36 +380,25 @@ extern void lcd_bitmap_transparent(const fb_data *src, int x, int y,
#endif /* HAVE_LCD_BITMAP */
/* internal usage, but in multiple drivers */
+#define SCROLL_SPACING 3
#ifdef HAVE_LCD_BITMAP
-#define SCROLL_SPACING 3
-#define SCROLL_LINE_SIZE (MAX_PATH + LCD_WIDTH/2 + SCROLL_SPACING + 2)
+#define SCROLL_LINE_SIZE (MAX_PATH + LCD_WIDTH/2 + SCROLL_SPACING + 2)
+#else
+#define SCROLL_LINE_SIZE (MAX_PATH + LCD_WIDTH + SCROLL_SPACING + 2)
+#endif
struct scrollinfo {
char line[SCROLL_LINE_SIZE];
int len; /* length of line in chars */
- int width; /* length of line in pixels */
int offset;
int startx;
+#ifdef HAVE_LCD_BITMAP
+ int width; /* length of line in pixels */
+ bool invert; /* invert the scrolled text */
+#endif
bool backward; /* scroll presently forward or backward? */
bool bidir;
- bool invert; /* invert the scrolled text */
long start_tick;
};
-#else /* !HAVE_LCD_BITMAP */
-
-struct scrollinfo {
- int mode;
- char text[MAX_PATH];
- int textlen;
- int offset;
- int turn_offset;
- int startx;
- int starty;
- long scroll_start_tick;
- int direction; /* +1 for right or -1 for left*/
- int jump_scroll;
- int jump_scroll_steps;
-};
-#endif
#endif /* __LCD_H__ */
diff --git a/firmware/target/sh/archos/player/lcd-player.c b/firmware/target/sh/archos/player/lcd-player.c
new file mode 100644
index 0000000000..7018b2277a
--- /dev/null
+++ b/firmware/target/sh/archos/player/lcd-player.c
@@ -0,0 +1,235 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: lcd-player.c 12835 2007-03-18 17:58:49Z amiconn $
+ *
+ * Copyright (C) 2007 by Jens Arnold
+ * Based on the work of Alan Korr, Kjell Ericson and others
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "config.h"
+#include <string.h>
+#include "hwcompat.h"
+#include "system.h"
+#include "lcd.h"
+
+#define OLD_LCD_CRAM ((char)0xB0) /* Characters */
+#define OLD_LCD_PRAM ((char)0x80) /* Patterns */
+#define OLD_LCD_IRAM ((char)0xE0) /* Icons */
+#define OLD_LCD_CONTRAST_SET ((char)0xA8)
+
+#define NEW_LCD_CRAM ((char)0x80) /* Characters */
+#define NEW_LCD_PRAM ((char)0xC0) /* Patterns */
+#define NEW_LCD_IRAM ((char)0x40) /* Icons */
+#define NEW_LCD_CONTRAST_SET ((char)0x50)
+#define NEW_LCD_FUNCTION_SET ((char)0x10)
+#define NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET ((char)0x0c)
+#define NEW_LCD_POWER_CONTROL_REGISTER_SET ((char)0x20)
+#define NEW_LCD_DISPLAY_CONTROL_SET ((char)0x28)
+#define NEW_LCD_SET_DOUBLE_HEIGHT ((char)0x08)
+
+#define LCD_CURSOR(x,y) ((char)(lcd_cram+((y)*16+(x))))
+#define LCD_ICON(i) ((char)(lcd_iram+i))
+
+static bool new_lcd;
+static char lcd_contrast_set;
+static char lcd_cram;
+static char lcd_pram;
+static char lcd_iram;
+
+/* hardware configuration */
+
+int lcd_default_contrast(void)
+{
+ return 30;
+}
+
+void lcd_set_contrast(int val)
+{
+ lcd_write_command_e(lcd_contrast_set, 31 - val);
+}
+
+/* charcell specific */
+
+void lcd_double_height(bool on)
+{
+ if(new_lcd)
+ lcd_write_command(on ? (NEW_LCD_SET_DOUBLE_HEIGHT|1)
+ : NEW_LCD_SET_DOUBLE_HEIGHT);
+}
+
+void lcd_put_hw_char(int x, int y, unsigned char hw_char)
+{
+ lcd_write_command_e(LCD_CURSOR(x, y), hw_char);
+}
+
+void lcd_define_hw_pattern (int which, const char *pattern)
+{
+ lcd_write_command(lcd_pram | (which << 3));
+ lcd_write_data(pattern, 7);
+}
+
+void lcd_icon(int icon, bool enable)
+{
+ static const struct {
+ char pos;
+ char mask;
+ } icontab[] = {
+ { 0, 0x02}, { 0, 0x08}, { 0, 0x04}, { 0, 0x10}, /* Battery */
+ { 2, 0x04}, /* USB */
+ { 3, 0x10}, /* Play */
+ { 4, 0x10}, /* Record */
+ { 5, 0x02}, /* Pause */
+ { 5, 0x10}, /* Audio */
+ { 6, 0x02}, /* Repeat */
+ { 7, 0x01}, /* 1 */
+ { 9, 0x04}, /* Volume */
+ { 9, 0x02}, { 9, 0x01}, {10, 0x08}, {10, 0x04}, {10, 0x01}, /* Vol 1-5 */
+ {10, 0x10}, /* Param */
+ };
+ static char icon_mirror[11] = {0};
+
+ int pos, mask;
+
+ pos = icontab[icon].pos;
+ mask = icontab[icon].mask;
+
+ if (enable)
+ icon_mirror[pos] |= mask;
+ else
+ icon_mirror[pos] &= ~mask;
+
+ lcd_write_command_e(LCD_ICON(pos), icon_mirror[pos]);
+}
+
+/* device specific init */
+void lcd_init_device(void)
+{
+ unsigned char data_vector[64];
+
+ new_lcd = is_new_player();
+
+ if (new_lcd)
+ {
+ lcd_contrast_set = NEW_LCD_CONTRAST_SET;
+ lcd_cram = NEW_LCD_CRAM;
+ lcd_pram = NEW_LCD_PRAM;
+ lcd_iram = NEW_LCD_IRAM;
+
+ /* LCD init for cold start */
+ PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */
+ or_b(0x0f, &PBDRL); /* ... high */
+ or_b(0x0f, &PBIORL); /* ... and output */
+
+ lcd_write_command(NEW_LCD_FUNCTION_SET + 1); /* CGRAM selected */
+ lcd_write_command_e(NEW_LCD_CONTRAST_SET, 0x08);
+ lcd_write_command(NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET + 2);
+ /* oscillator on */
+ lcd_write_command(NEW_LCD_POWER_CONTROL_REGISTER_SET + 7);
+ /* opamp buffer + voltage booster on*/
+
+ memset(data_vector, 0x20, 64);
+ lcd_write_command(NEW_LCD_CRAM); /* Set DDRAM address */
+ lcd_write_data(data_vector, 64); /* all spaces */
+
+ memset(data_vector, 0, 64);
+ lcd_write_command(NEW_LCD_PRAM); /* Set CGRAM address */
+ lcd_write_data(data_vector, 64); /* zero out */
+ lcd_write_command(NEW_LCD_IRAM); /* Set ICONRAM address */
+ lcd_write_data(data_vector, 16); /* zero out */
+
+ lcd_write_command(NEW_LCD_DISPLAY_CONTROL_SET + 1); /* display on */
+ }
+ else
+ {
+ lcd_contrast_set = OLD_LCD_CONTRAST_SET;
+ lcd_cram = OLD_LCD_CRAM;
+ lcd_pram = OLD_LCD_PRAM;
+ lcd_iram = OLD_LCD_IRAM;
+
+#if 1
+ /* LCD init for cold start */
+ PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */
+ or_b(0x0f, &PBDRL); /* ... high */
+ or_b(0x0f, &PBIORL); /* ... and output */
+
+ lcd_write_command(0x61);
+ lcd_write_command(0x42);
+ lcd_write_command(0x57);
+
+ memset(data_vector, 0x24, 13);
+ lcd_write_command(OLD_LCD_CRAM); /* Set DDRAM address */
+ lcd_write_data(data_vector, 13); /* all spaces */
+ lcd_write_command(OLD_LCD_CRAM + 0x10);
+ lcd_write_data(data_vector, 13);
+ lcd_write_command(OLD_LCD_CRAM + 0x20);
+ lcd_write_data(data_vector, 13);
+
+ memset(data_vector, 0, 32);
+ lcd_write_command(OLD_LCD_PRAM); /* Set CGRAM address */
+ lcd_write_data(data_vector, 32); /* zero out */
+ lcd_write_command(OLD_LCD_IRAM); /* Set ICONRAM address */
+ lcd_write_data(data_vector, 13); /* zero out */
+ lcd_write_command(OLD_LCD_IRAM + 0x10);
+ lcd_write_data(data_vector, 13);
+
+ lcd_write_command(0x31);
+#else
+ /* archos look-alike code, left here for reference. As soon as the
+ * rockbox version is confirmed working, this will go away */
+ {
+ int i;
+
+ PBCR2 &= 0xc000;
+ PBIOR |= 0x000f;
+ PBDR |= 0x0002;
+ PBDR |= 0x0001;
+ PBDR |= 0x0004;
+ PBDR |= 0x0008;
+
+ for (i=0; i<200; i++) asm volatile ("nop"); /* wait 100 us */
+
+ PBDR &= 0xfffd; /* CS low (assert) */
+
+ for (i=0; i<100; i++) asm volatile ("nop"); /* wait 50 us */
+
+ lcd_write_command(0x61);
+ lcd_write_command(0x42);
+ lcd_write_command(0x57);
+
+ memset(data_vector, 0x24, 13);
+ lcd_write_command(0xb0); /* Set DDRAM address */
+ lcd_write_data(data_vector, 13); /* all spaces */
+ lcd_write_command(0xc0);
+ lcd_write_data(data_vector, 13);
+ lcd_write_command(0xd0);
+ lcd_write_data(data_vector, 13);
+
+ memset(data_vector, 0, 32);
+ lcd_write_command(0x80); /* Set CGRAM address */
+ lcd_write_data(data_vector, 32); /* zero out */
+ lcd_write_command(0xe0); /* Set ICONRAM address */
+ lcd_write_data(data_vector, 13); /* zero out */
+ lcd_write_command(0xf0);
+ lcd_write_data(data_vector, 13);
+
+ for (i=0; i<300000; i++) asm volatile ("nop"); /* wait 150 ms */
+
+ lcd_write_command(0x31);
+ lcd_write_command_e(0xa8, 0); /* Set contrast control */
+ }
+#endif
+ }
+ lcd_set_contrast(lcd_default_contrast());
+}
diff --git a/tools/configure b/tools/configure
index a691c98d7f..1b469c855b 100755
--- a/tools/configure
+++ b/tools/configure
@@ -661,7 +661,7 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
- toolset="$toolset scramble descramble sh2d generate_rocklatin uclpack"
+ toolset="$toolset scramble descramble sh2d uclpack"
# Note: the convbdf is present in the toolset just because: 1) the
# firmware/Makefile assumes it is present always, and 2) we will need it when we
diff --git a/uisimulator/common/lcd-playersim.c b/uisimulator/common/lcd-playersim.c
index 0e10acf437..4c658438d6 100644
--- a/uisimulator/common/lcd-playersim.c
+++ b/uisimulator/common/lcd-playersim.c
@@ -51,8 +51,8 @@ void lcd_print_icon(int x, int icon_line, bool enable, char **icon)
int row=0, col;
int p=0, cp=0;
- struct coordinate points[LCD_WIDTH * LCD_HEIGHT];
- struct coordinate clearpoints[LCD_WIDTH * LCD_HEIGHT];
+ struct coordinate points[SIM_LCD_WIDTH * SIM_LCD_HEIGHT];
+ struct coordinate clearpoints[SIM_LCD_WIDTH * SIM_LCD_HEIGHT];
while (icon[row]) {
col=0;
@@ -221,16 +221,15 @@ void lcd_double_height(bool on)
lcd_update();
}
-void lcd_define_hw_pattern(int which, const char *pattern, int length)
+void lcd_define_hw_pattern(int pat, const char *pattern)
{
int i, j;
- int pat = which / 8;
unsigned char icon[8];
memset(icon, 0, sizeof icon);
DEBUGF("Defining pattern %d:", pat);
for (j = 0; j <= 5; j++) {
- for (i = 0; i < length; i++) {
+ for (i = 0; i < 7; i++) {
if ((pattern[i])&(1<<(j)))
icon[5-j] |= (1<<(i));
}
diff --git a/uisimulator/sdl/lcd-charcell.c b/uisimulator/sdl/lcd-charcell.c
index cb31d6349b..8849efc7cd 100644
--- a/uisimulator/sdl/lcd-charcell.c
+++ b/uisimulator/sdl/lcd-charcell.c
@@ -132,8 +132,10 @@ void sim_backlight(int value)
/* initialise simulator lcd driver */
void sim_lcd_init(void)
{
- lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, LCD_WIDTH * display_zoom,
- LCD_HEIGHT * display_zoom, 8, 0, 0, 0, 0);
+ lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE,
+ SIM_LCD_WIDTH * display_zoom,
+ SIM_LCD_HEIGHT * display_zoom,
+ 8, 0, 0, 0, 0);
sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max,
0, (1<<LCD_DEPTH));
@@ -142,10 +144,10 @@ void sim_lcd_init(void)
#define BMP_COMPRESSION 0 /* BI_RGB */
#define BMP_NUMCOLORS (1 << LCD_DEPTH)
#define BMP_BPP 1
-#define BMP_LINESIZE (((LCD_WIDTH + 31) / 32) * 4)
+#define BMP_LINESIZE (((SIM_LCD_WIDTH + 31) / 32) * 4)
#define BMP_HEADERSIZE (54 + 4 * BMP_NUMCOLORS)
-#define BMP_DATASIZE (BMP_LINESIZE * LCD_HEIGHT)
+#define BMP_DATASIZE (BMP_LINESIZE * SIM_LCD_HEIGHT)
#define BMP_TOTALSIZE (BMP_HEADERSIZE + BMP_DATASIZE)
#define LE16_CONST(x) (x)&0xff, ((x)>>8)&0xff
@@ -159,8 +161,8 @@ static const unsigned char bmpheader[] =
LE32_CONST(BMP_HEADERSIZE), /* Offset to start of pixel data */
0x28, 0x00, 0x00, 0x00, /* Size of (2nd) header */
- LE32_CONST(LCD_WIDTH), /* Width in pixels */
- LE32_CONST(LCD_HEIGHT), /* Height in pixels */
+ LE32_CONST(SIM_LCD_WIDTH), /* Width in pixels */
+ LE32_CONST(SIM_LCD_HEIGHT), /* Height in pixels */
0x01, 0x00, /* Number of planes (always 1) */
LE16_CONST(BMP_BPP), /* Bits per pixel 1/4/8/16/24 */
LE32_CONST(BMP_COMPRESSION),/* Compression mode */
@@ -193,15 +195,15 @@ void screen_dump(void)
SDL_LockSurface(lcd_surface);
/* BMP image goes bottom up */
- for (y = LCD_HEIGHT - 1; y >= 0; y--)
+ for (y = SIM_LCD_HEIGHT - 1; y >= 0; y--)
{
Uint8 *src = (Uint8 *)lcd_surface->pixels
- + y * LCD_WIDTH * display_zoom * display_zoom;
+ + y * SIM_LCD_WIDTH * display_zoom * display_zoom;
unsigned char *dst = line;
unsigned dst_mask = 0x80;
memset(line, 0, sizeof(line));
- for (x = LCD_WIDTH; x > 0; x--)
+ for (x = SIM_LCD_WIDTH; x > 0; x--)
{
if (*src)
*dst |= dst_mask;