2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Pascal: вывод пикселя в разл. видеорежимах.
Сообщение27.09.2009, 09:53 


01/05/09
22
Нужно сравнить быстродействие ф-ий вывода пикселя на экран через прерывание 10h и напрямую в разл. режимах (для 12h достаточно).
Загрузили в универе низкоуровневым :( Прошу помочь тех, кто знает, как это, вообще, делается.

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


11/05/08
32166
Ну например примерно так (если на Паскале):

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


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

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

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение27.09.2009, 10:39 
Заслуженный участник


28/04/09
1933
ewert
ewert в сообщении #246809 писал(а):
И ещё правда: вроде как прерывания ни досовские, ни биосовские под виндами не отрабатывают. Во всяком случае, все мои программы, использовавшие графику, под 98-ми вроде ещё работали, а под ХР -- уже нет.

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

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


11/05/08
32166
Да я слыхал что-то о виртуальных машинах, и даже вроде когда-то собирался что-то поставить себе, но руки так и не дошли.

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

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение27.09.2009, 15:38 
Заслуженный участник


26/07/09
1559
Алматы
2Sergio471
Цитата:
Нужно сравнить быстродействие ф-ий вывода пикселя на экран через прерывание 10h и напрямую

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

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

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 09:02 


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

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

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

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

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

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

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:01 


01/05/09
22
Про то, что область заливать, я тоже понял. Но не имел никакой практики и пиксель зарисовать не могу(никаких нужных команд не знаю). Пожалуйста, порекомендуйте подходящий ресурс или выложите код сего дела.

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:21 
Заслуженный участник


28/04/09
1933
Про видеорежим 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 


01/05/09
22
Это, полагаю, вывод напрямую в 12 видеорежиме. А через прерывание 10h как делается?

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:48 


21/03/06
1545
Москва
Цитата:
Это, полагаю, вывод напрямую в 12 видеорежиме. А через прерывание 10h как делается?

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

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:50 
Заслуженный участник


28/04/09
1933
Эээ... Это вроде бы и было через 10h ($10 в Pascal'е)...
Еще есть аналогичное прерывание DOS (точно не помню, какое именно; если хотите - посмотрю), ну и прямой доступ к видеопамяти (о чем говорил еще ewert).
О! Опередили.

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 18:55 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 19:27 
Заслуженный участник


11/05/08
32166
Maslov в сообщении #247259 писал(а):
При прямом доступе в видеопамять запись происходит (вернее, происходила ) в буфер по адресу A000:0

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

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 19:42 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Pascal: вывод пикселя в разл. видеорежимах.
Сообщение28.09.2009, 20:01 
Заслуженный участник


11/05/08
32166
Maslov в сообщении #247272 писал(а):
Эх, просто даже ностальгия какая-то

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group