
Сообщение от
nzeemin
Но он там жалуется на какую-то ошибку установки флагов
Действительно, в эмуляторе RT-11 для отдельных часто встречающихся кодов операций применены выборочные оптимизации, которых нет в эмуляторе PDP-11, и для команд вида MOV Rn,-(SP) как раз используется отдельный программный код для каждого из регистров:
Код:
void CPU11::Cmd_010046( word )
{// MOV R0,-(SP)
SP -= 2;
WordWrite( SP, R0 );
PSW &= ~(V|Z|N);
if( (signed short)R0 < 0 )
{
PSW |= N;
}
else
if( R0 == 0 )
{
PSW |= Z;
}
}
Тогда как в универсальном эмуляторе используется общий код для всех регистров, который выполняется дольше:
Код:
if( nWord <= 017777 )
{
byte nOp1 = (nWord & 07700)>>6;
word wOperand1;
WordRead0( nOp1, wOperand1 );
// MOV
WordWrite2( nWord & 077, nOp1, wOperand1 );
PSW &= ~(V|Z|N);
if( (signed short) wOperand1 < 0 )
{
PSW |= N;
}
else
if( wOperand1 == 0 )
{
PSW |= Z;
}
continue; // goto RETURN_TRUE;
}
На первый взгляд - оба варианта кода должны работать одинаково.
...
Ошибка найдена (и она впечатляет своей эпичностью):
Код:
void CPU11::Cmd_010146( word )
{// MOV R1,-(SP)
SP -= 2;
WordWrite( SP, R1 );
PSW &= ~(V|Z|N);
if( (signed short)R1 < 0 )
{
PSW |= N;
}
else
if( R0 == 1 ) // Должно быть if( R1 == 0 )
{
PSW |= Z;
}
}
- - - Добавлено - - -
...
Исправленная версия эмулятора: RT-11_Emulator_16.01.2022