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!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября