|
ZX Pilot
#35
27 ноября 1999 |
|
Coding - приемы оптимизации кода.

C O D I N G
──────────────────────────────────────────
(C) SERGIUS PUZZLER
- Пап, а че мне де-
лать с этим мусором?
- Да просто заксорь
его, сынок...
P. Fuzz.
Буду краток. Если вы часто и много по-
льзуетесь вот такой конструкцией:
...
M_FLAG1 EQU+1
LD A,FLAG
OR A
CALL NZ,PROGA
...
но желаете ее упростить и немного сэко-
номить, то предлагаю вам следующее:
...
M_FLAG1
SCF ; (или OR A)
CALL C,PROGA
...
Экономия составила 2 байта помноженных
на количество таких конструкций в вашей
программе. - Не так уж и много, - восклик-
ните вы, - Но я много и не обещал, - будет
ответ. SCF включит флаг переноса и срабо-
тает CALL C. OR A выключит флаг - CALL C
естественно не сработает.
А управляться с флагом вот таким Мака-
ром:
; ВКЛЮЧИТЬ ФЛАГ
LD A,#37 ; SCF - FC=1
LD (M_FLAG1),A
...
; ВЫКЛЮЧИТЬ ФЛАГ
LD A,#B7 ; OR A - FC=0
LD (M_FLAG1),A
...
; ПЕРЕКЛЮЧИТЬ ФЛАГ
LD A,(M_FLAG1)
XOR #80
LD (M_FLAG1),A
...
Ничего нового окромя XOR #80, который
переключает 7-ой бит в ячейке по адресу
M_FLAG1 переделывая SCF в OR A или обрат-
но.
Если у вас много адресов типа M_FLAG1,
то для удобства программирования могу пре-
дложить следующее:
...
LD HL,** ; адрес выбранного флага
CALL *_FLG ; * - SET/RES/XOR
...
...
SET_FLG ; ВКЛЮЧИТЬ
RES 7,(HL)
RET
RES_FLG ; ВЫКЛЮЧИТЬ
SET 7,(HL)
RET
XOR_FLG ; ПЕРЕКЛЮЧИТЬ
LD A,(HL)
XOR #80
LD (HL),A
RET
...
Каждый вызов процедуры SET/RES/XOR те-
переча занимает в ОЗУ 6/6/6 bts, а зани-
мал - 5/5/8 bts. Таким образом в среднем
мы ничего не выиграли, но и не потеряли,
зато, надеюсь, стало удобнее программиров-
ать. И все таки одна процедура SET/RES/XOR
(11 bts), ипользуемая для 3-х и больше од-
новременно флагов, дает экономию.
Теперь немного о другом. В Miracle #3,
если мне не изменяет память (да вроде бы
не с кем), есть статья об оптимизации ко-
да. Ее автор, PSV/Dream Team, привел одну
процедуру, которая требует уточнения.
Для ускорения работы цикла вида:
...
LD BC,COUNT
LOOP
...
cycle body
...
DEC BC ; работает
LD A,B ; достаточно
OR C ; медленно
JR NZ,LOOP
...
он предложил сделать так:
...
LD BC,COUNT
LOOP
...
cycle body
...
DEC C
JR NZ,LOOP
DEC B
JR NZ,LOOP
...
Несомненно, что этот вариант работает
быстрее, но его проверка (даже в уме) вы-
явила некорректную настройку счетчика BC.
Поясню: если мы запустим следующую проце-
дуру (дура вообще-то здесь ни причем):
...
LD HL,0
LD BC,#0101 ; 257 (DEC)
LOOP
INC HL ; cycle body
DEC C
JR NZ,LOOP
DEC B
JR NZ,LOOP
...
то на выходе в HL находим значение ра-
вное 1, вместо ожидаемого - 257. Вывод:
после настройки счетчика BC, его необходи-
мо подкорректировать - увеличить на 256.
А вот и окончательный вариант:
...
LD BC,COUNT
INC B ; недостающая команда
LOOP
...
cycle body
...
DEC C
JR NZ,LOOP
DEC B
JR NZ,LOOP
...
Еще не очень утомил? :) Yes? No? Press
"Y" for Yes or "N" for No. А лучше нужное
подчеркнуть. Прямо маркером на мониторе.
Скоро увидимся. По-каа...
SP.WH!
Другие статьи номера:
Похожие статьи:
В этот день... 17 ноября