Deja Vu #05: CODING: Техники Оптимизации Прокрутки Экрана на ZX Spectrum

SoundTrack: SECTOR/SERIOUS SPECCY GROUP'98
__________________________________________

(C) Колотов Сергей, SerzhSoft, may, 1998.
__________________________________________

Снова OPTIMIZATION

Великому и Ужасному Пpедводителю Самаpских Хаккеpов M.M.A aka UnBeliever, с улыбкой.

В четвёртом номере Deja Vu читатели могли ознакомиться со статьей M.M.A, посвященной оптимизации. Бесспорно, Максим поднял очень хорошую тему и довольно интересно все описал. Напомню, что речь шла о создании процедуры быстрого скроллинга всего экрана вверх. К статье прилагался исходник программы в формате нового крутого ассемблера STORM. Действительно, это довольно удобный и, что самое главное – _очень_ быстрый ASM. Но... Лично мне он не приглянулся. Хотя это чисто субъективное мнение. Просто я не привык к "слепленным" мнемоникам, когда команды и операнды разделены всего лишь одним пробелом... А так, ребята из X-TRADE просто молодцы! Советую всем попробовать покодить на STORM'е, это круто! Если бы DARK и LD еще сделали нормальные мнемоники, я не раздумывая уже давно бы storm'il!

Т.к. этот ассемблер не получил еще достаточно широкого распространения, то наверняка еще не все успели ознакомиться с исходником процедуры от M.M.A. Следовательно, хорошо бы напечатать ее в "нормальном", текстовом формате, что мы сейчас и сделаем...

;--------------------------------------
; ABSOLUTLY COOL LDI SCROLL
; COMPLETELY CODED BY M.M.A
;--------------------------------------

ORG #8000

CALL INSTAL; Построение таблицы экранных адресов

LD HL,#C000,DE,#4000,BC,6144
LDIR ; Переброска на экран
; загруженной с адреса #C000
; картинки

;--------------------------------------
; 192 раза вызываем процедуру сдвига
; экрана вверх на одну строчку
;-------------------------------------
;
LD B,192
LOO PUSH BC
DI
CALL ONELINE
EI:HALT ;можно убрать для получения равномерного "подергивания" строк.

POP BC
DJNZ LOO
RET ; /
;-------------------------------------

INSTAL LD HL,#4000; Этот инсталлятор
LD B,192; адресов можно
LOOP2 CALL DOWNHL; сделать быстрее,
PUSH HL; но зачем?
METK3 LD (TABL),HL;
LD HL,(METK3+1)
INC HL
INC HL
LD (METK3+1),HL
POP HL
DJNZ LOOP2
RET
;--------------------------------------
; САМА ПРОЦЕДУРА СДВИГА ВВЕРХ НА ЛИНИЮ
;--------------------------------------

ONELINE
LD (METK2+1),SP; 20
LD BC,6144-#20; 10
LD HL,#4000; 10
LD (METK1+1),HL; 16
LD HL,TABL; 10
LD (METK4+1),HL; 16

METK4 LD SP,0; 10 (В )
POP HL; 11 ( С )
LD (METK4+1),SP; 20 ( Е )
METK1 LD DE,0; 10 ( Г )
LD (METK1+1),HL; 16 ( О)
.32 LDI ; 16*32 ( )
JP PE,METK4; 10 ( 578 )

LD SP,#5800; 10
.16 PUSH BC; 11*16
METK2 LD SP,0; 10

RET ; ВСЕГО 110682 ТАКТОВ

; ++++++++++++++++++++++++++++++++++++
; + +
; + "DOWN HL" SUBROUTINES FROM MASM1.1 +
; + +
; ++++++++++++++++++++++++++++++++++++
;
;Для быстроты все переходы JR на команду
;RET заменены на собственно RET NZ,RET C

DOWNHL INC H; 4
LD A,H; 4
AND 7; 7
RET NZ; 5/11
LD A,L; 4
ADD A,32;7
LD L,A; 4
RET C; 5/11
LD A,H; 4
SUB 8; 7
LD H,A; 4
RET ; 10 TOTAL 55
TABL

А сейчас немного комментариев... Внимательно приглядевшись, можно заметить, что такты кое-где подсчитаны неправильно... Во-первых, команда POP HL занимает не 11, а 10 тактов! А во-вторых, эта команда вообще похоже не учитывается! Действительно, в цикле (где еще написано "ВСЕГО - 578") общее время выполнения команд занимает не 578 тактов, как указано, а все 588!!! А общее время выполнения оказывается значительно больше помеченного: 82+112308+196=112586 тактов! Аж целых 2 тысячи тактиков сверху!

Итак, ознакомившись с программой давайте попробуем ее оптимизировать, а еще лучше - напишем вообще "с нуля"! Не буду Вас долго мучить своими разглагольствованиями, смотрите и разбирайтесь:

;--------------------------------------;
; FULL SCREEN SCROLL UP ;
; coded by Kolotov Sergey ;
; (c) SerzhSoft, Shadrinsk, may, 1998 ;
;--------------------------------------;
_NULL EQU 0
;--------------------------------------;
_DATA EQU #6000
SCR_TBL EQU _DATA ;,#0300
DATAEND EQU SCR_TBL+#0300
;--------------------------------------;
ORG #8000
;--------------------------------------;
MAINPRG
EI
;
CALL MK_STBL
; CALL MKSRLUP
;
LD HL,#0000
LD DE,#4000
LD BC,#1800
LDIR
;
LD B,#C0
LP_MAIN PUSH BC
HALT
DI
CALL SRL_UP
EI
POP BC
DJNZ LP_MAIN
;
RET
;--------------------------------------;
MK_STBL
LD HL,SCR_TBL
LD DE,#4000
LD B,#C0
LP_MSTB LD (HL),E
INC HL
LD (HL),D
INC HL
;
INC D
LD A,D
AND #07
JR NZ,$+12
LD A,E
ADD A,#20
LD E,A
JR C,$+6
LD A,D
SUB #08
LD D,A
;
LD (HL),E
INC HL
LD (HL),D
INC HL
DJNZ LP_MSTB
; RET
;--------------------------------------;
MKSRLUP
LD HL,SRL_UP
LD (HL),#ED ;ld (...),sp
INC HL
LD (HL),#73
INC HL
PUSH HL
INC HL
INC HL
LD (HL),#01 ;ld bc,...
INC HL
LD (HL),#E0
INC HL
LD (HL),#17 ;ld bc,#17E0
INC HL
LD (HL),#31 ;ld sp,...
INC HL
LD DE,SCR_TBL
LD (HL),E
INC HL
LD (HL),D ;ld sp,SCR_TBL
INC HL
PUSH HL ;lp_srup
LD (HL),#D1 ;pop de
INC HL
LD (HL),#E1 ;pop hl
INC HL
LD B,#20
LP_MSU1 LD (HL),#ED ;ldi
INC HL
LD (HL),#A0
INC HL
DJNZ LP_MSU1
LD (HL),#EA ;jp pe,...
INC HL
POP DE
LD (HL),E
INC HL
LD (HL),D ;jp pe,lp_srup
INC HL
LD (HL),#31 ;ld sp,...
INC HL
LD (HL),B ;#00
INC HL
LD (HL),#58 ;ld sp,#5800
INC HL
LD B,#10
LP_MSU2 LD (HL),#C5 ;push bc
INC HL
DJNZ LP_MSU2
LD (HL),#31 ;ld sp,_NULL
INC HL
EX DE,HL
POP HL ;ld (...),sp
LD (HL),E ; ^^^
INC HL
LD (HL),D
EX DE,HL
INC HL
INC HL
LD (HL),#C9 ;ret
RET
;--------------------------------------;
_CODE EQU $
SRL_UP EQU _CODE ;,#0066
CODEEND EQU SRL_UP+#0066
;--------------------------------------;

Пара слов о программе... Как видите, все написано в традиционном стиле "realtime - programming", характерной чертой которого является создание в реальном времени быстро работающих, крупномасштабных процедур. В данном случае - генерируется скоростная процедура сдвига всего экрана на линию вверх (SRL_UP). Для этого вызывается процедура MKSRLUP, при передаче управления которой в "сегменте дополнительных кодов" мы получаем нечто, похожее на:

SRL_UP
LD (SP_SRUP+1),SP ;20
LD BC,#17E0 ;10
LD SP,SCR_TBL ;10
;
LP_SRUP POP DE ;10 (ВСЕГО)
POP HL ;10 ( 542 )
.32 LDI ;16*32 ( * )
JP PE,LP_SRUP ;10 ( 191 )
;
LD SP,#5800 ;10
.16 PUSH BC ;11*16
;
SP_SRUP LD SP,_NULL ;10
RET
;
ИТОГО: 40 + 103522 + 196 = 103758 тактов!

