diff --git a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
index 0d990dc..55486bb 100644
--- a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
+++ b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
@@ -493,28 +493,29 @@ void lcd_update(void)
 void lcd_update_rect(int x, int y, int width, int height)
 {
     const fb_data *ptr;
-    int xmax, ymax;

     if (!display_on)
         return;

-    xmax = x + width;
-    if (xmax >= LCD_WIDTH)
-        xmax = LCD_WIDTH - 1; /* Clip right */
-    if (x < 0)
-        x = 0;                /* Clip left */
-    if (x >= xmax)
-        return; /* nothing left to do */
-
-    width = xmax - x + 1;     /* Fix width */
+    /* nothing to draw? */
+    if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) || 
+        (y >= LCD_HEIGHT) || (x + width <= 0) || (y + height <= 0))
+        return;

-    ymax = y + height;
-    if (ymax >= LCD_HEIGHT)
-        ymax = LCD_HEIGHT - 1; /* Clip bottom */
+    if (x < 0)
+    {   /* clip left */
+        width += x;
+        x = 0;
+    }
     if (y < 0)
-        y = 0; /* Clip top */
-    if (y >= ymax)
-        return; /* nothing left to do */
+    {   /* clip top */
+        height += y;
+        y = 0;
+    }
+    if (x + width > LCD_WIDTH)
+        width = LCD_WIDTH - x; /* clip right */
+    if (y + height > LCD_HEIGHT)
+        height = LCD_HEIGHT - y; /* clip bottom */

     lcd_write_reg(R_ENTRY_MODE, r_entry_mode);

@@ -523,11 +524,10 @@ void lcd_update_rect(int x, int y, int width, int height)

     ptr = &lcd_framebuffer[y][x];

-    height = ymax - y; /* fix height */
     do
     {
         lcd_write_data(ptr, width);
         ptr += LCD_WIDTH;
     }
-    while (--height >= 0);
+    while (--height > 0);
 }
diff --git a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
index f9d5e5a..3332e0c 100644
--- a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
+++ b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
@@ -444,43 +444,43 @@ void lcd_update(void)
 void lcd_update_rect(int x, int y, int width, int height)
 {
     const fb_data *ptr;
-    int xmax, ymax;

     if (!display_on)
         return;

-    xmax = x + width;
-    if (xmax >= LCD_WIDTH)
-        xmax = LCD_WIDTH - 1; /* Clip right */
-    if (x < 0)
-        x = 0;                /* Clip left */
-    if (x >= xmax)
-        return; /* nothing left to do */
-
-    width = xmax - x + 1;     /* Fix width */
+    /* nothing to draw? */
+    if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) || 
+        (y >= LCD_HEIGHT) || (x + width <= 0) || (y + height <= 0))
+        return;

-    ymax = y + height;
-    if (ymax >= LCD_HEIGHT)
-        ymax = LCD_HEIGHT - 1; /* Clip bottom */
+    if (x < 0)
+    {   /* clip left */
+        width += x;
+        x = 0;
+    }
     if (y < 0)
-        y = 0; /* Clip top */
-    if (y >= ymax)
-        return; /* nothing left to do */
+    {   /* clip top */
+        height += y;
+        y = 0;
+    }
+    if (x + width > LCD_WIDTH)
+        width = LCD_WIDTH - x; /* clip right */
+    if (y + height > LCD_HEIGHT)
+        height = LCD_HEIGHT - y; /* clip bottom */

     lcd_write_reg(R_ENTRY_MODE, r_entry_mode);

-    lcd_window_x(x, xmax);
-    lcd_window_y(y, ymax);
+    lcd_window_x(x, x + width - 1);
+    lcd_window_y(y, y + height -1);

     lcd_write_cmd(R_WRITE_DATA_2_GRAM);

     ptr = &lcd_framebuffer[y][x];

-    height = ymax - y; /* fix height */
     do
     {
         lcd_write_data(ptr, width);
         ptr += LCD_WIDTH;
     }
-    while (--height >= 0);
+    while (--height > 0);
 }