Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 20 21 22 23 24 25 26  27 28 29 30 31 32 33 ... 85
          5. Если нет, то прокрутить экран на одну строку и, используя ROW
     переустановить курсор.

     AH=07: Прокрутка экрана вниз.  Для текстового режима прокрутка экрана
вниз обозначает удаление нижних  строк  и  вставка  чистых  строк  сверху.
Регистр AH должен содержать 07, значения  остальных  регистpов  аналогичны
функции 06 для прокрутки вверх.

     AH=08: Чтение атрибута/символа в текущей позиции курсора.  Для чтения
символа и байта атрибута из дисплейного буфера, как в текстовом, так  и  в
графическом режиме используются следующие команды:

               MOV  AH,08     ;Запрос на чтение атр./симв.
               MOV  BH,00     ;Страница 0 (для текстового реж.)
               INT  10H       ;Вызвать BIOS

Данная функция возвращает в регистре AL значение символа, а  в  AH  -  его
атрибут. В  графическом  режиме  функция   возвращает   шест.00   для   не
ASCII-кодов.  Так  как  эта  функция  читает  только  один cимвол,  то для
символьной строки необходима организация цикла.

     AH=09: Вывод атрибута/символа в текущую позицию курсора.  Для  вывода
на экран символов в текстовом или графическом режиме с установкой мигания,
инвертирования и т.д. можно воспользоваться следующими командами:

               MOV  AH,09          ;Функция вывода
               MOV  AL,символ      ;Выводимый символ
               MOV  BH,страница    ;Номер страницы (текст.реж.)
               MOV  BL,атрибут     ;Атрибут или цвет
               MOV  CX,повторение  ;Число повторений символа
               INT  10H            ;Вызвать BIOS

В регистр AL должен быть помещен выводимый на  экран  символ.  Значение  в
регистре CX определяет число повторений символа на экране.  Вывод на экран
последовательности различных символов требует  организации  цикла.  Данная
функция не перемещает курсор.  В следующем примере на экран выводится пять
мигающих "сердечек" в инвертированном виде:

               MOV  AH,09          ;Функция вывода
               MOV  AL,03H         ;Черви (карточная масть)
               MOV  BH,00          ;Страница 0 (текст. режим)
               MOV  BL,0F0H        ;Мигание, инверсия
               MOV  CX,05          ;Пять раз
               INT  10H            ;Вызвать BIOS

     В текстовом  (но  не  в  графическом)  режиме  символы  автоматически
выводятся на экран и переходят с одной строки на  другую.  Для  вывода  на
экран текста запроса или сообщения необходимо составить программу, которая
устанавливает в регистре CX значение 01 и в цикле загружает в  регистр  AL
из памяти выводимые символы текста.  Так как регистр CX  в  данном  случае
занят, то нельзя использовать команду LOOP. Кроме того, при выводе каждого
символа необходимо дополнительно продвигать  курсор  в  следующий  столбец
(функция 02).
     В графическом режиме регистр BL используется  для  определения  цвета
графики. Если бит 7 равен 0, то заданный цвет заменяет текущий цвет точки,
если бит 7 равен 1, то происходит комбинация цветов с помощью команды XOR.

     AH=0A: Вывод символа в текущую позицию курсора.  Единственная разница
между функциями 0A и 09 состоит в том, что  функция  0A  не  устанавливает
атрибут:

               MOV  AH,0AH         ;Функция вывода
               MOV  AL,символ      ;Выводимый символ
               MOV  BH,страница    ;Номер страницы (для текста)
               MOV  CX,повторение  ;Число повторений символа
               INT  10H            ;Вызвать BIOS

     Для большинства применений  команда  прерывания  DOS  INT  21H  более
удобна.

     AH=0E:  Вывод  в  режиме  телетайпа.   Данная    функция    позволяет
