-
чо-нить типа:
Код:
; hl = from_scraddr
; de = to_scraddr
; b = yr_znm
; c = xr_znm
Roller1 ;up/left
ld a,#20
sub c
add a,a
ld (ch_jr+1),a
lp2
push bc
ld a,#08
lp1
push de
push hl
ch_jr jr $
dup 32 : ldi : edup
pop hl
pop de
inc h
inc d
dec a
jr nz,lp1
ld a,l
add a,#20
ld l,a
jr c,$+6
ld a,h
sub #08
ld h,a
ld a,e
add a,#20
ld e,a
jr c,$+6
ld a,d
sub #08
ld d,a
pop bc
djnz lp2
ret
Roller2 ;down/right
;...
dup 32 : ldd : edup
;...
ret
и всего делов :)
-
Слуш, а прикольная идея. Ток у тебя там какой-то мега-глюк в расчетах после первого jr nz,lp1. Предыдущая строчка в знакоместе как-то не по русски высчитывается, неправильно.
-
если вдруг найдешь глюк - исправишь, не все ж разжевывать :)
а еще можно и от лишних jr во внутреннем цикле избавиться... ;)
Код:
ld a,0-2-2-4
sub c
sub c
ld (ch_jr+1),a
ld xl,b
ld bc,#0a00
jr lp1
dup 32 : ldi : edup
pop hl
pop de
inc h
inc d
lp1
push de
push hl
ch_jr djnz $
pop hl
pop de
ld bc,#0820
ld a,l
add a,c
ld l,a
jr c,$+5
ld a,h
sub b
ld h,a
ld a,e
add a,c
ld e,a
jr c,$+5
ld a,d
sub b
ld d,a
ld bc,#0a00
dec xl
jr nz,lp1
ret
-
Ну так-то понятно, просто я в общем-то просил готовую рабочую процедуру :) Чтоб не перепроверять. Твоя процедура вот к примеру не фурычит. А то можно и вообще сказать мол башка есть - сам и напиши работающую процедуру.
-
ппц. что не фурычит? c какими данными вызывается? как проявляется?
процедура должна без проблем познакоместно копировать справа-налево и/или снизу-вверх.
-
С любыми данными скролла по вертикали.
Ну к примеру сдвиг вверх de #4000, hl #4100 и окно 5 на 5. У тебя неправильно рассчитывается последняя строчка в знакоместе, inc h - так делать нельзя, потому что у спектрума экран поделен на трети, в итоге у тебя после 4700 идёт 4800, а не 4020 как должно быть. Сам попробовал бы и увидел.
PS - Все надеюсь поняли, что разговор был про плавные скроллы? Мож конечно это мой косяк что я непонятно написал.
-
Я бы по-другому сделал
есть команда JP (IX)
и есть команда LD XH,A
и можно код по ровному адресу выровнять. Тогда не надо будет модифицировать код по ходу. Да и быстрее будет.
А вообще с общим подходом согласен - 32 LDI самое то.
-
мда, посмеялса... так нужны шашечки или ехать? :)
раз написал про знакоместа - это и были познакоместные копировщики. (hl=#4020 de=#4000)
сразу видно - по 8 линий в знакоместе за внутренний цикл процедурка перекидывает (inc h / inc d), с последующим переходом к нижним знакоместам.
а то - "ой-ой", "не работает"...
короче, если нужно по-пиксельно, то - элементарно - во внутреннем цикле должна быть стандартная последовательность DOWN_HL / DOWN_DE.
структура процедурки - еще проще получается.
ld hl,#4100 : ld de,#4000 : ld bc,#c020 : call Copy3
Код:
Copy3
; hl = from_scraddr
; de = to_scraddr
; c = xr_znm
; b = yr_pix+1
ld a,0-(ch_djnz-ldi_end+2)
sub c
sub c
ld (ch_djnz+1),a
jr go_loop
dup 32 : ldi : edup
ldi_end
pop hl
pop de
inc h
ld a,h
and #07
jr nz,$+12
ld a,l
add a,#20
ld l,a
jr c,$+6
ld a,h
sub #08
ld h,a
inc d
ld a,d
and #07
jr nz,$+12
ld a,e
add a,#20
ld e,a
jr c,$+6
ld a,d
sub #08
ld d,a
go_loop
ld c,d ; C > #20
push de
push hl
ch_djnz djnz $
pop hl
pop de
ret
p.s. если используется как скроллер, где hl и de - на соседних линиях, - то вместо DOWN_DE - можно ld d,h : ld e,l (перед inc h) и push de / pop de - убрать ;)
-
Ну я себе вот типа такого и сделал в принципе, чуть подсократив. Мой косяк, значит, что непонятно написал.
-
:) гы... даешь процедуру двухэкранного сролла окна по стеку с таблицей просчитаных адресов экрана.
вот тогда действительно будет минимум по тактам и не хило по памяти :)