Операционные системы, среды и оболочки. 2002/2003 учебный год Лабораторная работа 1. Системное программирование для MS-DOS. Работа с монитором в текстовом режиме. Описание работы: --------------- Основа данной работы - задание в вариантах. Все варианты описывают некие задачи отображения информации в текстовом режиме монитора. Нужно выполнить задание своего варианта двумя различными способами: 1. Посредством прямого доступа в видеопамять. 2. Посредством вызова прерывания BIOS (int10h). Программа должна наглядно демонстрировать выполнение задания, а также сравнивать производительность при работе первым и вторым способом. Язык: Borland Pascal или Borland C++ Требования к работе: ------------------- - работа сдается в исходниках, с демонстрацией компиляции и запуска, а также с устным пояснением деталей реализации. - первые пять строк каждого файла должны содержать комментарий со следующей информацией: Фамилия, Имя, Группа, Предмет, Номер работы, Номер варианта, - следующие несколько строк каждого файла должны содержать данный вариант задания в виде комментария, - каждому объявлению процедуры или функции должна предшествовать строка комментария, с пояснением ее назначения. - в буфер следует сохранять минимальный объем информации. - программа должна компилироваться и выполняться на любом терминале, в случае необходимости дополнительных настроек компилятора их следует описать в комментарии после текста задания. Варианты задания могут быть сформулированы в общих чертах, за пояснениями сути задания следует обращаться к преподавателю. Все варианты заданий условно делятся на два типа: - элементы пользовательского интерфейса (помечены как "интерфейс"). - процедуры демонстрационного назначения (помечены как "демонстрация"). Требования для вариантов помеченых как "интерфейс": - на вход основной функции подаются (начальные) координаты отображения элемента интерфеса (рамочки, ...), - в демонстрационной программе основная функция вызывается многократно с различными входными параметрами. - возвращаемый функцией результат никак не отображается. - затирается только та часть экрана, где должна разместиться рамка. - в буфере хранится только затираемая часть экрана. Требования для вариантов помеченых как "демонстрация": - в демонстрационной программе основная вункция вызывается однократно. - в буфере хранится минимальный объем информации. - содержимое экрана до и после выполнения оновной функции должно быть идентичным. Некоторые рекомендации по прямому обращению к видеопамяти: --------------------------------------------------------- Ко всей основной памяти в DOS можно обращаться как к массиву. В BP этот массив имеет идентификатор mem. Синтаксис такой: mem[seg,off] где seg - сегментная часть адреса, off - смещение адреса. сегмент видеопамяти - B800h таким образом обращение к видеопамяти выглядит как mem[$b800,off] информация о содержимом экрана записывается в видеопамяти построчно, каждому знакоместу соответствует 2 последовательно идущих байта: первый - символ, второй - его атрибут. размер экрана в байтах - 25х80х2 Некоторые рекомендации по вызову прерывания BIOS: ------------------------------------------------ Порядок работы: 1. Запомнить текущее положение курсора. 2. Установить курсор в нужной позиции. 3. Записать/считать в позиции курсора символ с атрибутом. 4. Восстановить исходное положение курсора. Пункты 1 и 4 имеет смысл выполнить один раз, в начале и в конце программы соответственно. Краткое описание основных используемых функций обработчика прерывания int10h: Функция 03h - получить положение курсора. вход: ah - 3 (номер функии) bh - 0 (страница) выход: dl - ... (горизонтальная координата) dh - ... (вертикальная координата) Функция 02h - позиционировать курсор. вход: ah - 2 (номер функии) bh - 0 (страница) dl - ... (горизонтальная координата) dh - ... (вертикальная координата) Функция 09h - записать символ с атрибутом. вход: ah - 9 (номер функии) bh - 0 (страница) cх - 1 (количество повторений) al - ... (символ) bl - ... (атрибут) Функция 08h - считать символ с атрибутом. вход: ah - 8 (номер функии) bh - 0 (страница) выход: al - ... (символ) ah - ... (атрибут) Простой способ вызова обработчика прерывания int10h в Borland Pascal: 1. определить переменую стандартного типа registers (запись с набором полей, соответствующим набору регистров) 2. записать входные параметры в поля регистровой переменной. 3. вызвать стандартную процедуру intr(N,R), где N - номер прерывания (в данном случае - $10), R - регистровая переменная. 4. считать выходные параметры из полей регистровой переменной. Варианты задания: ---------------- 1. интерфейс Запрос типа Да/Нет в виде рамки с двумя кнопками. После получения информации с клавиатуры восстановить содержимое экрана. 2. интерфейс Запрос на введение текстовой строки в виде рамки с полем ввода. После получения информации восстановить содердимое экрана. 3. интерфейс Запрос на введение фиксированного цифрового кода в виде рамки. Сразу после введения корректного кода вернуть единицу. По нажатию клавиши Esc вернуть ноль. Вместо введенных цифр отображать символ *. После получения информации восстановить содержимое экрана. 4. интерфейс Запрос в виде вертикального меню из трех опций. После получения информации восстановить содержимое экрана. 5. интерфейс Запрос в виде горизонтального меню из трех опций. После получения информации восстановить содержимое экрана. 6. интерфейс Рамка с бегущей строкой. Отображение прекратить по нажатию на клавишу. После сворачивания рамки восстановить содержимое экрана. 7. интерфейс Рамка с надписью, перемещаемая клавишами курсора. Отображение прекратить по нажатию на клавишу Enter. Следить за восстановлением содержимого экрана. 8. демонстрация Циклическая прокрутка содержимого экрана при помощи клавиш курсора. Отображение прекратить по нажатию на клавишу Enter. 9. демонстрация Вывод на экран текстового файла, с возможностью прокрутки его содержимого вниз и вверх. По нажатию на клавишу Esc отображение прекратить, содержимое экрана восстановить. 10. демонстрация Пробегание цветовых волн (столбцов или строк, в пределах которых меняется цвет символов или фона) по экрану. Действие прекратить по нажатию на клавишу. Следить за сохранностью содержимого экрана. 11. демонстрация Перемещение по экрану цветового пятна (области, в пределах которой меняется цвет символов или фона) при помощи клавиш курсора. Действие прекратить по клавише Enter. Следить за сохранностью содержимого экрана. 12. демонстрация Изменять регистр буквенных символов на экране по строкам или по столбцам. Действие прекратить по нажатию на клавишу. Следить за сохранностью содержимого экрана. 13. интерфейс Деформируемая клавишами курсора рамка с отображением размеров внутри рамки. Отображение прекратить по нажатию на клавишу Enter. Следить за восстановлением содержимого экрана. 14. интерфейс Перемещение курсора по экрану с отображением в рамке позиции. Действие прекратить по клавише Enter. Следить за сохранностью содержимого экрана. 15. демонстрация Перемещение курсора по экрану с отображением его проекций на краях экрана. Действие прекратить по клавише Enter. Следить за сохранностью содержимого экрана. 16. демонстрация Постепенная перемена местами символов на экране. Действие прекратить по нажатию на клавишу. Следить за сохранностью содержимого экрана. 17. демонстрация Звездное небо. Действие прекратить по нажатию на клавишу. Следить за сохранностью содержимого экрана. 18. демонстрация Постепенная перемена местами строк и столбцов на экране. Действие прекратить по нажатию на клавишу. Следить за сохранностью содержимого экрана. 19. демонстрация Броуновское движение символа на экране. Действие прекратить по нажатию на клавишу. Следить за сохранностью содержимого экрана. 20. интерфейс Запрос на введение целого числа в виде рамки с полем ввода. После получения информации восстановить содердимое экрана. 21. интерфейс Запрос на введение действительного числа в виде рамки с полем ввода. После получения информации восстановить содердимое экрана. 22. интерфейс Запрос на введение двоичного числа в виде рамки с полем ввода. После получения информации восстановить содердимое экрана. 23. интерфейс Запрос на введение шестнадцатиричного числа в виде рамки с полем ввода. После получения информации восстановить содердимое экрана. 24. интерфейс Запрос на введение восьмеричного числа в виде рамки с полем ввода. После получения информации восстановить содердимое экрана. 25. демонстрация изображение геометрических фигур на экране. Следить за сохранностью содержимого экрана.