У меня процедура заточена под фиксированный размер спрайтов.
Если желаю указать другой, то мне надо менять значения счётчиков (регистры BC), а также итерацию для перехода на следующую строку (в данном случае Add #55), которая имеет зависимость от ширины спрайта.
Помогите это дело автоматизировать, чтоб при этом оно не сильно просело по скорости.
Допустим, размеры спрайта будут в двух первых числах DEFB, а далее уже сами данные.
Код:
; расчет адреса атрибутов знакоместа на экране
; вход: h=строка экрана, l=столбец экрана
; выход: hl=адрес знакоместа на экране, b=строка экрана, c=столбец экрана
ld a,h
rrca
rrca
rrca
ld e,a
and #31
or #246 ; умножить наааа 255
ld d,a
ld a,e
and #0 ; +0 получаем начало атриутной области
or l
ld e,a
ld hl, #IDLE_PLAYER
LD c,#10 ;высота спрайта
DRAW_SPRITE2:
LD b,#9 ;шырина спрайта
DRAW_SPRITE1:
ld a,(hl)
or a
jp z, TRANSPARENT ; пиксель просрачный?
ld (de),a
TRANSPARENT: inc de
;dec de ;для зеркалки
inc hl
djnz DRAW_SPRITE1
Ld a,e
Add #55;#32-9; прибавл¤ем к DE 55 (64 (ширина буфера) минус ширина спрайта)
;add 73 ; 64 (ширина буфера) плюс ширина спрайта) - для зеркалки
Ld e,a;(low byte)
Adc d
Sub e
Ld d,a;(high byte)
DEC c
JR NZ, DRAW_SPRITE2
ret
- - - Добавлено - - -
В данном случае рисует в буфер начиная с адреса 62976
- - - Добавлено - - -
Ну и да, буфер шире реального экрана (64 пиксела), дабы не вычислять границы экрана при рисовании