OSDev

для всех
Текущее время: 29 апр 2024, 11:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Unicode
СообщениеДобавлено: 27 сен 2007, 20:24 

Зарегистрирован: 26 апр 2007, 16:22
Сообщения: 67
Никто не знает, как загрузить UTF-16 в знакогенератор? А во всех доках по VGA-шным карточкам расписан только алгоритм загрузки таблицы из 256 символов.
Собственно, в линуксе (у меня Debian), скрипт при загрузке как раз юникод и грузит (причем, похоже, UTF-8 - как им
это удалось, ведь видюха не оценит символы переменной длины). Порывшись в скрипте, я обнаружил, что таблица грузится через ioctl(), т.е. это фича ядра, однако в ядре я так и не нашел это место :) Может, кто уже пробовал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 27 сен 2007, 21:42 
Quark, Че-то ты гонишь... код символа не требуется грузить в знакогенератор... туда надо грузить изображение символа.


Вернуться к началу
  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 27 сен 2007, 22:10 

Зарегистрирован: 26 апр 2007, 16:22
Сообщения: 67
Вполне возможно. Только мне кажется, что ВЕСЬ юникод туда не влезет, поэтому нужно установить соответствие между комбинациями байтов и картинкой.
Кстати, я вроде бы нашел механизм ядра, который это грузит. Работает оно через ioctl() /dev/ttyn, коды описаны в include/linux/kd.h. Вот только реализацию этого вызова я не нашел.
В kd.h, кстати, есть такая штука -
[*]define GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from kernel */
struct unipair {
unsigned short unicode;
unsigned short fontpos;
};
struct unimapdesc {
unsigned short entry_ct;
struct unipair __user *entries;
};
, если я правильно понял, это - пары символ-код, которые как то грузятся в видюху.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 28 сен 2007, 07:30 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Страннй вопрос... В знакогенератор можно загрузить несколько таблиц представлений символов, но активными могут быть только две, т.е. всего 512 символов (я использую вариант с 256 символами двух разных начертаний). Обычно работа с Unicode заключается в том, что ты сам ставишь в соответствие необходимым символам Unicode однобайтовые коды символов, загруженных в знакогенератор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 28 сен 2007, 10:46 

Зарегистрирован: 26 апр 2007, 16:22
Сообщения: 67
Ясно. А не подскажешь, где добыть код загрузки в две таблицы? Я только для одной нашел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 28 сен 2007, 14:21 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Таблицы находятся в памяти последовательно и нумеруются через одну. Чтобы на экране одновременно отображались символы из двух разных таблиц, нужно перепрограммировать синхронизатор. У меня под рукой сейчас нет ни исходников, ни документации, поэтому более подробно смогу написать немного позже.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 28 сен 2007, 15:19 

Зарегистрирован: 26 апр 2007, 16:22
Сообщения: 67
Документации на регитсры vga в инете навалом, вот тот же frolov-lib.ru - там все регитсры описаны. Там есть и русификация видюх, но только через BIOS.
Вкратце, в чем я разобрался:
В древних карточках (все современные ессно совместимы) были 4 т.н. плоскости, в которых в зависимости от режима может храниться разная информация. В режиме 25x80 на плоскостях 0 и 1 сидели символы и атрибуты соответственно, а в память они отображались через один байт. (вот извращенцы!) В плоскости 2 как раз и находятся таблицы знакогенератора. Там даже оффсеты даны для разных таблиц (ну и конечно вся инфа по переключению/т.д.) Вот только одного я так и не понял - от какого, собственно, места в (видео)памяти даны эти оффсеты? Я попробовал забить все от 0xa0000(начало видеопамяти) до 0xb8000 (начало собственно текста) 0xff, но ничего не произошло :) (хотя, скорее всего, нужно было разрешить запись в плоскость 2, хз как она там по умолчанию).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 28 сен 2007, 15:40 

Зарегистрирован: 26 апр 2007, 16:22
Сообщения: 67
Все, разобрался. Таблицы все находятся по одному и тому же базовому адресу - 0xb8000 в случае цветного текста. Только чтобы писать не в 0 и 1, а в 2, нужно ее выбрать в регистрах синхронизатора. Например так:
Код:
printf("%zStory OS%z version %z%s (build %i)%z, (C) 2007 Peter Zotovn", LIGHTBLUE, WHITE, LIGHTGREEN, VERSION, BUILD, WHITE);
printf("Compiled %s, %sn", __DATE__, __TIME__);
textcolor(LIGHTGRAY);
printf("Thanks to Legos, DinamytE, SadKo and all OSDev.ru community.nn");

