Index: /branches/grand/include/conf.h
===================================================================
--- /branches/grand/include/conf.h	(revision 113)
+++ /branches/grand/include/conf.h	(revision 114)
@@ -56,8 +56,9 @@
 
     char reader_file[100];
-    int reader_pos;
-    int reader_autoscroll;
-    int reader_autoscroll_delay;
+    int  reader_pos;
+    int  reader_autoscroll;
+    int  reader_autoscroll_delay;
     char reader_rbf_file[100];
+    int  reader_codepage;
 
     int sokoban_level;
Index: /branches/grand/include/font.h
===================================================================
--- /branches/grand/include/font.h	(revision 113)
+++ /branches/grand/include/font.h	(revision 114)
@@ -10,4 +10,7 @@
 #define FONT_KEYRUS     3
 
+#define FONT_CP_WIN     0
+#define FONT_CP_DOS     1
+
 //-------------------------------------------------------------------
 extern const unsigned char *current_font;
@@ -20,4 +23,5 @@
 extern int rbf_font_height();
 extern int rbf_char_width(int ch);
+extern void rbf_set_codepage(int codepage);
 extern int rbf_draw_char(int x, int y, int ch, color cl);
 
Index: /branches/grand/lib/font/rbf_font.c
===================================================================
--- /branches/grand/lib/font/rbf_font.c	(revision 113)
+++ /branches/grand/lib/font/rbf_font.c	(revision 114)
@@ -1,4 +1,5 @@
 #include "stdlib.h"
 #include "gui.h"
+#include "font.h"
 
 //-------------------------------------------------------------------
@@ -8,5 +9,16 @@
 //-------------------------------------------------------------------
 const char *RBF_HDR_MAGIC = "\xE0\x0E\xF0\x0D\x03\x00\x00\x00";
-
+/*
+const char tbl_dos2win[] = {
+    192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
+    208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
+    224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
+    136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
+    152,153,154,129,156,157,158,159,160,161,162,163,164,165,166,167,
+    168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,
+    240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
+    130,132,135,134,128,133,131,155,184,185,186,187,188,189,190,191
+};
+*/
 static struct {
      char name[RBF_MAX_NAME];
@@ -25,13 +37,38 @@
      int _unknown4;
 } rbf_font;
-static int need_free=0;;
+static int need_free    = 0;
+static int rbf_codepage = FONT_CP_WIN; 
 
 //-------------------------------------------------------------------
 static int win2dos(int ch) {
-    if (ch>=192 && ch<=255) {
-       if (ch<=239) ch-=64;
-       else         ch-=16;
-    }
-    return ch;
+    switch (ch) {
+        case 0xAA: return 0xF2;  // ò
+        case 0xBA: return 0xF3;  // ó
+        case 0xAF: return 0xF4;  // ô
+        case 0xBF: return 0xF5;  // õ
+        default:
+            if (ch>=192 && ch<=255) {
+               if (ch<=239) ch-=64;
+               else         ch-=16;
+            }
+            return ch;
+    }
+}
+
+//-------------------------------------------------------------------
+static int dos2win(int ch) {
+    switch (ch) {
+        case 0xF2: return 0xAA;  // ò
+        case 0xF3: return 0xBA;  // ó
+        case 0xF4: return 0xAF;  // ô
+        case 0xF5: return 0xBF;  // õ
+        default:
+            if (ch>=128 && ch<=175) {
+               ch+=64;
+            } else if (ch>=224 && ch<=239) {
+               ch+=16;
+            }
+            return ch;
+    }
 }
 
@@ -89,11 +126,11 @@
         lseek(fd, rbf_font._wmapAddr, SEEK_SET);
         for (i=rbf_font.charFirst; i<=rbf_font.charLast; ++i) {
-            read(fd, &rbf_font.wTable[win2dos(i)], 1);
+            read(fd, &rbf_font.wTable[i], 1);
         }
 
         lseek(fd, rbf_font._cmapAddr, SEEK_SET);
         for (i=rbf_font.charFirst; i<=rbf_font.charLast; ++i) {
-            rbf_font.cTable[win2dos(i)]=malloc(rbf_font.charSize);
-            read(fd, rbf_font.cTable[win2dos(i)], rbf_font.charSize);
+            rbf_font.cTable[i]=malloc(rbf_font.charSize);
+            read(fd, rbf_font.cTable[i], rbf_font.charSize);
         }
         need_free = 1;
