Пошел этот бейсик в эмуляторе. Очень Вам благодарен.
- - - Добавлено - - -
Опять демагогию разводите. :(
Вид для печати
Patron, я смотрю, Jonathan Harston портировал свой BBC Basic под этот эмулятор:
https://mdfs.net/Software/PDP11/BBCB...ocs/RT11Em.htm
Но он там жалуется на какую-то ошибку установки флагов:
Цитата:
I had to add a workaround for a bug in RT11Em.
After MOV Rn,-(sp) RT11Em fails to set NE/EQ correctly. On all other PDP11 platforms tested, EQ/NE is set correctly.
Действительно, в эмуляторе 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
@Patron я сейчас наблюдаю ситуацию: файлы на MACRO, все в кодировке КОИ-8Р.
Но один из файлов, подставляемый в INCLUDE оказывается в другой кодировке.
Есть ли автоопределение кодировки и перекодирование на лету в эмуляторе rt11?
Можно ли это отключить?
Если речь про подключенный каталог Windows, то действуют довольно сложные правила перекодировок, повлиять на которые невозможно.
1. При сохранении файла в каталоге Windows средствами эмулятора - те файлы, которые в этот момент опознаны как текстовые, перекодируются в кодировку WIN и лишаются завершающих нулей.
2. При чтении из каталога Windows средствами эмулятора - все файлы дополняются нулями до границы блока 512 байт и затем те из них, которые в этот момент опознаны как текстовые файлы с кодировками WIN и DOS, перекодируются в KOI-8.
Если, например, каким-то способом поместить в каталог Windows текстовый файл в кодировке КОИ-7 - он будет прочитан эмулятором без изменений, но при любой модификации будет сохранён в кодировке WIN и при последующем чтении уже будет перекодироваться в КОИ-8.
Поэтому, если прочитанный эмулятором из подключенного каталога текстовый файл не имеет кодировки КОИ-8 - это означает, что данный файл не имел в каталоге Windows кодировки КОИ-8 и при чтении не был опознан эмулятором как текстовый файл в кодировке WIN или DOS.
Перевёл файлы в кодировку Windows 1251, какое-то время это помогало.
После некоторых изменений в файле раз и его перестаёт правильно определять, внутри rt11 он опять воспринимается кракозяблами.
Проблема как раз в ненадёжности детектора кодировки, он лажает.
Хотелось бы возможность совсем отключать детектор, чтобы файлы читались как есть.
Сохранение файлов меня волнует в меньшей степени.
- - - Updated - - -
Во вложении архив с двумя файлами.
Выполняем команды:
rt11.exe TYPE A.MAC
-- всё хорошо
rt11.exe TYPE B.MAC
-- кракозяблы.
Оба файла в кодировке Windows 1251.
В файле B.MAC добавлены ТРИ строчки.
- - - Updated - - -
Нужен какой-то workaround хотя бы. Типа вставить что-то в файл, чтобы он гарантированно правильно определялся.
UPD: Похоже что символ многоточия начисто сбивает детектор кодировки, не смотря на весь остальной текст.