diff -ur orig/firmware/drivers/mas.h firmware/drivers/mas.h
--- orig/firmware/drivers/mas.h	Wed Jun 26 15:39:49 2002
+++ firmware/drivers/mas.h	Mon Jul 22 11:32:34 2002
@@ -60,6 +60,11 @@
 #define	MAS_REG_KPRESCALE       0xe7
 #define	MAS_REG_KBASS           0x6b
 #define	MAS_REG_KTREBLE         0x6f
+#define MAS_REG_KMDB_SWITCH     0x21
+#define MAS_REG_KMDB_STR        0x22
+#define MAS_REG_KMDB_HAR        0x23
+#define MAS_REG_KMDB_FC         0x24
+#define MAS_REG_KLOUDNESS       0x1e
 
 /*
  * MAS commands
diff -ur orig/firmware/mpeg.c firmware/mpeg.c
--- orig/firmware/mpeg.c	Sun Jul 21 10:12:39 2002
+++ firmware/mpeg.c	Mon Jul 22 11:54:48 2002
@@ -56,21 +56,30 @@
 {
     "%",    /* Volume */
     "dB",   /* Bass */
-    "dB"    /* Treble */
+    "dB",   /* Treble */
+    "",     /* Balance */
+    "dB",   /* Loudness */
+    "%"     /* Bass boost */
 };
 
 static int numdecimals[] =
 {
     0,    /* Volume */
     0,    /* Bass */
-    0     /* Treble */
+    0,    /* Treble */
+    0,    /* Balance */
+    0,    /* Loudness */
+    0     /* Bass boost */
 };
 
 static int minval[] =
 {
     0,    /* Volume */
     0,    /* Bass */
-    0     /* Treble */
+    0,    /* Treble */
+    0,    /* Balance */
+    0,    /* Loudness */
+    0     /* Bass boost */
 };
 
 static int maxval[] =
@@ -78,11 +87,14 @@
     50,    /* Volume */
 #ifdef ARCHOS_RECORDER
     24,    /* Bass */
-    24     /* Treble */
+    24,    /* Treble */
 #else
     30,    /* Bass */
-    30     /* Treble */
+    30,    /* Treble */
 #endif
+    100,   /* Balance */
+    17,    /* Loudness */
+    10     /* Bass boost */
 };
 
 static int defaultval[] =
@@ -90,11 +102,14 @@
     70/2,    /* Volume */
 #ifdef ARCHOS_RECORDER
     12+6,    /* Bass */
-    12+6     /* Treble */
+    12+6,    /* Treble */
 #else
     15+7,    /* Bass */
-    15+7     /* Treble */
+    15+7,    /* Treble */
 #endif
+    50,      /* Balance */
+    0,       /* Loudness */
+    0        /* Bass boost */
 };
 
 char *mpeg_sound_unit(int setting)
@@ -965,6 +980,34 @@
             set_prescaled_volume();
 #endif
             break;
+            
+#ifdef ARCHOS_RECORDER
+        case SOUND_SUPERBASS:
+            if (value) {
+                tmp = MAX(MIN(value * 10 * 1.2, 0x7f), 0);
+                mas_codec_writereg(MAS_REG_KMDB_STR, (tmp & 0xff) << 8);
+                tmp = 0x30; /* MDB_HAR: Space for experiment here */
+                mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0xff) << 8);
+                tmp = 60 / 10; /* calculate MDB_FC, 60hz - experiment here,
+                                  this would depend on the earphones...
+                                  perhaps make it tunable? */
+                mas_codec_writereg(MAS_REG_KMDB_FC, (tmp & 0xff) << 8);
+                tmp = 1.5 * tmp; /* calculate MDB_SHAPE */
+                mas_codec_writereg(MAS_REG_KMDB_SWITCH,
+                    ((tmp & 0xff) << 8) /* MDB_SHAPE */
+                    | 2);  /* MDB_SWITCH enable */
+            } else {
+                mas_codec_writereg(MAS_REG_KMDB_STR, 0);
+                mas_codec_writereg(MAS_REG_KMDB_HAR, 0);
+                mas_codec_writereg(MAS_REG_KMDB_SWITCH, 0); /* MDB_SWITCH disable */
+            }
+            break;
+            
+        case SOUND_LOUDNESS:
+            tmp = MAX(MIN(value * 4, 0x44), 0);
+            mas_codec_writereg(MAS_REG_KLOUDNESS, (tmp & 0xff) << 8);
+            break;
+#endif
     }
 #endif /* SIMULATOR */
 }
@@ -994,18 +1037,30 @@
             result = value - 15;
 #endif
             break;
+
+#ifdef ARCHOS_RECORDER            
+        case SOUND_LOUDNESS:
+            result = value;
+            break;
+            
+        case SOUND_SUPERBASS:
+            result = value * 10;
+            break;
+#endif
     }
     return result;
 }
 
