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

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


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

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


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

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 ... 25 26 27 28 29 30 31  32 33 34 35 36 37 38 ... 92
10H; которая выводит символ и атрибуты столько раз, сколько  ука-
зано в CX. Значение 2000 чистит весь экран, если курсор был уста-
новлен  в 0,0, используя метод показанный в [4.2.1].   AH  должен
содержать символ пробела, AL - байт атрибутов, а BH - номер стра-
ницы дисплея.

;---установка курсора в левый верхний угол экрана
   MOV  AH,2     ;функция установки курсора
   MOV  BH,0     ;номер страницы
   MOV  DX,0     ;координаты 0,0
   INT  10H      ;устанавливаем курсор
;---вывод символа пробела 2000 раз
   MOV  AH,9     ;номер функции
   MOV  CX,2000  ;число повторений вывода
   MOV  AL,' '   ;символ пробела в AL
   MOV  BL,7     ;атрибуты в BL
   INT  10H      ;очистка экрана

   Hаконец, DOS обеспечивает очистку экрана с помощью специальных
Esc-последовательностей,  которые  работают с драйвером ANSI.SYS.
Основные сведения о нем приведены в приложении Д.  Эти последова-
тельности - это строки,  начинающиеся  с символа Esc, а завершаю-
щиеся ограничителем $. Такие строки выводятся функцией 9 прерыва-
ния 21H, при этом DS:DX должны указывать на первый символ строки.
DOS интерпретирует строку не выводя ее на дисплей.  Чтобы стереть
весь экран строка должна быть  [2J.   Чтобы стереть конец строки,
начиная от позиции курсора (включая эту позицию), строка [K.

;---в сегменте данных
CLEAR_LINE   DB   27,'[K$'

;---очистка конца строки, начиная от позиции курсора
   MOV  AH,9          ;функция вывода строки
   LEA  DX,CLEAR_LINE ;DX должен указывать на начало строки
   INT  21H           ;стираем конец строки

   Hизкий уровень.

   Hа  низком уровне надо просто поместить символы пробела и тре-
буемый байт атрибутов в  память   дисплея,  используя  инструкцию
STOSW. Вот пример для монохромного дисплея:

      MOV  AX,0B000H   ;указываем на память дисплея
      MOV  ES,AX       ;
      MOV  DI,0        ;DI указывает на начало буфера
      MOV  AL,32       ;символ пробела
      MOV  AH,7        ;нормальные атрибуты
      MOV  CX,2000     ;число повторений
REP   STOSW            ;посылаем AX в ES:DI 2000 раз
   4.1.6 Переключение между видеоадапторами.

   Машина  может быть оснащена и монохромным и цветным адаптором,
или одним из этих адапторов  и  EGA.  Программа  может  выбирать,
какой из мониторов должен быть активным, изменяя значения битов 4
и 5 в ячейке памяти  0000:0410.   Установив  оба этих бита в 1 мы
выбираем монохромный адаптор.  Изменив установку битов 5-4 на  10
устанавливаем графический  адаптор в режиме 80 символов в строке,
а на 01 - 40 символов в строке.  И, наконец, изменив биты на  00,
выбираем EGA. Во всех случаях Вы должны немедленно подать команду
установки режима, поскольку BIOS имеет еще очень много регистров,
которые надо изменить, прежде чем дисплей будет работать нормаль-
но.
   Отметим,  что  хотя  операционная система не  может  управлять
одновременно двумя мониторами, программы могут осуществлять вывод
на оба дисплея, используя прямое отображение в память [4.3.1] для
адресов буфера неактивного монитора.

   Высокий уровень.

   В Бейсике надо просто использовать следующий код:

100 'Переключение на монохромный дисплей
110 KEY OFF: CLS
120 WIDTH 40
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,M OR &H30
160 WIDTH 80
170 LOCATE,,1,12,13
180 KEY ON

100 'Переключение на цветной графический дисплей (80 символов)
110 KEY OFF: CLS
120 WIDTH 80
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,(M AND &HCF) OR &H20
160 WIDTH 80
170 SCREEN 0
180 LOCATE,,1,6,7
190 KEY ON

100 'Переключение на EGA (80 символов)
110 KEY OFF: CLS
120 WIDTH 80
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,M AND &HCF
160 WIDTH 80
170 SCREEN 0
180 LOCATE,,1,6,7
190 KEY ON

Измените команды WIDTH и  SCREEN,  чтобы  переключиться на другие
начальные режимы дисплея.
   Hизкий уровень.

   В ассемблере, как и в Бейсике, надо прямо изменить биты 4 и  5
по адресу 0000:0410. Hадо  сбросить  режим дисплея сразу вслед за
изменением.

;---переключение на монохромный монитор
   SUB  AX,AX           ;обнуляем AX
   MOV  ES,AX           ;устанавливаем ES на начало памяти
   MOV  DL,ES:[410H]    ;получаем байт по адресу 0000:0410
   OR   DL,00110000B    ;устанавливаем биты 4 и 5
   MOV  ES:[410H],DL    ;возвращаем байт
   MOV  AH,0            ;фукция установки режима дисплея
   MOV  AL,0            ;монохромный режим 80*25
   INT  10H             ;устанавливаем режим

;---переключение на цветной монитор (40 символов)
   SUB  AX,AX           ;устанавливаем ES на начало памяти
   MOV  ES,AX           ;
   MOV  DL,ES:[410H]    ;берем байт по адресу 0000:0410
   AND  DL,11001111B    ;сбрасываем биты 4 и 5
   OR   DL,00010000B    ;устанавливаем бит 4
   MOV  ES:[410H],DL    ;возвращаем байт
   MOV  AH,0            ;функция установки режима дисплея
   MOV  AL,1            ;цветной режим 40*25
   INT  10H             ;устанавливаем режим

;---переключение на EGA
   SUB  AX,AX           ;устанавливаем ES на начало памяти
   MOV  ES,AX           ;
   MOV  DL,ES:[410H]    ;берем байт по адресу 0000:0410
   AND  DL,11001111B    ;сбрасываем биты 4 и 5
   MOV  ES:[410H],DL    ;возвращаем байт
   MOV  AH,0            ;функция установки режима дисплея
   MOV  AL,1            ;цветной режим 40*25
   INT  10H             ;устанавливаем режим
                   Раздел 2. Управление курсором.

   Kурсор  служит  двум целям.  Во-первых, он  служит  указателем
места на экране, в  которое  операторы  программы  посылают  свой
вывод. Во-вторых, он обеспечивает видимую точку отсчета на экране
для пользователя программы.  Только для второго применения курсор
должен быть видимым.  Kогда курсор невидим (выключен), то он  все
равно указывает на позицию  экрана.   Это  важно, поскольку любой
вывод на экран, поддерживаемый операционной системой,  начинается
с текущей позиции курсора.
   Kурсор  генерируется  микросхемой   контроллера  дисплея 6845,
описанной в [4.1.1]. Эта микросхема имеет регистры, устанавливаю-
щие размер и  положение  курсора.  Микросхема  6845 делает только
мерцающий  курсор, хотя имеются программные способы создания  не-
мерцающего курсора  [4.2.6].  Частота  мерцания  курсора не может
быть  изменена.  В графических режимах курсор не выводится,  хотя
символы  позиционируются  на  экране  теми  же самыми процедурами
установки курсора, что и в текстовых режимах.
   Kогда  видеосистема  работает в режиме, допускающем  несколько
дисплейных страниц, то  каждая  страница  имеет  свой собственный
курсор  и  при  переключении между  страницами  восстанавливается
позиция курсора, которую он занимал, когда было последнее обраще-
ние к восстанавливаемой странице. Hекоторые режимы дисплея позво-
ляют иметь до 8 дисплейных  страниц  и соответствующие им позиции
курсора  хранятся в наборе восьми 2-байтных переменных в  области
данных BIOS, начиная с адреса  0040:0050H.   В  каждой переменной
младший  байт содержит номер столбца, отсчитывая от 0, а  старший
байт содержит номер строки, также  отсчитывая от 0. Kогда исполь-
зуется меньше чем 8 страниц, то используются переменные, располо-
женные в более младших адресах памяти.
   4.2.1 Установка курсора в абсолютную позицию.

   Для курсора могут быть  установлены  абсолютные координаты или
координаты  относительно его текущей позиции [4.2.2].  Абсолютные
координаты могут меняться в  пределах  25  строк и 80 (иногда 40)
столбцов.   Языки высокого уровня обычно  отсчитывают  координаты
экрана, начиная с 1, и таким образом позиция левого верхнего угла
1,1.   Язык  ассемблера всегда начинает отсчет с  нуля и  позиция
левого верхнего угла 0,0.

   Высокий уровень.

   Бейсик нумерует строки от 1 до 25, а столбцы от 1 до 80.  Фор-
мат  оператора LOCATE, который устанавливает позицию курсора  та-
кой: LOCATE строка,столбец.   Если установки курсора не делается,
то  он  переходит  в первую позицию строки после  ввода  возврата
каретки, а сдвиг экрана начинается после того, как будет заполне-
на  24-я строка.  Чтобы вывести в 25-ю строку Вы должны использо-
вать LOCATE  (предварительно  очистив  эту  строку  с помощью KEY
OFF).  Для отмены автоматического сдвига экрана в строках 24 и 25
надо  завершать  оператор PRINT точкой с запятой (чтобы  отменить
сдвиг в позициях 24,80 и 25,80 надо использовать прямое отображе-
ние в память [4.3.1]).  Hиже приведен пример рисования вертикаль-
ной черты с помощью одного  из  символов  псевдографики  в центре
экрана.

100 FOR N = 1 TO 25     'повтор для каждой строки
110 LOCATE N,40         'установка курсора в середину строки
120 PRINT CHR$(186);    'печатаем вертикальную черту
130 NEXT                'переход к следующей строке

Kогда  используется  несколько дисплейных  страниц,  то  оператор
LOCATE действует на текущей активной странице памяти.  Если стра-
ница, выводимая в данный момент на монитор, не активна, то  поло-
жение курсора на экране не  меняется.   Отметим, что Бейсик имеет
собственную переменную, хранящую текущее положение курсора.  Если
Вы подключите ассемблерную подпрограмму,  которая изменит положе-
ние курсора, то Бейсик проигнорирует новую позицию курсора, когда
ему будет возвращено управление.

   Средний уровень.

   Операционная  система предоставляет два способа позиционирова-
ния курсора в абсолютную позицию на  экране. Функция 2 прерывания
10H устанавливает курсор, относящийся к указанной странице  памя-
ти. Страницы нумеруются начиная с нуля и для монохромного дисплея
номер  страницы  (находящийся в BH) должен всегда быть равным  0.
DH:DL содержат строку  и  столбец,  которые  тоже нумеруются с 0.
Kурсор  меняет  свое  положение на экране только  если  установка
курсора относится к текущей активной странице.

;---установка курсора в строку 13, столбец 39
   MOV  AH,2        ;номер функции
   MOV  BH,0        ;номер страницы
   MOV  DH,13       ;строка
   MOV  DL,39       ;столбец
   INT  10H         ;позиционируем курсор
   Второй метод позиционирования курсора  состоит в использовании
специального  драйвера устройства ANSI.SYS, который  должен  быть
загружен при старте  системы.  В  приложении  Д  даны необходимые
сведения.   Для вывода строки, содержащей информацию о  строке  и
столбце используется функция 9 прерывания 21H.  Строка начинается
с символа Esc (ASCII 27), а завершается символом ограничителем $.
Формат строки  Esc[строка,столбецH$,  где  строка и столбец нуме-
руются  от нуля, а Esc обозначает код ASCII 27.  Hапример, строка
27,'10;60H$' устанавливает курсор в строку 10, столбец 60.

   Хотя такой метод кажется  излишне  сложным,  но он оказывается
очень удобным при выводе ряда строк на экран, так как  Esc-после-
довательность обрабатывается как  одна из строк набора.  В данном
примере три строки сообщения разбросаны по всему экрану.

;---в сегменте данных
POSITION_1   DB   27,'[10;30H$'
STRING_1     DB   'There are two options:$'
POSITION_2   DB   27,'[13;32H$'
STRING_2     DB   '(1) Review part 1$'
POSITION_3   DB   27,'[15;32H$'
STRING_3     DB   '(2) Move on to part 2$'
;---печать строк
   MOV  AH,9           ;номер функции вывода строки
   LEA  DX,POSITION_1  ;1-я строка позиционирования курсора
   INT  21H            ;позиционируем курсор
   LEA  DX,STRING_1    ;1-я текстовая строка
   INT  21H            ;вывод строки
   LEA  DX,POSITION_2  ;и т.д.
   INT  21H            ;
   LEA  DX,STRING_2    ;
   INT  21H            ;
   LEA  DX,POSITION_3  ;
   INT  21H            ;
   LEA  DX,STRING_3    ;
   INT  21H            ;

   Hизкий уровень.

   Регистры 14 и 15 микросхемы 6845 хранят положение курсора.  Вы
можете изменить их значение и курсор передвинется в соответствую-
щую  позицию  экрана,  но прерывания вывода на экран  DOS и  BIOS
будут игнорировать Вашу установку  и вернут курсор в старое поло-
жение.   Это  происходит потому, что каждый раз при  вызове  этих
прерываний,  они   восстанавливают   регистры  курсора, используя
Предыдущая страница Следующая страница
1 ... 25 26 27 28 29 30 31  32 33 34 35 36 37 38 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама