Index: firmware/font.c
===================================================================
--- firmware/font.c	(revision 27631)
+++ firmware/font.c	(working copy)
@@ -28,6 +28,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <stdlib.h>
 #include "inttypes.h"
 #include "lcd.h"
 #include "font.h"
@@ -624,27 +625,47 @@
     return;
 }
 
+static int ushortcmp(const void *a, const void *b)
+{
+    return ((int)(*(unsigned short*)a - *(unsigned short*)b));
+}
+
+
 static void glyph_cache_load(struct font* pf)
 {
+#define GLYPH_CHUNK 32
     if (pf->fd >= 0) {
         int fd;
+        int i, size;
         unsigned char tmp[2];
         unsigned short ch;
+        unsigned short glyphs[GLYPH_CHUNK];
 
         fd = open(GLYPH_CACHE_FILE, O_RDONLY|O_BINARY);
 
         if (fd >= 0) {
 
-            while (read(fd, tmp, 2) == 2) {
-                ch = (tmp[0] << 8) | tmp[1];
-                font_get_bits(pf, ch);
+            while(1) {
+                
+                size = 0;
+                while ( read(fd, tmp, 2) == 2 && size < GLYPH_CHUNK ) {
+                    glyphs[size] = (tmp[0] << 8) | tmp[1];
+                    size++;
+                }
+                /* sort glyphs array to make sector cache happy */
+                qsort((void *)glyphs, size, sizeof(unsigned short), 
+                      ushortcmp );
+
+                for ( i = 0; i < size ; i++) 
+                    font_get_bits(pf, glyphs[i]);
+                
+                if ( size < GLYPH_CHUNK )
+                    break;
             }
-
             close(fd);
         } else {
             /* load latin1 chars into cache */
-            ch = 256;
-            while (ch-- > 32)
+            for ( ch = 32 ; ch < 256 ; ch++ );
                 font_get_bits(pf, ch);
         }
     }