-void mpeg_init(int volume, int bass, int treble)
+void mpeg_init(int volume, int bass, int treble, int loudness, int bass_boost)
 {
 #ifdef SIMULATOR
-    volume = bass = treble;
+    volume = bass = treble = loudness = bass_boost;
 #else
 #ifdef ARCHOS_RECORDER
     int rc;
     unsigned long val;
+#else
+    loudness = bass_boost;
 #endif
 
     setup_sci0();
@@ -1069,5 +1124,9 @@
     mpeg_sound_set(SOUND_BASS, bass);
     mpeg_sound_set(SOUND_TREBLE, treble);
     mpeg_sound_set(SOUND_VOLUME, volume);
+#ifdef ARCHOS_RECORDER
+    mpeg_sound_set(SOUND_LOUDNESS, loudness);
+    mpeg_sound_set(SOUND_SUPERBASS, bass_boost);
+#endif
 #endif /* SIMULATOR */
 }
diff -ur orig/firmware/mpeg.h firmware/mpeg.h
--- orig/firmware/mpeg.h	Tue Jul  2 18:55:50 2002
+++ firmware/mpeg.h	Mon Jul 22 09:22:06 2002
@@ -21,7 +21,7 @@
 
 #include <stdbool.h>
 
-void mpeg_init(int volume, int bass, int treble);
+void mpeg_init(int volume, int bass, int treble, int loudness, int bass_boost);
 void mpeg_play(char* trackname);
 void mpeg_stop(void);
 void mpeg_pause(void);
diff -ur orig/apps/debug_menu.c apps/debug_menu.c
--- orig/apps/debug_menu.c	Tue Jul 16 01:25:45 2002
+++ apps/debug_menu.c	Mon Jul 22 11:57:40 2002
@@ -341,18 +341,97 @@
 }
 #endif
 
+/* Read MAS registers and display them */
+void dbg_mas(void)
+{
+    char buf[32];
+    unsigned int addr = 0, r, i;
+    int button;
+
+    lcd_clear_display();
+    lcd_puts(0, 0, "MAS register read:");
+
+    while(1)
+    {
+        for (r = 0; r < 4; r++) {
+            i = mas_readreg(addr + r);
+            snprintf(buf, 30, "0x%02x: %08x", addr + r, i);
+            lcd_puts(1, r+1, buf);
+        }
+        
+        lcd_update();
+        sleep(HZ/16);
+
+        button = button_get(false);
+
+        switch(button)
+        {
+            case BUTTON_DOWN:
+                addr += 4;
+                break;
+            case BUTTON_UP:
+                if (addr) { addr -= 4; }
+                break;
+            case BUTTON_LEFT:
+                return;
+        }
+    }
+}
+
+#ifdef ARCHOS_RECORDER
+void dbg_mas_codec(void)
+{
+    char buf[32];
+    unsigned int addr = 0, r, i;
+    int button;
+
+    lcd_clear_display();
+    lcd_puts(0, 0, "MAS codec reg read:");
+
+    while(1)
+    {
+        for (r = 0; r < 4; r++) {
+            i = mas_codec_readreg(addr + r);
+            snprintf(buf, 30, "0x%02x: %08x", addr + r, i);
+            lcd_puts(1, r+1, buf);
+        }
+        
+        lcd_update();
+        sleep(HZ/16);
+
+        button = button_get(false);
+
+        switch(button)
+        {
+            case BUTTON_DOWN:
+                addr += 4;
+                break;
+            case BUTTON_UP:
+                if (addr) { addr -= 4; }
+                break;
+            case BUTTON_LEFT:
+                return;
+        }
+    }
+}
+#endif
+
 void debug_menu(void)
 {
     int m;
 
     struct menu_items items[] = {
-        { "Debug ports", dbg_ports },
+        { "View I/O ports", dbg_ports },
 #ifdef HAVE_LCD_BITMAP
 #ifdef HAVE_RTC
-        { "Debug RTC", dbg_rtc },
+        { "View/clr RTC RAM", dbg_rtc },
 #endif /* HAVE_RTC */
 #endif /* HAVE_LCD_BITMAP */
-        { "Debug OS", dbg_os },
+        { "View OS stacks", dbg_os },
+        { "View MAS regs", dbg_mas },
+#ifdef ARCHOS_RECORDER
+        { "View MAS codec", dbg_mas_codec },
+#endif
     };
 
     m=menu_init( items, sizeof items / sizeof(struct menu_items) );
diff -ur orig/apps/main.c apps/main.c
--- orig/apps/main.c	Tue Jul 16 11:48:16 2002
+++ apps/main.c	Mon Jul 22 09:22:33 2002
@@ -147,7 +147,9 @@
     
     mpeg_init( global_settings.volume,
                global_settings.bass,
-               global_settings.treble );
+               global_settings.treble,
+               global_settings.loudness,
+               global_settings.bass_boost );
 
     usb_start_monitoring();
 }
diff -ur orig/apps/settings.c apps/settings.c
--- orig/apps/settings.c	Mon Jul 15 21:55:15 2002
+++ apps/settings.c	Mon Jul 22 09:22:34 2002
@@ -209,7 +209,8 @@
     
     rtc_config_block[0xe] = (unsigned char)
         ((global_settings.playlist_shuffle & 1) |
-         ((global_settings.mp3filter & 1) << 1));
+         ((global_settings.mp3filter & 1) << 1) |
+         ((global_settings.sort_case & 1) << 2));
 
     rtc_config_block[0xf] = (unsigned char)
         ((global_settings.scroll_speed << 3) |
@@ -266,6 +267,7 @@
         if (rtc_config_block[0xe] != 0xFF) {
             global_settings.playlist_shuffle = rtc_config_block[0xe] & 1;
             global_settings.mp3filter = (rtc_config_block[0xe] >> 1) & 1;
+            global_settings.sort_case = (rtc_config_block[0xe] >> 2) & 1;
         }
     
         c = rtc_config_block[0xf] >> 3;
@@ -303,6 +305,7 @@
     global_settings.backlight   = DEFAULT_BACKLIGHT_SETTING;
     global_settings.wps_display = DEFAULT_WPS_DISPLAY;
     global_settings.mp3filter   = true;
+    global_settings.sort_case   = false;
     global_settings.playlist_shuffle = false;
     global_settings.total_boots = 0;
     global_settings.total_uptime = 0;
diff -ur orig/apps/settings.h apps/settings.h
--- orig/apps/settings.h	Mon Jul 15 14:02:12 2002
+++ apps/settings.h	Mon Jul 22 09:22:34 2002
@@ -52,8 +52,9 @@
 
     /* misc options */
 
-    int loop_playlist; /* do we return to top of playlist at end?            */
-    bool mp3filter;
+    int loop_playlist; /* do we return to top of playlist at end?  */
+    bool mp3filter;    /* only display mp3/m3u files and dirs in directory? */
+    bool sort_case;    /* dir sort order: 0=case insensitive, 1=sensitive */
     int scroll_speed;  /* long texts scrolling speed: 1-20 */
     bool playlist_shuffle;
 
diff -ur orig/apps/settings_menu.c apps/settings_menu.c
--- orig/apps/settings_menu.c	Mon Jul 15 14:02:12 2002
+++ apps/settings_menu.c	Mon Jul 22 09:22:34 2002
@@ -43,6 +43,11 @@
     set_bool( "[MP3/M3U filter]", &global_settings.mp3filter );
 }
 
+static void sort_case(void)
+{
+    set_bool( "[Sort case sensitive]", &global_settings.sort_case );
+}
+
 static void backlight_timer(void)
 {
     set_int( "[Backlight]", "s", &global_settings.backlight, 
@@ -68,6 +73,7 @@
     struct menu_items items[] = {
         { "Shuffle",         shuffle         }, 
         { "MP3/M3U filter",  mp3_filter      },
+        { "Sort mode",       sort_case       },
         { "Backlight Timer", backlight_timer },
         { "Scroll speed",    scroll_speed    },  
         { "While Playing",   wps_set },
diff -ur orig/apps/sound_menu.c apps/sound_menu.c
--- orig/apps/sound_menu.c	Mon Jul 15 14:02:12 2002
+++ apps/sound_menu.c	Mon Jul 22 11:48:03 2002
@@ -118,13 +118,29 @@
     set_sound("Treble", &global_settings.treble, SOUND_TREBLE);
 }
 
+#ifdef ARCHOS_RECORDER
+static void loudness(void)
+{
+    set_sound("Loudness", &global_settings.loudness, SOUND_LOUDNESS);
+};
+
+static void bass_boost(void)
+{
+    set_sound("Bass boost", &global_settings.bass_boost, SOUND_SUPERBASS);
+};
+#endif /* ARCHOS_RECORDER */
+
 void sound_menu(void)
 {
     int m;
     struct menu_items items[] = {
         { "Volume", volume },
         { "Bass",   bass },
-        { "Treble", treble }
+        { "Treble", treble },
+#ifdef ARCHOS_RECORDER
+        { "Loudness", loudness },
+        { "Bass Boost", bass_boost }
+#endif
     };
     
     m=menu_init( items, sizeof items / sizeof(struct menu_items) );
diff -ur orig/apps/tree.c apps/tree.c
--- orig/apps/tree.c	Wed Jul 17 14:25:04 2002
+++ apps/tree.c	Mon Jul 22 09:22:34 2002
@@ -114,7 +114,10 @@
     struct entry* e2 = *(struct entry**)p2;
     
     if (( e1->attr & ATTR_DIRECTORY ) == ( e2->attr & ATTR_DIRECTORY ))
-        return strncasecmp(e1->name, e2->name, TREE_MAX_FILENAMELEN);
+        if (global_settings.sort_case)
+            return strncmp(e1->name, e2->name, TREE_MAX_FILENAMELEN);
+        else
+            return strncasecmp(e1->name, e2->name, TREE_MAX_FILENAMELEN);
     else 
         return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY );
 }
