В документации к языку написано, что функция конвертирует только символы из Latin-1. Следовательно, стоит ожидать, что символы вне Latin1 она не изменит. Для русских символов была написана примитивная функция "капитализации". однако.
Код:
MODULE PrivTest;
   
   IMPORT Log;
   
   PROCEDURE Cap* (ch: CHAR): CHAR;
      VAR res: CHAR;
   BEGIN
      res := CAP(ch);
      CASE res OF
      'а': res := 'А' | 'б': res := 'Б' | 'в': res := 'В' | 'г': res := 'Г' | 'д': res := 'Д' | 
      'е': res := 'Е' | 'ё': res := 'Ё' | 'ж': res := 'Ж' | 'з': res := 'З' | 'и': res := 'И' | 
      'й': res := 'И' | 'к': res := 'К' | 'л': res := 'Л' | 'м': res := 'М' | 'н': res := 'Н' | 
      'о': res := 'О' | 'п': res := 'П' | 'р': res := 'Р' | 'с': res := 'С' | 'т': res := 'Т' | 
      'у': res := 'У' | 'ф': res := 'Ф' | 'х': res := 'Х' | 'ц': res := 'Ц' | 'ч': res := 'Ч' | 
      'ш': res := 'Ш' | 'щ': res := 'Щ' | 'ъ': res := 'Ъ' | 'ы': res := 'Ы' | 'ь': res := 'Ь' | 
      'э': res := 'Э' | 'ю': res := 'Ю' | 'я': res := 'Я'
      ELSE
      END;
      RETURN res
   END Cap;
   PROCEDURE CapThis(VAR s: ARRAY OF CHAR);
   VAR i: INTEGER;
   BEGIN
      FOR i:=0 TO LEN(s$)-1 DO s[i]:=Cap(s[i]) END;
   END CapThis;
   
   PROCEDURE Do*;
   VAR s: ARRAY 128 OF CHAR;
   BEGIN
      s:='abcdefghijklmnopqrstuvwxyzабвгдеёжзиклмнопрстуфхцчшщъыьэюя';
      CapThis(s); Log.Ln; Log.String(s$);
      s:='ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
      CapThis(s); Log.Ln; Log.String(s$);
   END Do;
END PrivTest.
PrivTest.Do
на выходе получаем:
Код:
ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏ
то есть, похоже, что все символы в {Р .. Я} портятся в CAP.
наверное, тема относится к русификации в большей мере