Доброго времени суток ) Не могу понять как устроен видеобуфер в данном режиме. Подскажите пожалуйста) Или, если можно, то дайте ссылочку (желательно русскую, а то читал уже по-английски, но почти ничего не смог понять ) по которой можно было бы прочитать про место нахождение этого буфера и работы с ним. Просто я читал, что он находится в промежутке a0000:bffff , но реально при записи в участок после b0000, записанное не отображается на экран + я могу орудовать приблезительно четырмя-пятью рядками экрана... остальные не знаю как адресовать ))) Большое спасибо! )
Programer Переключение банков видеопамяти или линейный кадровый буфер? Или по другому - реальный или защищенный режим?
Programer Если защищенный, то "... вся видеопамять отображается на непрерывный кусок адресного пространства, но начинающегося не с адреса 0A0000h, а с какого-нибудь другого адреса, так чтобы весь образ видеопамяти, который может занимать несколько мегабайтов, отобразился в один непрерывный массив. В защищенном режиме максимальный размер сегмента составляет 4 гигабайта, поэтому никаких сложностей с адресацией этого буфера не возникает. Буфер LFB можно использовать, только если видеоадаптер поддерживает спецификацию VBE 2.0 ..." Зубков. Ассемблер для DOS, Windows и UNIX. ps Что значит "Значит защищённый"? Ты не знаешь (еще не знаешь) в каком режиме работает (будет работать) программа?
))) Почему же не знаю )) конечно знаю... просто это я от удивления так ответил... Обьясните пожалуйста слова "а с какого-нибудь другого адреса". Это значит что я сам могу перепрограммировать буфер на другой адрес? Если да, то как? Спасибо.
Programer Зубков. Ассемблер для DOS, Windows и UNIX. 6.4.3. Вывод на экран через линейный кадровый буфер
этот "какой-нибудь" адрес мона узнать через функцию получения информации о видеорежмие: Код (Text): mov ax, 0x4F01 mov cx, 0x118 mov di, buffer push ds pop es int 0x10 mov edi, [buffer + 0x28]
Добрый день. Не мог некоторое время попасть в интернет, и за это время уже разобрался с данным режимом... Но в ходе программирования у меня появился вопрос: Почему, когда я резервирую память для отображения инфы режима в начале программы, то всё работает: Код (Text): start: jmp beg buffer db 256d dup (0) beg: push ds pop es mov di,buffer mov ax,4f01h mov bx,118h int 10h ... end start Но если резервировать память после кода программы, то данные туда не выводяться (то есть там остаются нолики) Код (Text): start: push ds pop es mov di,buffer mov ax,4f01h mov bx,118h int 10h ...тут продолжение программы buffer db 256d dup (0) end start
Programer Скорее всего данные оказались в другом сегменте, так что адрес ds:offset(buffer) не указывает на данные Лучши воспользуйся командой LES di, buffer для загрузки адресса
Так... помоему я что-то не так делаю или не правильно понимаю)) просто код Код (Text): jmp beg buffer db 256d dup (0) beg: push ds pop es mov di,offset buffer mov ax,4f01h mov bx,118h int 10h работает только в том случае правильно, если в момент вызова прерывания значение регистра сх равно значению регистра di (соответственно если значения обеих равно offset buffer). Почему так, и что я не правильно делаю? Спасибо.
Вполне возможно... Ведь ещё сегодня утром этот код работал, а через некоторое время (просто при смене положения переменной buffer) начались проблемы (кстати, это не первый раз, просто когда это случилось впервые я подумал что возможно что-то перепутал и потому переписал код заново, после чего всё прошло)... Но как избежать данной "спонтанной мутации" и чем она вызвана (всмысле у меня руки кривые, или разработчики не досмотрели)? Спасибо
)) Тоесть это значит руки кривые? Ладно... Ща буду отдельно с прерыванием експериментировать... Вдруг и правда руки не оттуда и я в самой программе что-то натворил, а жалуюсь на прерывание
Бляха... (((( Это ж надо было так ))) Всё... понятно, только теперь понял что имелось ввиду под "спонтанной мутацией".... Я регистры перепутал... ))) Всем спасибо