Пересылка память - память :
мифы и реальность.
(C) Dr.SQUIZER
________________________________
В среде начинающих програм-
мистов SPECCY постоянно циркули-
руют слухи , что кому-то удалось
перебросить экран быстрее , чем
за одно прерывание. Разберемся :
возможно ли это ?
Для пересылки 6144 байт нужно
6144 раз выполнить цикл записи в
память , иначе это уже не будет
называться пересылкой. А сколько
циклов чтения нужно выполнить ?
Если картинка симметричная либо
периодическая , то, естественно,
меньше. Оставим тут простор для
творческой фантазии, а сами рас-
смотрим случай нерегулярной кар-
тинки.
Выпишем из справочника в с е
команды Z80 , в которые входит
операция записи в ОЗУ :
LD (HL),r LD (ii),r
LD (DE),A LD (nn),A
PUSH qq PUSH ii
LDI LDIR
LD (HL),n LD (ii),n
LD (nn),HL LD (nn),dd
EX (SP),HL EX (SP),ii
LDD LDDR
LD (BC),A LD (nn),ii
По понятным причинам в список
не вошли команды :
INC (HL); DEC (HL); SET b,(HL);
RES b,(HL); то же по ii; враще-
ния и сдвиги по (HL) и (ii).
Запись в память при помощи опе-
раций CALL , RST и подтверждения
прерывания оставим для крутых
приколов.
Перепишем теперь только те ко-
манды , которые быстрее LDIR
(иначе зачем и голову морочить).
В скобках укажем количество так-
тов процессора на запись одного
байта в память при помощи этой
команды :
LDIR,LDDR (10.5)
EX (SP),HL (9.5)
LD (HL),r (7)
PUSH qq (5.5)
LD (nn),dd (10)
LD (nn),HL (8)
LD (BC),A (7)
LD (nn),ii (10)
PUSH ii (7.5)
LD (DE),A (7)
Команды, типа LD (HL),r требу-
ют после себя как минимум 4 та-
кта на модификацию адреса . Зна-
чит , их реальное быстродействие
11 тактов на байт . По этой же
причине исключаем и EX (SP),HL .
Быстродействие команд LD (nn),dd
и LD (nn),ii столь близко к LDIR
что целесообразность их примене-
ния в наших целях сомнительна.
А вот команда LD (nn),HL за-
служивает внимания.
Команда PUSH сама декременти-
рует адрес , но рано или поздно
потребуется как минимум LD SP,nn
поэтому ее максимальная произво-
дительность в цикле :
LD SP,nn
PUSH AF
PUSH BC
PUSH DE
PUSH HL
EXX
PUSH BC
PUSH DE
PUSH HL
равна 6.5 тактов на байт , что и
является рекордом для Z80.
Не будем утомлять читателей
аналогичными выкладками для ко-
манд чтения из памяти. Приведем
конечный результат :
LDIR (10.5)
LD HL,(nn) (8.0)
POP qq (5.0;6.0)
Отсюда следует , что экранную
область ОЗУ можно переслать за
такое количество тактов :
LDIR : 6144 * 21 = 129 024
LD HL,(mm)
LD (ss),HL: 6144 * 16 = 98 304
POP HL
LD (ss),HL: 6144 * 13 = 79 872
POP/PUSH : 6144 * 12.5 = 76 800
Как видим , даже при периоде
следования INT в 71 680 тактов ,
уложиться в одно прерывание не-
возможно.
Програмистская же легенда ро-
дилась , по-видимому , из некор-
ректного вычисления :
POP/PUSH:
6144 * (5.0 + 5.5) = 70 656 (!).
________________________________
Пересылка память-память:
мифы и реальность.
(C) DJNZ
--------------------------------