Просмотр полной версии : Требуются шустрые скроллы окон
Shadow Maker
13.10.2008, 20:17
Требуются шустрые скроллы окон в четырех направлениях. Тока чтобы без стека и настраиваемые на любое количество в знакоместах (хотя и от пиксельных не откажусь, но тогда уж совсем тормозно будет; я написал автогенерируемые шустрые - много жрут памяти).
Готовый отлаженный код или концепт?
Какая мера шустрости? (в тактах, говорите точно, сколько вешать ;-) )
Shadow Maker
13.10.2008, 22:28
Готовый отлаженный код или концепт?
Какая мера шустрости? (в тактах, говорите точно, сколько вешать ;-) )
Код разумеется. Шустрость - чтобы за прерывание укладывался скролл полэкрана, но окно произвольное разумеется. Неужто в первом сообщении что-то непонятно?
Shadow Maker
14.10.2008, 23:25
Ммм ню и? Программисты, ога...
Ммм ню и? Программисты, ога...
См. "Как написать игру на ассемблере". Там было. Ибо под твои требования ничего более быстрого не напишешь.
Shadow Maker
15.10.2008, 00:14
Там LDIRы. Не издевайся... Всё напишешь, при желании... Вот только походу желание есть только у меня...
Там LDIRы. Не издевайся...
А ты думаешь для изменяемых размеров окна другие варианты есть?
Shadow Maker
15.10.2008, 00:36
Ога, с мини-генератором кода. Ишо можно через буфер поизвращаться.
Ога, с мини-генератором кода. Ишо можно через буфер поизвращаться.
А накой тебе разные окна? Под один размер заточил и юзай. Можешь ее вылизать до максимального быстродействия
Shadow Maker
15.10.2008, 01:11
Да у меня несколько окошек разных размеров. Три штуки, если точнее, и везде в разных направлениях скроллы. Вот думал может кто какой-то эффективный путь предложит.
А так всё что в голову пришло: генерируется по заданным параметрам код вида DUP n: LD HL, #4000 (ну тут само собой меняется); LD DE, #4100; LDI x N Раз; EDUP и выполняется...
чо-нить типа:
; 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. Предыдущая строчка в знакоместе как-то не по русски высчитывается, неправильно.
если вдруг найдешь глюк - исправишь, не все ж разжевывать :)
а еще можно и от лишних 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
Ну так-то понятно, просто я в общем-то просил готовую рабочую процедуру :) Чтоб не перепроверять. Твоя процедура вот к примеру не фурычит. А то можно и вообще сказать мол башка есть - сам и напиши работающую процедуру.
ппц. что не фурычит? c какими данными вызывается? как проявляется?
процедура должна без проблем познакоместно копировать справа-налево и/или снизу-вверх.
Shadow Maker
16.10.2008, 14:16
С любыми данными скролла по вертикали.
Ну к примеру сдвиг вверх 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 - убрать ;)
Shadow Maker
16.10.2008, 22:03
Ну я себе вот типа такого и сделал в принципе, чуть подсократив. Мой косяк, значит, что непонятно написал.
:) гы... даешь процедуру двухэкранного сролла окна по стеку с таблицей просчитаных адресов экрана.
вот тогда действительно будет минимум по тактам и не хило по памяти :)
Shadow Maker
27.10.2008, 15:35
Ну это уж очень нехило по памяти.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot