Найти тему

Курсор в текстовом режиме

Статья на моем блоге - ULTeam8

Добрый день, уважаемые читатели. Некоторое время я был занят, но теперь снова возвращаюсь к продолжению хождений по мукам разработки операционной системы. Эта статья посвящена работе с курсором. Курсор в текстовом режиме, как показала практика, обладает аппаратной поддержкой.

Порты ввода/вывода

Порты ввода/вывода — это решение для взаимодействия процессора и внешних устройств. В процессорах x86 порты не связаны с основной оперативной памятью. Для взаимодействия с портами в ассемблере используются команды in — для чтения из порта и out — для записи в порт. Увы, прямой возможности работать на языке Си с портами не получится.

От ассемблера не уйти

Я старался! Правда! Но действительно не получится. Однако есть небольшое удобство. Команды ассемблера можно писать прямо в исходном коде на Си. Для этого предназначена команда:

__asm__

Встроенный ассемблер в GCC использует синтаксис AT&T. Для меня это открытие было очень болезненным. Конечно, можно перевести GCC в режим использования формат Intel, но такой синтаксис, хоть и похож на синтаксис nasm, но имеет отличия. Поэтому я решил писать на ассемблере AT&T. Ниже структура инлайновой ассемблерной строки:

__asm__( Инструкции ассемблера

: выходные операнды

: входные операнды

: список изменяемых регистров

Я не планирую развивать тему далее, так как она требует минимум отдельной статьи. Больше можно прочитать на HOWTO-странице по ассемблеру GCC или в переводе. Вернемся к нашим задачам.

Рефакторинг библиотеки

-2

В прошлой статье мы начали создавать библиотеку. Теперь продолжаем улучшать. Для начала возьмусь за типизацию. Точнее сделаю ее понятнее. Для этого создадим файл с наименованием types.h, в котором определим несколько новых типов:

Также я вынес глобальные константы в единый файл — constants.h

Взаимодействие с портами

Выше, я писал об аппаратной поддержке курсора в текстовом режиме. Он управляется с помощью портов ввода/вывода. Поэтому нам надо подготовить библиотечную функцию, которая будет работать с портами. Это нужно также и для того, чтобы не писать инлайновые ассемблерные вставки везде.

Эта часть кода чрезвычайно проста. Здесь содержится четыре функции 2 из которых работают с одним байтом:

  • outb — выводит байт в указанный порт
  • inb — получает байт из порта

Две другие — со словом (2 байта):

  • outw — выводит слово
  • inw — получает слово

Курсор

-3

Теперь можно начинать работу с курсором. Условно всю работу с курсором можно разделить на три части:

  • Включение курсора
  • Изменение местоположения
  • Отключение курсора

Пока мы реализуем только две части. В исходном коде ниже представлены функции для работы с экраном в текстовом режиме.

Функция init_cursor занимается настройкой внешнего вида курсора и, самое главное, его включением. Другая функция — set_cursor — занимается установкой курсора в нужную позицию на экране. Также я перенес сюда функцию очистки экрана, что на мой взгляд естественно. Вызов инициализации экрана осуществляется в основном файле ядра — kernel.c. Сейчас он немного изменился:

Все изменения внесены в репозиторий: Simple OS

В результате получился вот такой курсор.

-4

P.S. Запущен сайт с документацией, формируемой с помощью утилиты doxygen. Документация доступна по двум адресам: github и здесь, на моем сайте.

Картинки, кроме последней, найдены на просторах интернета.

ULTeam8Блог об информатике, вычислительной технике, а также программировании и, даже, разработке простейшей операционной системы EOS