Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Смена видео режима через BIOS parameter block


Автор: GShadrin 28.3.2011, 11:45
Здравствуйте.

Необходимо на тасме сменить текущий видео режим прямым доступом к BIOS parameter block.
Нагуглил, что BIOS parameter block находится в сегменте 0040.
Смещение для текущего видео режима 49h (byte).
Пишу следующим образом:
Код

 mov ax, 0040h ; Сегментный адрес BPB
 mov es, ax
 mov bx, 49h ; смещение режима 
 mov  byte ptr ES:[BX], 0 ; или любой другой
     
Но режим не меняется. Может кто-то делал, что-то подобное.
В чем моя ошибка?

Автор: iff 28.3.2011, 15:25
49h - текущий видеорежим, указывемый единичным битом:
бит --- Режим
7 - монохромный
6 - 640х200 монохромный
5 - 320х200 монохромный
4 - 320х200 цветной
3 - 80х25 цветной (здесь и далее текстовые режимы)
2 - 80х25 монохромный
1 - 40х25 цветной
0 - 40х25 монохромный

П.С. Попробуйте запустить на виртуальной машине (досбокс) или вообще по чистым ДОС.

Автор: GShadrin 28.3.2011, 16:02
Запускал под досбоксом. На чистом досе нет возможности.
Спасибо за расшифровку режимов, но я ее знаю.

Проблема заключается в том, что после записи на 49h, указанным выше способом, допустим нулевого режима (как и любого другого), смены режима не происходит. Досбокс запускается с шириной 80, после выполнения смены режима указанным способом ширина остается 80 (а не 40, как для 0-го режима). Если делаю через int10h ширина меняется на 40. Хочется разобраться почему происходит именно так. Может просто записать на 49h необходимый режим недостаточно для изменения режима? Можно ли так делать? В интернете мало информации.

Автор: iff 28.3.2011, 18:19
Цитата(GShadrin @  28.3.2011,  16:02 Найти цитируемый пост)
Спасибо за расшифровку режимов

Это расшифровка значения байта 40:49 по битам (для каждого бита, от нулевого до седьмого указано его значение).

Боюсь, что этот параметр обеспечивает только чтение. Т.е. прочитав его, можно узнать инф. о рижиме, а записав его режим изменить нельзя, можно только нарушить работу программ, которые читают это значение.
Например функция 00h прерывания int 10 считывает значинеия из таких портов как:
03CA
03C4
03CE
03CC
03D4
03D5
и записывает в такие как:
03D4
03D5
это наверно не весь список, т.к. я просто в отладчике debug просмотрел как работает это прерывание.

А интересно для чего вам нужно устанавливать режим, не используя int 10h?

Автор: ФедосеевПавел 28.3.2011, 19:32
GShadrin, IMHO, в BIOS Area для видеорежимов хранится справочная информация. Сами видеорежимы можно менять или через прерывание 10h или прямым обращением к портам видеоконтроллера.
При вызове прерывания 10h BIOS обращается к портам видеоконроллера, а затем обновляет ряд переменых в BIOS Area.

Хотя, для перемещения курсора всё наоборот. После записи новых координат в соответствующие ячейки (аппаратный курсор пока не переместился) и вызова int 10h для вывода символа или строки, символы напечатаются в ожидаемом месте (и аппаратный курсор переместится).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)