zx_, неправильное колдунство. Правильное такое: в тему кастуется @ivagor ! Трахти-бидохти-бидох!
zx_, неправильное колдунство. Правильное такое: в тему кастуется @ivagor ! Трахти-бидохти-бидох!
___________
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Не знаю, какие ограничения есть для процедуры рисования линии в элите на специалисте, но про сократить я ничего умного в данном случае сказать не могу, процедура очень компактная. А вот ускорить можно. Если в приведенной процедуре вынести расчет адреса по координатам из цикла, а в цикле только сдвигать маску и инкрементировать составляющие адреса, то она ускориться в 2 раза. Тестировал по сумме двух циклов (x0=0, y0=0, x1=255, y1=255-0 и x0=0, y0=0, x1=255-0, y1=255). Но есть процедура, которая быстрее в 2.7 раза. Если нужно в основном рисовать средние и длинные линии (примерно >16 точек), то эту процедуру можно еще ускорить за счет развертывания циклов, но она станет непотребно толстой.
ivagor, нет ограничений
там конвейер и длина не более 252 по горизонтали и 191 по вертикали соответсвенно
С уважением,
Jerri / Red Triangle.
появилось время
пересмотрел линию
теперь будет быстрее
Код:bitstream db #80,#40,#20,#10,#08,#04,#02,#01 ;в DE - yx начала ;в HL - yx конца line00 ld a,h sub d ;h<d? jp nc,line1 ;h>d ex de,hl cpl inc a line1 ld b,a ;b=vertical cntr DY ld a,l sub e ;a=DX ;e<l? jp nc,line_lr ;e>l line_rl cpl inc a ld c,a ;c=horizontal cntr cp b ;c?b jp c,line_rlv ;c>b line_rlh display "line_rlh ",$ ;right left horizontal call de_coo ld a,b ld d,c inc d line_rlh0 push af ld a,(hl) xor e ld (hl),a ld a,e or a rla jp nc,line_rlhb ld a,1 dec h line_rlhb ld e,a pop af sub b jp nc,line_rlh1 add a,c inc l line_rlh1 dec d jp nz,line_rlh0 ret line_rlv display "line_rlv ",$ ;right left vertical call de_coo ld a,c ld d,b inc d line_rlv0 push af ld a,(hl) xor e ld (hl),a inc l pop af sub c jp nc,line_rlv1 add a,b push af ld a,e or a rla jp nc,line_rlvb ld a,1 dec h line_rlvb ld e,a pop af line_rlv1 dec d jp nz,line_rlv0 ret line_lr ld c,a cp b ;c?b jp c,line_lrv ;c>b line_lrh display "line_lrh ",$ ;left right horizontal call de_coo ld a,b ld d,c inc d line_lrh0 push af ld a,(hl) xor e ld (hl),a ld a,e or a rra jp nc,line_lrhb ld a,128 inc h line_lrhb ld e,a pop af sub b jp nc,line_lrh1 add a,c inc l line_lrh1 dec d jp nz,line_lrh0 ret line_lrv display "line_rlv ",$ ;left right vertical call de_coo ld a,c ld d,b inc d line_lrv0 push af ld a,(hl) xor e ld (hl),a inc l pop af sub c jp nc,line_lrv1 add a,b push af ld a,e or a rra jp nc,line_lrvb ld a,128 inc h line_lrvb ld e,a pop af line_lrv1 dec d jp nz,line_lrv0 ret de_coo ;de=source ld a,e rra rra rra and #1f add a,#98 ld h,a ld l,d ld a,e ex de,hl and #07 ld hl,bitstream add a,l ld l,a ld l,(hl) ex de,hl ;hl=addr ;e=bitstream ret
С уважением,
Jerri / Red Triangle.
Не должно быть в цикле рисования линии push/pop af, лучше dx или dy встроить в код и править при вызове.
blackmirror, поясни
С уважением,
Jerri / Red Triangle.
jerri, сейчас ошибка лежит в A, а в BC лежит dx и dy, но чтобы поменять точку или маску приходится сохранять A в стеке, поскольку регистров не хватает. Можно одну из инструкций sub/add b/c поменять на инструкцию с константой, которая будет меняться на реальный dx или dy перед циклом. А ошибку переместить в освободившийся регистр, откуда её быстрее будет достать чем из стека.
вариант конечно.
Код:bitstream db #80,#40,#20,#10,#08,#04,#02,#01 ;в DE - yx начала ;в HL - yx конца line00 ld a,h sub d ;h<d? jp nc,line1 ;h>d ex de,hl cpl inc a line1 ld b,a ;b=vertical cntr DY ld a,l sub e ;a=DX ;e<l? jp nc,line_lr ;e>l line_rl cpl inc a ld c,a ;c=horizontal cntr cp b ;c?b jp c,line_rlv ;c>b line_rlh ;right left horizontal call de_coo ld a,b ld (line_rlhb0),a ld d,c inc d line_rlh0 ld a,(hl) xor e ld (hl),a ld a,e or a rla jp nc,line_rlhb ld a,1 dec h line_rlhb ld e,a ld a,b sub 0 ;b line_rlhb0 equ $-1 jp nc,line_rlh1 add a,c inc l line_rlh1 ld b,a dec d jp nz,line_rlh0 ret line_rlv ;right left vertical call de_coo ld a,c ld (line_rlvb0),a ld d,b inc d line_rlv0 ld a,(hl) xor e ld (hl),a inc l ld a,c sub 0 ;c line_rlvb0 equ $-1 ld c,a jp nc,line_rlv1 add a,b ld c,a ld a,e or a rla jp nc,line_rlvb ld a,1 dec h line_rlvb ld e,a line_rlv1 dec d jp nz,line_rlv0 ret line_lr ld c,a cp b ;c?b jp c,line_lrv ;c>b line_lrh ;left right horizontal call de_coo ld a,b ld (line_lrhb0),a ld d,c inc d line_lrh0 ld a,(hl) xor e ld (hl),a ld a,e or a rra jp nc,line_lrhb ld a,128 inc h line_lrhb ld e,a ld a,b sub 0 ;b line_lrhb0 equ $-1 jp nc,line_lrh1 add a,c inc l line_lrh1 ld b,a dec d jp nz,line_lrh0 ret line_lrv ;left right vertical call de_coo ld a,c ld (line_lrvb0),a ld d,b inc d line_lrv0 ld a,(hl) xor e ld (hl),a inc l ld a,c sub 0 ;c line_lrvb0 equ $-1 ld c,a jp nc,line_lrv1 add a,b ld c,a ld a,e or a rra jp nc,line_lrvb ld a,128 inc h line_lrvb ld e,a line_lrv1 dec d jp nz,line_lrv0 ret de_coo ;de=source ld a,e rra rra rra and #1f add a,#98 ld h,a ld l,d ld a,e ex de,hl and #07 ld hl,bitstream add a,l ld l,a ld l,(hl) ex de,hl ;hl=addr ;e=bitstream ret
Последний раз редактировалось jerri; 14.02.2019 в 23:34.
С уважением,
Jerri / Red Triangle.
Не уверен в нужности ld a,1/ld a,128 после rra/rla и условного перехода, может там нужны rrca/rlca ?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)