использовать монитор, как простой терминал.  Для выполнения  этой  функции
необходимо установить в регистре  AH  шест.  значение  0E,  в  pегистр  AL
поместить выводимый символ, цвет текста (в графическом режиме)  занести  в
регистр BL и номер страницы для текстового режима - в регистр BH. Звуковой
сигнал (код 07H), возврат на одну позицию  (08H),  конец  строки  (0AH)  и
возврат каретки (0DH) действуют,  как  команды  для  форматизации  экрана.
Данная функция  автоматически  продвигает  курсор,  переводит  символы  на
следующую cтроку, выполняет прокрутку экрана и сохраняет текущие  атрибуты
экрана.

     AH=0F: Получение текущего видео режима.  Данная функция возвращает  в
регистре AL текущий видео режим (см.функцию AH=00), в pегистре AH -  число
символов в строке (20, 40 или 80), в регистре BH - номер страницы.

     AH=13: Вывод  символьной  строки  (только  для  AT).  Данная  функция
позволяет на компьютерах типа AT выводить на  экран  символьные  строки  с
установкой атрибутов и перемещением курсора:

               MOV  AH,13H         ;Функция вывода на экран
               MOV  AL,сервис      ;0, 1, 2 или 3
               MOV  BH,страница    ;
               LEA  BP,адрес       ;Адрес строки в ES:BP
               MOV  CX,длина       ;Длина строки
               MOV  DX,экран       ;Координаты на экране
               INT  10H            ;Вызвать BIOS

     Возможен следующий дополнительный сервис:
     0 - использовать атрибут и не перемещать курсор;
     1 - использовать атрибут и переместить курсор;
     2 - вывести символ, затем атрибут и не перемещать курсор;
     3 - вывести символ, затем атрибут и переместить курсор.


     ПРОГРАММА: МИГАНИЕ, ИНВЕРСИЯ И ПРОКРУТКА
     ________________________________________________________________

     Программа, приведенная на рис. 9.1, принимает ввод имен с  клавиатуры
и выводит их на экран.  Запрос  выдается  в  инвертированном  отображении,
имена принимаются в нормальном отображении, а вывод имен осуществляется  с
40 столбца в той же строке с миганием и инвертированием:

               Name? Francis Bacon      Francis Bacon [мигание]
               |                        |
               Столбец 0                Столбец 40

     Для управления положением курсора в программе  определены  переменные
ROW (вертикальное перемещение  вниз)  и  COL  (горизонтальное  перемещение
вправо).  Команда INT 10H не перемещает  курсор  автоматически.  Программа
выводит имена сверху вниз, пока не  достигнет  20-й  строки.  После  этого
выполняется прокрутка экрана вверх  на  одну  строку  для  каждого  нового
запроса.

__________________________________________________________________________

        page     60,132
TITLE   NMSCROLL (EXE) Инвертирование, мигание, прокрутка
; -------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
        DW      32 DUP(?)
STACKSG SEGMENT PARA STACK 'Stack'
        DW      32 DUP(?)
STACKG  ENDS
; -------------------------------------------------------
DATASG  SEGMENT PARA  'Data'
NAMEPAR LABEL   BYTE            ;Имя списка параметров:
MAXNLEN DB      20              ; макс. длина имени
ACTNLEN DB      ?               ; число введенных символов
NAMEFLD DB      20 DUP(' ')     ; имя

COL     DB      00
COUNT   DB      ?
PROMPT  DB      'Name? '
ROW     DB      00
DATASG  ENDS
; -------------------------------------------------------
CODESG  SEGMENT PARA  'Code'
BEGIN   PROC    FAR
        ASSUME  CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
        PUSH    DS
        SUB     AX,AX
        PUSH    DS
        MOV     AX,DATASG
        MOV     ES,AX
        MOV     AX,0600H
        CALL    Q10CLR          ;Очистить экран
A20LOOP:
        MOV     COL,00          ;Установить столбец 0
        CALL    Q20CURS
        CALL    B10PRMP         ;Выдать текст запроса
        CALL    D10INPT         ;Ввести имя с клавиатуры
        CMP     ACTNLEN,00      ;Нет имени? (т.е. конец)
        JNE     A30
        MOV     AX,0600H
        CALL    Q10CLR          ;Если да, то очистить экран,
        RET                     ; и завершить программу
A30:
        CALL    E10NAME         ;Вывести имя на экран
        JMP     A20LOOP
