Здравствуйте! Подскажите, пожалуйста, возможна ли в видеорежиме 320x240x256 адресация такая же как и в 320x200x256 (mov ax, 13h/int10h)? ModeX не хочу, там организация другая, неудобно, надо чтобы на один пиксель был один байт. Пытался просто в CRT контроллере к регистрам вертикальных характеристик добавить 40 (или 80) плюс включить 256k вместо 64k, в результате экран немного сжался, отображается вроде больше, но видно, что нижние строки заворачиваются наверх и наоборот, при постоянном обновлении экрана получаем мерцание нескольких верхних и нижних строк. Такая же как и в 320x200 организация доступа к видеопамяти нужна для того, чтобы можно было использовать один и тот же алгоритм обновления экрана как для 320x200, так и для 320x240. Другой резон - чтобы лишний раз порты не трогать, просто пиши себе в память и все. Спасибо.
Я напрямую и программирую, но т.к. хотелось бы избежать полного перепрограммирования всех регистров, в контроллере CRT изменяются лишь поля: Vertical Total, Vertical Retrace Start, Vertical Display End и Start Vertical Blanking. Т.е. сначала я выставляю стандартный видеорежим 13h через int 10h, затем читаю значение вышеуказанных полей, прибавляю к каждому по 40 и записываю обратно. Дополнительно изменяю еще несколько регистров: Код (Text): ; change memory map to 0A0000h-0BFFFFh mov dx, 003CEh mov al, 006h out dx, al inc dl in al, dx and al, 0F3h out dx, al ; select extended memory mode mov dx, 003C4h mov al, 004h out dx, al inc dl in al, dx or al, 002h out dx, al ; set misc output mov dx, 003CCh in al, dx mov dl, 0C2h or al, 0C0h out dx, al , однако, похоже, начиная с адреса 0B0000h, данные записываются как в нижние строки, так и в верхние, отчего видно мерцание внизу и вверху при постоянном обновлении данных в видеопамяти. Гораздо меньше вероятность того, что там будет режим 320x240x256, да еще с непрерывным буфером (по документации на VBE/VESA буфер может быть вообще разбит по 4k, располагающихся непоследовательно).
Ykidia Здесь прога перечисляющая видеорежимы доступные через vesa. И насколько я помню если юзать линейный видеобуфер (его адрес за пределами обычной оперативки узнаётся через vesa) то никаких проблем с неадекватным дроблением буфера нет
Так у тебя скорее всего не получится. Для 320х240@256 надо 75Кб. А на всех картах на которых я пробовал отображение видеопамяти на A000h-B000h (128К) не работает.
Y_Mur VESA это VESA. Для этого более-менее современную карту надо иметь. А ModeX на чистом VGA работает. Ты ж не знаеш для чего он свою прогу пишет и где запускать будет...
Подтверждаю, сто пудово не видел чтоб работало. Зато ModeX в VESA режимах - прикольно так работает по разному на разных видяхах. А если VESA ну никак не хочется - то только XMode. Все равно демки, игрухи или чего там еще... будут работать не с одним экранным буфером... Так что заводим буфер в памяти где нить, а потом в нужный момент или с нужной частотой отображаем его на экран в XMode.
Обидно! Придется делать 288x216x256 (либо 296x222 минус одна нижняя строчка), я не знал, что так необходимо в 64k влезть... А у меня вопрос тогда по ModeX: как мне тогда отобразить байт на экран в виде последовательных пикселей, где установленные биты будут пикселями с одним цветом, а сброшенные - пикселями с другим цветом? Возможно ли сделать без дерганий портов ввода-вывода?
хе, точно, я как то уж и забыл. Но все равно, рисовать что либо проще в нормальном режиме, т.е. когда память плоская. Ну а если тов. Ykidia захотелось реального церебрального секса , тогда как гриться As you wish... Где то в примерах из C-- видел разные алгоритмы рисования линий в XMode, скажу сразу - мозг отказывался анализировать код и было принято решение передрать неглядя все на асм, тем более что там почти асм... не стоит, оставь 320 x 240 просто выводи кадр (буфер 64К, полных 204 строки) по центру экрана, т.е. начиная с 18 строки, по крайней мере экран не перекосо$#@ит при нестандартных разрешениях. IMHO - нет, такой финт проходит лишь в 4-х битных режимах. есть вариант - за одно обращение к памяти красить сразу 4 точки, при этом предварительно установить соответствующую битовую маску, например: mov ax,0F02h ; 0F - маска для вывода точек mov dx,3c4h out dx,ax ; set bit plane mask register mov al,[color] mov es:[di],al ; draw pixels mov es:[di+10],al ; draw pixels mov es:[di+20],al ; draw pixels mov es:[di+30],al ; draw pixels mov es:[di+40],al ; draw pixels соответственно - дергаем порт всего лишь раз для установки битовой маски. Очень удобно в плане рисования горизонтальных линий.
Поздно, уже успел сделать 288x216. А можно тогда пример для 4х-битного? Спасибо большое вам за отзывчивость и дельные советы! Но у меня имеется и другая проблемка, описана в соседней теме http://www.wasm.ru/forum/viewtopic.php?id=20850 . Собственно, именно из-за нее я решил пока VBE/VESA не трогать. Но дело оказалось не только в VBE/VESA, а также и просто в выборе стандартного видеорежима 13h. Прерывания пропадают. Как мне их вернуть назад? Помогите, пожалуйста!
Вобщем, в 4 битном VGA режиме имеем 4 плоскости видеопамяти, соответственно, для наибыстрейшего вывода битмапки на экран нужно последовательно заполнить все 4 плоскости, т.е. требуется всего 4 обращения к порту видяхи. Насколько я понимаю, это наибыстрейший способ отображения. Недостаток - исходную битмапку нужно "разрезать" на 4 слоя должным образом, и дополнительный геморой при выводе битмапки в любую область экрана...