Вот не знаю чем заменить "dup 12" и "edup"
Вид для печати
ага inr l пропущенКод:;вывод спрайта в системе битпланов Вектор 06
;ширина спрайта -24
;на входе
;bc адрес спрайта
;de aдрес на экране
;E-Y D-X
drop24
ld hl,0
add hl,sp
ld (sprite_sp0),hl
ld h,b
ld l,c
ld c,(hl)
inc hl
ld b,(hl)
inc hl
ld sp,hl
;задаем Y в L
ld l,e
;задаем X в A
ld a,d ;битплан1
add a,#20
ld e,a ;битплан2
add a,#20 ;битплан3
drop240
dup 12
ld h,d
;рисуем на первом плане
ld (hl),c
inc h
ld (hl),b
inc h
pop bc
ld (hl),c
;переход на второй битплан
ld h,e
;рисуем на втором плане
ld (hl),b
inc h
pop bc
ld (hl),c
inc h
ld (hl),b
pop bc
;переход на третий битплан
ld h,a
;рисуем на третьем плане
ld (hl),c
inc h
ld (hl),b
inc h
pop bc
ld (hl),c
;переходим на следующую строку
inc l
;возвращаемся на первый план
ld h,d
;повторяем цикл рисования
ld (hl),b
inc h
pop bc
ld (hl),c
inc h
ld (hl),b
pop bc
;переход на второй битплан
ld h,e
;рисуем на втором плане
ld (hl),c
inc h
ld (hl),b
inc h
pop bc
ld (hl),c
;переход на третий битплан
ld h,a
;рисуем на третьем плане
ld (hl),b
inc h
pop bc
ld (hl),c
inc h
ld (hl),b
inc l
;выбираем следующую пару байтов для цикла рисования
pop bc
edup
org $-1
sprite_sp
ld sp,#3131
sprite_sp0 equ $-2
ret
Не выдержала душа поэта... с утреца всё перелопатил.
Первоначальный вариант теста давал не совсем корректный результат, т.к. во время тестирования быстродействия алгоритма вывода было ещё много накладных вычислений перед выводом каждого спрайта. в основном это вычисление адреса спрайта, который нужно вывести на экран, т.к. фактически сразу выводились показания счётчика.
Переписал само тестирование. Сейчас кроме вывода спрайта в цикле минимум, вот пример:
Скрытый текст
Код:Jerri_c:
lxi d,a_test_spr ; адрес спрайта на экране
lxi b,tab_spr0 ; адрес спрайта
push h ; сохранить счетчик
;
call drop24 ; вывод спрайта
;
pop h восстановить счетчик
inx h ; увеличение счетчика выводов спрайта на экран
;
lda StopFlag ; читаем флаг остановки
ora a ; проверка флага
jnz Jerri_c
[свернуть]
И результат немного поменялся:
Оригинальный вариант алгоритма Jerri - 1380h
Вариант Jerri, с заранее вычисленными адресами битпланов, и полностью развёрнутый (без циклов) - 1603h
Мой оригинальный алгоритм - 151Eh
Мой с заранее вычисленными адресами битпланов - 15B2h
Алгоритм metamorpho, совсем не использующий стек - 0С0Сh
Алгоритм metamorpho, совсем не использующий стек и с обычным прерыванием в которои нет защиты стека - 0С0Eh
Во вложении сам тест и его исходник.
Если здесь добавить змейку по плоскостям, то еще -16 тактов на каждый edup. Варианты с циклами тоже можно ускорить и даже если без плоскостной змейки, но с ней выигрыш будет заметнее.
-2 команды, каждая по 8 тактов, итого 16 тактов.
Сейчас 3 перехода между плоскостями на каждую строку, условно можно их назвать в 1, 2 и 3 плоскость. При змейке по плоскостям достаточно в 1й строке двух переходов: во 2 и 3 плоскость и во второй строке два перехода: во 2 и 1 плоскость.