Привет из прошлого, Ассемблер Z80
Читая один из постов Аввы, наткнулся на ассемблерные алгоритмы быстрой очистки экрана, вспомнил, что мне тоже что-то такое приходилось использовать, я одно время много на Ассемблере программировал, на Ассемблере под Зет80 («Спектрум») — тоже. Чтобы было понятно как иногда приходилось извращаться в те годы, цитирую:
penguinny: Опыт работы в ассемблере даёт это знание самым непосредственным образом. Кстати, тесно связанный трюк в ассемблере Z80 служил как один из самых быстрых (и точно самый компактный) способ очистки экрана:
ld hl,screen_addr ld de,screen_addr+1 ld bc,6143 ld (hl),0 ldir
Команда ldir копирует bc байт информации, начинающейся с адреса hl, в блок памяти, начинающийся с адреса de. С учётом выбранных адресов, 0 вручную пишется в первый байт, а затем копируется из первого во второй, из второго в третий, и т. д. Экран очищается по индукции.
kray_zemli: говорят, как-то через стек можно ещё было. вы его имели в виду?
penguinny: Да, именно так. Регистр стека устанавливался в конце экрана, один из 16-битных регистров очищался и затем в частично развёрнутом цикле многократно сохранялся в стек. 16-битные операции на 8-битном процессоре! Шок.
Стековые операции были самым быстрым способом работы с экраном на zx.
Не самый :)
9 байт против 13 ;)
Можно укоротить ещё на байт, если содержимым ячеек #5B00…#5BFF можно пренебречь :)
Комментарий для mr-simm.livejournal.com:
Я так понял, что оно будет чистить до адреса 00FF? Т. е. попытается зачистить ПЗУ тоже? :)
Ага, для Speccy некритично :)
Комментарий для mr-simm.livejournal.com:
Некритично, но должно сказываться на производительности очистки экрана, я думаю.
Комментарий для Евгения Степанищева:
SiMM прав, я не думал о компактности, когда писал.
А в плане производительности, его код легко улучшается вот таким образом:
LD HL,#5B00 ; 3
XOR A ; 1
DEC HL ; 1
LD (HL),A ; 1
OR (HL) ; 1
JR NZ,$-3 ; 2
Чёрт, опять поспешил. JR Z, конечно.
Комментарий для penguinny.livejournal.com:
А где тут улучшена сильно производительность? Как цикл «очищал» лишние полтора десятка килобайт, так и очищает.
Комментарий для Евгения Степанищева:
Это вы что-то упускаете из вида. Цикл встаёт на первом же ненулевом байте ПЗУ.
Комментарий для penguinny.livejournal.com:
А, точно, не увидел скобки. Я всё же за последний десяток лет не читал Ассемблер Z80 ни разу, я думаю :)
Я тоже сидел, вспоминал со скрипом :)
Комментарий для Евгения Степанищева:
Сходу даже не возьмусь сказать, где была бы важна производительность для ОЧИСТКИ экрана :) В целях экономии времени можно и очисткой 768 байт ограничиться (в некоторых случаях — вполне, если экран перед изменением атрибутов целиком перерисовывается). Ну и если уж ОЧЕНЬ критична производительность — то, как уже упоминалось:
LD HL,0
LD SP,#5B00
LD B,192+24;
.16 PUSH HL; тиражируем 16 раз, см. описание на STORM http://zxpress.ru/article.php?id=11747
DJNZ $-16
PS: таки да, в FireFox’е 17.0.1/WinXP каммент под жж-аккаунтом не оставляется.
Оптимизаторы, ватьмашу, потом из-за вашего говнокода программы не запускаются на старших моделях ZX.
В топку такие программы.