ну начинается ликбез :-) ладно как модеру мне положено это делать :-)
Если есть область данных неизвестной заранее структуры, тогда используются по простому
1) классика
ld hl,откуда
ld de,куда
ld bc,сколько
ldir
в итоге для больших массивов начальные установки можно считать 0 длительности, около 21 такт на байт, это наиболее очевидная и древняя конструкция, использовалась для переброса во всех первых играх
2) классика 2
ld a,количество_строк
ld hl,откуда
ld de,куда
metka:
ldi
ldi
..
ldi ; заданное количество раз
dec a
jr nz,metka
итого около 16 тактов на 1 байт, использовалось в robocop и многих других программах
3) классика 3
ld sp,откуда
pop hl
pop de
pop bc
pop af
exx
pop hl
pop de
pop bc
; сюда же можно записать и pop ix pop iy, однако это не так эффективно
ld sp,куда+количество_регистро ых_пар*2
push bc
push de
push hl
exx
push af
push bc
push de
push hl
; и заново переустанавливать стек
Эта конструкция использовалась в Satisfaction и часто в других демках. Длина - около 12 тактов на байт, за это приходится расплачиваться тем что такие конструкции не сделаешь в цикле, итого огромный размер перебросчика буфера (около 1,5 байта на 1 байт перебрасываемой области, для одного экрана около 10 кбайт).
Итого 12 тактов * 6912 байт = около 80 тыщ тактов.
Если экран обрезан по краям (например есть рамка, которую нет смысла каждый раз выводить), тогда можно уложиться и в прерывание (опять тот же Satisfaction, где карта Киева), можно даже посчитать - вместо 32*24*8 надо прорисовать 30*20*8 байт, это 4080 байт, около 60 тыщ тактов на прорисовку, даже есть время прорисовать атрибуты и сделать бегущую строчку и проиграть фоновую музыку.
Быстрее можно только если экранная область будет кривая, то есть например расположена внутри кода её выводящего -классическая для мультиколора процедура
ld hl,nn
push hl
ld hl,mm
push hl
и т.д.
nn и mm - те самые данные.
В этом случае около 11 тактов на 1 байт (меньше невозможно).




Ответить с цитированием