hal->outb(0x3c4, 2);
hal->outb(0x3c5, 0x4); //enable plane 2

for(int i = 0xb8000; i < 0xc0000; i++)
 *((char*) i) = 0xff;

hal->outb(0x3c4, 2);
hal->outb(0x3c5, 0x3); //re-enable planes 0&1

printf("%zInitializing HAL...%z ", GREEN, LIGHTGRAY);

while(1);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 28 сен 2007, 17:56 

Зарегистрирован: 26 апр 2007, 16:22
Сообщения: 67
Демка загрузки символов во вторую таблицу: (в QEMU НЕ работает)
Код:
for(int i = 0; i < 8; i++)
 {
 for(int j = 0; j < 16; j++)
  hal->terminal->put_char_raw(i * 32 + j, GREEN);
 printf(" | ");
 for(int j = 16; j < 32; j++)
  hal->terminal->put_char_raw(i * 32 + j, GREEN);
 printf("n");
 }

for(int i = 0; i < 8; i++)
 {
 for(int j = 0; j < 16; j++)
  hal->terminal->put_char_raw(i * 32 + j, GREEN | 8);
 printf(" | ");
 for(int j = 16; j < 32; j++)
  hal->terminal->put_char_raw(i * 32 + j, GREEN | 8);
 printf("n");
 }

hal->outw(0x3c4, 0x0100); //sync reset
hal->outw(0x3c4, 0x0402); //write plane 2
hal->outw(0x3c4, 0x0704); //sequential addressing
hal->outw(0x3c4, 0x0300); //clear reset

hal->outw(0x3ce, 0x0204); //read plane 2
hal->outw(0x3ce, 0x0005); //disable odd-even addressing
hal->outw(0x3ce, 0x0006); //start map at 0xA0000

int symbol_height = 16, symbol, table = 2;

memcpy((void*) (0xa0000 + symbol_height * 256 * 2 * table), (void*) 0xa0000, 256 * 2 * symbol_height);

for(int i = 0xa0000 + 256 * 2 * table * symbol_height + 2 * symbol_height; i < 0xa0000 + 256 * 2 * table * symbol_height + 2 * 256 * symbol_height; i++)
  *((char*) i) = *((char*) ((i - 256 * 2 * table * symbol_height) / symbol_height * symbol_height) + 15 - (i - 256 * 2 * table * symbol_height) % symbol_height);

hal->outw(0x3c4, 0x0100); //sync reset
hal->outw(0x3c4, 0x0302); //write planes 0&1
hal->outw(0x3c4, 0x0304); //odd-even addressing
hal->outw(0x3c4, 0x0403); //symbol tables D3=0 -> 0, D3=1 -> 1
hal->outw(0x3c4, 0x0300); //clear reset

hal->outw(0x3ce, 0x0004); //read map 0
hal->outw(0x3ce, 0x1005); //enable odd-even addressing
hal->outw(0x3ce, 0x0E06); //start map at 0xB8000


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Unicode
СообщениеДобавлено: 29 сен 2007, 11:45 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Цитата:
Вот только одного я так и не понял - от какого, собственно, места в (видео)памяти даны эти оффсеты? Я попробовал забить все от 0xa0000(начало видеопамяти) до 0xb8000 (начало собственно текста) 0xff, но ничего не произошло  (хотя, скорее всего, нужно было разрешить запись в плоскость 2, хз как она там по умолчанию).
Таблицы можно грузить и через "окно", начиная с адреса 0xA0000, и через "окно", начиная с адреса 0xB8000. Это зависит от того, как запрограммирован графический контроллер. Про то, что фонты нужно грузить во вторую графическую плоскость, думаю, тем, кто этим занимался, известно. Я говорил о порядке размещения загружаемых таблиц и их нумерации - если мне не изменяет память, порядок нумерации таблиц такой: 0, 4, 1, 5, 2, 6, 3, 7 (каждай таблица имеет размер 8 Кб).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB