diff -urP /tmp/acroread_0_0/busybox-1.12.0/include/usage.h ./include/usage.h
--- /tmp/acroread_0_0/busybox-1.12.0/include/usage.h	2008-08-20 00:05:31.000000000 +0200
+++ ./include/usage.h	2008-09-16 10:35:34.000000000 +0200
@@ -136,9 +136,10 @@
      "\n	-d	Framebuffer device (default /dev/fb0)" \
      "\n	-i	Config file (var=value):" \
      "\n			BAR_LEFT,BAR_TOP,BAR_WIDTH,BAR_HEIGHT" \
-     "\n			BAR_R,BAR_G,BAR_B" \
+     "\n			BAR_R,BAR_G,BAR_B \
+     "\n			TEXT_LEFT,TEXT_TOP,TEXT_R,TEXT_G,TEXT_B,TEXT_SIZE" \
      "\n	-f	Control pipe (else exit after drawing image)" \
-     "\n			commands: 'NN' (% for progress bar) or 'exit'" \
+     "\n			commands: 'NN' (% for progress bar), 'write:string to print' or 'exit'" \
 
 #define brctl_trivial_usage \
        "COMMAND [BRIDGE [INTERFACE]]"
diff -urP /tmp/acroread_0_0/busybox-1.12.0/miscutils/Config.in ./miscutils/Config.in
--- /tmp/acroread_0_0/busybox-1.12.0/miscutils/Config.in	2008-08-06 00:56:08.000000000 +0200
+++ ./miscutils/Config.in	2008-09-16 10:41:51.000000000 +0200
@@ -221,6 +221,7 @@
 	    grep -q "fbsplash=on" </proc/cmdline && setsid fbsplash [params] &
 	  - commands for fifo:
 	    "NN" (ASCII decimal number) - percentage to show on progress bar
+	    "write:string to print" - print the string after the word "write:"
 	    "exit" - well you guessed it
 
 config INOTIFYD
diff -urP /tmp/acroread_0_0/busybox-1.12.0/miscutils/fbsplash.c ./miscutils/fbsplash.c
--- /tmp/acroread_0_0/busybox-1.12.0/miscutils/fbsplash.c	2008-08-06 00:56:08.000000000 +0200
+++ ./miscutils/fbsplash.c	2008-09-16 10:27:44.000000000 +0200
@@ -1,7 +1,6 @@
 /* vi: set sw=4 ts=4: */
 /*
- * Copyright (C) 2008 Michele Sanges <michele.sanges@otomelara.it>,
- * <michele.sanges@gmail.it>
+ * Copyright (C) 2008 Michele Sanges <michele.sanges@gmail.com>
  *
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  *
@@ -19,6 +18,7 @@
  *   grep -q "fbsplash=on" </proc/cmdline && setsid fbsplash [params]
  * - commands for fifo:
  *   "NN" (ASCII decimal number) - percentage to show on progress bar.
+ *   "write:string to print" - print the string after the word "write:"
  *   "exit" (or just close fifo) - well you guessed it.
  */
 
@@ -38,7 +38,7 @@
 	FILE *logfile_fd;	// log file
 #endif
 	unsigned char *addr;	// pointer to framebuffer memory
-	unsigned ns[7];		// n-parameters
+	unsigned ns[13];	// n-parameters
 	const char *image_filename;
 	struct fb_var_screeninfo scr_var;
 	struct fb_fix_screeninfo scr_fix;
@@ -55,6 +55,12 @@
 #define nbar_colr	ns[4]	// progress bar color red component
 #define nbar_colg	ns[5]	// progress bar color green component
 #define nbar_colb	ns[6]	// progress bar color blue component
+#define text_posx	ns[7]	// text horizontal position
+#define text_posy	ns[8]	// text vertical position
+#define text_colr	ns[9]	// text color red component
+#define text_colg	ns[10]	// text color green component
+#define text_colb	ns[11]	// text color blue component
+#define text_size	ns[12]	// text size (1 to 4)
 
 #if DEBUG
 #define DEBUG_MESSAGE(strMessage, args...) \
@@ -67,6 +73,1338 @@
 #endif
 
 
