Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Assembler _ Работа с "графикой"

Автор: Account 7.10.2011 21:47

Поставлена вот такая задача:
Нарисовать 8 разноцветных полос (не линий) во весь экран, режим например использовать 640х350 параллельных главной диагонали.

Пример результата в прикрепленной картинке


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: IUnknown 10.10.2011 20:57

Вот так:
Прикрепленный файл  lines5.zip ( 1.04 килобайт ) Кол-во скачиваний: 721

(по непонятной причине ASM-файл загружаться отказался. Странно, почему PAS можно, и CPP можно, а ASM-нельзя)

Но задача решена "в лоб", с выводом напрямую в видеопамять в этом режиме заморачиваться не очень хочется, поэтому вывод сделан через BIOS, откуда и быстродействие: ниже плинтуса, тем более, что запускалось это всё в эмуляторе. Хочешь - измени вывод пиксела на запись в видеопамять - будет на порядок (если не на 2) быстрей. Картинка получается очень похожая на ту, что ты показал... Да, там можно, разумеется, код еще подшлифовать, но пока я этого делать не стал...

Автор: IUnknown 13.10.2011 12:10

Похоже, эта тема интересна мне одному, но оставить недоделанным это задание я не мог. Вот версия, которая пишет напрямую в видеопамять.
Прикрепленный файл  lines8v.zip ( 3.75 килобайт ) Кол-во скачиваний: 732


Работает гораздо быстрее, чем предыдущая. Компилировалось TASM 3.0 :

>tasm lines8v.asm
>tlink lines8v.obj


Автор: Account 13.10.2011 14:05

Цитата(IUnknown @ 13.10.2011 13:10) *

Похоже, эта тема интересна мне одному, но оставить недоделанным это задание я не мог. Вот версия, которая пишет напрямую в видеопамять.


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

Остальное в приват отправил.

Автор: IUnknown 13.10.2011 17:15

Значит, по поводу артефактов...

Большую часть убрал, со ступенчатостью, извини, сделать ничего не могу, это все-таки не горизонтальные/вертикальные, а диагональные линии, причем соотношение сторон в этом граф. режиме тоже не самое благоприятное.

Касаемо черных точек, проскакивающих в некоторых местах - еще раз проверил всю работу с битами в начальном/конечном неполных байтах (уверен, проблема - именно там, какой-нибудь бит маски неправильно выставляется, или что-то в этом роде, отсюда и "битый пиксель", опять же - заметил, что появляются эти черные только на стыках разных цветов, а не в середине?). Пока ничего некорректного в коде найти не могу, потом еще покопаюсь.

Что касается правого нижнего угла - это вообще для меня загадка, я уже ограничил входные данные в процедуре ScanLine, теперь физически линия не может заходить на предыдущую/последующую строки (а очень похоже на то, что где-то все-таки происходит выход за пределы 0 .. 639 и пиксель уходит на соседнюю строку). Прогнал несколько раз в отладчике - не вижу, где проблема (то есть, время возникновения - как раз увидел, эта фигня проявляется, когда рисуется нижняя часть малиновых штановой полосы, но опять же, как с этим бороться - пока без понятия). Найду - напишу. Может, еще кто посмотрит и найдет что не так...


Прикрепленные файлы
Прикрепленный файл  lines9v.zip ( 4.18 килобайт ) Кол-во скачиваний: 535

Автор: Account 13.10.2011 17:38

Цитата(IUnknown @ 13.10.2011 18:15) *

Значит, по поводу артефактов...

Большую часть убрал, со ступенчатостью, извини, сделать ничего не могу, это все-таки не горизонтальные/вертикальные, а диагональные линии, причем соотношение сторон в этом граф. режиме тоже не самое благоприятное.

Касаемо черных точек, проскакивающих в некоторых местах - еще раз проверил всю работу с битами в начальном/конечном неполных байтах (уверен, проблема - именно там, какой-нибудь бит маски неправильно выставляется, или что-то в этом роде, отсюда и "битый пиксель", опять же - заметил, что появляются эти черные только на стыках разных цветов, а не в середине?). Пока ничего некорректного в коде найти не могу, потом еще покопаюсь.

Что касается правого нижнего угла - это вообще для меня загадка, я уже ограничил входные данные в процедуре ScanLine, теперь физически линия не может заходить на предыдущую/последующую строки (а очень похоже на то, что где-то все-таки происходит выход за пределы 0 .. 639 и пиксель уходит на соседнюю строку). Прогнал несколько раз в отладчике - не вижу, где проблема (то есть, время возникновения - как раз увидел, эта фигня проявляется, когда рисуется нижняя часть малиновых штановой полосы, но опять же, как с этим бороться - пока без понятия). Найду - напишу. Может, еще кто посмотрит и найдет что не так...


По поводу ступенчатости. Я понимаю что от нее не деться. Я там обвел только в одном месте что то слишком торчало))
Далее, верхний левый угол, такое ощущение что не с 0-го пикселя (по оси Y) начинало рисовать, я стрелочкой показал. При том что это только на первой полоске от главной диагонали почему то.

//-----------------------------------------------------

Посмотрел последнюю версию. Все шикарно и быстро. Только уголок остался.))
Цитата(IUnknown @ 13.10.2011 18:15) *

Может, еще кто посмотрит и найдет что не так...


Честно, гложет большое сомнение, что кто то захочет копаться в чужом коде на данном языке). Но время покажет, может и ошибаюсь...

Автор: TarasBer 13.10.2011 21:47

Цитата(IUnknown @ 13.10.2011 13:10) *

Похоже, эта тема интересна мне одному, но оставить недоделанным это задание я не мог. Вот версия, которая пишет напрямую в видеопамять.


Париться с "удобным" устройством видеопамяти в 640х350 мало кому интересно. Возни много, а толку? 320х200, 256 цветов намного интереснее.

Автор: IUnknown 14.10.2011 13:02

Надо ж было так ошибиться... Account, исправь (строка 494):

	; Рисуем пиксели из конечного неполного байта
mov al, [di] ; <--- Вот тут было mov AX, [di]
stosb

, я ж говорил, что проблема - с замыкающим байтом...

Автор: Account 14.10.2011 16:22

Цитата(IUnknown @ 14.10.2011 14:02) *

Надо ж было так ошибиться... Account, исправь (строка 494):

	; Рисуем пиксели из конечного неполного байта
mov al, [di] ; <--- Вот тут было mov AX, [di]
stosb

, я ж говорил, что проблема - с замыкающим байтом...


От ошибок никто не застрахован, особенно в этом языке.

Подправил, проверил. Ну что тут можно сказать, супер, быстро и красиво. А ты как всегда на высоте.