Лунолёт-1

Численное моделирования маневров космических аппаратов в непосредственной близости безатмосферных небесных тел.

История

По логике работы и алгоритмам это копия программы Лунолёт-1 из статьи Истинная правда журнала Техника Молодёжи №6 за 1985. Текст статьи можно посмотреть и здесь.

Отличия от исходной версии.

Главное отличие только в размере программы. Она на 20(!) команд короче. Фактически это демонстрация, как можно оптимизировать программу. И код по-прежнему подходит для ПМК Б3-34 (обратите внимание на вычисление модуля по программным адресам 15–16).

Игровой процесс

Напомню, кратко, как играть. Программа имитирует космический аппарат, изначально стоящий на поверхности Луны. Параметрами можно задать любое космическое тело.

Распределение регистров

Регистр Значение
R0 Рабочий. Время на манёвр в сек.
R1 Константа. Предельное ускорение, выдерживаемое экипажем без потери сознания от перегрузок в м/с². Для задачи как в оригинале = 29.43 (3g).
R2 Рабочий. Расход топлива в кг. в одну секунду.
R3 Рабочий. Достигнутое двигателем ускорение в м/с². При реверсе отрицательное.
R4 Константа. Ускорение свободного падения в м/с². Для Луны = 1.62.
R5 Константа. Масса корабля без топлива в кг. Для задачи как в оригинале = 2550.
R6 Константа. Скорость истечения продуктов сгорания в м/с. Для задачи как в оригинале = 3660.
R7 Константа 21. Используется как адрес подпрограммы.
R8 Константа 65. Используется как адрес подпрограммы.
R9 Индикатор аварийной ситуации. Тут хранится ЗГ0ГГ. Формально 0. 257, но такое, конечно, на экране ПМК не отображается.
Получается так: CX, В↑, F1/x, ВП, Fcos-1, CX, <->, x→П9, CX, KБП9.
Можно извлечь его из R9 и убедиться, что он именно такой, по методике, описанной в статье по ЗГ0ГГам.
Ra Высота от поверхности в м. Изначально равна нулю.
Rb Достигнутая скорость движения в м/с². Положительная – вверх, отрицательная – вниз. Изначально нулевая.
Rc Общее время игры в сек. Изначально нулевое.
Rd Количество топлива в кг. Для задачи как в оригинале = 400. Когда уменьшится до нуля, то корабль станет неуправляемым.

Игра

Игра начинается командой В/О, С/П. На индикаторе в регистре X отображается текущая высота. В регистре Y скорость движения. Остальные параметры, главным образом запас топлива, можно посмотреть в регистрах.

Для выполнения манёвра указываем объём топлива в кг., затем ПП. Время на манёвр в секундах, затем С/П. Если нужна реверсивная тяга, то вместо С/П нажимаем ПП, /-/ и С/П.

Если на индикаторе отображается 3Г.0ГГ , значит потеряли сознания от перегрузки. Если 3Г0Г.Г – кончилось топливо. После этого нужно(!) нажать <->. В случае пустого бака будет стоять число 3660 (константа из R6). В случае перегрузки будет превышение ускорения над предельным в м/с². Оно же время "отключки" в сек., в течение которого корабль будет неуправляемым. Затем нужно нажать С/П, не меняя состояние стека. Если вы случайно сразу нажали С/П, то ПМК вернётся в ту же точку, намекая, что ввод был некорректный.

После окончания расчёта манёвра в RX и RY будут отображены высота и скорость.

В случае окончания топлива корабль останется неуправляемым до приземления. По финальной скорости можно будет понять, было ли оно удачным.

Окончание игры

Игра заканчивается, если закончилось топливо, либо вы сами решаете, что хватит. Например, совершив один взлёт и одну посадку.

Перед началом очередной игры нужно будет обнулить регистры Ra, Rb, Rc. Задать начальное количество топлива в Rd, и нажать В/О, С/П.

Контроль

Также, как и в оригинале, контролируется только параметр времени на манёвр. Если он нулевой, то ПМК снова отобразит текущее состояние.

Пример полёта

Вот результаты манёвров из исходной статьи, но без художественного описания.

Ход игрока Регистр X Регистр Y
6 5 ПП 3 СП 3Г.0ГГ 4.94527 -01
<-> СП 169.16435 84.11245
0 ПП 2 СП 334.14925 80.87245
6 5 ПП 3 СП 3Г.0ГГ 1.246981
<-> СП 915.81041 166.02329
0 ПП 1 2 0 СП 9174.6052 -28.37671
2 5 ПП 2 СП 9150.9213 4.692814
1 0 ПП 1 0 ПП /-/ СП 9043.5028 -26.176525
2 5 ПП 5 СП 8984.4225 2.5444
0 ПП 9 0 СП 2652.4185 -143.2556
1 0 0 ПП 3 СП 3Г.0ГГ 20.163493
<-> СП 2122.6199 -31.999978
1 0 ПП 2 0 СП 1313.7051 -48.891504
1 0 ПП 1 5 СП 514.8911 -57.617035
3 5 ПП 1 . 5 СП 3Г.0ГГ 7.065725
<-> СП 389.78923 -16.749921
2 2 ПП 2 2 СП 13.51129 -17.457166
2 2 ПП 0 . 7 СП 3Г.0ГГ 20.95483
<-> СП 7.052854 -17.268609
2 2 ПП 0 . 7 СП 3Г0Г.Г 3660.
<-> СП 0. -3.7417

Текст программы

 # |  00 01 02 03 04 05 06 07 08 09
 00 |  П→xa Кx≠07 Fx<0 73 2 × КПП8 Fx2 <->
 10 |  F П→xb БП 63 Fx2 F П→x1 Fx<0
 20 |  77 П→xb П→xa С/П В↑ x→П0 Кx≠09 П→x5 П→xd +
 30 |  × ÷ П→x6 × x→П3 F П→x0 ÷ x→П2 П→x0
 40 |  КПП8 + x→Пb FВx + 2 ÷ × П→xa +
 50 |  x→Пa П→xc П→x0 + x→Пc П→xd П→x0 П→x2 ×
 60 |  x→Пd Кx<09 П→x2 ÷ БП 40 В↑ П→x3 П→x4
 70 |  × П→xb В/О П→xd Fx=0 14 П→x6 П→x9

Хитрости при оптимизации

Распишем, за счёт чего была достигнута оптимизация размера. Сначала простые.

Теперь более изощрённые.