Вход

Просмотр полной версии : Требуются шустрые скроллы окон



Shadow Maker
13.10.2008, 20:17
Требуются шустрые скроллы окон в четырех направлениях. Тока чтобы без стека и настраиваемые на любое количество в знакоместах (хотя и от пиксельных не откажусь, но тогда уж совсем тормозно будет; я написал автогенерируемые шустрые - много жрут памяти).

GriV
13.10.2008, 20:31
Готовый отлаженный код или концепт?
Какая мера шустрости? (в тактах, говорите точно, сколько вешать ;-) )

Shadow Maker
13.10.2008, 22:28
Готовый отлаженный код или концепт?
Какая мера шустрости? (в тактах, говорите точно, сколько вешать ;-) )
Код разумеется. Шустрость - чтобы за прерывание укладывался скролл полэкрана, но окно произвольное разумеется. Неужто в первом сообщении что-то непонятно?

Shadow Maker
14.10.2008, 23:25
Ммм ню и? Программисты, ога...

Vitamin
15.10.2008, 00:12
Ммм ню и? Программисты, ога...
См. "Как написать игру на ассемблере". Там было. Ибо под твои требования ничего более быстрого не напишешь.

Shadow Maker
15.10.2008, 00:14
Там LDIRы. Не издевайся... Всё напишешь, при желании... Вот только походу желание есть только у меня...

Vitamin
15.10.2008, 00:24
Там LDIRы. Не издевайся...
А ты думаешь для изменяемых размеров окна другие варианты есть?

Shadow Maker
15.10.2008, 00:36
Ога, с мини-генератором кода. Ишо можно через буфер поизвращаться.

Vitamin
15.10.2008, 00:58
Ога, с мини-генератором кода. Ишо можно через буфер поизвращаться.
А накой тебе разные окна? Под один размер заточил и юзай. Можешь ее вылизать до максимального быстродействия

Shadow Maker
15.10.2008, 01:11
Да у меня несколько окошек разных размеров. Три штуки, если точнее, и везде в разных направлениях скроллы. Вот думал может кто какой-то эффективный путь предложит.

А так всё что в голову пришло: генерируется по заданным параметрам код вида DUP n: LD HL, #4000 (ну тут само собой меняется); LD DE, #4100; LDI x N Раз; EDUP и выполняется...

char
15.10.2008, 05:27
чо-нить типа:





; 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




и всего делов :)

Shadow Maker
15.10.2008, 12:56
Слуш, а прикольная идея. Ток у тебя там какой-то мега-глюк в расчетах после первого jr nz,lp1. Предыдущая строчка в знакоместе как-то не по русски высчитывается, неправильно.

char
15.10.2008, 21:00
если вдруг найдешь глюк - исправишь, не все ж разжевывать :)

а еще можно и от лишних 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

Shadow Maker
15.10.2008, 23:43
Ну так-то понятно, просто я в общем-то просил готовую рабочую процедуру :) Чтоб не перепроверять. Твоя процедура вот к примеру не фурычит. А то можно и вообще сказать мол башка есть - сам и напиши работающую процедуру.

char
16.10.2008, 06:13
ппц. что не фурычит? c какими данными вызывается? как проявляется?
процедура должна без проблем познакоместно копировать справа-налево и/или снизу-вверх.

Shadow Maker
16.10.2008, 14:16
С любыми данными скролла по вертикали.
Ну к примеру сдвиг вверх de #4000, hl #4100 и окно 5 на 5. У тебя неправильно рассчитывается последняя строчка в знакоместе, inc h - так делать нельзя, потому что у спектрума экран поделен на трети, в итоге у тебя после 4700 идёт 4800, а не 4020 как должно быть. Сам попробовал бы и увидел.

PS - Все надеюсь поняли, что разговор был про плавные скроллы? Мож конечно это мой косяк что я непонятно написал.

GriV
16.10.2008, 20:35
Я бы по-другому сделал
есть команда JP (IX)
и есть команда LD XH,A
и можно код по ровному адресу выровнять. Тогда не надо будет модифицировать код по ходу. Да и быстрее будет.

А вообще с общим подходом согласен - 32 LDI самое то.

char
16.10.2008, 20:54
мда, посмеялса... так нужны шашечки или ехать? :)
раз написал про знакоместа - это и были познакоместные копировщики. (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 - убрать ;)

Shadow Maker
16.10.2008, 22:03
Ну я себе вот типа такого и сделал в принципе, чуть подсократив. Мой косяк, значит, что непонятно написал.

himik
27.10.2008, 10:31
:) гы... даешь процедуру двухэкранного сролла окна по стеку с таблицей просчитаных адресов экрана.
вот тогда действительно будет минимум по тактам и не хило по памяти :)

Shadow Maker
27.10.2008, 15:35
Ну это уж очень нехило по памяти.