Видеорежим 320x240x256 - возможно ли сделать байт на пиксель?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Ykidia, 3 июн 2007.

  1. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Здравствуйте!

    Подскажите, пожалуйста, возможна ли в видеорежиме 320x240x256 адресация такая же как и в 320x200x256 (mov ax, 13h/int10h)?
    ModeX не хочу, там организация другая, неудобно, надо чтобы на один пиксель был один байт.
    Пытался просто в CRT контроллере к регистрам вертикальных характеристик добавить 40 (или 80) плюс включить 256k вместо 64k, в результате экран немного сжался, отображается вроде больше, но видно, что нижние строки заворачиваются наверх и наоборот, при постоянном обновлении экрана получаем мерцание нескольких верхних и нижних строк.
    Такая же как и в 320x200 организация доступа к видеопамяти нужна для того, чтобы можно было использовать один и тот же алгоритм обновления экрана как для 320x200, так и для 320x240. Другой резон - чтобы лишний раз порты не трогать, просто пиши себе в память и все.

    Спасибо.
     
  2. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Для этого нужно напрямую запрограммировать видеокарту. Гораздо легче попользоваться VESA BIOS.
     
  3. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Я напрямую и программирую, но т.к. хотелось бы избежать полного перепрограммирования всех регистров, в контроллере CRT изменяются лишь поля:
    Vertical Total,
    Vertical Retrace Start,
    Vertical Display End и
    Start Vertical Blanking.
    Т.е. сначала я выставляю стандартный видеорежим 13h через int 10h,
    затем читаю значение вышеуказанных полей, прибавляю к каждому по 40 и записываю обратно. Дополнительно изменяю еще несколько регистров:
    Код (Text):
    1.                 ; change memory map to 0A0000h-0BFFFFh
    2.                 mov     dx, 003CEh
    3.                 mov     al, 006h
    4.                 out     dx, al
    5.                 inc     dl
    6.                 in      al, dx
    7.                 and     al, 0F3h
    8.                 out     dx, al
    9.                 ; select extended memory mode
    10.                 mov     dx, 003C4h
    11.                 mov     al, 004h
    12.                 out     dx, al
    13.                 inc     dl
    14.                 in      al, dx
    15.                 or      al, 002h
    16.                 out     dx, al
    17.                 ; set misc output
    18.                 mov     dx, 003CCh
    19.                 in      al, dx
    20.                 mov     dl, 0C2h
    21.                 or      al, 0C0h
    22.                 out     dx, al
    , однако, похоже, начиная с адреса 0B0000h, данные записываются как в нижние строки, так и в верхние, отчего видно мерцание внизу и вверху при постоянном обновлении данных в видеопамяти.

    Гораздо меньше вероятность того, что там будет режим 320x240x256, да еще с непрерывным буфером (по документации на VBE/VESA буфер может быть вообще разбит по 4k, располагающихся непоследовательно).
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Ykidia
    Здесь прога перечисляющая видеорежимы доступные через vesa. И насколько я помню если юзать линейный видеобуфер (его адрес за пределами обычной оперативки узнаётся через vesa) то никаких проблем с неадекватным дроблением буфера нет ;)
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Так у тебя скорее всего не получится.
    Для 320х240@256 надо 75Кб.
    А на всех картах на которых я пробовал отображение видеопамяти на A000h-B000h (128К) не работает.
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Y_Mur VESA это VESA.
    Для этого более-менее современную карту надо иметь.
    А ModeX на чистом VGA работает.
    Ты ж не знаеш для чего он свою прогу пишет и где запускать будет...
     
  7. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    Подтверждаю, сто пудово не видел чтоб работало. Зато ModeX в VESA режимах - прикольно так работает :) по разному на разных видяхах.
    А если VESA ну никак не хочется - то только XMode. Все равно демки, игрухи или чего там еще... будут работать не с одним экранным буфером... Так что заводим буфер в памяти где нить, а потом в нужный момент или с нужной частотой отображаем его на экран в XMode.
     
  8. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Обидно! Придется делать 288x216x256 (либо 296x222 минус одна нижняя строчка), я не знал, что так необходимо в 64k влезть...
    А у меня вопрос тогда по ModeX: как мне тогда отобразить байт на экран в виде последовательных пикселей, где установленные биты будут пикселями с одним цветом, а сброшенные - пикселями с другим цветом? Возможно ли сделать без дерганий портов ввода-вывода?
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Дык а в ModeX в отличии от стандартного 13h можно и так три видеостраницы сделать :)
     
  10. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    хе, точно, я как то уж и забыл. Но все равно, рисовать что либо проще в нормальном режиме, т.е. когда память плоская.
    Ну а если тов. 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
    соответственно - дергаем порт всего лишь раз для установки битовой маски.
    Очень удобно в плане рисования горизонтальных линий.
     
  11. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Поздно, уже успел сделать 288x216.
    А можно тогда пример для 4х-битного?

    Спасибо большое вам за отзывчивость и дельные советы! Но у меня имеется и другая проблемка, описана в соседней теме http://www.wasm.ru/forum/viewtopic.php?id=20850 . Собственно, именно из-за нее я решил пока VBE/VESA не трогать. Но дело оказалось не только в VBE/VESA, а также и просто в выборе стандартного видеорежима 13h. Прерывания пропадают. Как мне их вернуть назад? Помогите, пожалуйста!
     
  12. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    можно, только завтра, сейчас с собой нету сырцов...
     
  13. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    Вобщем, в 4 битном VGA режиме имеем 4 плоскости видеопамяти, соответственно, для наибыстрейшего вывода битмапки на экран нужно последовательно заполнить все 4 плоскости, т.е. требуется всего 4 обращения к порту видяхи. Насколько я понимаю, это наибыстрейший способ отображения.
    Недостаток - исходную битмапку нужно "разрезать" на 4 слоя должным образом, и дополнительный геморой при выводе битмапки в любую область экрана...
     
  14. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Спасибо большое за исходники! Буду разбираться...