
Сообщение от
drbars
jerri показал один из способов вывода. Совсем не обязательно юзать стек для загрузки спрайта в регистры.
Возьмём 3 байта танка.
pop de ; 10t
ld (hl),e ; 7
inc l ; 4
ld (hl),d ; 7
inc l ; 4
pop de ; 10
ld (hl),e ; 7
inc h ; 4
Всего 53 такта на строку.
Теперь у меня:
ldi ; 16
ldi
ldi
Всего 48 тактов на строку. При этом можно рисовать в любую область экрана. И использовать для вертикального движения спрайта.
Что-то не очень понятно. В первой процедуре на копирование одного байта тратится 5+7+4=16 тактов. У вас тоже 16 тактов на 1 байт. Хотя можно без стека обойтись. Это тоже может быть удобно.
Небольшое уточнение. Если копировать "змейкой", то по второму способу будет так:
ldi
ldi
ldi
dec e
inc d
ldd
ldd
ldd
inc e
inc d
...
На три байта тратится 16+16+16+4+4. Все-таки первый способ быстрее.
Если посмотреть это фрагмент:
Код:
; Вывод спрайта
; HL = Адрес спрайта
; DE = Адрес экрана
SP_OUT:
LD IX,SPR_OUT
LD BC,#18FF
JP (IX)
COR_DE LD A,E
SUB #E0
LD E,A
SBC A,A
AND #F8
ADD A,D
LD D,A
JP (IX)
LOOP_1 DEC DE
LD E,A
INC D
LD A,D
AND #07
JR Z,COR_DE
SPR_OUT LD A,E
LDI
LDI
LDI
DJNZ LOOP_1
RET
Выглядит мудрено. И непонятно, зачем команда DEC DE. Ведь у вас до этого были LD A,E, а потом LD E,A и INC D. Если только LDI перескакивает...
На мой взгляд ваша процедура подходит для движения по-вертикали. А для движения по-горизонтали использовать стек.