Привет из прошлого, Ассемблер 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-битном процессоре! Шок.
12 марта 2013 06:28

v3 (инкогнито)
12 марта 2013, 08:22

Стековые операции были самым быстрым способом работы с экраном на zx.

SiMM (mr-simm.livejournal.com)
12 марта 2013, 15:43

и точно самый компактный
Не самый :)
LD HL,#5AFF ; 3
XOR A ; 1
LD (HL),A ; 1
DEC HL ; 1
CP A,H ; 1
JR NZ,$-3 ; 2
9 байт против 13 ;)

SiMM (mr-simm.livejournal.com)
12 марта 2013, 15:45

Можно укоротить ещё на байт, если содержимым ячеек #5B00…#5BFF можно пренебречь :)

Евгений Степанищев (bolknote.ru)
12 марта 2013, 15:49, ответ предназначен SiMM (mr-simm.livejournal.com):

Я так понял, что оно будет чистить до адреса 00FF? Т.е. попытается зачистить ПЗУ тоже? :)

SiMM (mr-simm.livejournal.com)
12 марта 2013, 16:14

попытается зачистить ПЗУ тоже? :)
Ага, для Speccy некритично :)

Евгений Степанищев (bolknote.ru)
12 марта 2013, 17:40, ответ предназначен SiMM (mr-simm.livejournal.com):

Некритично, но должно сказываться на производительности очистки экрана, я думаю.

Птахх (penguinny.livejournal.com)
12 марта 2013, 22:32, ответ предназначен Евгений Степанищев (bolknote.ru):

SiMM прав, я не думал о компактности, когда писал.
А в плане производительности, его код легко улучшается вот таким образом:

LD HL,#5B00 ; 3
XOR A ; 1
DEC HL ; 1
LD (HL),A ; 1
OR (HL) ; 1
JR NZ,$-3 ; 2

Птахх (penguinny.livejournal.com)
12 марта 2013, 22:33

Чёрт, опять поспешил. JR Z, конечно.

Евгений Степанищев (bolknote.ru)
13 марта 2013, 06:08, ответ предназначен Птахх (penguinny.livejournal.com):

А где тут улучшена сильно производительность? Как цикл «очищал» лишние полтора десятка килобайт, так и очищает.

Птахх (penguinny.livejournal.com)
13 марта 2013, 09:56, ответ предназначен Евгений Степанищев (bolknote.ru):

Это вы что-то упускаете из вида. Цикл встаёт на первом же ненулевом байте ПЗУ.

Евгений Степанищев (bolknote.ru)
13 марта 2013, 10:54, ответ предназначен Птахх (penguinny.livejournal.com):

А, точно, не увидел скобки. Я всё же за последний десяток лет не читал Ассемблер Z80 ни разу, я думаю :)

Птахх (penguinny.livejournal.com)
13 марта 2013, 11:00

Я тоже сидел, вспоминал со скрипом :)

SiMM (инкогнито)
14 марта 2013, 05:29, ответ предназначен Евгений Степанищев (bolknote.ru):

должно сказываться на производительности очистки экрана
Сходу даже не возьмусь сказать, где была бы важна производительность для ОЧИСТКИ экрана :) В целях экономии времени можно и очисткой 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 каммент под жж-аккаунтом не оставляется.

Epsiloncool (инкогнито)
5 июля 2017, 12:54

Оптимизаторы, ватьмашу, потом из-за вашего говнокода программы не запускаются на старших моделях ZX.
В топку такие программы.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)