В данной категории изменения коснулись только группы команд циклического сдвига. Как мы видели из Рис. 5.13 (стр. 148), команды rlf и rrf сдвигают содержимое заданного регистра через бит переноса. Новые же команды осуществляют сдвиг в обход этого бита. Эти команды имеют мнемоники rIncf (сдвиг влево, не через флаг переноса) и rrncf (сдвиг вправо, не через флаг переноса). Команды сдвига, доставшиеся в наследство от семейства среднего уровня, для единообразия были переименованы в rlcf и rrcf. Еще раз напоминаю, что, поскольку к рабочему регистру можно обращаться как к регистру данных, его содержимое можно сдвигать точно так же, как и содержимое любого другого регистра.
Команды передачи управления
Все команды, имевшиеся в предыдущих семействах, т. е. команды goto, call и три команды возврата, были сохранены. Однако первые две из них теперь занимают два слова в памяти программ и способны осуществлять переход в пределах 20 Мелов, позволяя, таким образом, забыть о страничной организации памяти программ, которая имела место в микроконтроллерах с ядром PIC16. Кроме того, команда call может теперь сохранять контекст программы в теневом стеке (если прерывания не используются) при ее вызове с параметром FAST. Возврат из подпрограммы, вызванной таким образом, осуществляется командой return FAST.
Большинство переходов, осуществляемых с помощью команд goto, относительно короткие. К примеру, команда goto LOOP в Программе 16.4 возвращается назад всего на две команды. Новая однословная команда bra позволяет осуществлять переход в пределах —1023…+1024 слов. Таким образом, используя вместо goto LOOP команду bra LOOP, мы экономим одно слово памяти программ, хотя время выполнения команды остается равным двум машинным циклам. Аналогичным образом команда относительного вызова подпрограмм rcall позволяет осуществлять вызов близлежащих подпрограмм, правда, она не имеет возможности сохранения контекста.
К командам безусловного перехода добавились десять команд
clrf SIGN; Обнуляем регистр признака знака и копируем
movf f PORTC,TEMPERATURE; принятое значение температуры
movf TEMPERATURE,f; Проверим на ноль или отрицательное число
bnn NEXT; Если > 0, ТО обходим инвертирование
negf TEMPERATURE,f; ИНАЧЕ меняем знак числа
setf SIGN; и устанавливаем биты регистра признака знака
NEXT…..; Продолжаем
Команда bnn NEXT выполняет переход к метке NEXT при положительном значении. В противном случае меняется знак числа и с помощью команды setf в регистр SIGN заносится число h’FF’.
На стр. 139 мы с вами видели, что для сравнения двух беззнаковых чисел, скажем W и содержимого регистра данных, необходимо вычесть одно число из другого с последующей проверкой состояния флагов С и Z. Три новые команды сравнения/пропуска выполняют эту проверку автоматически. Команда cpfseq пропускает следующую команду, если беззнаковое число в заданном регистре равно числу в рабочем регистре, cpfsgt — если оно больше, чем число в W, a cpfsit — если это число меньше находящегося в W.
Возьмем для примера код системы контроля уровня топлива, приведенный на стр. 140. Если в баке остается менее 20 л, то включается сигнальная лампочка, а если менее 5 л — звуковой сигнал. Теперь этот же код будет выглядеть следующим образом: