ВМ2: Самая загадочная команда CODE030
Все, что вы хотели узнать о команде CODE030, но боялись спросить :v2_wink2:
Пояснения:
1. На флаги VZNC влияют все микрокоманды, однако переписывают их в PSW только те, у которых это отдельно указано.
2. Режим проверки условий GET_STATE устроен таким образом, что условия проверяются по окончании микрокоманды,
добавляя к ней еще 4 такта (а что делать, надо же прокачать PLM проверки условий),
а результат проверки (BRA=1, если условие совпало) доступен уже в следующей микрокоманде.
В начале следующей микрокоманды условие будет сброшено (BRA=0), в независимости от того, воспользовались им или нет.
3. SEXT() - расширение знака байта до слова.
Код:
//======================================================================
//
// Команда CODE030 (000030)
//
//======================================================================
Адрес Микрокоманда PSW Дополнительно Комментарий
0x05: R0=0
//----------------------------------------------------------------------
0x27: ACC.B=R2 GET_STATE N=0 // Если N=0, то BRA=1, иначе BRA=0
//---------------------------------------------------------------------- Начало цикла
0x35: if (BRA=1) // Если BRA=1 (в прошлой команде N=0)
R0.B=R0+1 GET_STATE N=0 // Если N=0, то BRA=1, иначе BRA=0
else // Иначе
ACC=R0 VZNC PLI_REQ // Запросить проверку запросов на прерывание
GOTO 0x01 // и перейти на команду выборки следующей инструкции
//----------------------------------------------------------------------
0x31: if (BRA=1) // Если BRA=1 (в прошлой команде N=0)
R1=R1<<1
else // Иначе
ACC=R0 VZNC PLI_REQ // Запросить проверку запросов на прерывание
GOTO 0x01 // и перейти на команду выборки следующей инструкции
//----------------------------------------------------------------------
0x19: R3=(R3<<1)|PSW[0]
//----------------------------------------------------------------------
0x1E: R2=SEXT((R2<<1)|PSW[0]) GET_STATE N=0 // Если N=0, то BRA=1, иначе BRA=0
GOTO 0x35 // Перейти на команду 0x35