Читать «Как проектировать электронные схемы» онлайн - страница 87

Клод Галле

lsla;а х 2

Второй сдвиг влево приведет к новому умножению на 2 и, следовательно, к умножению на 4.

По аналогии с этим деление содержимого регистра А на 2 сводится к сдвигу вправо с помощью следующей команды:

lsra: а / 2

Если второй операнд является нечетным, то основную операцию необходимо дополнить сложением или вычитанием. Например, выражение 8x5, можно преобразовать следующим образом: 8 х (4 + 1) или (8 х 4) + (8 х 1). Эти действия выполняются простым циклом операций:

lsla: a x 2

lsla;a x 4

inca;a x 5

В рассмотренных процедурах необходимо использовать логические операции не циклического, а линейного сдвига состояний в регистре. При каждой операции сдвига на одном конце регистра происходит выход бита, а на другом конце — вход. При этом значение входящего бита должно всегда равняться 0.

Использование 16-битных адресов

Восьмибитные микропроцессоры и микроконтроллеры по определению могут оперировать только байтами и не способны использовать более длинные слова. Расширение их возможностей обеспечивает так называемый индексный регистр, который в сочетании с накопителем позволяет осуществлять перемещение по устройству памяти, ограниченному 256 адресами. Иногда этот предел достигается очень быстро, когда необходимо найти одно значение или блок данных в большой таблице. Однако обычно в оперативной памяти существует свободная область. В нее можно записать подпрограмму, один из параметров которой в нужный момент будет изменяться.

Применение команды Ida table в расширенном виде позволяет считывать содержимое любого адреса размером 16 бит. Для ее записи требуется три байта. Первый байт задает код команды (записанный в регистре А), в данном случае D6H на языке Motorola. Два других байта содержат собственно адрес (в первом указывается старший разряд адреса, во втором — младший или наоборот, согласно стандартам изготовителя). Подпрограмма считывания адреса, расположенного в ячейке с именем Rout, имеет следующую структуру:

Если адресуемая ячейка расположена в ОЗУ, необходимо предварительно заполнить соответствующую область памяти. Данная процедура выполняется следующими командами:

Ida #06

sta Rout

Ida #00

sta Rout+1

sta Rout+2

Ida #81

sta Rout+3

Эти команды записываются в программу инициализации устройства. В дальнейшем их использование сводится к вызову подпрограммы с нужными параметрами. Например, при считывании содержимого адреса 0178Н процедура будет иметь следующий вид:

Ida 01

sta Rout+1

Ida 78

sta Rout+2

jsr Rout

После возврата в основную программу регистр А содержит требуемые данные. При считывании таблицы нужно давать приращение сначала младшему разряду адреса, а затем, если нужно, старшему (при обнулении младшего разряда). Такую процедуру может существенно облегчить использование команды с переменным индексом типа Ida table + х.