ВУЗ:
Составители:
20
символ на синем фоне.
Из всех графических режимов (они существуют только в реальном адаптере; в
модели AsmEd графические режимы не реализованы!) обратим внимание только на
наиболее простой – режим 320х200х256. Это означает разрешающую способность 320
точек (пикселов) по оси Х, 200 пикселов по оси Y, 256 цветов. Этот режим имеет номер
13h (для функции переключения режимов). Организация видеопамяти (видеобуфера)
здесь ещё проще: каждому пикселу соответствует свой байт, и эти байты размещаются
линейным образом, начиная с адреса A000h:0000h. В дисплейном адаптере существуют
также так называемые регистры палитры и регистры ЦАП, но, если не менять из
содержимое, то можно считать, что значения байтов видеопамяти (каждый байт=0…255)
однозначно определяют цвета соответствующих пикселов на экране.
Отметим, что первые 16 цветов (значения 0…15) совпадают с цветами для
текстового режима.
Смещение в видеобуфере (offset), соответствующее значению пиксела с
координатами (X, Y), можно вычислить по очень простой формуле: offset = 320*Y + X.
Переключение режимов адаптера. В составе BIOS (Base Input-Output System)
компьютеров типа IBM PC существует функция, предназначенная для этого. В регистр
AH следует записать 0, в регистр AL – номер режима (в частности, 3 либо 13h,
упомянутые выше) и затем выполнить команду Int 10h. Эта команда вызывает
программное прерывание номер 10h, которое соответствует функциям обслуживания
дисплейного адаптера. При отработке функции переключения режимов происходит также
очистка экрана дисплея.
Пример: вывод символа в текстовом режиме в левом верхнем углу;
используется встроенный ассемблер системы Turbo Pascal.
Program EXAMPLE_F;
Begin
ASM
MOV AH, 0
MOV AL, 3
INT 10H ; очистили экран путем реинициализации текстового режима
PUSH DS ; сохранили сегментный регистр в стеке
MOV AX, $B800
MOV DS, AX ; задали новый сегмент (указывающий на видеобуфер)
MOV BX, 0 ; смещение в видеобуфере = 0
MOV CX, 65 ; код буквы А
MOV [BX], CX ; выдали на экран (применена косвенная адресация)
MOV byte ptr [BX+1], $86 ; а это – догадайтесь сами !
POP DS ; восстановили старое содержимое сегментного регистра
End;
Readln { ждем нажатия клавиши Enter }
End.
20 символ на синем фоне. Из всех графических режимов (они существуют только в реальном адаптере; в модели AsmEd графические режимы не реализованы!) обратим внимание только на наиболее простой – режим 320х200х256. Это означает разрешающую способность 320 точек (пикселов) по оси Х, 200 пикселов по оси Y, 256 цветов. Этот режим имеет номер 13h (для функции переключения режимов). Организация видеопамяти (видеобуфера) здесь ещё проще: каждому пикселу соответствует свой байт, и эти байты размещаются линейным образом, начиная с адреса A000h:0000h. В дисплейном адаптере существуют также так называемые регистры палитры и регистры ЦАП, но, если не менять из содержимое, то можно считать, что значения байтов видеопамяти (каждый байт=0…255) однозначно определяют цвета соответствующих пикселов на экране. Отметим, что первые 16 цветов (значения 0…15) совпадают с цветами для текстового режима. Смещение в видеобуфере (offset), соответствующее значению пиксела с координатами (X, Y), можно вычислить по очень простой формуле: offset = 320*Y + X. Переключение режимов адаптера. В составе BIOS (Base Input-Output System) компьютеров типа IBM PC существует функция, предназначенная для этого. В регистр AH следует записать 0, в регистр AL – номер режима (в частности, 3 либо 13h, упомянутые выше) и затем выполнить команду Int 10h. Эта команда вызывает программное прерывание номер 10h, которое соответствует функциям обслуживания дисплейного адаптера. При отработке функции переключения режимов происходит также очистка экрана дисплея. Пример: вывод символа в текстовом режиме в левом верхнем углу; используется встроенный ассемблер системы Turbo Pascal. Program EXAMPLE_F; Begin ASM MOV AH, 0 MOV AL, 3 INT 10H ; очистили экран путем реинициализации текстового режима PUSH DS ; сохранили сегментный регистр в стеке MOV AX, $B800 MOV DS, AX ; задали новый сегмент (указывающий на видеобуфер) MOV BX, 0 ; смещение в видеобуфере = 0 MOV CX, 65 ; код буквы А MOV [BX], CX ; выдали на экран (применена косвенная адресация) MOV byte ptr [BX+1], $86 ; а это – догадайтесь сами ! POP DS ; восстановили старое содержимое сегментного регистра End; Readln { ждем нажатия клавиши Enter } End.