Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 13:38

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Дисплей и клавиатура
СообщениеДобавлено: 17 июл 2015, 00:10 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Ну что же, всё что было до этого интересно, но потыкать пальцами в пимпы, так сказать пожмакать в живую и увидеть лучше.
Создаём файл Keyboard.Mod c примерно таким содержимым:
Код: "OBERON"
  1. MODULE Keyboard;
  2.  
  3. IMPORT
  4. Kernel, SYSTEM;
  5.  
  6. CONST
  7. Trace = TRUE;
  8.  
  9. PROCEDURE Test;
  10. VAR
  11. k: INTEGER;
  12. BEGIN
  13.  
  14. k:=0;
  15. WHILE k<256 DO
  16. Kernel.WriteChar(CHR(k));
  17. Kernel.WriteChar(" ");
  18. INC(k);
  19. END;
  20.  
  21. END Test;
  22.  
  23. BEGIN
  24. Test;
  25. END Keyboard.


Который выводит 255 символов на экран компьютера.

Батюшки светы, непорядок, русских буковок не видно. Какие то непонятные закорюки:

Изображение

Придется исправлять немедленно! :D

Очень хотелось бы, как пишут на форумах любителей ассемблера (фу-фу-фу, мы же синей крови господа :D ) использовать прерывание 10H и загрузить свои шрифты.. но.. НО!!! Мы же в скафандре, кислород с собой разбавлен гелием, кесонной болезни страшимся отгоняя пузырьками акул, китов и всяких страшных креветок, плавающих рядом. Прерывания у нас в защищённом режиме не работают. Ну, вот так задумано.
Что делать? Делать то что, я вас спрашиваю господа офицеры?
Читать не охото, скопипастить бы откуда да не откуда.. хнык.. хнык, включаем мозги.
Вспоминаем как устроен текстовый vga адаптер (надеюсь CGA и MDA сница нам только по ночам в ностальгически печальных снах, очень надеюсь).

Изображение

Ага, знакогенератор (или попросту шрифты, находятся на слое 2 видеопамяти. Значит, что бы сбрить усы нам не нужен топор. Просто сначала откроем доступ к слою 2 видеопамяти, поменяем что нам надо на своё (китайцы сейчас пищат от восторга) и опять вернём как было в зад!
Код: "OBERON"
  1. PROCEDURE FntPlane(Flag: BOOLEAN);
  2. BEGIN
  3. SYSTEM.CLI;
  4. IF Flag THEN
  5. SYSTEM.PORTOUT(03C4H, SYSTEM.VAL(INTEGER, 0402H));
  6. SYSTEM.PORTOUT(03C4H, SYSTEM.VAL(INTEGER, 0704H));
  7. SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0204H));
  8. SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0005H));
  9. SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0406H));
  10. ELSE
  11. SYSTEM.PORTOUT(03C4H, SYSTEM.VAL(INTEGER, 0302H));
  12. SYSTEM.PORTOUT(03C4H, SYSTEM.VAL(INTEGER, 0304H));
  13. SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0004H));
  14. SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 1005H));
  15. SYSTEM.PORTOUT(03CEH, SYSTEM.VAL(INTEGER, 0E06H));
  16. END;
  17. SYSTEM.STI;
  18. END FntPlane;

Что делает сия функция? Просто открывает нам доступ к кодогенератору по адресу 0A0000H если параметр Flag=TRUE и возвращает при FALSE
После этого, мы с чистой совестью поменяем байтики на нужные нам, а для экономии кода подменим только символы с 128 по 176 и с 224 по 255.
Кодируются буковки очень просто:

Изображение

И всего их надо в нашем случае 32 - 8*16 наш шрифт и 16 резерв (задумано было так парнями)
А после этого проинициализируем клавиатуру, добавим прерывание на неё (ну нам же надо прерываться то когда по пимпам жмём)
и уже в этом прерывании будем отлавливать скан-коды клавиш и преобразовывать в символы нашего шрифта!

Вот что получилось после всего проделанного

Изображение

ЛЮБО ДОРОГО ПОСМОТРЕТЬ :)

Прикрепляю архив с начальным драйвером клавиатуры


Вложения:
Комментарий к файлу: Русификатор шрифта
Keyboard.zip [631.19 КБ]
Скачиваний: 650
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Дисплей и клавиатура
СообщениеДобавлено: 18 июл 2015, 14:48 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Ну вот, шрифты подгружены, теперь бы самое время и о кнопках подумать!!!
В кратце:

Для начала надо настроить всякие переменные отвечающие за нажатие Shift CapsLock Ctrl и т.д. А ьак же в процедуре InitKeyboard позаботиться о считывании нажатых клавиш до загрузки системы (а ну как мы, или не мы захочем меню спецзагрузки сделать)

