OSDev http://osdev.su/ |
|
Unicode http://osdev.su/viewtopic.php?f=7&t=138 |
Страница 1 из 1 |
Автор: | whitequark [ 27 сен 2007, 20:24 ] |
Заголовок сообщения: | Unicode |
Никто не знает, как загрузить UTF-16 в знакогенератор? А во всех доках по VGA-шным карточкам расписан только алгоритм загрузки таблицы из 256 символов. Собственно, в линуксе (у меня Debian), скрипт при загрузке как раз юникод и грузит (причем, похоже, UTF-8 - как им это удалось, ведь видюха не оценит символы переменной длины). Порывшись в скрипте, я обнаружил, что таблица грузится через ioctl(), т.е. это фича ядра, однако в ядре я так и не нашел это место :) Может, кто уже пробовал? |
Автор: | Гость [ 27 сен 2007, 21:42 ] |
Заголовок сообщения: | Re: Unicode |
Quark, Че-то ты гонишь... код символа не требуется грузить в знакогенератор... туда надо грузить изображение символа. |
Автор: | whitequark [ 27 сен 2007, 22:10 ] |
Заголовок сообщения: | Re: Unicode |
Вполне возможно. Только мне кажется, что ВЕСЬ юникод туда не влезет, поэтому нужно установить соответствие между комбинациями байтов и картинкой. Кстати, я вроде бы нашел механизм ядра, который это грузит. Работает оно через 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; }; , если я правильно понял, это - пары символ-код, которые как то грузятся в видюху. |
Автор: | phantom-84 [ 28 сен 2007, 07:30 ] |
Заголовок сообщения: | Re: Unicode |
Страннй вопрос... В знакогенератор можно загрузить несколько таблиц представлений символов, но активными могут быть только две, т.е. всего 512 символов (я использую вариант с 256 символами двух разных начертаний). Обычно работа с Unicode заключается в том, что ты сам ставишь в соответствие необходимым символам Unicode однобайтовые коды символов, загруженных в знакогенератор. |
Автор: | whitequark [ 28 сен 2007, 10:46 ] |
Заголовок сообщения: | Re: Unicode |
Ясно. А не подскажешь, где добыть код загрузки в две таблицы? Я только для одной нашел. |
Автор: | phantom-84 [ 28 сен 2007, 14:21 ] |
Заголовок сообщения: | Re: Unicode |
Таблицы находятся в памяти последовательно и нумеруются через одну. Чтобы на экране одновременно отображались символы из двух разных таблиц, нужно перепрограммировать синхронизатор. У меня под рукой сейчас нет ни исходников, ни документации, поэтому более подробно смогу написать немного позже. |
Автор: | whitequark [ 28 сен 2007, 15:19 ] |
Заголовок сообщения: | Re: Unicode |
Документации на регитсры vga в инете навалом, вот тот же frolov-lib.ru - там все регитсры описаны. Там есть и русификация видюх, но только через BIOS. Вкратце, в чем я разобрался: В древних карточках (все современные ессно совместимы) были 4 т.н. плоскости, в которых в зависимости от режима может храниться разная информация. В режиме 25x80 на плоскостях 0 и 1 сидели символы и атрибуты соответственно, а в память они отображались через один байт. (вот извращенцы!) В плоскости 2 как раз и находятся таблицы знакогенератора. Там даже оффсеты даны для разных таблиц (ну и конечно вся инфа по переключению/т.д.) Вот только одного я так и не понял - от какого, собственно, места в (видео)памяти даны эти оффсеты? Я попробовал забить все от 0xa0000(начало видеопамяти) до 0xb8000 (начало собственно текста) 0xff, но ничего не произошло :) (хотя, скорее всего, нужно было разрешить запись в плоскость 2, хз как она там по умолчанию). |
Автор: | whitequark [ 28 сен 2007, 15:40 ] |
Заголовок сообщения: | Re: Unicode |
Все, разобрался. Таблицы все находятся по одному и тому же базовому адресу - 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); |
Автор: | whitequark [ 28 сен 2007, 17:56 ] |
Заголовок сообщения: | Re: Unicode |
Демка загрузки символов во вторую таблицу: (в 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 |
Автор: | phantom-84 [ 29 сен 2007, 11:45 ] |
Заголовок сообщения: | Re: Unicode |
Цитата: Вот только одного я так и не понял - от какого, собственно, места в (видео)памяти даны эти оффсеты? Я попробовал забить все от 0xa0000(начало видеопамяти) до 0xb8000 (начало собственно текста) 0xff, но ничего не произошло (хотя, скорее всего, нужно было разрешить запись в плоскость 2, хз как она там по умолчанию). Таблицы можно грузить и через "окно", начиная с адреса 0xA0000, и через "окно", начиная с адреса 0xB8000. Это зависит от того, как запрограммирован графический контроллер. Про то, что фонты нужно грузить во вторую графическую плоскость, думаю, тем, кто этим занимался, известно. Я говорил о порядке размещения загружаемых таблиц и их нумерации - если мне не изменяет память, порядок нумерации таблиц такой: 0, 4, 1, 5, 2, 6, 3, 7 (каждай таблица имеет размер 8 Кб).
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |