
Сообщение от
weiv
Спектакулятор и ZXMAK2 неправильно эмулируют команды LD A,I/LD A,R - хотя они эмулируют ошибку этой команды, из-за которой во флаг P/V во время прихода импульса прерывания во время команды заносится 0 на NMOS-процессорах, (в остальное время во флаг P/V заносится состояние маскируемых прерываний - 0-выключены,1 - включены), НО - не всегда, иногда на них во флаг P/V заносится 1, а после команды происходит прерывание
а в чём неправильность? LD A,I/R читает IFF2 (не путать с IFF1), это вроде даже в документации прописано.
Нужно это для того, чтобы в обработчике NMI можно было узнать состояние IFF1 до прерывания.
Это нужно, т.к. NMI срабатывает независимо от того - разрешены прерывания или нет.
Таким образом NMI обработчик имеет возможность корректно восстановить состояние прерываний после завершения своей работы.
Глюк процессора в том, что IFF2 не всегда читается, в частности он не читается когда INT активен и IFF1=1 (прерывания разрешены).
По крайней мере в ZXMAK2 такое условие эмуляции. Откуда это бралось уже не помню.
Был какой-то софт, который без эмуляции этой фишки не работал.
Вот код эмуляции этого флага в ZXMAK2:
Код:
if (!(INT && IFF1) && IFF2)
{
regs.F |= CpuFlags.P;
}
На счёт спектакулятора, у него отладчик глючный. Его поведение во время прерываний разное, зависит от того выполняется код по шагам или запущена эмуляция. Поэтому под отладчиком в спектакуляторе можно много магических эффектов обнаружить