+static char fontmap[95][12] = {
+ //space (32) 
+{0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ // ! (33) 
+{0x00,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x00,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //" (34) 
+{0x00,
+0xA0,
+0xA0,
+0xA0,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //# (35) 
+{0x00,
+0x24,
+0x24,
+0x7E,
+0x28,
+0xFC,
+0x48,
+0x48,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //$ (36) 
+{0x00,
+0x20,
+0x78,
+0xA0,
+0x60,
+0x30,
+0x28,
+0xF0,
+0x20,
+0x20,
+0x00,
+0x00},
+
+ //% (37) 
+{0x00,
+0x64,
+0x98,
+0x98,
+0x7E,
+0x19,
+0x19,
+0x26,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //& (38) 
+{0x00,
+0x60,
+0x90,
+0x90,
+0x68,
+0x90,
+0x98,
+0x64,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //' (39) 
+{0x00,
+0x80,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //( (40) 
+{0x00,
+0x20,
+0x40,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x40,
+0x20,
+0x00},
+
+ //) (41) 
+{0x00,
+0x80,
+0x40,
+0x20,
+0x20,
+0x20,
+0x20,
+0x20,
+0x20,
+0x40,
+0x80,
+0x00},
+
+ //* (42) 
+{0x00,
+0x20,
+0xA8,
+0x70,
+0xA8,
+0x20,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //+ (43) 
+{0x00,
+0x00,
+0x20,
+0x20,
+0xF8,
+0x20,
+0x20,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //, (44) 
+{0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x40,
+0x40,
+0x80,
+0x00},
+
+ //- (45) 
+{0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0xC0,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //punto (112) 
+{0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ /// (47) 
+{0x00,
+0x20,
+0x20,
+0x40,
+0x40,
+0x40,
+0x40,
+0x40,
+0x80,
+0x80,
+0x00,
+0x00},
+
+ //0 (48) 
+{0x00,
+0x60,
+0x90,
+0x90,
+0x90,
+0x90,
+0x90,
+0x60,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //1 (49) 
+{0x00,
+0x40,
+0xC0,
+0x40,
+0x40,
+0x40,
+0x40,
+0xE0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //2 (50) 
+{0x00,
+0xE0,
+0x10,
+0x10,
+0x20,
+0x40,
+0x80,
+0xF0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //3 (51) 
+{0x00,
+0xE0,
+0x10,
+0x10,
+0x60,
+0x10,
+0x10,
+0xE0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //4 (52) 
+{0x00,
+0x10,
+0x30,
+0x50,
+0x90,
+0xF8,
+0x10,
+0x10,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //5 (53) 
+{0x00,
+0xF0,
+0x80,
+0x80,
+0xE0,
+0x10,
+0x10,
+0xE0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //6 (54) 
+{0x00,
+0x60,
+0x80,
+0x80,
+0xE0,
+0x90,
+0x90,
+0x60,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //7 (55) 
+{0x00,
+0xF0,
+0x10,
+0x20,
+0x20,
+0x40,
+0x40,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //8 (56) 
+{0x00,
+0x60,
+0x90,
+0x90,
+0x60,
+0x90,
+0x90,
+0x60,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //9 (57) 
+{0x00,
+0x60,
+0x90,
+0x90,
+0x70,
+0x10,
+0x10,
+0x60,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //: (58) 
+{0x00,
+0x00,
+0x00,
+0x80,
+0x80,
+0x00,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //; (59) 
+{0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x40,
+0x40,
+0x00,
+0x40,
+0x40,
+0x80},
+
+ //< (60) 
+{0x00,
+0x00,
+0x00,
+0x08,
+0x70,
+0x80,
+0x70,
+0x08,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //= (61) 
+{0x00,
+0x00,
+0x00,
+0x00,
+0xFC,
+0x00,
+0xFC,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //> (62) 
+{0x00,
+0x00,
+0x00,
+0x80,
+0x70,
+0x08,
+0x70,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //? (63) 
+{0x00,
+0xE0,
+0x10,
+0x10,
+0x20,
+0x40,
+0x00,
+0x40,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //@ (64) 
+{0x00,
+0x38,
+0x44,
+0x9A,
+0xAA,
+0xAA,
+0x9C,
+0x40,
+0x38,
+0x00,
+0x00,
+0x00},
+
+ //A (65) 
+{0x00,
+0x30,
+0x30,
+0x48,
+0x48,
+0xFC,
+0x84,
+0x84,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //B (66) 
+{0x00,
+0xE0,
+0x90,
+0x90,
+0xF0,
+0x88,
+0x88,
+0xF0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //C (67) 
+{0x00,
+0x38,
+0x44,
+0x80,
+0x80,
+0x80,
+0x44,
+0x38,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //D (68) 
+{0x00,
+0xF0,
+0x88,
+0x84,
+0x84,
+0x84,
+0x88,
+0xF0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //E (69) 
+{0x00,
+0xF8,
+0x80,
+0x80,
+0xF0,
+0x80,
+0x80,
+0xF8,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //F (70) 
+{0x00,
+0xF8,
+0x80,
+0x80,
+0xF0,
+0x80,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //G (71) 
+{0x00,
+0x38,
+0x44,
+0x80,
+0x9C,
+0x84,
+0x44,
+0x3C,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //H (72) 
+{0x00,
+0x84,
+0x84,
+0x84,
+0xFC,
+0x84,
+0x84,
+0x84,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //I (73) 
+{0x00,
+0xE0,
+0x40,
+0x40,
+0x40,
+0x40,
+0x40,
+0xE0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //J (74) 
+{0x00,
+0x60,
+0x20,
+0x20,
+0x20,
+0x20,
+0x20,
+0xC0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //K (75) 
+{0x00,
+0x88,
+0x90,
+0xA0,
+0xC0,
+0xA0,
+0x90,
+0x88,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //L (76) 
+{0x00,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0xF0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //M (77) 
+{0x00,
+0xC6,
+0xC6,
+0xAA,
+0xAA,
+0x92,
+0x92,
+0x82,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //N (78) 
+{0x00,
+0x84,
+0xC4,
+0xA4,
+0x94,
+0x8C,
+0x84,
+0x84,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //O (79) 
+{0x00,
+0x38,
+0x44,
+0x82,
+0x82,
+0x82,
+0x44,
+0x38,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //P (80) 
+{0x00,
+0xF0,
+0x88,
+0x88,
+0x88,
+0xF0,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //Q (81) 
+{0x00,
+0x38,
+0x44,
+0x82,
+0x82,
+0x82,
+0x44,
+0x38,
+0x08,
+0x06,
+0x00,
+0x00},
+
+ //R (82) 
+{0x00,
+0xF0,
+0x88,
+0x88,
+0xF0,
+0xA0,
+0x90,
+0x88,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //S (83) 
+{0x00,
+0x78,
+0x80,
+0x80,
+0x70,
+0x08,
+0x08,
+0xF0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //T (84) 
+{0x00,
+0xF8,
+0x20,
+0x20,
+0x20,
+0x20,
+0x20,
+0x20,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //U (85) 
+{0x00,
+0x84,
+0x84,
+0x84,
+0x84,
+0x84,
+0x84,
+0x78,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //V (86) 
+{0x00,
+0x84,
+0x84,
+0x84,
+0x48,
+0x48,
+0x30,
+0x30,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //W (87) 
+{0x00,
+0x92,
+0x92,
+0xAA,
+0xAA,
+0xAA,
+0x44,
+0x44,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //X (88) 
+{0x00,
+0x90,
+0x90,
+0x60,
+0x60,
+0x60,
+0x90,
+0x90,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //Y (89) 
+{0x00,
+0x88,
+0x50,
+0x50,
+0x20,
+0x20,
+0x20,
+0x20,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //Z (90) 
+{0x00,
+0xF0,
+0x10,
+0x20,
+0x40,
+0x40,
+0x80,
+0xF0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //[ (91) 
+{0x00,
+0xC0,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0xC0,
+0x00},
+
+ //\ (92) 
+{0x00,
+0x80,
+0x80,
+0x40,
+0x40,
+0x40,
+0x40,
+0x40,
+0x20,
+0x20,
+0x00,
+0x00},
+
+ //] (93) 
+{0x00,
+0xC0,
+0x40,
+0x40,
+0x40,
+0x40,
+0x40,
+0x40,
+0x40,
+0x40,
+0xC0,
+0x00},
+
+ //^ (94) 
+{0x00,
+0x20,
+0x50,
+0x88,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //_ (95) 
+{0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0xF0,
+0x00,
+0x00},
+
+ //  (32) 
+{0x00,
+0x80,
+0x40,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //a (97) 
+{0x00,
+0x00,
+0x00,
+0x60,
+0x10,
+0x70,
+0x90,
+0x70,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //b (98) 
+{0x80,
+0x80,
+0x80,
+0xE0,
+0x90,
+0x90,
+0x90,
+0xE0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //c (99) 
+{0x00,
+0x00,
+0x00,
+0x60,
+0x80,
+0x80,
+0x80,
+0x60,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //d (100) 
+{0x10,
+0x10,
+0x10,
+0x70,
+0x90,
+0x90,
+0x90,
+0x70,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //e (101) 
+{0x00,
+0x00,
+0x00,
+0x60,
+0x90,
+0xF0,
+0x80,
+0x70,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //f (102) 
+{0x60,
+0x80,
+0x80,
+0xE0,
+0x80,
+0x80,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //g (103) 
+{0x00,
+0x00,
+0x00,
+0x70,
+0x90,
+0x90,
+0x90,
+0x70,
+0x10,
+0x60,
+0x00,
+0x00},
+
+ //h (104) 
+{0x80,
+0x80,
+0x80,
+0xE0,
+0x90,
+0x90,
+0x90,
+0x90,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //i (105) 
+{0x00,
+0x80,
+0x00,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //j (106) 
+{0x00,
+0x40,
+0x00,
+0xC0,
+0x40,
+0x40,
+0x40,
+0x40,
+0x40,
+0x80,
+0x00,
+0x00},
+
+ //k (107) 
+{0x80,
+0x80,
+0x80,
+0x90,
+0xA0,
+0xC0,
+0xA0,
+0x90,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //l (108) 
+{0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //m (109) 
+{0x00,
+0x00,
+0x00,
+0xEC,
+0x92,
+0x92,
+0x92,
+0x92,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //n (110) 
+{0x00,
+0x00,
+0x00,
+0xE0,
+0x90,
+0x90,
+0x90,
+0x90,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //o (111) 
+{0x00,
+0x00,
+0x00,
+0x60,
+0x90,
+0x90,
+0x90,
+0x60,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //p (112) 
+{0x00,
+0x00,
+0x00,
+0xE0,
+0x90,
+0x90,
+0x90,
+0xE0,
+0x80,
+0x80,
+0x00,
+0x00},
+
+ //q (113) 
+{0x00,
+0x00,
+0x00,
+0x70,
+0x90,
+0x90,
+0x90,
+0x70,
+0x10,
+0x10,
+0x00,
+0x00},
+
+ //r (114) 
+{0x00,
+0x00,
+0x00,
+0xA0,
+0xC0,
+0x80,
+0x80,
+0x80,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //s (115) 
+{0x00,
+0x00,
+0x00,
+0xE0,
+0x80,
+0x40,
+0x20,
+0xE0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //t (116) 
+{0x00,
+0x00,
+0x80,
+0xC0,
+0x80,
+0x80,
+0x80,
+0x40,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //u (117) 
+{0x00,
+0x00,
+0x00,
+0x90,
+0x90,
+0x90,
+0x90,
+0x70,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //v (118) 
+{0x00,
+0x00,
+0x00,
+0x88,
+0x50,
+0x50,
+0x50,
+0x20,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //w (119) 
+{0x00,
+0x00,
+0x00,
+0x92,
+0x92,
+0xAA,
+0x6C,
+0x44,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //x (120) 
+{0x00,
+0x00,
+0x00,
+0xA0,
+0x40,
+0x40,
+0x40,
+0xA0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //y (121) 
+{0x00,
+0x00,
+0x00,
+0x88,
+0x50,
+0x50,
+0x50,
+0x20,
+0x20,
+0x40,
+0x00,
+0x00},
+
+ //z (122) 
+{0x00,
+0x00,
+0x00,
+0xE0,
+0x20,
+0x40,
+0x80,
+0xE0,
+0x00,
+0x00,
+0x00,
+0x00},
+
+ //{ (123) 
+{0x00,
+0x20,
+0x40,
+0x40,
+0x40,
+0x40,
+0x80,
+0x40,
+0x40,
+0x40,
+0x20,
+0x00},
+
+ //| (124) 
+{0x00,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x80,
+0x00},
+
+ //} (125) 
+{0x00,
+0x80,
+0x40,
+0x40,
+0x40,
+0x40,
+0x20,
+0x40,
+0x40,
+0x40,
+0x80,
+0x00},
+
+ //~ (126) 
+{0x00,
+0x60,
+0x90,
+0x90,
+0x60,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00,
+0x00}};
+
+
 /**
  *	Open and initialize the framebuffer device
  * \param *strfb_device pointer to framebuffer device
@@ -213,9 +1551,13 @@
 
 
 /**
- *	Draw image from PPM file
+ *	Draws a PPM image.
+ * \param nXPos horizontal position from which draw the image.
+ * \param nYPos vertical position from which draw the image. With nXPos=-1 and nYPos=-1, draws the full image.
+ * \param nXDim horizontal dimension of the image section to draw.
+ * \param nYDim vertical dimension of the image section to draw.
  */
-static void fb_drawimage(void)
+static void fb_drawimage(int nXPos, int nYPos, int nXDim, int nYDim)
 {
 	char head[256];
 	char s[80];
@@ -254,13 +1596,29 @@
 		height = G.scr_var.yres;
 
 	pixline = xmalloc(line_size);
-	for (j = 0; j < height; j++) {
-		unsigned char *pixel = pixline;
-		DATA *src = (DATA *)(G.addr + j * G.scr_fix.line_length);
+
+	if (nYPos == -1) {
+		nYPos = 0;
+	}
+	else {
+		fseek(theme_file, line_size * nYPos, SEEK_CUR);
+		height = nYPos + nYDim;
+	}
+
+	if (nXPos == -1) {
+		nXPos = 0;
+	}
+	else {
+		width = nXPos + nXDim;
+	}
+
+	for (j = nYPos; j < height; j++) {
+		unsigned char *pixel = pixline + 3 * nXPos;
+		DATA *src = (DATA *)(G.addr + (j * G.scr_var.xres + nXPos) * BYTES_PER_PIXEL);
 
 		if (fread(pixline, 1, line_size, theme_file) != line_size)
 			bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
-		for (i = 0; i < width; i++) {
+		for (i = nXPos; i < width; i++) {
 			unsigned thispix;
 			thispix = (((unsigned)pixel[0] << 8) & 0xf800)
 				| (((unsigned)pixel[1] << 3) & 0x07e0)
@@ -275,6 +1633,71 @@
 
 
 /**
+ *	Draws a single character on framebuffer.
+ * \param nXPos horizontal position from which draw the character.
+ * \param nYPos vertical position from which draw the character.
+ * \param nCharSize character scale factor [1..4].
+ * \param nChar character to draw.
+ */
+static void fb_drawchar(int nXPos, int nYPos, int nCharSize, int nChar)
+{
+	unsigned char nred, ngreen, nblue;
+	DATA *ptr, thispix;
+
+	nred = G.text_colr;
+	ngreen = G.text_colg;
+	nblue = G.text_colb;
+
+	nred   >>= 3;  // 5-bit red
+	ngreen >>= 2;  // 6-bit green
+	nblue  >>= 3;  // 5-bit blue
+	thispix = nblue + (ngreen << 5) + (nred << (5+6));
+
+	for (int nHeight = 0; nHeight < 12 * nCharSize; nHeight++) {
+		for (int nWidth = 0; nWidth < 8 * nCharSize; nWidth++) {
+			ptr = (DATA*)(G.addr + ((nYPos + nHeight) * G.scr_var.xres + (nXPos + nWidth)) * BYTES_PER_PIXEL);
+			if ((fontmap[nChar - 32][nHeight / nCharSize] & (0x80 >> (nWidth / nCharSize))) != 0) {
+				*ptr = thispix;
+			}
+		}
+	}
+}
+
+
+/**
+ *	Draws a string on framebuffer.
+ * \param *strString pointer to the string.
+ */
+static void fb_drawstring(char *strString)
+{
+	int nCharSize;
+	static int nOldCharSize = -1;
+	static int nOldStringSize = -1;		// in pixel
+
+	// size check
+	nCharSize = G.text_size;
+	if (nCharSize < 1)
+		nCharSize = 1;
+	else if (nCharSize > 4)
+		nCharSize = 4;
+
+	// redraws the portion of image interested to the old write operation
+	if (nOldStringSize != -1) {
+		fb_drawimage(G.text_posx, G.text_posy, nOldStringSize, 12 * nCharSize);
+	}
+
+	// new write operation
+	for (int nCharNum = 0; nCharNum < strlen(strString); nCharNum++) {
+		char c = *(strString + nCharNum);
+		fb_drawchar(G.text_posx + 8 * nCharSize * nCharNum, G.text_posy, nCharSize, c);
+	}
+
+	nOldCharSize = nCharSize;
+	nOldStringSize = 8 * nCharSize * strlen(strString);
+}
+
+
+/**
  *	Parse configuration file
  * \param *cfg_filename name of the configuration file
  */
@@ -283,7 +1706,8 @@
 	static const char const param_names[] ALIGN1 =
 		"BAR_WIDTH\0" "BAR_HEIGHT\0"
 		"BAR_LEFT\0" "BAR_TOP\0"
-		"BAR_R\0" "BAR_G\0" "BAR_B\0"
+		"BAR_R\0" "BAR_G\0" "BAR_B\0" 
+		"TEXT_LEFT\0" "TEXT_TOP\0" "TEXT_R\0" "TEXT_G\0" "TEXT_B\0" "TEXT_SIZE\0"
 #if DEBUG
 		"DEBUG\0"
 #endif
@@ -296,10 +1720,10 @@
 		int i = index_in_strings(param_names, token[0]);
 		if (i < 0)
 			bb_error_msg_and_die("syntax error: '%s'", token[0]);
-		if (i >= 0 && i < 7)
+		if (i >= 0 && i < 13)
 			G.ns[i] = val;
 #if DEBUG
-		if (i == 7) {
+		if (i == 13) {
 			G.bdebug_messages = val;
 			if (G.bdebug_messages)
 				G.logfile_fd = xfopen_for_write("/tmp/fbsplash.log");
@@ -343,7 +1767,7 @@
 		full_write(STDOUT_FILENO, "\x1b" "[?25l", 6);
 	}
 
-	fb_drawimage();
+	fb_drawimage(-1, -1, -1, -1);
 
 	if (!fifo_filename)
 		return EXIT_SUCCESS;
@@ -374,6 +1798,11 @@
 			DEBUG_MESSAGE("exit");
 			break;
 		}
+		else if (strncmp(num_buf, "write:", 6) == 0) {
+			fb_drawstring(num_buf + 6);
+			continue;
+		}
+
 		num = atoi(num_buf);
 		if (isdigit(num_buf[0]) && (num <= 100)) {
 #if DEBUG
diff -urP /tmp/acroread_0_0/busybox-1.12.0/miscutils/fbsplash.cfg ./miscutils/fbsplash.cfg
--- /tmp/acroread_0_0/busybox-1.12.0/miscutils/fbsplash.cfg	2008-08-06 00:56:08.000000000 +0200
+++ ./miscutils/fbsplash.cfg	2008-09-16 09:46:04.000000000 +0200
@@ -7,3 +7,12 @@
 BAR_R=80
 BAR_G=80
 BAR_B=130
+# text position
+TEXT_LEFT=100
+TEXT_TOP=350
+# text color
+TEXT_R=80
+TEXT_G=80
+TEXT_B=130
+# text size (1 to 4)
+TEXT_SIZE=2
