Цитата Сообщение от Titus Посмотреть сообщение
Все, что вы хотели узнать о команде CODE030, но боялись спросить
Ну в общем мой алгоритм, выясненный методом научного тыка, оказался правильным:

Алгоритм:
R0:=0;
while ((R0[7]==0) && (R2[7]==0))
{
R1:=R1<<1 | 0; R2[07:00]:=R2[07:00]<<1 | C;
R2[15:08]:=R2[7]; R3:=R3<<1 | C; R0++;
}
N:=0; Z:=(R0==0); V:=0; C:=0

Описание: По этой команде сперва очищается регистр R0. Далее исполняется цикл, окончанием которого является установка в разряде 07 R0 или R2 единицы. В цикле над регистрами проводятся следующие действия: регистры с R1 по R3 сдвигаются влево, при этом в R1 в младший разряд вдвигается ноль, а в R2 и R3 – содержимое разряда C, при этом старшая часть R2 расширяется знаковым разрядом младшей части, R0 инкрементируется. Так как останов исполнения команды производится при наличии единицы в разряде 7 в R0 или R2, то после исполнения команды R0 может принимать значения от 0 до 108 или 2008. Значение 2008 получается в том случае, если до исполнения операции младшая часть R2 была равна нулю и был сброшен бит С.
Признаки: N – очищается, Z – устанавливается, если значение в R0 равно нулю, в противном случае очищается, V – очищается, C – очищается.

Вопрос в другом. Это наверное разработчики так промахнулись или как? Команды с кодами от 020 до 027 используются для чтения, а с кодами от 030 до 037 для записи. Но записи регистра SEL нету, потому команда 030 должна выполняться также, как и 020. В 1806ВМ2 эту ошибку уже исправили. Тут надо смотреть, как производится дешифрация и исполнение кодов от 020 до 037.