2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Pascal: вывод пикселя в разл. видеорежимах.
Сообщение27.09.2009, 09:53 
Нужно сравнить быстродействие ф-ий вывода пикселя на экран через прерывание 10h и напрямую в разл. режимах (для 12h достаточно).
Загрузили в универе низкоуровневым :( Прошу помочь тех, кто знает, как это, вообще, делается.

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение27.09.2009, 10:22 
Ну например примерно так (если на Паскале):

Код:
regim:=13;
asm
    MOV AX,$4F02;
    MOV BX,regim;
    INT $10;
end;


Это, правда, не вывод пиксела, а установка видеорежима (я пикселы никогда не выводил прерываниями, а всегда обращался напрямую к видеопамяти).

И ещё правда: вроде как прерывания ни досовские, ни биосовские под виндами не отрабатывают. Во всяком случае, все мои программы, использовавшие графику, под 98-ми вроде ещё работали, а под ХР -- уже нет.

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение27.09.2009, 10:39 
ewert
ewert в сообщении #246809 писал(а):
И ещё правда: вроде как прерывания ни досовские, ни биосовские под виндами не отрабатывают. Во всяком случае, все мои программы, использовавшие графику, под 98-ми вроде ещё работали, а под ХР -- уже нет.

Довольно странно, по-моему, эмулятор справляется с большинством прерываний (у меня, по крайней мере, графические вроде бы срабатывают; причем не только в Pascal-программах, а даже в ассемблерных COM-файлах). Хотя, так или иначе, существует замечательная вещь под названием Dosbox.

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение27.09.2009, 10:43 
Да я слыхал что-то о виртуальных машинах, и даже вроде когда-то собирался что-то поставить себе, но руки так и не дошли.

(Обычно я при форматировании очередного винчестера ставил бутменеджер с вариантом загрузки под чистый ДОС, но в последних двух случаях и это поленился сделать, а теперь уже поздно -- диски забиты.)

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение27.09.2009, 15:38 
2Sergio471
Цитата:
Нужно сравнить быстродействие ф-ий вывода пикселя на экран через прерывание 10h и напрямую

Понятно, что прямой доступ к видеобуферу будет осуществляться быстрее.

Кстати, кажется, особого смысла в непосредственном замере времени установки цвета пикселя нет, вместо этого нужно замерять время попиксельной заливки некоторой области, делить на количество пикселей, повторять процедуру несколько раз, а потом усреднять. Примерно так. :)

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 09:02 
ewert писал(а):
И ещё правда: вроде как прерывания ни досовские, ни биосовские под виндами не отрабатывают. Во всяком случае, все мои программы, использовавшие графику, под 98-ми вроде ещё работали, а под ХР -- уже нет.

Естественно, что на уровне пользовательский процессов обращения к низкоуровневым, аппаратно-зависимым ресурсам компьютера, типа аппаратных прерываний, в нормальных ОС запрещены.

EtCetera писал(а):
Хотя, так или иначе, существует замечательная вещь под названием Dosbox.

Вещь неплохая, однако тормознутая до жути. Хотя, конечно, идея красивая - написать эмулятор PC на чистом СИ и портировать его на все возможные платформы, где есть компилятор с Си и соотв. ресурсы.
Если нужна скорость, под винду лучше ставить виртуальную машину.

Circiter писал(а):
Кстати, кажется, особого смысла в непосредственном замере времени установки цвета пикселя нет, вместо этого нужно замерять время попиксельной заливки некоторой области, делить на количество пикселей, повторять процедуру несколько раз, а потом усреднять. Примерно так.

Естественно, что так. Ибо время отрисовки одного пикселя засечь практически невозможно по разным причинам. Странно, что это отметили только в четвертом сообщении!

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:01 
Про то, что область заливать, я тоже понял. Но не имел никакой практики и пиксель зарисовать не могу(никаких нужных команд не знаю). Пожалуйста, порекомендуйте подходящий ресурс или выложите код сего дела.

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:21 
Про видеорежим ewert уже сказал, но немного добавлю:
код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
        mov ah, $0F ;функция, определяющая текущий видеорежим
        int $10 ;работа со вводом/выводом
        ;заталкиваем в стек содержимое регистров ax и bx
        push bx
        push ax

        ;очистка экрана
        mov al, $12 ;установка видеорежима 640x480, 16 цветов
        mov ah, $00
        int 10h

        mov ah, $05 ;установка активной страницы
        mov al, 0 ;Номер страницы
        int $10
       
        ;...
        ;что-то делаем

        ;возвращаемся к прежнему видеорежиму:
        pop ax ;достаем из ax
        ;устанавливаем прежний видеорежим
        mov ah, $00
        int $10
        ;устанавливаем прежнюю видеостраницу
        pop bx ;достаем bx
        mov al, bh ;номер прежней видеостраницы
        mov ah, $05 ;устанавливаем ее
        int $10
 

Приблизительно таким должен быть код в случае нормальной работы программы (сохранение предыдущего видеорежима; установка нового видеорежима + страницы видеопамяти; работа программы; восстановление старого видеорежима).
Собственно вывод пикселя:
код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
    push ax
    push bx
    push cx
    push dx
    mov bl, 0
    mov bh, code_page
    mov cx, coord_x ;Горизонтальная координата
    mov dx, coord_y ;Вертикалькая координата
    mov ah, $0C ;Функция вывода точки
    mov al, col ;Цвет точки
    int $10 ;Вызов прерывания BIOS
    pop dx
    pop cx
    pop bx
    pop ax
 

Вместо code_page подставьте 0 или номер другой кодовой страницы. Вместо coord_x и coord_y - координаты пикселя, вместо col - цвет пикселя (здесь можно немного поиграться в зависимости от видеорежима).
Если планируется заливка области, то сохранять значения регистров не надо (уберите все push и pop).
Комментарии также уберите (в Pascal'е все равно используются { } и (* *) ).

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:41 
Это, полагаю, вывод напрямую в 12 видеорежиме. А через прерывание 10h как делается?

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:48 
Цитата:
Это, полагаю, вывод напрямую в 12 видеорежиме. А через прерывание 10h как делается?

Именно так и делается. Вам уже весь код написали!

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:50 
Эээ... Это вроде бы и было через 10h ($10 в Pascal'е)...
Еще есть аналогичное прерывание DOS (точно не помню, какое именно; если хотите - посмотрю), ну и прямой доступ к видеопамяти (о чем говорил еще ewert).
О! Опередили.

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:55 
Прямой доступ в видеопамять не просматривается - только установка видеорежима.
При прямом доступе в видеопамять запись происходит (вернее, происходила :)) в буфер по адресу A000:0 с предварительным выбором цветовой плоскости в каком-то из регистров видеоконтроллера.
Я думаю, Вам лучше Фроловых почитать (http://frolov-lib.ru/books/bsp/v21/index.html). Сейчас уже вряд ли кто-нибудь с ходу вспомнит, как это делается, - давно все это было.
У Фроловых и библиотека есть (правда, на C).

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 19:27 
Maslov в сообщении #247259 писал(а):
При прямом доступе в видеопамять запись происходит (вернее, происходила ) в буфер по адресу A000:0

Ну там ещё были (внутри ДОСа) какие-то прерывания, позволявшие обращаться к расширенной памяти, к любым её страничкам. Когда-то этим баловался, и даже написал какой-то вьюер, но -- было это давно, деталей уже не помню. Даже не помню, чем EXTENDED отличается от EXPANDED (т. е. помню, что один из терминов означал расширение по существу, а второй -- лишь использование верхушки стандартного мегабайта; но какой из них какой -- в упор не помню; я имел в виду, конечно, первое)

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 19:42 
ewert в сообщении #247267 писал(а):
Ну там ещё были (внутри ДОСа) какие-то прерывания, позволявшие обращаться к расширенной памяти, к любым её страничкам.
Да, только это к видеоадаптеру не относилось; он в зависимости от выбранной цветовой плоскости отображал соответствующий кусок своей внутренней памяти на один и тот же диапазон адресов A000:0 - B000:0. Т.е., включалась красная плоскость, прописывался бит R, затем включалась зеленая, прописывался бит G, и т.д.
Эх, просто даже ностальгия какая-то :)

 
 
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 20:01 
Maslov в сообщении #247272 писал(а):
Эх, просто даже ностальгия какая-то

ага, и Вы тоже не обращайте на меня внимания, это какие-то и у меня деццкие воспоминания

 
 
 [ Сообщений: 26 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group