Симулятор dubna
2023-03-31 19:58Хочу представить вашему вниманию новый проект: симулятор операционной системы "Дубна". Он позволяет запускать из командной строки задания мониторной системы "Дубна" ровно в виде, как они описаны в книжке Мазного. На выходе получаете распечатку. Это похоже на то, как работает наш старый симулятор dispak. Но не нужно никаких паспортов.
Из всех бэсмовских дисков симулятор dubna использует только ленточку monsys.9. Она по умолчанию подключается на 30 направление (только чтение) и на неё переназначается барабан 21. Так называемый режим физ.обмена.
Собираем симулятор из текстов и устанавливаем в /usr/local:
Из всех бэсмовских дисков симулятор dubna использует только ленточку monsys.9. Она по умолчанию подключается на 30 направление (только чтение) и на неё переназначается барабан 21. Так называемый режим физ.обмена.
Установка
Для сборки из текстов нужно иметь компилятор C++ и CMake. Их можно установить на Ubuntu командой "sudo apt install build-essential cmake", на маке - командой "xcode-select --install; brew install cmake".Собираем симулятор из текстов и устанавливаем в /usr/local:
Вызов симулятора выглядит так:git clone https://github.com/besm6/dubna.git
cd dubna
make
sudo make install
$ dubna
Dubna Simulator, Version 0.1.45-b6d3248
Usage:
dubna [options...] filename
Input files:
filename Job file in MS Dubna format
Options:
-h, --help Display available options
-V, --version Print the version number and exit
-v, --verbose Verbose mode
-l NUM, --limit=NUM Stop after so many instructions (default 100000000000)
-t Trace extracodes to stdout
--trace=FILE Redirect trace to the file
-d MODE, --debug=MODE Select debug mode, default irm
Debug modes:
i Trace instructions
e Trace extracodes
f Trace fetch
r Trace registers
m Trace memory read/write
Пример: фортран
В папке examples есть несколько примеров. К примеру, возьмём простейшую программу на Фортране, файл fortran.dub:Запускаем:*name фортран
*fortran
program hello
print 1000
stop
1000 format('Hello, World!')
end
*execute
*end file
$ cd dubna/examples
$ dubna fortran.dub
Read job 'fortran.dub'
Mount image '/Users/vak/.besm6/9' as disk 30
Redirect drum 21 to disk 30
------------------------------------------------------------
3 000 00.00
ЙОКСЕЛ БЭСМ-6/5 ШИФР-12
МОНИТОРНАЯ СИСТЕМА ′Д У Б Н А′ - 20/10/88
Ж ЖЖЖ ЖЖЖЖ ЖЖЖЖЖ ЖЖЖЖ ЖЖЖ Ж Ж
ЖЖЖЖЖ Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж
Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж ЖЖЖЖЖ
Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж
ЖЖЖЖЖ Ж Ж ЖЖЖЖ Ж ЖЖЖЖ Ж Ж Ж Ж
Ж Ж Ж Ж Ж Ж ЖЖЖЖЖ Ж Ж
Ж ЖЖЖ Ж Ж Ж Ж Ж Ж Ж
*NАМЕ ФОРТРАН
*FОRТRАN
3 000 00.00
Ф О Р Т Р А Н
/16.07.73/
РRОGRАМ НЕLLО
РRINТ 1000
2 SТОР
1000 FОRМАТ(′НЕLLО, WОRLD!′)
ЕND
ТАБЛИЦА ОТНОСИТЕЛЬНЫХ АДРЕСОВ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
000 :00001 00003
*ЕХЕСUТЕ
≠
НЕLLО 01000 IОСОNТ* 01622 FТ*723 Е 01674 ISОТСОS1 Е 04025
РRОGRАМ Е 01000 IОАС* Е 01653 FТ*003 Е 01674 FМRТАРЕ 04045
ВСDWRIТ* 01017 FТ*722 Е 01666 SТОР* 02662 ОСТТDЕС 04774
FТ*621 Е 01017 FТ*642 Е 01666 ЕХIТ Е 02663 LUNМUN С 05027
ВСDЕNС* Е 01023 FТ*002 Е 01666 ВСDВЕG* 02711 JЕRRIО* С 05030
FТ*611 Е 01023 FD*642 Е 01667 FТ2* Е 03216 САRD2 С 05031
FТ*571 Е 01025 FD*722 Е 01667 КОNV1* Е 03231 ISОIСТТR 05056
FТ*561 Е 01030 FС*722 Е 01667 РRINТ8 03325 RЕVСАRD 05113
NЕХТLЕТ* Е 01035 FС*642 Е 01667 ТТРRINТ 03506 *IСНЕСК* С 05140
RК* Е 01077 FС*002 Е 01667 ВСDРUN 03545 *ПЕРФОРА 05146
WSУ* Е 01335 IОЕND* Е 01674 ЕВСDРUN Е 03571 КОД*СDС Е 05147
I/О*ЕRR Е 01575 FТ*643 Е 01674 ISОТСОSУ 03754 СВОБОДНО 05207
≠
НЕLLО, WОRLD!
------------------------------------------------------------
Elapsed time: 0.017 seconds
Simulated: 1365269 instructions
Simulation rate: 82289735 instructions/sec
Пример: ассемблер
Попробуем ассемблер, файл assem.dub:Получаем:*name ассемблер
*assem
program: ,name,
,*64 , inf64
,*74 ,
inf64: , , text
, , text
,001 ,
8, ,
text: ,gost, 18h Hello, World!'214'
,gost, 6h'231'
,end ,
*execute
*end file
$ dubna assem.dub
Read job 'assem.dub'
Mount image '/Users/vak/.besm6/9' as disk 30
Redirect drum 21 to disk 30
------------------------------------------------------------
3 000 00.00
ЙОКСЕЛ БЭСМ-6/5 ШИФР-12
МОНИТОРНАЯ СИСТЕМА ′Д У Б Н А′ - 20/10/88
ЖЖЖ ЖЖЖЖ ЖЖЖЖ ЖЖЖЖ Ж Ж ЖЖЖЖЖ ЖЖЖ ЖЖЖЖ ЖЖЖЖ
Ж Ж Ж Ж Ж ЖЖ ЖЖ Ж Ж Ж Ж Ж Ж
Ж Ж Ж Ж ЖЖЖ Ж Ж Ж ЖЖЖЖ Ж Ж ЖЖЖ Ж Ж
Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж
Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж ЖЖЖЖ
ЖЖЖЖЖ Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж Ж
Ж Ж ЖЖЖЖ ЖЖЖЖ ЖЖЖЖЖ Ж Ж ЖЖЖЖ Ж Ж ЖЖЖЖЖ Ж
*NАМЕ АССЕМБЛЕР
*АSSЕМ
3 000 00.00
АВТОКОД МАDLЕN
(1.10.72)
РRОGRАМ : , NАМЕ,
0000 , *64 ,INF64
-
0001 , *74 ,
-
0002 INF64 : , ,ТЕХТ
- , ,ТЕХТ
0003 , 001 ,
- 8, ,
0004 ТЕХТ : , GОSТ,18Н НЕLLО, WОRLD!′214′
0007 , GОSТ,6Н′231′
, ЕND ,
ЧИСЛО ПЕРФ. 0010 ЧИСЛО ОШИБ. ОПЕРАТОРОВ 0000
*ЕХЕСUТЕ
≠
РRОGRАМ 01000 СВОБОДНО 01010
≠
НЕLLО, WОRLD!
------------------------------------------------------------
Elapsed time: 0.010 seconds
Simulated: 880205 instructions
Simulation rate: 84005058 instructions/sec
Пример: *edit
У Мазного в четвёртой главе "Работа с текстами во внешней памяти" описан пакетный редактор текста *EDIT. Запустим небольшой пример с ним, edit.dub:Результат:*name Edit
*edit
*RO
*W:27001,2
Варкалось. Хливкие шорьки
Пырялись по наве,
И хрюкотали зелюки,
Как мюмзики в мове.
*EE
*
*edit
*R:270001
*LL
*EE
*end file
$ dubna edit.dub
Read job 'edit.dub'
Mount image '/Users/vak/.besm6/9' as disk 30
Redirect drum 21 to disk 30
------------------------------------------------------------
3 000 00.00
ЙОКСЕЛ БЭСМ-6/5 ШИФР-12
МОНИТОРНАЯ СИСТЕМА ′Д У Б Н А′ - 20/10/88
ЖЖЖЖ ЖЖЖ ЖЖЖ ЖЖЖЖЖ
Ж Ж Ж Ж Ж
ЖЖЖ Ж Ж Ж Ж
Ж Ж Ж Ж Ж
Ж Ж Ж Ж Ж
Ж Ж Ж Ж Ж
ЖЖЖЖЖ ЖЖЖЖ ЖЖЖ Ж
*NАМЕ ЕDIТ
*ЕDIТ
3 000 00.00
РЕДАКТОР ТЕКСТОВ
(01.06.82)
*RО
*W:27001,2
ВАРКАЛОСЬ. ХЛИВКИЕ ШОРЬКИ
ПЫРЯЛИСЬ ПО НАВЕ,
И ХРЮКОТАЛИ ЗЕЛЮКИ,
КАК МЮМЗИКИ В МОВЕ.
ФАЙЛ 27001 :ЗАПИСАНО 4 КАРТ (0001 ТР.)
*ЕЕ
*
*ЕDIТ
3 000 00.00
РЕДАКТОР ТЕКСТОВ
(01.06.82)
*R:270001
*LL
ВАРКАЛОСЬ. ХЛИВКИЕ ШОРЬКИ
ПЫРЯЛИСЬ ПО НАВЕ,
И ХРЮКОТАЛИ ЗЕЛЮКИ,
КАК МЮМЗИКИ В МОВЕ.
ФАЙЛ 270001 :СЧИТАНО 4 КАРТ (0001 ТР.)
*ЕЕ
*ЕND FILЕ
------------------------------------------------------------
Elapsed time: 0.009 seconds
Simulated: 738930 instructions
Simulation rate: 79199357 instructions/sec
Дальнейшее развитие
Приглашаются желающие развить функционал симулятора. Возможные направления:- Сделать нужные экстракоды для динамического подключения лент командой *TAPE.
- Разобраться, как подключить стандартные библиотеки *LIBRARY:1 и *LIBRARY:2.
- Сделать ввод-вывод стандартных массивов.
- Научиться подключать внешние трансляторы: *MADLEN, *BEMSH, Паскаль, другие фортраны.

no subject
Date: 2023-04-01 14:50 (UTC)no subject
Date: 2023-04-01 17:55 (UTC)no subject
Date: 2023-04-02 07:31 (UTC)no subject
Date: 2023-04-02 18:48 (UTC)no subject
Date: 2023-04-01 18:17 (UTC)почему бы не добавить это в SIMH?
no subject
Date: 2023-04-01 19:59 (UTC)Dubna супротив SIMH это как Каштанка супротив человека. То есть примерно как Wine супротив QEMU. SIMH симулирует весь хардвер машины целиком. На нём сначала надо запустить ядро операционной системы Дубна, а потом уже user space, то есть мониторную систему Дубна. Мало кто готов с этим бороться. Симулятор dubna же выполняет непосредственно код юзерного режима, перехватывая системные вызовы (экстракоды).