Andrew771, спасибо за информацию!!
А что-то быстрее этого есть ?
Вид для печати
Зависит от того, что за спрайты - прямоугольные? большие/маленькие? проверка краев экрана нужна? и т.д.
Целая баталия по выводу спрайтов сейчас ведется тут
Если брать за основу процедуры из книги, то можно:
- раскрыть циклы (тело цикла написать 8 раз, а push/pop/djnz убрать);
- удалить проверки краев экрана, если спрайты априори не выходят за края.
Для прямоугольных спрайтов, которые не выходят за пределы экрана, выгоднее кодировать строками спрайта, а не отдельными знакоместами. Тогда каждую строку выводишь командами ldir, предварительно задав нужную длину строки в байтах в bc. Переход на следующую строку знакоместа - inc h (или inc d).
А самый быстрый способ - установить начало стека в нужное место экрана и перебрасывать командами по два байта сразу:
ld hl,...
push hl
вывод спрайтов 32 и 24 на экран с урезанием по вертикали для Медноноговского варианта контроля стека
Код:;вывод спрайта 32*b
screenhigh equ #c0
drop_sprite32
ld (sprite_sp0),sp
;hl adr spr
;de coor
;Dy Ex 0-ff 0-1f
;b sprite high
ld a,d
cp screenhigh ;max Y
jr c,drop_sp1 ;middle check high
add a,b
jp nc,drop_end ;out of screen
ld c,a
sub b
neg
ld b,c
;вычисляем обьем обрезания спрайта
add a,a ;*2
add a,a ;*4
;изменяем размер спрайта
add a,l
ld l,a
adc a,h
sub l
ld h,a
;Y=0
ld d,0
jr drop_sp10
drop_sp1
;проверяем уход за экран
sub screenhigh
neg
cp b
jr nc,$+3
ld b,a
drop_sp10
ld a,d
and #38
add a,a
add a,a
add a,e
ld e,a
ld a,d
rra
rra
rra
and #18
xor d
and #f8
xor d
add a,#40
ld d,a
ld a,b
ld c,(hl)
inc hl
ld b,(hl)
inc hl
ld sp,hl
ld h,d
ld d,a
drop_sp0
ld l,e
ld (hl),c
inc l
ld (hl),b
inc l
pop bc
ld (hl),c
inc l
ld (hl),b
dec d
jp z,drop_end
pop bc
inc h
ld a,h
and #07
jp nz,drop_sp0
ld a,e
add a,32
ld e,a
jr c,drop_sp0
ld a,h
sub 8
ld h,a
jp drop_sp0
drop_end
ld sp,0
sprite_sp0 equ $-2
ret
;вывод спрайта 24*b
drop_sprite24
ld (sprite_sp0),sp
;hl adr spr
;de coor
;Dy Ex 0-ff 0-1f
;b sprite high
ld a,d
cp screenhigh ;max Y
jr c,drop_sp2 ;middle check high
add a,b
jp nc,drop_end ;out of screen
ld c,a
sub b
neg
ld b,c
;вычисляем обьем обрезания спрайта
ld c,a
add a,a ;*2
add a,c ;*3
;изменяем размер спрайта
add a,l
ld l,a
adc a,h
sub l
ld h,a
;Y=0
ld d,0
jr drop_sp20
drop_sp2
;проверяем уход за экран
sub screenhigh
neg
cp b
jr nc,$+3
ld b,a
drop_sp20
ld a,d
and #38
add a,a
add a,a
add a,e
ld e,a
ld a,d
rra
rra
rra
and #18
xor d
and #f8
xor d
add a,#40
ld d,a
ld a,b
ld c,(hl)
inc hl
ld b,(hl)
inc hl
ld sp,hl
ld h,d
ld d,a
drop_sp240
ld l,e
ld (hl),c
inc l
ld (hl),b
inc l
pop bc
ld (hl),c
dec d
jp z,drop_end
inc h
ld a,h
and #07
jp nz,drop_sp241
ld a,e
add a,32
ld e,a
jr c,drop_sp241
ld a,h
sub 8
ld h,a
drop_sp241
ld l,e
ld (hl),b
inc l
pop bc
ld (hl),c
inc l
ld (hl),b
dec d
jp z,drop_end
pop bc
inc h
ld a,h
and #07
jp nz,drop_sp240
ld a,e
add a,32
ld e,a
jr c,drop_sp240
ld a,h
sub 8
ld h,a
jp drop_sp240
[свернуть]
jerri, спасибо!!
Правильно ли я понял что на Спектруме в стандартном графическом режиме
сделать горизонтальный или вертикальный скролин плавно по одной точке не получиться если
рядом стоящие знакоместа имеют разный атрибут цвета ?