Dec. 13th, 2020
В SIMH работает АЛГОЛ-БЭСМ-6
Dec. 13th, 2020 11:30 pmНаконец, у меня дошли руки попробовать АЛГОЛ-БЭСМ-6 имени В. М. Курочкина на SIMH. В Сосновом Бору его не было, на диске СВС в стандартном паспорте была область архива, но я когда-то это дело разобрал и оно у меня работало в онлайн-эмуляторе.
Для SIMH потребовались, и ещё потребуются, некоторые изменения. Вот этот пакет работает в SIMH:
Одно различие заключается в том, что версия ДИСПАКа для SIMH не понимает указание сдвига по диску в паспорте, как в https://github.com/besm6/besm6.github.io/blob/master/wiki/examples/algol-besm6.b6 (ЛЕНТ 57(2148-300)^), и поэтому приходится выдавать экстракод сдвига явно. Но такой способ несовместим с эмулятором ДИСПАКа для СВС (размер сдвига нужно задавать в других единицах). Так что я заведу в МГУ стандартный паспорт ЗС3, как было принято (и с ЕЕВ1А3, по традиции).
Другое различие - требования к кодированию концов строк для АЛГОЛа. По умолчанию он делает из входного потока "кирпич":
Для разбиения программы на строки используется символ с кодом 0174 (в кодировке ГОСТ), который сейчас вводится в SIMH как ctrl-^ (record separator).
(В эмуляторе Диспак для этого используется ^M (carriage return), потому что эмулятор Диспака используется только в среде UNIX, в отличие от SIMH, который должен одинаково понимать строки с LF (UNIX) и CR-LF (Windows) на конце ради переносимости.
По-хорошему нужно придумать какой-то более изящный способ. Можно, например, изменить таблицу в SIMH, чтобы и символ \ тоже перекодировался в 0174, а не в пробел, как сейчас.
Паспорт С3 занят чем-то непонятным; я завёл паспорт АЛ, так что
должно работать.
Для SIMH потребовались, и ещё потребуются, некоторые изменения. Вот этот пакет работает в SIMH:
ШИФР 419999^
ФИЗО МБ21^
ТРАК 32^
ЛИСТ 0-27^
ВХОД 36^
ВРЕМ 240^
АЦПУ 3^
ЛЕНТ 57(2148)^
ЛЕНТ 30(1С)^
РОСП 0^
АВОС^
СПЕЦ^
Е
В 36
К 00 010 0043 00 050 0112
К 00 010 0042
К 15 24 00100
К 00 066 0011 00 000 0100
С 0000 0000 0057 0002
C 0000 0000 0057 0300
EB1A3
$АЛГО
_begin
_comment Целые числа от 2 до 100: решето Эратосфена;
_integer _array prime [2:100];
_integer n, k;
_comment Обнулим prime;
_for n:=2 _step 1 _until 100 _do
prime [n] := 1;
_comment Вычислим prime;
_for n:=2 _step 1 _until 100 _do
_if prime[n] = 1 _then
_for k:=n+n _step n _until 100 _do
prime [k] := 0;
_comment Печать prime;
_for n:=2 _step 1 _until 100 _do
_if prime[n] = 1 _then
output (`z4d', n);
_end
``````
ЕКОНЕЦОдно различие заключается в том, что версия ДИСПАКа для SIMH не понимает указание сдвига по диску в паспорте, как в https://github.com/besm6/besm6.github.io/blob/master/wiki/examples/algol-besm6.b6 (ЛЕНТ 57(2148-300)^), и поэтому приходится выдавать экстракод сдвига явно. Но такой способ несовместим с эмулятором ДИСПАКа для СВС (размер сдвига нужно задавать в других единицах). Так что я заведу в МГУ стандартный паспорт ЗС3, как было принято (и с ЕЕВ1А3, по традиции).
Другое различие - требования к кодированию концов строк для АЛГОЛа. По умолчанию он делает из входного потока "кирпич":
СИСТЕМА АЛГОЛ-БЭСМ6. ВАРИАНТ 01-05-79.
СЧЕТ БЕЗ КОНТРОЛЯ
1. _ВЕGIN _СОММЕNТ ЦЕЛЫЕ ЧИСЛА ОТ 2 ДО 100: РЕШЕТО ЭРАТОСФЕНА; _INТЕGЕR _АRRАУ РRIМЕ [2:100]; _INТЕGЕR N, К; _С
ОММЕNТ ОБНУЛИМ РRIМЕ; _FОR N:=2 _SТЕР 1 _UNТIL 100 _DО РRIМЕ [N] := 1; _СОММЕNТ ВЫЧИСЛИМ РRIМЕ; _FОR N:=2 _SТЕР
1 _UNТIL 100 _DО _IF РRIМЕ[N] = 1 _ТНЕN _FОR К:=N+N _SТЕР N _UNТIL 100 _DО РRIМЕ [К] := 0; _
СОММЕNТ ПЕЧАТЬ РRIМЕ; _FОR N:=2 _SТЕР 1 _UNТIL 100 _DО _IF РRIМЕ[N] = 1 _ТНЕN ОUТРUТ (‘Z4D’, N);_ЕND
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
1
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
Для разбиения программы на строки используется символ с кодом 0174 (в кодировке ГОСТ), который сейчас вводится в SIMH как ctrl-^ (record separator).
(В эмуляторе Диспак для этого используется ^M (carriage return), потому что эмулятор Диспака используется только в среде UNIX, в отличие от SIMH, который должен одинаково понимать строки с LF (UNIX) и CR-LF (Windows) на конце ради переносимости.
По-хорошему нужно придумать какой-то более изящный способ. Можно, например, изменить таблицу в SIMH, чтобы и символ \ тоже перекодировался в 0174, а не в пробел, как сейчас.
Паспорт С3 занят чем-то непонятным; я завёл паспорт АЛ, так что
ШИФР 419999ЗАЛ^
ЕЕВ1А3
$АЛГО
_begin
_comment Целые числа от 2 до 100: решето Эратосфена;
_integer _array prime [2:100];
_integer n, k;
_comment Обнулим prime;
_for n:=2 _step 1 _until 100 _do
prime [n] := 1;
_comment Вычислим prime;
_for n:=2 _step 1 _until 100 _do
_if prime[n] = 1 _then
_for k:=n+n _step n _until 100 _do
prime [k] := 0;
_comment Печать prime;
_for n:=2 _step 1 _until 100 _do
_if prime[n] = 1 _then
output (`z4d', n);
_end
``````
ЕКОНЕЦ
должно работать.