BEGIN   ENDP
;               Вывод текста запроса:
;               --------------------
B10PRMP PROC    NEAR
        LEA     SI,PROMPT       ;Адрес текста
        MOV     COUNT,05
B20:
        MOV     BL,70H          ;Видеоинверсия
        CALL    F10DISP         ;Подпрограмма вывода
        INC     SI              ;Следующий символ в имени
        INC     COL             ;Следующий столбец
        CALL    Q20CURS
        DEC     COUNT           ;Уменьшение счетчика
        JNZ     B20             ;Повторить n раз
        RET
B10PRMP ENDP
;               вод имени с клавиатуры:
;               ----------------------
D10INPT PROC    NEAR
        MOV     AN,0AH
        LEA     DX,NAMEPAR
        INT     21H
        RET
D10INPT ENDP
;               Вывод имени с миганием и инверсией:
;               ----------------------------------
E10NAME PROC    NEAR
        LEA     SI,NAMEFLD      ;Адрес имени
        MOV     COL,40          ;Установить столбец
E20:
        CALL    Q20CURS         ;Установить курсор
        MOV     BL,0FOH         ;Мигание и инверсия
        CALL    F10DISP         ;Подпрограмма вывода
        INS     SI              ;Следующий символ в имени
        INS     COL             ;Следующий столбец на экране
        DES     ACTNLEN         ;Уменьшить счетчик длины
        JNZ     E20             ;Циклить n раз
        CMP     ROW,20          ;Последняя строка экрана?
        JAE     E30             ; нет
        INC     ROW
        RET
E30:    MOV     AX,0601H        ; да --
        CALL    Q10CLR          ; очистить экран
        RET
E10NAME ENDP
;               Вывод символа на экран:
;               ----------------------
F10DISP PROC    NEAR            ;BL (атрибут) уже установлен
        MOV     AN,09           ;Функция вывода на экран
        MOV     AL,[SI]         ;Получить символ из имени
        MOV     BH,00           ;Номер страницы
        MOV     CX,01           ;Один символ
        INT     10H             ;Вызов BIOS
        RET
F10DISP ENDP
;               Очистка экрана:
;               --------------
Q10CLR  PROC    NEAR            ;AX установлен при вызове
        MOV     BH,07           ;Нормальный ч/б
        MOV     CX 0000
        MOV     DX,184FH
        INT     10H             ;Вызов BIOS
        RET
Q10CLR  ENDP
;               Установить курсор (строка/столбец):
;               ----------------------------------
Q20CURS PROC    NEAR
        MOV     AN,02
        MOV     BH,00
        MOV     DH,ROW
        MOV     DL,COL
        INT     10H
        RET
Q20CURS ENDP
CODESG  ENDS
        END     BEGIN
__________________________________________________________________________

     Рис.9.1. Мигание, инвертирование и прокрутка.


     Для ввода имен в процедуре D10INPT используется команда DOS INT  21H.
Для замены на BIOS INT 10H необходимо:

          1. Инициализировать счетчик для адреса области ввода  и  счетчик
     для длины имени.
          2. Выполнить INT 10H (функция 08) с 08 в регистре AH и 00 в  BH.
     Функция возвращает каждый символ в регистре AL.
          3. Если регистр AL не содержит символа RETURN  и  счетчик  длины
     достиг максимального значения, выдать  звуковой  сигнал  и  выйти  из
     процедуры.
          4. Переслать содержимое AL в область ввода имени.
          5. Если регистр AL содержит символ RETURN, выйти из процедуры.
          6. Увеличить счетчик длины и адрес области ввода имени.
          7. Переместить курсор на один столбец.
          8. Перейти на пункт 2.

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


     РАСШИРЕННЫЙ ASCII КОД
     ________________________________________________________________

     ASCII-коды от  128  до  255  (шест.  80-FF)  представляют  собой  ряд
специальных символов полезных при формировании запросов, меню, специальных
значков с экранными  атрибутами.  Например,  используя  cледующие  символы
можно нарисовать прямоугольник:
Предыдущая страница Следующая страница
1 ... 20 21 22 23 24 25 26  27 28 29 30 31 32 33 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама