Давай на почту. drbars:v2_dizzy_keyboard:ngs.ru
Я решил не расчитывать на лету границы, а уже готовые параметры в таблице карт хранить. Так быстрее отрисовка и спрайт максимально 8*8 знакомест, с кратностью высоты 2.
Вид для печати
drbars, в чем кодишь? Графику кто рисует?
Я свою капельку добавлю. Автор топика (drbars) выводит спрайты-полотна, а дырявые спрайты - состоящие из знакомсет правильнее, т.к. часто же половина спрайта заполнена нулями и чёрнотой.
Самый быстрый способ вывода "дырявых" знакоместных спрайтов я нашёл для себя такой - это хранить адрес в атрибутной области, куда выводить атрибут, а быструю процедуру пересчёта атрибутов в пикселы я приводил уже в этюдах. Т.е. получив адрес знакоместа сразу записываем туда атрибут, в 35 тактов переходим в адреса пикселов, и записываем уже само знакоместо.
Проверять на выход за границу экрана тоже просто - если добавить атрибутное смещение по X и Y в атрибутных же терминах, то если адрес получился за границами атрибутной области, то точно выводить не надо. Если 3 старших бита младшего байта поменялись - то аналогично, выводить не надо.
Код такой
ld bc,x+y*32 - координаты куда выводить, x и y могут быть отрицательными
....
pop af - в аккумуляторе - атрибут
pop hl - в hl - атрибутный адрес
ld e,a
ld a,l - запоминаем чтобы использовать старшие 3 бита
add hl,bc
xor l
and %11100000 - сравниваем изменились ли эти биты, т.е. вписались ли по X
jr nz,out_of_screen
ld a,h
cp #58 - проверяем был ли выход за атрибутную область, т.е. вписались ли по Y
jr c,out_of_screen
cp #5b
jr nc,out_of_screen
ld (hl),e - записываем атрибут
; преобразование адреса атрибутов в адрес знакоместа
ld a,h ; 4
; and %00000011 ; 7 0 - так и хочется замаскировать эти биты, но эта операция не нужна,
add a,a ; 4 8 - т.к. старшие биты уйдут по дальнейшей маске %00011111, а
add a,a ; 4 12 - младшие биты забиты нулями по add a,a
add a,a ; 4 16
xor h ; 4 20
and %00011111 ; 7 27 - сохраним нужные биты и обнулим ненужные 0-2
xor h ; 4 31 - вытащили исходный адрес расположения
ld h,a ; 4 35
dup 4 ; 4 раза выводим пару пиксельных линий
pop de
ld (hl),e
inc h
ld (hl),d
inc h
edup
получается очень быстро, заточенность на стек легко убираема.
Чем не устраивает sub #50:rlca:rlca:rlca?
Я решил для себя ввести некоторые ограничения:
1) Сделать предвычисления и уже их помещать в карту вывода спрайтов. Ведь мне нужна ещё возможность выводить заданную часть спрайта, обрезая его слева или справа не границей экрана. Для этого очень удобен метод 256 знакомест, предложенный выше.
2) На каждую длину каждого метода вывода будет отдельная процедурка.
Пересчёт старшего адреса атрибутов в адрес на экране.