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

Поделиться
Отправить
2013  
14 комментариев
v3

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

SiMM (mr-simm.livejournal.com)

и точно самый компактный

Не самый :)

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)

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

Евгений Степанищев (bolknote.ru)

Комментарий для mr-simm.livejournal.com:

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

SiMM (mr-simm.livejournal.com)

попытается зачистить ПЗУ тоже? :)

Ага, для Speccy некритично :)

Евгений Степанищев (bolknote.ru)

Комментарий для mr-simm.livejournal.com:

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

Птахх (penguinny.livejournal.com)

Комментарий для Евгения Степанищева:

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)

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

Евгений Степанищев (bolknote.ru)

Комментарий для penguinny.livejournal.com:

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

Птахх (penguinny.livejournal.com)

Комментарий для Евгения Степанищева:

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

Евгений Степанищев (bolknote.ru)

Комментарий для penguinny.livejournal.com:

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

Птахх (penguinny.livejournal.com)

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

SiMM

Комментарий для Евгения Степанищева:

должно сказываться на производительности очистки экрана

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

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

Популярное