Численное моделирования маневров космических аппаратов в непосредственной близости безатмосферных небесных тел.
По логике работы и алгоритмам это копия программы Лунолёт-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 |
Распишем, за счёт чего была достигнута оптимизация размера. Сначала простые.
Теперь более изощрённые.
фокусне получается. Неожиданно помогает значение правило 160 для шестнадцатеричных порядков. По нему код 1А должен перейти в 50. Но если есть ещё единица в третьем разряде, то переходит в 150 (F0). В результате, если ввести команду Fcos-1 (код 1A), то получается степень 1F0 (численно равно 250). При этом, ПМК помнит, что порядок начинается с единицы, т. е. отображает число как ЕГГ0Г. Благодаря косвенной адресации, к числу автоматом дописывается 7 нулей, но степень уже преобразуется в десятичную, порядок становится равным 257 и это уже нормальный ЗГ0ГГ (хотя что нормального в числе 0257!?).