Ну что же, всё что было до этого интересно, но потыкать пальцами в пимпы, так сказать пожмакать в живую и увидеть лучше.
Создаём файл
Keyboard.Mod c примерно таким содержимым:
Код: "OBERON"
MODULE Keyboard;
IMPORT
Kernel, SYSTEM;
CONST
Trace = TRUE;
PROCEDURE Test;
VAR
k: INTEGER;
BEGIN
k:=0;
WHILE k<256 DO
Kernel.WriteChar(CHR(k));
Kernel.WriteChar(" ");
INC(k);
END;
END Test;
BEGIN
Test;
END Keyboard.
Который выводит 255 символов на экран компьютера.
Батюшки светы, непорядок, русских буковок не видно. Какие то непонятные закорюки:
Придется исправлять немедленно!
Очень хотелось бы, как пишут на форумах любителей ассемблера (фу-фу-фу, мы же синей крови господа
) использовать прерывание 10H и загрузить свои шрифты.. но.. НО!!! Мы же в скафандре, кислород с собой разбавлен гелием, кесонной болезни страшимся отгоняя пузырьками акул, китов и всяких страшных креветок, плавающих рядом. Прерывания у нас в защищённом режиме не работают. Ну, вот так задумано.
Что делать? Делать то что, я вас спрашиваю господа офицеры?
Читать не охото, скопипастить бы откуда да не откуда.. хнык.. хнык, включаем мозги.
Вспоминаем как устроен текстовый vga адаптер (надеюсь CGA и MDA сница нам только по ночам в ностальгически печальных снах, очень надеюсь).
Ага, знакогенератор (или попросту шрифты, находятся на слое 2 видеопамяти. Значит, что бы сбрить усы нам не нужен топор. Просто сначала откроем доступ к слою 2 видеопамяти, поменяем что нам надо на своё (китайцы сейчас пищат от восторга) и опять вернём как было в зад!
Код: "OBERON"
PROCEDURE FntPlane(Flag: BOOLEAN);
BEGIN
SYSTEM.CLI;
IF Flag THEN
SYSTEM.PORTOUT(03C4H, SYSTEM.VAL(INTEGER, 0402H));
SYSTEM.PORTOUT(03C4H, SYSTEM.VAL(INTEGER, 0704H));
SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0204H));
SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0005H));
SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0406H));
ELSE
SYSTEM.PORTOUT(03C4H, SYSTEM.VAL(INTEGER, 0302H));
SYSTEM.PORTOUT(03C4H, SYSTEM.VAL(INTEGER, 0304H));
SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0004H));
SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 1005H));
SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0E06H));
END;
SYSTEM.STI;
END FntPlane;
Что делает сия функция? Просто открывает нам доступ к кодогенератору по адресу
0A0000H если параметр
Flag=TRUE и возвращает при
FALSEПосле этого, мы с чистой совестью поменяем байтики на нужные нам, а для экономии кода подменим только символы с 128 по 176 и с 224 по 255.
Кодируются буковки очень просто:
И всего их надо в нашем случае 32 - 8*16 наш шрифт и 16 резерв (задумано было так парнями)
А после этого проинициализируем клавиатуру, добавим прерывание на неё (ну нам же надо прерываться то когда по пимпам жмём)
и уже в этом прерывании будем отлавливать скан-коды клавиш и преобразовывать в символы нашего шрифта!
Вот что получилось после всего проделанного
ЛЮБО ДОРОГО ПОСМОТРЕТЬ Прикрепляю архив с начальным драйвером клавиатуры