Сообщение от
Impartial
выход в пультовый режим. Заканчивается командой HALT
Процессор 1801ВМ1 выполняет команду HALT, как программное прерывание особого типа ( HALT Trap ) по вектору 0160002.
Алгоритм HALT Trap выглядит так:
Код:
void VM1_CPU_Class::HALT_TrapToRomOffset( int nROM_Vector_Offset )
{
WORD(SEL1) |= BIT_3;
WORD(0177676) = PSW;
WORD(0177674) = PC;
word addr = 0160000 + nROM_Vector_Offset;
PC = WORD(addr);
PSW = WORD(addr+2);
}
Т.е. по команде HALT (как и по сигналу IRQ1, устанавливаемому переключателем "Пульт") процессор 1801ВМ1 устанавливает бит 3 в регистре SEL1 по адресу 0177716 (подключая ПЗУ пульта в адресное пространство), сохраняет PSW в слове памяти по адресу 0177676, сохраняет PC по адресу 0177674 и считывает вектор (т.е. PC и PSW) программы обработки прерывания HALT по адресу 0160002.
Сообщение от
Impartial
Что дальше должно быть?
Поскольку по адресу 0160002 записаны 0160446 и 02340, то процессор запишет в PSW значение 02340, установив бит 10 и зафиксировав переход из режима USER в режим HALT, и перейдёт к выполнению программы обработки прерывания HALT по адресу 0160446.
Сообщение от
Impartial
При пуске с (177716=0,2) (вектор 24 и начальным загрузчиком НГМД) все заканчивается прерыванием по несуществующей команде (код 012).
Это команда START, которая обычно используется для выхода из режима HALT в режим USER.
Процессор 1801ВМ1 имеет только две дополнительных команды - START и STEP, алгоритм выполнения которых следующий:
Код:
// STEP
case 014:
case 015:
case 016:
case 017:
nSTEP_Flag = 1;
// START
case 010:
case 011:
case 012:
case 013:
WORD(SEL1) = WORD(SEL1)&(~BIT_3);
PC = WORD(0177674);
PSW = WORD(0177676);
PSW &= ~(BIT_9|BIT_8);
continue;
Т.е. обе команды делают одно и то же, но STEP дополнительно запрещает прерывания на один шаг.