Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Дисплей и клавиатура
https://zx.oberon.org/forum/viewtopic.php?f=94&t=248
Страница 1 из 1

Автор:  S.Atan [ 17 июл 2015, 00:10 ]
Заголовок сообщения:  Дисплей и клавиатура

Ну что же, всё что было до этого интересно, но потыкать пальцами в пимпы, так сказать пожмакать в живую и увидеть лучше.
Создаём файл 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

Автор:  S.Atan [ 18 июл 2015, 14:48 ]
Заголовок сообщения:  Re: Дисплей и клавиатура

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

Для начала надо настроить всякие переменные отвечающие за нажатие 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

Автор:  S.Atan [ 22 авг 2015, 04:10 ]
Заголовок сообщения:  Re: Дисплей и клавиатура

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

Код: "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

Автор:  Zorko [ 23 авг 2015, 20:26 ]
Заголовок сообщения:  Re: Дисплей и клавиатура

А как у тебя описан тип четвёртого параметра? Обычно помогает так:
Код: "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 (в зависимости от реализации).

Автор:  S.Atan [ 26 авг 2015, 02:48 ]
Заголовок сообщения:  Re: Дисплей и клавиатура

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

Вложения:
Project1.zip [31.73 КБ]
Скачиваний: 593

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/