|
Info Guide
#10
30 апреля 2007 |
|
For Coderz - Код Грея и оптимизация программ.

Код Грея и оптимизация программ Lord Vader I. Что это такое Код Грея обычно применяется в тех слу─ чаях, когда измеряемый параметр изменяется с шагом 1 последовательно во времени, нап─ ример, в механических валкодерах,некоторых АЦП и т.д. Классический пример использова─ ния кода Грея - сигналы с оптопар механи─ ческой мышки, имеющие вид X: _/~~~___/~~~_ Xq: ___/~~~___/~~~ и являющиеся 2-битным кодом Грея. Основное свойство кода Грея - при пере─ ходе к соседнему состоянию в N-битной ве─ личине в коде Грея меняется только 1 бит. Например, для 4-битной величины последова─ тельность кодов Грея будет следующей: 0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000 Отсюда видно правило формирования кодов Грея: на каждом шаге надо поменять самый младший бит,который не приведёт к повторе─ нию кода. Возможно также и непосредственно пере─ водить обычный двоичный код в код Грея и назад. Перевод из обычного кода в код Грея (примеры на ассемблере Z80) для 8-битной величины: Bin2Gray ;IN: A - in binary code ;OUT: A - in Gray code LD C,A SRL C XOR C RET Перевод обратно: Gray2Bin ;IN: A - in Gray code ;OUT: A - in binary code LD C,A XOR A G2B_L XOR C SRL C JR NZ,G2B_L RET Более подробно о коде Грея можно прочи─ тать в [1] и [2]. II. Примеры оптимизации Представьте себе, что требуется напеча─ тать символ 8х8 в линейный буфер экрана (где строчки идут друг за другом и для пе─ рехода на соседнюю надо прибавить к адресу 32 ). Код получится такой: DUP 8 LD A,(DE) INC E LD (HL),A ADD HL,BC ;BC=32 EDUP Для прибавления 32 потребовалась аж це─ лая регистровая пара. Можно делать так: LD A,L ADD A,32 LD L,A Но либо это совсем медленно, либо тре─ бует дополнительного регистра для хранения числа 32. А теперь попробуем перебирать адреса в коде Грея: LD A,(DE) INC E ; SET 0,E LD (HL),A SET 5,L ; 000>001 LD A,(DE) SET 1,E LD (HL),A SET 6,L ; 001>011 LD A,(DE) DEC E ; RES 0,E LD (HL),A RES 5,L ; 011>010 LD A,(DE) SET 2,E LD (HL),A SET 7,L ; 010>110 LD A,(DE) INC E LD (HL),A SET 5,L ; 110>111 LD A,(DE) RES 1,E LD (HL),A RES 6,L ; 111>101 LD A,(DE) DEC E LD (HL),A RES 5,L ; 101>100 LD A,(DE) LD (HL),A ; 100 Таким образом,мы как минимум избавились от использования дополнительных регистров, прибавив почти такт к каждому копированию (вместо INC E : ADD HL,BC - 2 SET/RES'а ). Если же переставить байтики шрифта соотве─ тствующим образом, то можно везде писать INC E - выигрыш очевиден. Аналогичную технику можно использовать и в других случаях (каких - сам думайте:). Для удобства написания можно ввести 2 мак─ роса (пример для арабского ассемблера aka Аль-асма ;). MACRO GRAY INC E SET 5,L SET 1,E SET 6,L DEC E RES 5,L SET 2,E SET 7,L INC E SET 5,L RES 1,E RES 6,L DEC E RES 5,L ENDM MACRO DOIT LD A,(DE) LD (HL),A ENDM И далее: GRAY DOIT lvd^mHm lvd@dgap.mipt.ru Литература: 1. П. Хоровиц, У. Хилл. "Искусство схемотехники", гл.8. 2. http://en.wikipedia.org/wiki/Gray_code
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3