Процедура MK_STBL создает в сегменте данных табличку экранных адресов SCR_TBL, занимающую 768 байт. Так как подгружать какой-либо screen не совсем удобно (причем, еще необходимо подыскать подходящий! :-)), то было решено копировать на экран стандартную, присутствующую во всех компьютерах картинку, размещенную в ПЗУ с адреса #0000. :-) Называется - "CHAOS", хотя некоторые авторитеты настаивают на другом названии, а именно "Сломанный телевизор"! Ну да неважно. Главное, что эффект скроллинга очень хорошо просматривается и при этом неплохо видно - где именно луч развёртки экрана "перегоняет" нашу процедуру...

Программа занимает всего 147 байт!

Если же Вы готовы пожертвовать бОльшими объемами памяти, то скорость можно еще повысить... Тогда программа немного изменится:

...
;--------------------------------------;
LNS_NUM EQU #40
;--------------------------------------;
...
;--------------------------------------;
MKSRLUP
LD HL,SRL_UP
LD (HL),#ED ;ld (...),sp
INC HL
LD (HL),#73
INC HL
PUSH HL
INC HL
INC HL
LD (HL),#01 ;ld bc,...
INC HL
LD (HL),#E0
INC HL
LD (HL),#17 ;ld bc,#17E0
INC HL
LD (HL),#31 ;ld sp,...
INC HL
LD DE,SCR_TBL
LD (HL),E
INC HL
LD (HL),D ;ld sp,SCR_TBL
INC HL
LD (HL),#C3 ;jp ...
INC HL
LD D,H
LD E,L
LD BC,#0042+2
ADD HL,BC
EX DE,HL
LD (HL),E
INC HL
LD (HL),D ;jp lp_srup+#0042
INC HL
PUSH HL ;lp_srup
LD C,LNS_NUM
LP_MSU0 LD (HL),#D1 ;pop de
INC HL
LD (HL),#E1 ;pop hl
INC HL
LD B,#20
LP_MSU1 LD (HL),#ED ;ldi
INC HL
LD (HL),#A0
INC HL
DJNZ LP_MSU1
DEC C
JR NZ,LP_MSU0
LD (HL),#EA ;jp pe,...
INC HL
POP DE
LD (HL),E
INC HL
LD (HL),D ;jp pe,lp_srup
INC HL
LD (HL),#31 ;ld sp,...
INC HL
LD (HL),B ;#00
INC HL
LD (HL),#58 ;ld sp,#5800
INC HL
LD B,#10
LP_MSU2 LD (HL),#C5 ;push bc
INC HL
DJNZ LP_MSU2
LD (HL),#31 ;ld sp,_NULL
INC HL
EX DE,HL
POP HL ;ld (...),sp
LD (HL),E ; ^^^
INC HL
LD (HL),D
EX DE,HL
INC HL
INC HL
LD (HL),#C9 ;ret
RET
;--------------------------------------;
LN_SRUP EQU LNS_NUM*#0042+#0027
;--------------------------------------;
_CODE EQU $
SRL_UP EQU _CODE ;,LN_SRUP
CODEEND EQU SRL_UP+LN_SRUP
;--------------------------------------;

Как видите, изменилась процедура MKSRLUP, которая генерирует теперь гораздо более объемную процедуру SRL_UP:

SRL_UP
LD (SP_SRUP+1),SP ;20
LD BC,#17E0 ;10
LD SP,SCR_TBL ;10
JP LP_SRUP+#0042 ;10
;
LP_SRUP POP DE ;10
POP HL ;10
.32 LDI ;16*32
...
POP DE ;10 ВСЕГО
POP HL ;10 LNS_NUM
.32 LDI ;16*32 PАЗ
... /
POP DE ;10 /
POP HL ;10 /
.32 LDI ;16*32 /
;
JP PE,LP_SRUP ;10
;
LD SP,#5800 ;10
.16 PUSH BC ;11*16
;
SP_SRUP LD SP,_NULL ;10
RET

Константа LNS_NUM определяет количество линий экрана, которые копируются за одну итерацию цикла. Так, при LNS_NUM = 64(#40) общее время выполнения процедуры подсчитывается так:

50 + ((532*64+10)*(192/64)-532) + 196 =
= 246 + 101642 = 101888 тактов.

Таким образом, выигрыш составил 1870 тактов, что, конечно же, не так уж и много. Скорее, из этого Вы должны уяснить сами принципы оптимизации программы по времени выполнения и пользоваться ими где нужно и где не нужно!

Напоследок, хочется все же заметить, что в любом случае, для переброски больших объемов данных быстрее всего выполняются программы, работающие со стеком. Возможно, в следующей статье мы как раз об этом и поговорим. А пока попытайтесь разобраться сами... Желаю удачи!

With best wishes
Serzh.

Оглавление издания: Deja Vu #05

  • Аперативчик - Max
    Подробные инструкции по управлению интерфейсом DEJA VU, выделены разные методы ввода и команды навигации. Объяснение новых и старых интерфейсов для улучшенного пользовательского опыта. Обсуждение дополнительных функций, таких как фреймовый скроллинг и управление музыкой.
  • Аперативчик - Max
    Обсуждение поддержки машин с памятью более 128к, что привело к наличию отдельных оболочек для систем 128к и 256к. Тестирование проводилось в основном на Scorpion и Profi, предполагается работа на других моделях. Статья содержит инструкции по распаковке исходников и информацию об использовании улучшенных алгоритмов.
  • Тема - M.M.A
    Статья исследует теорию оцифровки звука на ZX Spectrum, акцентируя внимание на процессах дискретизации и квантования. Она предлагает практические советы по конвертации звуковых файлов с использованием определенного оборудования и программного обеспечения. Также даются методы улучшения качества звука с учетом аппаратных ограничений.
  • Тема
    Статья обсуждает инициативу Save Our Scene, направленную на объединение пользователей и разработчиков Spectrum для продвижения дистрибуции ПО и улучшения развития сцены.
  • Устав Ассоциации Amazing Soft Making
    Обсуждение устава ассоциации Amazing Soft Making, в котором изложены ее цели, критерии членства и принципы функционирования.
  • Теория Журналостроения
    Статья содержит подробное руководство для начинающих создателей журналов, сосредотачиваясь на технических аспектах, таких как дизайн интерфейса, управление памятью, форматирование текста и интеграция музыки для публикаций на ZX Spectrum.
  • Капля припоя
    Статья представляет личный опыт покупки и использования устройства General Sound для ZX Spectrum, описывая установку и качество звука. Обсуждаются первоначальные проблемы и восхищение улучшенным звуковым сопровождением в совместимых играх. Автор призывает к дальнейшей адаптации программного обеспечения для устройства и размышляет о мультимедийных возможностях с одновременным использованием оборудования.
  • Капля припоя
    Статья описывает возможности Sound Forge 4.0c для профессиональной обработки звука на ПК, подчеркивая его обширные функции, такие как редактирование звука, эффекты и инструменты восстановления.
  • SOFTWARE
    Статья рассматривает последние разработки программного обеспечения для ZX Spectrum из Самары, включая обновления MAXSOFT SCREEN PACKER, File Commander и новые приложения, такие как S-Terminal.
  • SOFTWARE - Card!nal
    Обзор и прохождение логической графической приключенческой игры 'Операция Р.Р.' с подробными инструкциями по уровням. Обсуждение элементов игры, таких как выбор музыки и графический дизайн. Упоминается участие нового кодера MAX/CYBERAX/BINARY DIMENSION.
  • SOFTWARE
    Обсуждение текущего состояния и эволюции демосцены, подчеркивающее рост 4K интро и предстоящие конкурсы, такие как FUNTOP'98.
  • CODING
    Статья обсуждает техники кодирования на ассемблере для оптимизации прокрутки экрана на ZX Spectrum, включает примеры кода и анализ производительности.
  • CODING - RLA
    Статья рассматривает методы манипуляции со стеком при прерываниях второго рода для графических эффектов на ZX Spectrum. Обсуждаются решения для сохранения целостности данных, когда прерывания нарушают графические операции. Приведены практические примеры для эффективного решения проблем со стеком.
  • КОДИРОВАНИЕ
    Статья описывает паковщик MS-PACK и его DEPACKER, детализируя сценарии использования и предоставляя примеры кода на BASIC и ассемблере для работы с упакованными файлами. Подчеркивается оптимизация производительности, позволяющая распаковку с включенными прерываниями и отделение DEPACKER от упакованных файлов. Дополнительно включены идеи о техниках программирования для загрузки и выполнения BASIC-файлов на ZX Spectrum.
  • КОДИРОВАНИЕ
    Статья обсуждает различные техники кодирования для ZX Spectrum, сосредоточиваясь на выводе спрайтов, алгоритмах поворота и методах оптимизации для повышения производительности.
  • ДРУГОЙ МИР
    Обсуждение эволюции мультимедийных технологий и их влияния на различные области, включая образование и развлечения. Охватываются достижения в аппаратном и программном обеспечении, которые способствовали интеграции аудио, видео и текста. Статья отражает прошлые достижения и предполагает будущее мультимедийных систем.
  • АНО ДРУГОЙ МИР
    Сравнение систем PC и Amiga, подчеркивающее производительность, стоимость программного обеспечения и пользовательский опыт с мультимедийными возможностями.
  • Доска почета
    Интервью с PROGRESS обсуждает их творческий путь на ZX Spectrum и AMIGA, касаясь проблем в демомейкинге и текущего состояния сцены.
  • Доска почета
    Статья описывает деятельность и будущие проекты команды Eternity Industry из Коврова, включая успешные релизы и сотрудничество с другими группами.
  • Доска почета
    Обсуждение фестиваля Artcomp'98, сосредоточенное на его формате участия по почте и правилах для различных конкурсов, включая демо, графику и музыку.
  • Доска почета
    Статья представляет собой глоссарий терминов, используемых в демосцене, объясняя роли, такие как музыкант, программист и художник, а также различные типы демо и эффектов. Она служит полезным ресурсом для понимания терминологии и динамики сообщества. Это описание, направленное на просвещение читателей о жаргоне демосцены.
  • Доска почета
    Статья обсуждает проблемы с поддержкой мыши в различных изданиях ZX Spectrum и разочарование пользователей при столкновении с несовместимостями. Критика разработчиков за несоблюдение стандартов приводит к плохому пользовательскому опыту. Автор подчеркивает важность постоянного улучшения программного обеспечения для сообщества ZX Spectrum.
  • Доска почета
    Статья обсуждает процесс создания триколорных изображений для ZX Spectrum с использованием Photoshop и упрощенного подхода. Описывается, как разделить изображение на RGB-каналы и конвертировать их для использования на Spectrum. Также даны советы по управлению файлами для достижения оптимальных результатов.
  • Доска почета
    Статья обсуждает сравнение и перспективы различных компьютерных систем, акцентируя внимание на сильных сторонах AMIGA по сравнению с PC и призывая ценить все машины.
  • Семь и 1/2
    Статья обсуждает юмористические абсурдности и особенности военного обучения и академической жизни, сочетая сатиру с реальными анекдотами и остроумными наблюдениями.
  • Семь и 1/2
    Статья представляет собой сатирический мануал по методологиям программирования, высмеивая жесткость формальных практик программирования и выступая за более креативный подход к коду.
  • Семь и 1/2
    Инструкция по технике безопасного секса, включая рекомендации по допуску, подготовке, действиям во время и после сеанса, а также действиям в аварийных ситуациях.
  • Семь и 1/2
    Статья обсуждает призыв к талантливому художнику в Краснодаре для группы ZX Spectrum, поднимает вопросы об unethical практике Scorpion по правам на софт и критикует видеообзор E'97.
  • Семь и 1/2
    Статья 'Семь и 1/2' описывает забавное приключение пикника команды редакторов Deja Vu, подчеркивая их товарищество и неудачи при приготовлении шашлыка.
  • Проба пера
    Статья представляет собой юмористическое описание вымышленных приключений Винни-Пуха в взаимодействии с компьютерами и друзьями, обсуждая абсурдность технологий и повседневной жизни.
  • Проба пера
    Статья посвящена новому разделу журнала Deja Vu, посвященному литературе фэнтези и фантастики, включая обзоры книг и участие читателей в создании контента.
  • Реклама
    Статья является рекламной секцией журнала Deja Vu #05, предлагая сотрудничество с дизайнерами и музыкантами для будущих выпусков, а также предлагая различные программное обеспечение и оборудование для ZX Spectrum.
  • Новости
    Статья объявляет о запуске нового журнала AMIGA RULES, посвященного компьютеру AMIGA, на фоне нехватки качественных русскоязычных изданий. Он направлен на предоставление информации о программировании, аппаратном обеспечении, программном обеспечении и играх, а также на формирование сообщества среди поклонников AMIGA. Журнал будет включать материалы от читателей и регулярные обновления о сцене AMIGA.