В коде попиксельного рисования в буфере желательно заменить вот это:
Code:
drawpixel_buf:
bt bx,15
jc @f
bt cx,15
jc @f
cmp bx,word[active_buffer_w]
jge @f
cmp cx,word[active_buffer_h]
jge @f
push edi esi
mov edi,dword[active_buffer] ;ptr - pointer to buffer
mov esi,ebx ;esi=coord x
imul esi,3 ;x*3
add edi,esi ;ptr+x*3
xor esi,esi
mov si,word[active_buffer_w] ;size x
imul esi,ecx ;size_x*y
imul esi,3 ;size_x*y*3
add edi,esi ;ptr+x*3+size_x*y*3
mov word[edi],dx ;
ror edx,16
mov byte[edi+2],dl
ror edx,16
pop esi edi
@@:
ret
хотя бы на это
Code:
drawpixel_buf:
bt bx,15
jc @f
bt cx,15
jc @f
cmp bx,word[active_buffer_w]
jge @f
cmp cx,word[active_buffer_h]
jge @f
push esi
xor esi,esi
mov si,word[active_buffer_w] ;size x
imul esi,ecx ;size_x*y
add esi,ebx ;size_x*y+x
lea esi,[esi+esi*2] ;(size_x*y+x)*3
add esi,dword[active_buffer] ;ptr+(size_x*y+x)*3
mov word[esi],dx ;
ror edx,16
mov byte[esi+2],dl
ror edx,16
pop esi
@@:
ret
Небольшие рекомендации.
В коде попиксельного рисования отдельного вида кривой желательно сделать как можно меньше обращений к системной памяти. То есть желательно отказаться от push/pop для функции попиксельного рисования. Перед вызовом drawpixel_buf необходимые параметры поместить в регистры(указатель на буфер, его ширина и высота). Если последовательно рисуется множество точек одной кривой, то заранее размещённые в регистрах параметры дадут очень существенное ускорение работы. Скорость работы регистровой памяти значительно выше, чем системной.