Вопрос № 122807: Здравствуйте уважаемые эксперты!
Извините за длинный вопрос, просто они у меня накапливаются, чтобы лишний раз вас не отвлекать.
Объясните, пожалуйста, несколько вопросов. (программы типа COM).
1) Изучая режимы SVGA, я столкнулся с такой ...
Вопрос № 122.807
Здравствуйте уважаемые эксперты!
Извините за длинный вопрос, просто они у меня накапливаются, чтобы лишний раз вас не отвлекать.
Объясните, пожалуйста, несколько вопросов. (программы типа COM).
1) Изучая режимы SVGA, я столкнулся с такой ситуацией:
На большинстве машин за один пиксель отвечают 4 байта (синий, зеленый, красный, резерв). Я использовал процедуру в приложении 1 для пересчета в линейный адрес и установки «окна проецирования».
А вот на некоторых машинах, за один пиксель отвечают 3 байта (т.е. без резервного). В этом я убедился, используя ax=4f01h cx=112h (режим 640*480 и 3-х байтный цвет), int 10h.
Ну думаю ладно, изменил первые две строки процедуры (shl bx,2 / mov ax,640*4) на (mov ax,bx / add bx,ax / add bx,ax / mov ax,640*3). И тем не менее не хочет работать (рисунка нет). До этого все делал из-под Windows, загрузил с дискеты «чистый» DOS. И вот тогда программа заработала. Я делаю вывод, что каким-то образом принимает участие видеодрайвер (кстати, на этой машине стоит мат. плата «Mercury», а допол. видеокарты нет вообще). Но отсюда вытекает второй вопрос.
2) Почему SVGA режимы работают под «чистым» DOS. Неужели DOS понимает все современные видеокарты, ведь производители не стоят на месте. И никаких драйверов не надо?
3) Не совсем до конца понимаю, когда мы используем прямое копирование в сегмент A000h для графических режимов, и в сегмент B800h (или B900h и т.д.) для текстовых режимов – куда это все на самом деле копируется? Действительно сразу на видеопамять или все же сначала в оперативную память в некую область под условным названием «видеобуфер»? И в этом случае, когда все попадает на видеопамять?
4) Объяните, пожалуйста, команды арифметического сопроцессора: FBLD, FBSTP, FBST.
Сколько пробовал компилятор ругается. И что такое десятичный формат числа? Правильно ли я понял- что используя связки FLD-FBSTP и FBLD-FSTP можно переводить числа из 16-й системы в 10-ную и обратно?
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Бартосик Феликс Михайлович!
1) Видеоконтролеры различных производителей по разному интерпретируют режимы TureColor: 10Fh,112h,115,118h и 11Bh. Одни как 24-битовые, другие как 32-битовые, т.е. однозначного стандарта на эти режимы нет. Поэтому нужно проверять функцией 4F01h байт +25h(возвращаемой структуры)- число бит резервной компоненты (если 0, значит это 24-битовый, если 8, то 32-битовый). 2) Работая в "чистом" DOSe, Вы работаете прямо с видеоконтролером, без "посредников".
Когда Вы работаете в эмуляторе DOS под Windows, из-за некорректно написаного эмулятора DOS, некоторые режимы и команды неправильно обрабатываются и потом передаются по цепи: операционная система, драйвер и только сейчас видеоконтролер. 3) Все это копируется в оперативную память. Вывод информации на экран производится так: - информация записывается в оперативную память; - во время обратного хода луча, видеоконтролер используя режим DMA(Direct Memo
ry Access - прямой доступ к памяти) без участия процессора, сам считывет информацию из опертивной памяти в свою; - и только потом она попадает на экран. По вопросам 1-3, думаю Вам будет полезна книга В.Кулакова.
4) Эти команды работают с упакoванными двоичнодесятичноними числами(BCD) , в отличии от двоичных, на каждую десятичную цифру отводится 4-е бита, т.е. в одном байте находятся 2-е десятичные цифры, к примеру: число 99 в BCD
формате выглядят так: 1001 10012 = 9916 = 15310 В отличии от 2-ой системы: 0110 00112 = 6316 = 9910 не упакованные BCD число, это когда в каждом байте находятся по одной цифре. В приложении варианты ввода и вывода без сопроцессора, а также вывод с его использованием. Как пример перевода чисел без сопроцессора, посмотрите Вопрос № 120.924. ps:вопросы задавайте в мини-форум. Удачи!
Приложение:
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Профессионал) Украина, Киев Тел.: +380958380164 Адрес: Украина г.Киев ---- Ответ отправлен: 12.02.2008, 18:16 Оценка за ответ: 5 Комментарий оценки: Спасибо Константин Николаевич !
3) Не совсем понял откуда видеоконтролер знает из какого места опер.памяти нужно считывать инфомацию в свою память? Т.е., если например программа находится в текстовом режиме и активна нулевая страница, то видеоконтролер такой умный и знает, что нужно считывать из 0B800h-ного сегмента?
4) В примере из Вашего приложения есть такая строка fbstp number_temp. Какого типа должна быть переменная number_temp. Вот над этим я уже и до этого бился - перебрал все типы от db до dq, и везде компилятор Masm611 выдает ошибку:invalid operand size for instruction