@@ -129,8 +166,13 @@
 
     for (i=rbf_font.charFirst; i<=rbf_font.charLast; ++i) {
-        rbf_font.cTable[i]=malloc(rbf_font.charSize);
-        memcpy(rbf_font.cTable[i], font+i*rbf_font.charSize, rbf_font.charSize);
+        rbf_font.cTable[dos2win(i)]=malloc(rbf_font.charSize);
+        memcpy(rbf_font.cTable[dos2win(i)], font+i*rbf_font.charSize, rbf_font.charSize);
     }
     need_free = 1;
+}
+
+//-------------------------------------------------------------------
+void rbf_set_codepage(int codepage) {
+    rbf_codepage = codepage;
 }
 
@@ -142,4 +184,11 @@
 //-------------------------------------------------------------------
 int rbf_char_width(int ch) {
+    switch (rbf_codepage) {
+        case FONT_CP_WIN: 
+            break;
+        case FONT_CP_DOS: 
+            ch = dos2win(ch); 
+            break;
+    }
     return rbf_font.wTable[ch];
 }
@@ -149,11 +198,19 @@
     int xx, yy;
 
-    for (yy=0; yy<rbf_font.height; ++yy){
-	for (xx=0; xx<rbf_font.wTable[ch]; ++xx){
+    switch (rbf_codepage) {
+        case FONT_CP_WIN: 
+            break;
+        case FONT_CP_DOS: 
+            ch = dos2win(ch); 
+            break;
+    }
+
+    for (yy=0; yy<rbf_font.height; ++yy) {
+	for (xx=0; xx<rbf_font.wTable[ch]; ++xx) {
             draw_pixel(x+xx ,y+yy, (rbf_font.cTable[ch][yy*rbf_font.width/8+xx/8] & (1<<(xx%8)))? cl&0xff : cl>>8);
 	}
     }
-    return rbf_char_width(ch);
-}
-
-//-------------------------------------------------------------------
+    return rbf_font.wTable[ch];
+}
+
+//-------------------------------------------------------------------
Index: /branches/grand/core/conf.c
===================================================================
--- /branches/grand/core/conf.c	(revision 113)
+++ /branches/grand/core/conf.c	(revision 114)
@@ -103,4 +103,5 @@
     CONF_INFO( 44, conf.reader_autoscroll_delay, CONF_DEF_VALUE, i:5, NULL),
     CONF_INFO( 45, conf.reader_rbf_file,        CONF_DEF_PTR,   ptr:"", NULL),
+    CONF_INFO( 46, conf.reader_codepage,        CONF_DEF_VALUE, i:FONT_CP_WIN, NULL),
 };
 #define CONF_NUM (sizeof(conf_info)/sizeof(conf_info[0]))
Index: /branches/grand/core/gui.c
===================================================================
--- /branches/grand/core/gui.c	(revision 113)
+++ /branches/grand/core/gui.c	(revision 114)
@@ -58,4 +58,5 @@
 static const char* gui_raw_prefix_enum(int change, int arg);
 static const char* gui_raw_ext_enum(int change, int arg);
+static const char* gui_reader_codepage_enum(int change, int arg);
 
 // Menu callbacks
@@ -98,7 +99,8 @@
     {"Open new file...",            MENUITEM_PROC,    (int*)gui_draw_read },
     {"Open last opened file",       MENUITEM_PROC,    (int*)gui_draw_read_last },
+    {"Select RBF font",             MENUITEM_PROC,    (int*)gui_draw_load_rbf },
+    {"Codepage",                    MENUITEM_ENUM,    (int*)gui_reader_codepage_enum },
     {"Enable autoscroll",           MENUITEM_BOOL,    &conf.reader_autoscroll },
     {"Autoscroll delay (sec)",      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.reader_autoscroll_delay, MENU_MINMAX(0, 60) },
-    {"Select RBF font",             MENUITEM_PROC,    (int*)gui_draw_load_rbf },
     {"<- Back",                     MENUITEM_UP },
     {0}
@@ -328,4 +330,17 @@
 
     return exts[conf.raw_ext];
+}
+
+//-------------------------------------------------------------------
+const char* gui_reader_codepage_enum(int change, int arg) {
+    static const char* cps[]={ "Win1251", "DOS"};
+
+    conf.reader_codepage+=change;
+    if (conf.reader_codepage<0)
+        conf.reader_codepage=(sizeof(cps)/sizeof(cps[0]))-1;
+    else if (conf.reader_codepage>=(sizeof(cps)/sizeof(cps[0])))
+        conf.reader_codepage=0;
+
+    return cps[conf.reader_codepage];
 }
 
@@ -858,4 +873,5 @@
         if (!rbf_load(conf.reader_rbf_file))
             rbf_load_from_8x16(current_font);
+        rbf_set_codepage(conf.reader_codepage);
         gui_mode = GUI_MODE_READ;
         gui_read_init(fn);