Код: "OBERON"
  1. Kernel.InstallIP(KeyboardInterrupt, Kernel.IRQ+1);
  2.  
  3. i := 8;
  4. LOOP
  5. SYSTEM.PORTIN(64H, SYSTEM.VAL(CHAR, s));
  6. IF ~(0 IN s) OR (i = 0) THEN EXIT END;
  7. SYSTEM.PORTIN(60H, c);
  8. SYSTEM.PORTIN(61H, SYSTEM.VAL(CHAR, s));
  9. INCL(s, 7);
  10. SYSTEM.PORTOUT(61H, SYSTEM.VAL(CHAR, s));
  11. EXCL(s, 7);
  12. SYSTEM.PORTOUT(61H, SYSTEM.VAL(CHAR, s));
  13. DEC(i)
  14. END;

Первая функция задаёт новое прерывание для клавиатуры, а цикл считывает 7 бит регистра порта 61Н и изменяет его. Так вот устроено в компьютере.

Далее, порт 60Н у нас отвечает так же за лампочки на клавиатуре (ну надо же им моргать то в конце концов?

Когда в обработчике прерывания KeyboardInterrupt мы получаем скан-код клавиши, его как то надо обработать. В зависимости от нажатых функциональных клавиш, раскладки клавиатуры и т.п. и вернуть код символа нашего шрифта.
А потом уже обработать его, либо вывести на терминал, или просто запомнить для последующей обработки (ну допустим когда мы напишем драйвер графического дисплея, что нибудь нарисовать на нём, иероглиф там какой или буковку красивую в стиле хай-тэк)
Для этого используется функция MapScanCode. Которая в свою очередь и переводит скан-коды в коды символов, включает лампочки при нажатии функциональных клавиш вроде NumLock или CapsLock.

Код: "OBERON"
  1. PROCEDURE TableUS(): LONGINT;
  2. ...
  3. PROCEDURE CheckLayout;
  4. ...
  5. PROCEDURE Swap(k: INTEGER):INTEGER;
  6. ...

Вспомогательные процедуры.
1. Вот так вот хитро-жопым способом инициализируется массив в памяти (никогда не понимал почему нельзя включить прямо в язык такое?
Типа как в паскале а: array [0..200] of byte = (1,2,3....);.
2. Проверяет нажатие кнопок Ctrl и Shift. Ну вот так я задал переключение раскладки клавиатуры.
3. Изменяет код нажатой клавиши в зависимости от раскладки клавиатуры. В нашем случае происходит соответствие:
Цитата:
QWERTY...
ЙЦУКЕН...


И напоследок я написал тестовый обработчик клавиш, что бы наглядно зафиксировать работу драйвера!!!

Изображение

Ну вот и всё пока, можно уже написать что нибудь полезное в нашей операционке. Интерпретатор BASIC например ;) или какой нибудь командный интерпретатор простенький!
Во вложении изменённые файлы исходников.


Вложения:
Driver.zip [31.99 КБ]
Скачиваний: 644
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Дисплей и клавиатура
СообщениеДобавлено: 22 авг 2015, 04:10 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Ребят, запарка вышла. Никак не справлюсь с

Код: "OBERON"
  1. VAR
  2. FPointer: POINTER TO ARRAY OF LONGINT;
  3. ........
  4. FBitmap:=W.CreateDIBSection(hMemDc, BI, W.DIB_RGB_COLORS,FPointer[0], 0, 0);

Кто нибудь может помочь??? с CreateDIBSection


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Дисплей и клавиатура
СообщениеДобавлено: 23 авг 2015, 20:26 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
А как у тебя описан тип четвёртого параметра? Обычно помогает так:
Код: "OBERON"
  1. FBitmap:=W.CreateDIBSection(
  2. hMemDc,
  3. BI,
  4. W.DIB_RGB_COLORS,
  5. SYSTEM.VAL(YourType, FPointer),
  6. 0,
  7. 0
  8. );
, где YourType может быть Kernel32.ADDRESS, SYSTEM.PTR, INTEGER/LONGINT или WinApi.PtrVoid (в зависимости от реализации).


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Дисплей и клавиатура
СообщениеДобавлено: 26 авг 2015, 02:48 
Не в сети
Администратор
Аватара пользователя

Сообщения: 189
Ага, уже разобрался. :D
SYSTEM.VAL(YourType, FPointer) не проходит, так как в описании процедуры этот параметр определён по значению (VAR),
то есть передаётся адрес области памяти массива картинки. Я тут за одно переписываю и библиотеку. Хочу всё таки студию переписать на ОБЕРОН... Поэтому ковыряюсь с быстрым канвасом и т.д.
Сделал сейчас канву, которая не уступает всяким BGRABitmap, Graphics32 и т.д...
Вот разбираюсь с графическими библиотеками, алгоритмами.... :D
Как пример по пиксельной заливки в скрепке!!!


Вложения:
Project1.zip [31.73 КБ]
Скачиваний: 592
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

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


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club