stmd: mov ax,OFOOh | код функции "Чтение видеорежима" |
int lOh BIOS | читает текущий видеорежим |
mov OldMode, al | сохранение кода видеорежима |
mov bx, NewMode | ; код одного из режимов VESA |
mov ax, 4F02h | ; код запрашиваемой функции BIOS |
int lOh BIOS | ; исполняет запрос |
cmp ax, 4Fh | ; режим установлен ? |
jz succ -> | ; да, на продолжение программы |
; Ошибка при установке видеорежима |
В тексте примера 2.4 использованы имена OldMode и NewMode. Первое из них может быть только именем байта, расположенного в области данных программы. Как создаются такие имена, описано в последнем разделе данной главы. NewMode может быть именем расположенного в области данных слова, или константы, которой заранее присвоено конкретное значение, скажем, NewMode = noh. Кроме того, код режима может быть указан в команде явно, например, mov bx, noh. Если при выполнении задачи видеорежим устанавливается только один раз, то выбор способа указания NewMode произволен. Тем не менее использование переменных является более универсальным и предпочтительным приемом.
Первые три команды примера 2.4 считывают текущий видеорежим и сохраняют его в байте OldMode. Следующие три команды устанавливают новый режим, в котором будет работать задача. После второго возврата из BIOS анализируется содержимое регистра ах. Если в нем записан код 4Fh, то нужный режим установлен и происходит переход на начало примера 2.5 (метка succ). Отличие кода от 4Fh означает чрезвычайную ситуацию, поскольку предварительно были выполнены проверки, показавшие, что видеокарта поддерживает нужный режим. Если ваша задача заведомо корректна, то остается только проверять общее состояние компьютера и программного обеспечения.
В примере 2.4 для определения значения исходного видеорежима издается запрос OFh прерывания int 10h. При его исполнении BIOS просто считывает в регистр al содержимое байта 0000:0449, относящегося к области данных BIOS. Выполнить эти действия можно непосредственно в задаче без обращения к BIOS. В таком случае исключаются примерно 30 команд, которые BIOS выполняет при расшифровке запроса, сохранении и восстановлении содержимого регистров.