Работа с адаптером дисплея в текстовом режиме

Страницы работы

Содержание работы

ГУАП

КАФЕДРА № 44

ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

ассистент

А.Б. Бубликов

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №2

Работа с адаптером дисплея в текстовом режиме

по курсу: ИНТЕРФЕЙСЫ ПЕРИФЕРИЙНЫХ УСТРОЙСТВ

РАБОТУ ВЫПОЛНИЛ(А)

СТУДЕНТ(КА) ГР.

В8441

Тарасов Р.С.

подпись, дата

инициалы, фамилия

Санкт-Петербург 2011

Вариант 1. Написать программу, которая получает с клавиатуры код цвета и сторону квадрата и отображает в центре экрана квадрат с заданной длиной стороны и заданного цвета

Ниже перечислены использованные функции INT 10H стандартного видеосервиса ROM-BIOS:

AH  сервис

--- ----------------------------------------------------------------------------

00H уст. видео режим. Очистить экран, установить поля BIOS, установить режим.

    вход:  AL=режим

           AL  Тип      формат   цвета          адаптер  адрес монитор

           === =======  =======  =============  =======  ====  =================

            3  текст    80x25    16/8           CGA,EGA  b800  Comp,RGB,Enhanced

--- ----------------------------------------------------------------------------

01H уст. размер/форму курсора (текст). курсор, если он видим, всегда мерцает.

    вход:  CH = начальная строка (0-1fH; 20H=подавить курсор)

           CL = конечная строка (0-1fH)

--- ----------------------------------------------------------------------------

02H уст. позицию курсора. установка на строку 25 делает курсор невидимым.

    вход:  BH = видео страница

           DH,DL = строка, колонка (считая от 0)

--- ----------------------------------------------------------------------------

09H писать символ/атрибут в текущей позиции курсора

    вход:  BH = номер видео страницы

           AL = записываемый символ

           CX = счетчик (сколько экземпляров символа записать)

           BL = видео атрибут (текст) или цвет (графика)

                (графические режимы: +80H означает XOR с символом на экране)

--- ----------------------------------------------------------------------------

Текст программы:

        .MODEL SMALL

        .STACK 100h

        .DATA

Message1 DB 'Введите сторону квадрата в знакоместах: ','$'

Message2 DB 'Возможные цвета ',13,10

         DB 9,'1 - синий',13,10

         DB 9,'2 - зеленый',13,10

         DB 9,'3 - голубой',13,10

         DB 9,'4 - красный',13,10

         DB 9,'5 - пурпурный',13,10

         DB 9,'6 - коричневый',13,10

         DB 9,'7 - серый',13,10

Message3 DB 'Введите цвет квадрата: ','$'

buff     DB 6,7 dup (?)

sqsize   DW ?

color    DW ?

        .CODE

main:

; подготовительные действия

         mov ax,@Data         ; устанавливаем регистры DS и ES

         mov ds,ax            ; таким образом, чтобы они указывали

         mov es,ax            ; на сегмент данных

; вводим значение стороны квадрата

sqs:     mov ah,09h

         lea dx,Message1

         int 21h              ; выводим приглашение на ввод размера

         mov ah,0ah

         mov dx,offset buff   ; адрес буфера

         int 21h              ; принимаем строку

         mov dl,0ah

         mov ah,02

         int 21h              ; выводим перевод строки

         mov si,offset buff+2 ; готовим параметр для процедуры интерпретации

         call InInt           ; переводим введенную строку в число

         cmp ax,26            ; сторона д.б.не больше количества строк

         jnl sqs

         cmp ax,0             ; сторона д.б.не меньше нуля

         jle sqs

         mov sqsize,ax

; вводим значение цвета

sqc:     mov ah,09h

         lea dx,Message2

         int 21h              ; выводим приглашение на ввод цвета

         mov ah,0ah

         mov dx,offset buff   ; адрес буфера

         int 21h              ; принимаем строку

         mov dl,0ah

         mov ah,02

         int 21h              ; выводим перевод строки

         mov si,offset buff+2 ; готовим параметр для процедуры интерпретации

         call InInt           ; переводим введенную строку в число

         cmp ax,8             ; цвет не больше 7

         jnl sqc

         cmp ax,0             ; цвет не меньше 0

         jle sqc

         shl ax,4             ; сдвигаем, т.к.это цвет фона

         mov color,ax

         mov ax,3             ; включаем текстовый видеорежим 25х80

         int 10h              ; с очисткой экрана

         mov ah,1             ; выключаем текстовый курсор

         mov ch,20h

         int 10h

; отрисовываем квадрат

         mov ax,25            ; вычисляем смещение левого верхнего угла

         sub ax,sqsize

         shr al,1

         mov dh,al

         mov cx,sqsize        ; чтобы было больше похоже на квадрат,

         shl cx,1             ; удваиваем количество знаков по горизонтали

         mov ax,80

         sub ax,cx

         shr al,1

         mov dl,al

         mov si,sqsize        ; инициализируем счетчик цикла

paint:   

         mov ah,2             ; выставляем курсор

         xor bh,bh           

         int 10h

         mov ah,9            

         mov al,20h           ; грузим пробел

         mov bx,color         ; введенным цветом

         mov cx,sqsize        ; количество выводимых - сторона квадрата

         shl cx,1             ; (удвоенная для большей пропорциональности)

         int 10h

         inc dh               ; на строку ниже

         dec si               ; уменьшаем счетчик цикла

         jnz paint

         xor ah,ah            ; ожидаем нажатия какой-нибудь клавиши   

         int 16h

; завершение работы программы

         mov ax,4c00h

         int 21h              ; завершаем работу программы

;-------------------------------------------------------------------------

InInt   proc near             ; процедура интерпретации знаковых целых чисел

                              ; параметры: si - смещение буфера

                              ; результат возвращается в регистре ax

;-------------------------------------------------------------------------

        push cx

        push dx

        push bx

        push si

        push di

; обрабатываем содержимое буфера

        cmp byte ptr [si],"-" ; если первый символ минус

        jnz ii1

        mov di,1              ; устанавливаем флаг

        inc si                ; и пропускаем его

ii1:

        xor ax,ax

        mov bx,10             ; основание системы счичления

ii2:

        mov cl,[si]           ; берем символ из буфера

        cmp cl,0dh            ; это замыкающий 0?

Похожие материалы

Информация о работе