ВМ2: Команды с двумя операндами, расположенными в памяти
И, наконец, финальная вишенка на торте описания микрокода ВМ2 - это команды с двумя операндами, расположенными в памяти.
MOV(B), BIS(B), BIC(B), ADD, SUB, CMP(B), BIT(B):
Код:
//======================================================================
//
// Oперации с двумя операндами вида ss,dd
//
// MOV(B), BIS(B), BIC(B), ADD, SUB, CMP(B), BIT(B)
//
// step=1 для байтовых команд, если dd<>R6 и dd<>R7
// step=2 для всх остальных команд
//
// RI2=1, если адресация ss: (R7), (R7)+, -(R7), @(R7)+, @-(R7), X(Rn), @X(Rn)
//
// Циклы шины IO_X001 для:
//
// CMP(B), BIT(B)
// Read (IO_RD, IO_IN) - Инициировать цикл чтения шины в регистр BRD
//
// MOV:
// Write (IO_WR) - Инициировать цикл записи BRD на шину
//
// MOVB, BIS(B), BIC(B), ADD, SUB:
// R-M-W (IO_RD, IO_WR, IO_IN) - Инициировать цикл чтения шины в регистр BRD
// с последующим циклом записи по готовности BRD
//
//======================================================================
0x0F: if (Rn) RA=Rs IO_RD, IO_IN // Инициировать цикл чтения шины
Rs=Rs
if (Rn)+ and (IX1=0) // Если Rn<>R7
RA=Rs
Rs=Rs+step
if (Rn)+ and (IX1=1) and (IX0=1) // Если Rn=R7, и работа со словом
PC1=PC2 DISABLE_CACHE // Запретить кэш и включить режим использования BIR как данных
// Фактически PC1=PC1+2
ACC=Rs // Пустая операция
// Чтение BRD не инициируется, т.к. в нем уже и так находится требуемое слово
if (Rn)+ and (IX1=1) and (IX0=0) // Если Rn=R7, и работа с байтом
PC1=PC2 DISABLE_CACHE // Запретить кэш и включить режим использования BIR как данных
// Фактически PC1=PC1+2
ACC=PC1-2 // ACC=PC1-2 (коррекция, т.к. PC1 опережает реальное значение R7 на 2)
RA=ACC IO_RD, IO_IN // Инициировать цикл чтения шины
if -(Rn) Rs=Rs-step
RA=Rs IO_RD, IO_IN // Инициировать цикл чтения шины
if @(Rn)+ and (IX1=0) // Если Rn<>R7
RA=Rs IO_RD, IO_IN // Инициировать цикл чтения шины
Rs=Rs+2
GOTO 0x32
if @(Rn)+ and (IX1=1) // Если Rn=R7
WAIT_BRD // Ожидание готовности чтения BRD (на самом деле BIR)
PC1=PC2 DISABLE_CACHE // Запретить кэш и включить режим использования BIR как данных
// Фактически PC1=PC1+2
ACC=BIR
RA=ACC IO_RD, IO_IN // Инициировать цикл чтения шины
if @-(Rn) Rs=Rs-2
RA=Rs IO_RD, IO_IN // Инициировать цикл чтения шины
GOTO 0x32
if X(Rn) WAIT_BRD // Ожидание готовности чтения BRD (на самом деле BIR)
PC1=PC2 DISABLE_CACHE // Запретить кэш и включить режим использования BIR как данных
ACC=Rs+BIR
RA=ACC IO_RD, IO_IN // Инициировать цикл чтения шины
if @X(Rn) WAIT_BRD // Ожидание готовности чтения BRD (на самом деле BIR)
PC1=PC2 DISABLE_CACHE // Запретить кэш и включить режим использования BIR как данных
ACC=Rs+BIR
RA=ACC
GOTO 0x32
if (dd=Rn) and (RI2=0) // Если приемник - регистр и ss не использует R7
GOTO 0x13
if (dd=Rn) and (RI2=1) // Если приемник - регистр и ss использует R7
GOTO 0x12
else GOTO 0x03 // Иначе приемник - память
//---------------------------------------------------------------------- Чтение операнда из памяти
0x32: WAIT_BRD // Ожидание готовности чтения BRD
ACC=BRD
RA=ACC IO_RD, IO_IN // Инициировать цикл чтения шины
if (dd=Rn) and (RI2=0) // Если приемник - регистр и ss не использует R7
GOTO 0x13
if (dd=Rn) and (RI2=1) // Если приемник - регистр и ss использует R7
GOTO 0x12
else GOTO 0x03 // Иначе приемник - память
//---------------------------------------------------------------------- Приемник - регистр, ss использует R7
0x12: WAIT_BRD // Ожидание готовности чтения BRD
RS=BRD
//---------------------------------------------------------------------- Кэширование следующей команды
0x10:
RA=PC2 IO_RD, IO_IN, IO_RCD // Инициировать цикл чтения шины в регистр BIR и BRD одновременно (кеширование следующей команды/данных)
PC1=PC2 // Фактически имитация PC1=PC+2
PC2=PC2+2
//---------------------------------------------------------------------- Приемник - регистр
0x13:
if (RI2=0) WAIT_BRD // Если ss не использует R7, то oжидание готовности чтения BRD
ALU BRD,Rd // Операции ALU из шага 0x3B, в качестве приемника Rd, в качестве источника BRD
else // Иначе ss использует R7
ALU RS,Rd // Операции ALU из шага 0x3B, в качестве приемника Rd, в качестве источника RS
endif
PLI_REQ // Запросить проверку запросов на прерывание
if (Rd=R7) // Если Rd=R7, то
GOTO 0x21 // Перейти на команду выборки следующей некэшированной инструкции
else // Иначе
GOTO 0x01 // Перейти на команду выборки следующей инструкции
//---------------------------------------------------------------------- Приемник - память
0x03: WAIT_BRD // Ожидание готовности чтения BRD
RS=BRD
if (RI2=0) GOTO 0x17 // Если ss не использует R7, то перейти на шаг 0x17 операции с двумя операндами
//---------------------------------------------------------------------- ss использует R7
0x16: // Кэширование следующей команды (для того, чтобы адресация dd по R7 работала корректно)
RA=PC2 IO_RD, IO_IN, IO_RCD // Инициировать цикл чтения шины в регистр BIR и BRD одновременно (кеширование следующей команды/данных)
PC1=PC2 // Фактически имитация PC1=PC+2
PC2=PC2+2
GOTO 0x17 // Перейти на шаг 0x17 операции с двумя операндами
//----------------------------------------------------------------------
Больше в микрокоде ничего нет, так что на этом, это самое, мои полномочия всё... закончены)