Зависит от того, что за спрайты - прямоугольные? большие/маленькие? проверка краев экрана нужна? и т.д.
Целая баталия по выводу спрайтов сейчас ведется тут
Если брать за основу процедуры из книги, то можно:
- раскрыть циклы (тело цикла написать 8 раз, а push/pop/djnz убрать);
- удалить проверки краев экрана, если спрайты априори не выходят за края.
Последний раз редактировалось Andrew771; 01.09.2020 в 10:36.
metamorpho(02.09.2020)
Для прямоугольных спрайтов, которые не выходят за пределы экрана, выгоднее кодировать строками спрайта, а не отдельными знакоместами. Тогда каждую строку выводишь командами ldir, предварительно задав нужную длину строки в байтах в bc. Переход на следующую строку знакоместа - inc h (или inc d).
А самый быстрый способ - установить начало стека в нужное место экрана и перебрасывать командами по два байта сразу:
ld hl,...
push hl
metamorpho(02.09.2020)
metamorpho(02.09.2020)
вывод спрайтов 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 / Red Triangle.
Bedazzle(04.09.2020), metamorpho(03.09.2020)
jerri, спасибо!!
Правильно ли я понял что на Спектруме в стандартном графическом режиме
сделать горизонтальный или вертикальный скролин плавно по одной точке не получиться если
рядом стоящие знакоместа имеют разный атрибут цвета ?
metamorpho(04.09.2020)
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)