Лунолёт XXI, версия 2.5


Главная / ЭКВМ / Программы для ЭКВМ / Игры

Автор программы: paul-161, опубликовано: http://community.livejournal.com/mk_152/46577.html


Доброго времени!

Выкладываю обновлённый Лунолёт-XXI. Максимально приблизил его к интерфейсу "Гравилёта", теперь обе программы дополняют друг друга. Можно летать от лунных кратеров до газовых гигантов у далеких звёзд. Летать на керосинно-кислородном движке или на гравитационном приводе Пятой культуры. Перевозить грузы по Ганимеду и пролетать над серными вулканами Ио.

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

Итак - взлёт!


Изменения от версии 1.1

I. Интерфейс

Переделан в стиле "Гравилёта". Экран картины рельефа убран из программы.

Список выводимых параметров:

ALTD - высота над рельефом (в режиме 1) и над нулевым уровнем (в режиме 2)

VERT - вертикальная скорость

VHOR - горизонтальная скорость

VORB - орбитальная скорость на текущей высоте (перед стартом выводится 0)

OVER - текущая перегрузка (кратность g)

FUEL - остаток топлива

RNGn (в режиме 1) или ANGn (в режиме 2) - расстояние (линейное или угловое) до выбранной базы n

Время полета в формате ЧЧ:ММ:СС


Переключение режимов 1 и 2 делается клавишей "ВП".

Выбор текущей базы - клавишами 1, 2, 3 и 0 (ноль соответствует главной базе - месту старта).

Нажатием клавиши "," можно вызвать информацию о планете/луне - её название, радиус, ускорение силы тяжести, максимальную высоту гор (или ледяных торосов), а также общий счет пилота. Вернуться в основной режим можно клавишей "," или "СХ".

В основном режиме перейти к вводу маневра можно клавишей "В1".

Повторить предыдущий маневр - клавишей "СХ".

Записать состояние полёта в файл - клавишей "Ввод".

Закончить полёт (только если лунолет находится на поверхности, т.е. высота равна 0) - клавиша "Выход".

После нажатия "В↑" в стеке показаны сверху вниз запас топлива, предыдущие угол, расход и время маневра.

Ввод маневра делается, как и раньше: угол В↑ расход В↑ время С/П

Перегрузка выше 3g работает так же, как и раньше, с потерей сознания (выводится сообщение, нужно нажать любую клавишу).

Проверяется расход топлива, если он выше 5% от полной массы - делается равным этим 5% (время маневра пересчитывается автоматически).

Маневр не принимается, если время задано больше 100 с.

II. Перевозка грузов

Вместо времени можно ввести вес принимаемого на борт груза (в т.ч. 0) со знаком "-". Прием груза делается только на базах, сброс (обнуление) - в любой момент. Аварийным сбросом можно воспользоваться для спасения корабля при нехватке топлива для посадки. Максимальный вес груза - 100 кг.

Вес лунолёта без топлива и груза - 2100 кг (один пилот).

III. Планета

При запуске программы (В/О С/П), если нет сохраненного файла или начинается новый полет, выводится меню выбора места действия (выбор - цифровыми клавишами).

0 - полет на Луне

1 - "задание": случайный выбор из списка: Луна, Меркурий, Плутон, Ио, Европа, Ганимед, Каллисто, Новая Селена

2 - Новая Селена.

Новая Селена - это случайно создаваемая (алгоритмом из "Планетного конструктора", см. ТМ №7/85) луна планеты Новый Эдем, открытой экспедицией "Гравилёта-XXI" (см. описание его версии 2.0). Радиус луны - от 1 до 3 тыс. км, максимальная высота гор от 0 д 10 км.

Пункты 1 и 2 считаются режимом повышенной сложности. В этом случае все полученные при посадке на базы очки удваиваются.

Высота гор принята 5,8 км для Луны, 3, 7 км для Меркурия, 9 км для Ио, 100 м для Европы, 1 км для Ганимеда и Каллисто, 3 км для Плутона (последняя цифра научными данными не будет обоснована аж до 2015 года, когда до Плутона долетит станция New Horizons - пожелаем же ей удачи!).

IV. Базы

На любой луне/планете есть 4 базы - главная и три форпоста, случайно размещаемых на поверхности. Задача пилота - посетить как можно больше форпостов и вернуться на главную базу. Посадка на базу считается успешной, если произошла не далее 1 км от её центра. Очки начисляются в момент посадки в зависимости от удаленности центра базы и точки посадки (от 0 до 100 очков). За привезенный на форпост груз дополнительно дается число очков, равное весу груза в момент посадки. При мягкой посадке на форпосте лунолет полностью заправляется топливом. После этого данный форпост исчезает из списка баз (точнее, "переносится" на главную).

Посадка считается мягкой при полной скорости до 5 м/с. При скорости от 5 до 10 м/с результат случаен - чем больше скорости, тем больше вероятность гибели. При скорости выше 10 м/с пилот погибает.

При мягкой посадке на главной базе полёт заканчивается (с выводом финального экрана). При аварии счет пилота обнуляется, и также выводится финальный экран (с общим временем полета, счетом и удалением точки посадки/гибели от главной базы).

V. Рельеф

Справа на экране в режиме индикации выводится вертикальная шкала рельефа под лунолетом. Высота всего экрана равна в масштабе максимальной высоте гор луны или планеты. Над шкалой рельефа выводится горизонтальная черта - символ лунолета (если высота полета меньше максимальной высоты гор). Рельеф меняется случайно и в целом произвольно (но горы малой высоты встречаются чаще). Стартовый кратер (с нулевой высотой рельефа) простирается на 0,5 углового градуса (15 км для Луны) в обе стороны от главной базы.

VI. Масконы

Предполагается наличие масконов на всех лунах/планетах программы. Маскон (встречающийся случайно) действует так: при пролете над ним ускорение силы тяжести возрастает на случайную величину от 0 до 100%, моделируя таким образом "синдром Перепёлкина" - пилот в орбитальном полёте не сразу замечает падение высоты. При следующем маневре сила тяжести уже будет нормальной для данной луны/планеты.




Версии

2.1

  • - маскон локально увеличивает силу тяжести не до 100, а только до 10 процентов;
  • - при посадке обнуляются скорости и ускорение;
  • - Луне возвращена "пуховская" предельная высота гор 3500 м. Всё-таки она уже сейчас изучена настолько, чтобы прокладывать маршрут в обход самых высоких пиков.

Значение "Курс" на финальном экране - это просто случайное направление полёта, чтобы на карте прикинуть, где именно побывал лунолёт (первый удачный рейс был, например, в Залив Зноя к "северо-западу" от центра имени Королёва, который, как известно, имеет лунные координаты 0:0 градусов).

При выходе клавишей "Выход" в режиме задания оно считается невыполненным, если не посещены все три форпоста, и в этом случае счет обнуляется. Очки сохраняются, если посещены три форпоста без возвращения на главную базу.

2.2

  • - масконы на Луне дают 1% аномалии;
  • - другие масконы дают случайно от 0 до 10% аномалии;
  • - вероятность масконов увеличена вдвое (везде);
  • - время отключки от перегрузок округляется до целого;
  • - дополнительный груз - до 150 кг (можно взять пассажира в скафандре).

После удачной посадки вне базы (ALTD=0) можно клавишей "Выход" по радио вызвать луноход-заправщик с базы, предварительно выбранной клавишами 0-3. Заправщик с немалым трудом забирается на ледяной торос или стенку кратера и полностью заправляет лунолёт. За это с пилота снимается сумма очков, равная двадцатикратному расстоянию до выбранной базы в километрах. После этого можно лететь дальше (в том числе к базе, посылавшей заправщик).

Груз можно принимать только на главной базе (перед стартом в самом начале миссии).

2.3

Полностью переделана система заправки и перевозки грузов.

1. Топливо

Находясь на поверхности (на любой базе или вне баз) пилот перед взлётом загружает топливо, введя его в режиме задания манёвра со знаком "-". Остальные регистры стека роли не играют. Введенная масса (без минуса) добавляется к текущему запасу топлива. Это можно делать любое число раз, пока лунолёт стоит на поверхности.

2. Цена топлива

За заправку пилот платит очками со счета по курсу 1 очко за 10 кг топлива. Отрицательным счет не становится.

Если заправка делается вне баз (независимо от расстояния), курс повышается вдвое. Это цена доставки.

3. Баки и масса лунолёта

Топливо загружается в виде легкосплавных универсальных кассет ЛУК-100, каждая из которых вмещает 100 кг горючего и окислителя, имея собственный вес 10 кг. Поэтому запас топлива имеет смысл брать кратным 100 кг, чтобы место в кассете не пустовало.

Сухая масса вычисляется при загрузке топлива как масса нужного числа кассет + масса двигателя (1000 кг) + масса системы жизнеобеспечения, кресел, пульта управления, купола и стабилизаторов (600 кг) + масса пилота в скафандре (150 кг).

Масса выводится на экране данных о планете/луне в виде "сухая масса + масса груза".

4. Груз

Груз принимается на лунолёт автоматически при посадке на любую базу, а также перед вылетом с главной базы. Вес груза задаётся случайно от 0 до 140 кг. Также возможен вариант перевозки пассажира - тогда вес груза равен 150 кг.

Вес груза или пассажира прибавляется к счету пилота при разгрузке - т.е. удачной посадке на главной базе или форпосте.

Сбросить груз теперь нельзя.

5. Время заправки/погрузки

При заправке на базе составляет 10 минут. Вне базы - 1 час 40 минут (учитывая путь заправщика к лунолёту).

Добавляется к общему времени полёта.

6. Двигатель

Теперь один и тот же на всех планетах/лунах. Работает на неорганической нефти, имеет скорость истечения газов 3660 м/с. Классика.

7. Масконы

Сила нелунных масконов снижена вдвое (их аномалия теперь от 1 до 5%).

8. Режимы полёта

При выборе пункта "1" в меню выбора задания (тренировочный режим) пилот получает только половину возможных очков, но для успеха миссии нужно посетить только один (любой) форпост и вернуться на главную базу.

В режиме задания (пункты "2" и "3") надо посетить все три форпоста и вернуться на главную базу.

Новая Селена теперь не даётся заданием при выборе пункта "2".

2.4

1. Все величины при выводе на экране округляются до сотых долей.

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

3. На шкале высоты выводится три полосы. Средняя - текущая высота рельефа под лунолётом в масштабе "высота экрана = максимальная высота гор на планете". Полосы слева и справа - соседние горы ("вид из кабины"). Ширина полос - не в масштабе, расстояние до соседних гор неизвестно (нет атмосферы - другие оптические эффекты). Лунолёт рисуется горизонтальной чертой над средней полосой шкалы. По мере полёта шкала смещается влево или вправо.

4. Заправка теперь может осуществляться на расстоянии не более 50 км от базы или форпоста.

5. В стартовом меню после выбора задания программа задаёт вопрос о ранцевых двигателях (РД). Ответ - 0 или 1. Если пилот берёт скафандр с РД, его вес увеличивается до 200 кг (вес пассажира - аналогично). Если лунолёт терпит катастрофу (падает с пустыми баками), можно в режиме индикации нажать клавишу "Выход" - произвести катапультирование. Лунолёт падает, сухая масса становится равной 180 кг, вес груза - 0, вес топлива в РД - 20 кг. Если пилот успешно садится на РД (в любом месте планеты/луны), очков он не получает, но и не теряет ранее набранные. Пассажир садится автоматически на собственном РД.

6. Вес груза, автоматически получаемого на базе/форпосте, составляет от 0 до веса пассажира (150 или 200 кг). Если в лунолёт садится пассажир (вероятность 50%), то на экране данных о планете (клавиша "ВП") около веса груза ставится символ "п".

7. Уже посещённые форпосты не выбираются на экране индикации.

8. Перегрузки после 3g приводят к потере сознания с возрастающей вероятностью вплоть до 6g. После 6g потеря сознания гарантирована.

9. Новая Селена снова может даваться в качестве места действия при заданиях.

10. Стартовый кратер с нулевой высотой рельефа расширен до 1 градуса в обе стороны от главной базы.

11. Введён режим тренировки. Нужен для оценки планеты перед получением задания (компьютерный тренажёр на базе). Включается командой "0" в режиме ввода манёвра (только на главной базе перед вылетом). Форпостов нет. Спасательной миссии (см. ниже) нет. Очки, соответственно, получить нельзя. Заправка бесплатна. Если пилот погибает, его счёт не обнуляется.

12. Режим "Спасатели"

Выбирается в главном меню клавишей "3".

На поверхности планеты/луны в неизвестном месте находится потерпевший аварию одноместный лунолёт. Его радио передаёт сигналы бедствия, которые, однако, сильно экранируются горами. Запас кислорода на лунолёте составляет от 4 до 8 часов (более точных данных нет).

Задача пилота - найти лунолёт и сесть в пределах 1 км от него. Если при очередном манёвре удалось принять сигнал SOS (вероятность приёма зависит от расстояния до аварийного лунолёта) - выводится сообщение с указанием направления пеленга (стрелка "влево" или "вправо"). Положение лунолёта надо вычислить, ориентируясь на это направление и частоту принятых сигналов. Можно совершать промежуточные посадки на форпостах для заправки (помня о времени, которое нужно на неё). При успехе миссии пилоту даётся 1000 очков. Если после посадки выясняется, что кислород у аварийного лунолёта закончился раньше - выводится сообщение о гибели экипажа, и очки не даются. В обоих случаях на этом миссия заканчивается.

2.5

Исправлено:

  • - ошибка с загрузкой файла после успешной миссии;
  • - не начислялись очки при спасении аварийного лунолёта;
  • - лунолёт с погибшим экипажем продолжал посылать SOS;
  • - не округлялось расстояние от базы на финальном экране;
  • - перегрузка могла возникнуть при переключении режимов дисплея.




Программа "Лунолёт XXI"

Версия 2.5 от 04.04.12 (2664 байта, КС 216769/207)

  0 1 2 3 4 5 6 7 8 9
0000 Cx P П 28 PP П 90 45 P ПП 17 66 1
0010 - P x≠0 00 35 1 + PP П 91 28 PP П
0020 91 23 PP П 91 28 PP П 91 24 ИП A P ИП
0030 25 - P x<0 05 21 Cx П 0 П 1 П 3 П 4
0040 П 8 П A П B P П 16 P П 17 P П 18 P П
0050 20 P П 25 P П 33 9 ВП 3 П E 2
0060 1 + П D 2 + П C 1 5 0 P П
0070 32 /-/ P П 19 P П 35 2 PP П 90 10
0080 2 5 3 6 K П D 1 6 B↑ 0 K П E
0090 2 5 6 0 K П D 2 4 B↑ 0 K П E
0100 2 5 6 9 K П D 3 2 B↑ 0 K П E
0110 2 5 8 6 K П D 4 0 B↑ 0 K П E
0120 2 5 9 9 K П D 0 3 8 4 П 9
0130 P ПП 16 50 4 - P x<0 01 30 4 +
0140 P x≠0 01 79 3 - P x=0 01 67 1 P П
0150 33 K СЧ 4 × 4 + 3 6 0 0
0160 × K [x] P П 34 P БП 01 72 1 + P x=0
0170 03 40 K СЧ 8 × K [x] P x=0 02 07 1
0180 5 0 P П 19 2 5 6 0 B↑ 4
0190 + P П 29 1 7 3 8 П 7 3 ,
0200 5 B↑ 1 , 6 2 K БП 9 1 - P x=0
0210 02 29 2 4 3 3 P П 29 2 4
0220 4 0 П 7 4 B↑ 3 , 7 K БП 9 1
0230 - P x=0 02 51 2 4 4 2 P П 29
0240 1 8 1 5 П 7 9 B↑ 1 , 8
0250 K БП 9 1 - P x=0 02 76 2 4 4 5
0260 P П 29 1 5 6 9 П 7 0 , 1
0270 B↑ 1 , 3 2 K БП 9 1 - P x=0 02
0280 99 2 4 5 2 P П 29 2 6 3
0290 1 П 7 1 B↑ 1 , 4 3 K БП 9 1
0300 - P x=0 03 22 2 4 6 0 P П 29
0310 2 4 0 0 П 7 1 B↑ 1 , 2
0320 3 K БП 9 2 4 6 9 P П 29 1 1
0330 9 5 П 7 3 B↑ 0 , 5 8 K БП 9
0340 2 5 6 9 B↑ 4 + P П 29 K СЧ
0350 ВП 1 K СЧ 2 × 1 + ВП 3 K [x]
0360 П 7 6 3 7 1 ÷ B↑ B↑ 1 -
0370 0 , 6 9 0 4 × F ex × 9
0380 , 8 1 × P П 27 1 П 9 P П
0390 15 ВП 3 × K [x] P П 26 P ПП 19 66
0400 P П 30 P ПП 19 66 P П 31 5 6 B↑
0410 0 K П E 2 6 1 3 K П D P ПП 16 50
0420 P x≠0 04 39 1 - P x=0 04 17 2 0
0430 0 P П 32 P ИП 19 K ЗН × P П 19 4
0440 П 2 2 0 П 6 ИП 7 F π × П 5 ИП 5 2
0450 × K СЧ × ИП 5 - K П 6 PF L2 04 48 P ИП
0460 33 × P П 33 0 P П 24 P x=0 04
0470 74 P ПП 16 99 P ПП 19 74 Cx P П 35
0480 P ИП 34 P x≥0 05 21 P ИП 33 P x≠0 05 21
0490 P ПП 18 84 B↑ K |x| F √ F √ F 1/x K СЧ -
0500 P x≥0 05 21 K ЗН P П 35 ИП 8 3 0
0510 - F Bx ÷ K СЧ - P x≥0 05 21 2 P П
0520 35 2 PP П 90 10 2 3 0 6 K П D
0530 ИП A P ИП 15 P x≥0 05 41 ИП A P ИП 25 -
0540 B↑ P ПП 19 55 2 3 8 0 K П D
0550 8 B↑ 0 K П E 2 3 2 7 K П D ИП B
0560 P ПП 19 55 2 3 8 7 K П D 1 6
0570 B↑ 0 K П E 2 3 1 3 K П D ИП 0 P ПП
0580 19 55 2 3 8 7 K П D 2 4 B↑
0590 0 K П E 2 3 2 0 K П D P ИП 18 P ПП
0600 19 55 2 3 8 7 K П D 3 2 B↑
0610 0 K П E 2 3 3 4 K П D ИП 8 1 0
0620 ÷ P ПП 19 55 4 0 B↑ 0 K П E 2
0630 3 4 5 K П D P ИП 20 P ПП 19 55 2
0640 3 9 2 K П D 4 8 B↑ 0 K П E П 2
0650 P ИП 15 K |x| 1 - P x≠0 06 64 2 0
0660 + П 6 PK ИП 06 П 6 P ИП 15 P x<0 06 91
0670 ИП 6 1 8 0 × F π ÷ ИП 7 ÷ P ПП
0680 18 97 П 6 2 3 4 1 K П D P БП 07
0690 01 ИП 6 P ПП 18 84 П 6 2 3 5 2
0700 K П D P ИП 15 K |x| 4 7 + PP П 90 20
0710 5 8 PP П 90 20 3 2 PP П 90 20
0720 ИП 6 P ПП 19 55 2 3 9 6 P ИП 15
0730 P x<0 07 38 2 3 8 3 B↑ K П D
0740 5 6 B↑ 0 K П E P ИП 35 2 - P x≠0
0750 07 81 P ИП 35 P x≠0 07 75 2 ÷ 2
0760 6 , 5 + PP П 90 20 2 6 2
0770 9 K П D P БП 08 06 P ПП 15 95 P БП 08
0780 06 2 4 0 4 K П D ИП 8 2 9 -
0790 K [x] П 9 K П C 2 4 0 0 K П D 0 П 4
0800 P ПП 16 50 P БП 11 54 P ИП 30 P ПП 19
0810 21 1 1 0 P ПП 19 33 P ИП 25 P ПП
0820 19 21 1 1 6 P ПП 19 33 P ИП 31
0830 P ПП 19 21 1 2 2 P ПП 19 33 ИП A
0840 P ПП 19 21 1 1 7 K П E 1 2
0850 0 PP П 90 12 P ПП 16 50 P x≠0 08 78
0860 4 - P x<0 08 89 2 4 + П 6 PK ИП
0870 06 P x≠0 08 54 ИП 6 2 0 - 1 +
0880 P ИП 15 K ЗН × P П 15 P БП 05 21 6
0890 - P x=0 09 00 P ПП 19 74 P БП 05 21
0900 2 3 - P x=0 09 24 P ПП 17 25 2
0910 PP П 90 10 2 4 1 8 K П D P ПП 16
0920 50 P БП 05 21 1 + P x=0 09 53 P ИП
0930 32 2 0 0 - P x≥0 08 54 F Bx 2
0940 0 - P П 19 F Bx P П 20 0 P П 24
0950 P БП 05 21 2 0 + P x=0 09 67 P ИП
0960 15 /-/ P П 15 P БП 05 21 1 - P x≠0
0970 11 54 2 2 4 4 PP П 90 26 0
0980 ИП 3 ИП 4 ИП 9 С/П P x=0 10 08 P ИП 16 P x=0
0990 09 72 P П 21 P П 22 P П 23 P П 33
1000 P ИП 26 /-/ P П 26 P БП 05 21 P x<0 11
1010 38 П 5 ИП A P ИП 25 - P x=0 09 72 ИП 9
1020 1 - P x≠0 10 70 P ИП 16 K |x| 5 0
1030 - P x≥0 10 70 P ИП 21 P ПП 18 84 K |x|
1040 5 0 - P x≥0 10 70 P ИП 22 P ПП 18
1050 84 K |x| 5 0 - P x≥0 10 70 P ИП 23
1060 P ПП 18 84 K |x| 5 0 - P x<0 09 72
1070 P ИП 26 P x≥0 10 91 ИП 5 1 0 ÷ ИП 9
1080 × P ИП 28 + K [x] P x<0 10 89 Cx P П
1090 28 ИП 5 K |x| P ИП 20 + P П 20 2 F 10x
1100 ÷ K [x] 1 0 × 1 6 0 0 +
1110 P ИП 32 + P ИП 19 K ЗН × P П 19 P ИП
1120 34 ИП 9 F 10x 6 0 × - P П 34 F Bx
1130 P ИП 17 + P П 17 P БП 05 21 ИП B P x=0
1140 11 48 F O P ИП 20 P x≠0 09 72 F O П 9
1150 F O П 4 F O П 3 ИП 4 B↑ P ИП 19 K |x| P ИП
1160 24 + P ИП 20 + 2 0 ÷ ÷ 1
1170 - P x≥0 11 82 1 + ÷ П 4 ИП 9 F Bx
1180 ÷ П 9 P ИП 17 ИП 9 + K [x] P П 17 P ИП
1190 34 ИП 9 - P П 34 ИП 4 ИП 9 ÷ P ИП 20
1200 ИП 4 - P x<0 12 11 ИП 4 + П 4 P БП 11
1210 95 P П 20 P ИП 19 K |x| + P ИП 24 +
1220 ÷ 3 6 6 0 × П 8 ИП A ИП 7 ВП
1230 3 + П A ИП 0 ИП 8 ИП 3 F sin × ИП B /-/
1240 P ПП 15 87 + П 0 P ПП 15 91 9 0
1250 × F π ÷ ИП A ÷ ИП 1 П 5 + B↑ F sin
1260 K ЗН F cos F arccos × П 1 ИП 7 F π × ×
1270 1 8 0 ÷ P П 16 P ИП 27 P П 18
1280 ИП 9 6 0 ÷ 0 , 9 8 F xy K СЧ
1290 - P x<0 13 22 P ИП 27 1 , 6 2
1300 - P x=0 13 11 1 , 0 1 P БП 13
1310 17 K СЧ 2 0 ÷ 1 + P ИП 18 ×
1320 P П 18 ИП B ИП 8 ИП 3 F cos × ИП 7 ВП 3
1330 ИП A ÷ F x2 P ИП 18 × - ИП 0 P ПП 15
1340 87 + П B P ПП 15 91 2 ÷ ИП A +
1350 П A P ИП 27 ÷ F √ ИП 7 ВП 3 ×
1360 P П 18 ИП 1 K [x] P x=0 13 73 Cx P П 25
1370 P БП 14 20 ИП 5 P ПП 18 97 K |x| 0 ,
1380 5 F xy K СЧ - P x<0 14 20 ИП 0 P x≥0 14
1390 07 P ИП 25 P П 30 P ИП 31 P П 25 P ПП
1400 19 66 P П 31 P БП 14 20 P ИП 25 P П
1410 31 P ИП 30 P П 25 P ПП 19 66 P П 30
1420 ИП A ИП 7 ВП 3 - П A P ИП 25 - P x<0
1430 04 77 ИП 0 F x2 ИП B F x2 + F √ 5 -
1440 P x≥0 14 50 5 ÷ K СЧ - P x<0 20 88
1450 P ИП 33 P x≠0 14 82 P ПП 18 84 K [x] P x=0
1460 14 82 2 2 9 0 P ИП 34 P x≥0 14
1470 96 P ИП 28 1 ВП 3 + P П 28 P БП
1480 14 91 P ИП 19 K |x| 3 F 10x - P x<0 15
1490 07 2 6 4 8 B↑ Cx P П 21 P П
1500 22 P П 23 P БП 21 14 0 П 2 2
1510 0 П 6 P ИП 16 K |x| K [x] P x≠0 15 40 3
1520 П 2 K ИП 6 P ПП 18 84 K [x] P x≠0 15 37 PF L2
1530 15 21 2 П 9 P БП 15 73 0 PK П 06
1540 1 П 9 F Bx - ВП 2 P ИП 24 + K [x]
1550 P ИП 19 P x<0 15 59 2 ×
1560 P ИП 28 + P П 28 P ИП 15 K ЗН P П 15
1570 P ПП 16 99 0 П 0 П 8 П B P ИП 25 П A
1580 ИП 2 P x≠0 21 10 P БП 04 77 ИП 0 × ИП A
1590 ÷ + ИП 9 × В/О 2 3 5 6 K П D
1600 P ИП 17 3 6 0 0 ÷ K Г→МС П 5 K [x]
1610 P ПП 16 30 ИП 5 K {x} 2 F 10x × П 5 K [x]
1620 P ПП 16 30 ИП 5 K {x} 2 F 10x × K П C В/О
1630 K П C 3 2 PP П 90 20 5 8 PP П
1640 90 20 3 2 PP П 90 20 В/О
1650 K ГРФ PP ИП 90 29 K NOT P x≠0 16 51 F Bx B↑
1660 B↑ 4 - P x≥0 16 97 6 - P x≠0 16
1670 97 2 - P x≠0 16 97 1 - P x≠0 16
1680 97 1 - P x≠0 16 97 1 8 - P x≠0
1690 16 97 1 - P x=0 16 51 В/О K СЧ
1700 2 × K [x] P x≠0 17 20 K СЧ P ИП 32 ×
1710 1 0 ÷ K [x] 1 0 × P П 24 В/О
1720 P ИП 32 P П 24 В/О 0 П 5 3 6 П 2
1730 1 PP П 90 47 PK ИП 05 PK П 05 K ИП 5 PF L2
1740 17 30 P ПП 17 66 П 5 1 - P x=0 17
1750 58 P ПП 18 39 P ПП 17 66 П 5 ИП 5 PP П
1760 91 28 PP П 91 26 В/О 0 PP П 90 30
1770 1 PP П 91 20 6 3 П 2 3 PP П 90
1780 31 ИП 2 PP П 91 22 PP ИП 90 34 7 6
1790 - P x=0 18 34 PP ИП 90 34 1 1 7
1800 - P x=0 18 34 PP ИП 90 34 1 1 0
1810 - P x=0 18 34 PP ИП 90 34 9 7 -
1820 P x=0 18 34 PP П 90 31 PP ИП 90 33 4
1830 - P x≠0 18 37 PF L2 17 77 ИП 2 В/О 3
1840 PP П 90 31 7 6 PP П 90 34 1 1
1850 7 PP П 90 34 1 1 0 PP П 90 34
1860 9 7 PP П 90 34 1 6 П 2 3 2
1870 PP П 90 34 PF L2 18 68 4 PP П 91 28
1880 PP П 91 25 В/О P ИП 16 - B↑ K |x|
1890 ИП 7 F π × P ПП 19 09 В/О ИП 1 -
1900 B↑ K |x| 1 8 0 P ПП 19 09 В/О -
1910 P x≥0 19 19 F Bx - K ЗН × B↑ F O
1920 В/О 6 4 P ИП 26 K |x| ÷ 6 4
1930 × - В/О K П E F Bx P x≠0 19 54 1 +
1940 6 PP П 90 13 K ИП E 6 3 K П E 5
1950 + PP П 90 12 В/О 1 0 0 × K [x]
1960 1 0 0 ÷ K П C В/О K СЧ F x2 F x2 P ИП
1970 26 K |x| × В/О 2 PP П 90 10 2 4
1980 7 6 K П D P ИП 29 K П D 1 6 B↑ 0
1990 K П E 2 4 8 7 K П D ИП 7 K П C 2 3
2000 9 6 K П D 2 4 B↑ 0 K П E 2 4
2010 9 6 K П D P ИП 26 K |x| K П C 2 3 8
2020 0 K П D 3 2 B↑ 0 K П E 2 5 0
2030 9 K П D P ИП 27 P ПП 19 55 4 8 B↑
2040 0 K П E 2 5 2 1 K П D P ИП 19 K |x|
2050 K П C 4 3 PP П 90 20 P ИП 24 K П C P ИП
2060 32 - P x=0 20 71 1 7 5 PP П 90
2070 20 5 6 B↑ 0 K П E 2 5 2 9
2080 K П D P ИП 28 K П C P ПП 16 50 В/О P ИП 26
2090 P x≥0 20 96 Cx P П 28 2 2 7 3
2100 P БП 21 14 2 2 9 0 P БП 21 14
2110 2 2 5 7 B↑ 2 PP П 90 10 /-/
2120 П A K П D P ИП 21 P ИП 22 P ИП 23 +
2130 + P x≠0 21 53 P ИП 19 P x≥0 21 50 P ИП
2140 21 P ИП 22 P ИП 23 × × P x≠0 21 53
2150 Cx P П 28 2 5 2 9 K П D P ИП 28
2160 K П C 1 6 B↑ 0 K П E 2 3 6 3
2170 K П D P ИП 16 P ПП 19 55 2 3 9 6
2180 K П D 3 2 B↑ 0 K П E 2 3 7 4
2190 K П D K СЧ 3 6 0 × 1 8 0 -
2200 K [x] K П C 2 3 8 3 K П D 4 8 B↑
2210 0 K П E P ПП 15 95 P ИП 28 P x=0 22 37
2220 P ПП 17 66 1 - P x≠0 22 40 1 +
2230 PP П 91 28 PP П 91 24 С/П P ПП 17 25
2240 P ПП 16 50 С/П C2h E2h 'т' EEh 'ю' E4h 'ф' 20h ' ' ECh 'ь'
2250 E0h 'р' EDh 'э' E5h 'х' E2h 'т' F0h 'Ё' E0h 'р' 00h CFh EEh 'ю' EBh 'ы'
2260 B8h F2h 20h ' ' EEh 'ю' EAh 'ъ' EEh 'ю' EDh 'э' F7h E5h 'х' EDh 'э'
2270 2Eh '.' 20h ' ' 00h C2h E7h 'ч' F0h 'Ё' FBh E2h 'т' 20h ' ' E8h 'ш'
2280 20h ' ' E3h 'у' E8h 'ш' E1h 'с' E5h 'х' EBh 'ы' FCh 21h '!' 20h ' ' 00h
2290 D1h EFh 'я' E0h 'р' F1h 'ё' B8h EDh 'э' EDh 'э' FBh F5h 20h ' '
2300 EDh 'э' E5h 'х' F2h 2Eh '.' 20h ' ' 00h 41h 'A' 4Ch 'L' 54h 'T' 44h 'D'
2310 3Ah ':' 20h ' ' 00h 56h 'V' 48h 'H' 4Fh 'O' 52h 'R' 3Ah ':' 20h ' ' 00h
2320 56h 'V' 4Fh 'O' 52h 'R' 42h 'B' 3Ah ':' 20h ' ' 00h 56h 'V' 45h 'E' 52h 'R'
2330 54h 'T' 3Ah ':' 20h ' ' 00h 4Fh 'O' 56h 'V' 45h 'E' 52h 'R' 3Ah ':' 20h ' '
2340 00h 41h 'A' 4Eh 'N' 47h 'G' 00h 46h 'F' 55h 'U' 45h 'E' 4Ch 'L' 3Ah ':'
2350 20h ' ' 00h 52h 'R' 4Eh 'N' 47h 'G' 00h C2h F0h 'Ё' E5h 'х' ECh 'ь'
2360 FFh 20h ' ' 00h CEh F2h 20h ' ' F1h 'ё' F2h E0h 'р' F0h 'Ё'
2370 F2h E0h 'р' 20h ' ' 00h CAh F3h F0h 'Ё' F1h 'ё' 20h ' ' 00h
2380 20h ' ' ECh 'ь' 00h 20h ' ' E3h 'у' F0h 'Ё' 00h 20h ' ' ECh 'ь' 2Fh '/'
2390 63h 'c' 00h 20h ' ' EAh 'ъ' E3h 'у' 00h 20h ' ' EAh 'ъ' ECh 'ь' 00h
2400 20h ' ' F1h 'ё' 21h '!' 00h C1h E5h 'х' E7h 'ч' 20h ' ' F1h 'ё' EEh 'ю'
2410 E7h 'ч' EDh 'э' E0h 'р' EDh 'э' E8h 'ш' FFh 20h ' ' 00h D4h E0h 'р'
2420 E9h 'щ' EBh 'ы' 20h ' ' F1h 'ё' EEh 'ю' F5h F0h 'Ё' E0h 'р' EDh 'э' B8h
2430 EDh 'э' 2Eh '.' 00h CCh E5h 'х' F0h 'Ё' EAh 'ъ' F3h F0h 'Ё' E8h 'ш'
2440 E9h 'щ' 00h C8h EEh 'ю' 00h C5h E2h 'т' F0h 'Ё' EEh 'ю' EFh 'я'
2450 E0h 'р' 00h C3h E0h 'р' EDh 'э' E8h 'ш' ECh 'ь' E5h 'х' E4h 'ф' 00h
2460 CAh E0h 'р' EBh 'ы' EBh 'ы' E8h 'ш' F1h 'ё' F2h EEh 'ю' 00h CFh
2470 EBh 'ы' F3h F2h EEh 'ю' EDh 'э' 00h CDh E0h 'р' E7h 'ч' E2h 'т'
2480 E0h 'р' EDh 'э' E8h 'ш' E5h 'х' 3Ah ':' 20h ' ' 00h D0h E0h 'р' E4h 'ф'
2490 E8h 'ш' F3h F1h 'ё' 3Ah ':' 20h ' ' 00h C2h FBh F1h 'ё' EEh 'ю'
2500 F2h E0h 'р' 20h ' ' E3h 'у' EEh 'ю' F0h 'Ё' 3Ah ':' 20h ' ' 00h D3h
2510 F1h 'ё' EAh 'ъ' EEh 'ю' F0h 'Ё' E5h 'х' EDh 'э' E8h 'ш' E5h 'х' 3Ah ':' 20h ' '
2520 00h CCh E0h 'р' F1h 'ё' F1h 'ё' E0h 'р' 3Ah ':' 20h ' ' 00h D1h
2530 F7h E5h 'х' F2h 3Ah ':' 20h ' ' 00h CBh D3h CDh CEh
2540 CBh A8h 'и' D2h 2Dh '-' 58h 'X' 58h 'X' 49h 'I' 2Eh '.' 20h ' ' C2h
2550 E5h 'х' F0h 'Ё' F1h 'ё' E8h 'ш' FFh 20h ' ' 32h '2' 2Eh '.' 35h '5' 00h
2560 30h '0' 20h ' ' 2Dh '-' 20h ' ' CBh F3h EDh 'э' E0h 'р' 00h 31h '1'
2570 20h ' ' 2Dh '-' 20h ' ' CDh EEh 'ю' E2h 'т' E0h 'р' FFh 20h ' ' D1h
2580 E5h 'х' EBh 'ы' E5h 'х' EDh 'э' E0h 'р' 00h 32h '2' 20h ' ' 2Dh '-' 20h ' '
2590 D4h EEh 'ю' F0h 'Ё' EFh 'я' EEh 'ю' F1h 'ё' F2h FBh 00h 33h '3'
2600 20h ' ' 2Dh '-' 20h ' ' D1h EFh 'я' E0h 'р' F1h 'ё' E0h 'р' F2h E5h 'х'
2610 EBh 'ы' E8h 'ш' 00h D1h EAh 'ъ' E0h 'р' F4h E0h 'р' EDh 'э' E4h 'ф'
2620 F0h 'Ё' FBh 20h ' ' F1h 'ё' 20h ' ' D0h C4h 3Fh '?' 00h CFh
2630 F0h 'Ё' E8h 'ш' EDh 'э' FFh F2h 20h ' ' F1h 'ё' E8h 'ш' E3h 'у' EDh 'э'
2640 E0h 'р' EBh 'ы' 20h ' ' 53h 'S' 4Fh 'O' 53h 'S' 21h '!' 00h DDh EAh 'ъ'
2650 E8h 'ш' EFh 'я' E0h 'р' E6h 'ц' 20h ' ' F1h 'ё' EFh 'я' E0h 'р' F1h 'ё' B8h
2660 EDh 'э' 21h '!' 20h ' ' 00h            

Текст программы для кросс-компилятора

; Лунолет-XXI
; Версия 2.5, 04.04.12

; Регистры:
; 0,A,B - как в Лунолете-3
; 1 - угол от главной базы
; 2,5,6 - рабочие
; 3 - угол импульса
; 4 - расход 
; 7 - радиус планеты (км)
; 8 - ускорение
; 9 - время маневра
; C - константа 9023
; D - константа 9021
; E - константа 9000
; 15 - выбранная база/режим индикации
; 16 - расстояние от старта
; 17 - время полета
; 18 - ускорение силы тяжести/круговая скорость
; 19 - сухая масса/признак задания
; 20 - топливо
; 21-23 - координаты баз (км)
; 24 - вес груза
; 25 - текущая высота рельефа
; 26 - максимальная высота гор/признак тренировки
; 27 - начальное ускорение силы тяжести
; 28 - счет пилота
; 29 - указатель на название планеты
; 30 - высота на участке слева
; 31 - высота на участке справа
; 32 - масса человека в скафандре
; 33 - координата сигнала SOS (км)
; 34 - оставшееся аварийному лунолету время
; 35 - признак получения SOS/перегрузок

	CX
	P M 28
	PP M 9045
	P GSB FIND_FILE
	1 -
	P X!=0 START
	1 +
	PP M 9128
	PP M 9123
	PP M 9128
	PP M 9124
	RM A
	P RM 25
	-
	P X<0 PRINT
; Начинаем заново
START:
	CX
	M 0
	M 1
	M 3
	M 4
	M 8
	M A
	M B
	P M 16
	P M 17
	P M 18
	P M 20
	P M 25
	P M 33
	9 EE 3
	M E
	21 +
	M D
	2 +
	M C
	150 
	P M 32
	+/-
	P M 19
	P M 35
; Выбираем место действия
	2 PP M 9010
	.NUM TITLE0
	K M D
	16 ENT 0
	K M E
	.NUM TITLE1
	K M D
	24 ENT 0
	K M E
	.NUM TITLE2
	K M D
	32 ENT 0
	K M E
	.NUM TITLE3
	K M D
	40 ENT 0
	K M E
	.NUM TITLE4
	K M D
	.NUM INIT
	M 9
WAIT_SELECT:
	P GSB GET_KEY
	4 -
	P X<0 WAIT_SELECT
	4 +
	P X!=0 MOON
	3 -
	P X=0 NO_RESCUE
; Аварийный лунолет
	1
	P M 33
	K RAN
	4 *
	4 +
	3600 *
	K INT
	P M 34
	P GOTO MAKE_TASK	
NO_RESCUE:
	1 +
	P X=0 NEW_SELENA
MAKE_TASK:
	K RAN
	8 *
	K INT
	P X=0 LUN1
MOON:
; Луна
	150
	P M 19
	.NUM TITLE1
	ENT
	4 +
	P M 29
	1738
	M 7
	3,5
	ENT
	1,62
	K GOTO 9
LUN1:
	1 -
	P X=0 LUN2
; Меркурий
	.NUM TITLE3B
	P M 29
	2440
	M 7
	4
	ENT
	3,7
	K GOTO 9
LUN2:
	1 -
	P X=0 LUN3
; Ио
	.NUM TITLE3C
	P M 29
	1815
	M 7
	9
	ENT
	1,8
	K GOTO 9
LUN3:
	1 -
	P X=0 LUN4
; Европа
	.NUM TITLE3D
	P M 29
	1569
	M 7
	0,1
	ENT
	1,32
	K GOTO 9
LUN4:
	1 -
	P X=0 LUN5
; Ганимед
	.NUM TITLE3E
	P M 29
	2631
	M 7
	1
	ENT
	1,43
	K GOTO 9
LUN5:
	1 -
	P X=0 LUN6
; Каллисто
	.NUM TITLE3F
	P M 29
	2400
	M 7
	1
	ENT
	1,23
	K GOTO 9
LUN6:
; Плутон
	.NUM TITLE3G
	P M 29
	1195
	M 7
	3
	ENT
	0,58
	K GOTO 9
NEW_SELENA:
; Случайная планета/луна
	.NUM TITLE2
	ENT
	4 +
	P M 29
	K RAN
	EE 1
	K RAN
	2 *
	1 +
	EE 3
	K INT
	M 7
	6371
	/
	ENT
	ENT
	1 -
	0,6904
	*
	F EXP
	*
	9,81
	*
INIT:
	P M 27
	<->
	1 
	M 9
	P M 15
	EE 3 
	*
	K INT
	P M 26
	P GSB RAND_HEIGHT
	P M 30
	P GSB RAND_HEIGHT
	P M 31
; Спрашиваем про ранцевые двигатели
	56 ENT 0
	K M E
	.NUM TITLE5
	K M D
WAIT_JETS:
	P GSB GET_KEY
	P X!=0 NO_JETS
	1 -
	P X=0 WAIT_JETS
	200
	P M 32
	P RM 19
	K SGN
	*
	P M 19
NO_JETS:
; Генерация форпостов
	4
	M 2
	20 
	M 6
	RM 7
	F PI
	*
	M 5
CYC_BASES:
	RM 5
	2 *
	K RAN
	*
	RM 5
	-
	K M 6
	PF L2 CYC_BASES
; Генерация места сигнала SOS
	P RM 33
	*
	P M 33
	0
	P M 24
	<->
	P X=0 NO_LOADING
	P GSB NEW_CARGO
NO_LOADING:
	P GSB SHOW_PLANET
; Основной цикл
BEGIN:
	CX
	P M 35
; Проверка сигнала SOS
	P RM 34
	P X>=0 PRINT
	P RM 33
	P X!=0 PRINT
	P GSB CALC_RANGE
	ENT
	K ABS
	F SQRT
	F SQRT
	F 1/X
	K RAN
	-
	P X>=0 PRINT
	<->
	K SGN
	P M 35
	RM 8
; Предельная перегрузка (от 3 до 6 g)
	30 -
	F ANS
	/
	K RAN
	-
	P X>=0 PRINT
	2
	P M 35
PRINT:
; Вывод параметров полета
	2
	PP M 9010
	.NUM MESS1
	K M D
	RM A
	P RM 15
	P X>=0 NO_SCAPE
	RM A
	P RM 25
	-
	ENT
NO_SCAPE:
	<->
	P GSB ROUND
	.NUM MESS20
	K M D
	8 ENT 0
	K M E
	.NUM MESS4
	K M D
	RM B
	P GSB ROUND
	.NUM MESS22
	K M D
	16 ENT 0
	K M E
	.NUM MESS2
	K M D
	RM 0
	P GSB ROUND
	.NUM MESS22
	K M D
	24 ENT 0
	K M E
	.NUM MESS3
	K M D
	P RM 18
	P GSB ROUND
	.NUM MESS22
	K M D
	32 ENT 0
	K M E
	.NUM MESS5
	K M D
	RM 8
	10 /
	P GSB ROUND
	40 ENT 0
	K M E
	.NUM MESS7
	K M D
	P RM 20
	P GSB ROUND
	.NUM MESS23
	K M D
	48 ENT 0
	K M E
	M 2
	P RM 15
	K ABS
	1 -
	P X!=0 NO_BASE
	20 +
	M 6
	PK RM 6
NO_BASE:
	M 6
	P RM 15
	P X<0 SHOW_DIST
	RM 6
	180 *
	F PI
	/
	RM 7
	/
	P GSB CALC_ANGLE
	M 6
	.NUM MESS6
	K M D
	P GOTO SHOW_ANGL
SHOW_DIST:
	RM 6
	P GSB CALC_RANGE
	M 6
	.NUM MESS8
	K M D
SHOW_ANGL:
	P RM 15
	K ABS
	47 +
	PP M 9020
	58
	PP M 9020
	32
	PP M 9020
	RM 6
	P GSB ROUND
	.NUM MESS24
	P RM 15
	P X<0 SHOWTM
	.NUM MESS21
	ENT
SHOWTM:
	<->
	K M D
	56 ENT 0
	K M E
	P RM 35
	2 -
	P X!=0 OVER
; Сообщение о сигнале SOS
	P RM 35
	P X!=0 NOT_SOS
	2 /
	26,5 +
	PP M 9020
	.NUM SOS
	K M D
	P GOTO SCALES
NOT_SOS:
	P GSB SHOW_TIME
	P GOTO SCALES
OVER:
	.NUM MESS30
	K M D
; Время без сознания
	RM 8
	29 -
	K INT
	M 9
	K M C
	.NUM MESS25
	K M D
	0
	M 4
	P GSB GET_KEY
	P GOTO CALC
; Рисуем шкалу высоты
SCALES:
	P RM 30
	P GSB SET_SCALE
	110
	P GSB DRAW_SCALE
	P RM 25
	P GSB SET_SCALE
	116
	P GSB DRAW_SCALE
	P RM 31
	P GSB SET_SCALE
	122
	P GSB DRAW_SCALE
; Рисуем лунолет
	RM A
	P GSB SET_SCALE
	117
	K M E
	<->
	120
	PP M 9012
; Ждем команду
WAIT_COMM:
	P GSB GET_KEY
	P X!=0 SELECT_BASE
	4 -
	P X<0 CHANGE_MODE
	24 +
	M 6
	PK RM 6
; Проверяем посещенные базы
	P X!=0 WAIT_COMM
	RM 6
	20 -
SELECT_BASE:
	1 +
	P RM 15
	K SGN
	*
	P M 15
	P GOTO PRINT
CHANGE_MODE:
	6 -
	P X=0 NO_PLANET
	P GSB SHOW_PLANET
	P GOTO PRINT
NO_PLANET:
	23 -
	P X=0 SAVE_FILE
	P GSB WRITE_FILE
	2 PP M 9010
	.NUM MESS31
	K M D
	P GSB GET_KEY
	P GOTO PRINT
SAVE_FILE:
	1 +
	P X=0 EJECT
	P RM 32
	200 -
	P X>=0 WAIT_COMM
	F ANS
	20 -
	P M 19
	F ANS
	P M 20
	0
	P M 24
	P GOTO PRINT
EJECT:
	20 +
	P X=0 DISP_MODE
	P RM 15 
	+/-
	P M 15
	P GOTO PRINT
DISP_MODE:
	1 -
	P X!=0 CALC
; Ввод маневра
ENTER:
	.NUM MESS0
	PP M 9026
	0
	RM 3
	RM 4
	RM 9
	R/S
; Проверка получения груза/топлива
	P X=0 TRAINING
	P RM 16
	P X=0 ENTER
; Переход в тренировочный режим	
	P M 21
	P M 22
	P M 23
	P M 33
	P RM 26
	+/-
	P M 26
	P GOTO PRINT
TRAINING:
	P X<0 FUELING
	M 5
	RM A
	P RM 25
	-
	P X=0 ENTER
; Проверяем расстояние до баз
	RM 9
	1 -
	P X!=0 VALID_RANGE
	P RM 16
	K ABS
	50 -
	P X>=0 VALID_RANGE
	P RM 21
	P GSB CALC_RANGE
	K ABS
	50 -
	P X>=0 VALID_RANGE
	P RM 22
	P GSB CALC_RANGE
	K ABS
	50 -
	P X>=0 VALID_RANGE
	P RM 23
	P GSB CALC_RANGE
	K ABS
	50 -
	P X<0 ENTER
VALID_RANGE:
	P RM 26
	P X>=0 LOAD_FUEL
	RM 5
	10 /
; Штраф за заправку вне базы?
	RM 9
	*
	P RM 28
	+
	K INT
	P X<0 NEG_SCORE
	CX
NEG_SCORE:
	P M 28
LOAD_FUEL:
; Сама заправка
	RM 5
	K ABS
	P RM 20
	+
	P M 20
; Вычисляем массу баков и полную сухую массу
	2 F 10^X /
	K INT
	10 *
	1600 +
	P RM 32
	+
	P RM 19
	K SGN
	*
	P M 19
; Время заправки (10 или 100 минут)
	P RM 34
	RM 9
	F 10^X
	60 *
	-
	P M 34
	F ANS
	P RM 17
	+
	P M 17
	P GOTO PRINT
FUELING: 
; Не забыли ли заправиться?
	RM B
	P X=0 IS_FUEL
	F R
	P RM 20
	P X!=0 ENTER
IS_FUEL:
	F R
	M 9
	F R
	M 4
	F R
	M 3
; Проверка ограничения по расходу 5% от массы
CALC:
	RM 4
	ENT
	P RM 19
	K ABS
	P RM 24
	+
	P RM 20
	+
	20 /
	/
	1 -
	P X>=0 CALC1
	1 +
	/
	M 4
	RM 9
	F ANS
	/
	M 9
; Основной расчет
CALC1:
	P RM 17
	RM 9
	+
	K INT
	P M 17
	P RM 34
	RM 9
	-
	P M 34
CALC2:
	RM 4
	RM 9
	/
	P RM 20
	RM 4
	-
	P X<0 FUEL_OK
	RM 4
	+
	M 4
	P GOTO CALC2
FUEL_OK:
	P M 20
; Расчет ускорения
	P RM 19
	K ABS
	+
	P RM 24
	+
	/
; Удельный импульс
	3660
	*
	M 8
LBL2:
; Расчет скоростей
	RM A
	RM 7
	EE 3
	+
	M A
	RM 0
	RM 8
	RM 3
	F SIN
	*
	RM B
	+/-
	P GSB SUB1
	+
	M 0
	P GSB SUB2
	90 *
	F PI
	/
	RM A
	/
; Расчет угла
	RM 1
	M 5
	+
	ENT
	F SIN
	K SGN
	<->
	F COS
	F ARCCOS
	*
	M 1
	RM 7
	F PI
	*
	*
	180 /
; Расстояние от точки старта
	P M 16
; Проверяем маскон
	P RM 27
	P M 18
; Расчет вероятности (2% за каждую минуту)
	RM 9
	60 /
	0,98
	F X^Y
	K RAN
	-
	P X<0 NO_MASCON
; Для Луны маскон дает 1%, для других - от 1 до 5%
	P RM 27
	1,62 -
	P X=0 NO_MOON
	1,01
	P GOTO MASC_MOON
NO_MOON:
	K RAN
	20 /
	1 +
MASC_MOON:
	P RM 18
	*
	P M 18
NO_MASCON:
	RM B
	RM 8
	RM 3
	F COS
	*
	RM 7
	EE 3
	RM A
	/
	F X^2
	P RM 18
	*
	-
	RM 0
	P GSB SUB1
	+
	M B
	P GSB SUB2
	2 /
	RM A
	+
	M A
	P RM 27
	<->
	/
	F SQRT
	RM 7
	EE 3
	*
	P M 18
; Ищем высоту рельефа под лунолетом
	RM 1
	K INT
; Стартовый кратер
	P X=0 START_LOC
	CX
	P M 25
	P GOTO CALC_ALT
START_LOC:
	RM 5
	P GSB CALC_ANGLE
; Высота меняется с вероятностью 50% на 1 градус
	K ABS
	0,5
	F X^Y
	K RAN
	-
	P X<0 CALC_ALT
; Определяем, куда летим
	RM 0
	P X>=0 TO_RIGHT
	P RM 25
	P M 30
	P RM 31
	P M 25
	P GSB RAND_HEIGHT
	P M 31
	P GOTO CALC_ALT
TO_RIGHT:
	P RM 25
	P M 31
	P RM 30
	P M 25
	P GSB RAND_HEIGHT
	P M 30
CALC_ALT:
	RM A
	RM 7
	EE 3
	-
	M A
	P RM 25
	-
	P X<0 BEGIN
; Посадка или авария?
	RM 0
	F X^2
	RM B
	F X^2
	+
	F SQRT
	5 -
	P X>=0 SURFACE
	5 /
	K RAN
	-
	P X<0 DEATH1
SURFACE:
; Проверка, не спасли ли аварийный лунолет
	P RM 33
	P X!=0 IS_EJECT
	P GSB CALC_RANGE
	K INT
	P X=0 IS_EJECT
	.NUM MESS1C
	P RM 34
	P X>=0 OTHER_END
	P RM 28
	1 EE 3
	+
	P M 28
	P GOTO HAPPY_END
; Проверка, не катапультировались ли
IS_EJECT:
	P RM 19
	K ABS
	3 F 10^X
	-
	P X<0 NO_EJECT
HAPPY_END:
	.NUM SOSWIN
	ENT
OTHER_END:
	CX
	P M 21
	P M 22
	P M 23
	<->
	P GOTO FINISH
NO_EJECT:
; Проверка, на какой базе сели
	0
	M 2
	20
	M 6
	P RM 16
	K ABS
	K INT
	P X!=0 REFUEL1
	3
	M 2
CYC_TEST:
	K RM 6
	P GSB CALC_RANGE
	K INT
	P X!=0 REFUEL
	PF L2 CYC_TEST
; Штрафной коэффициент заправки
	2
	M 9
	P GOTO STOP_SHIP
REFUEL:
; Удаляем форпост
	0
	PK M 6
REFUEL1:
; Заправка на базе и получение очков
	1
	M 9
	F ANS
	-
	EE 2
; Учитываем груз
	P RM 24
	+
	K INT
; При задании удваиваем очки
	P RM 19
	P X<0 NO_DOUBLE
	<->
	2 *
	<->
NO_DOUBLE:
	<->
	P RM 28
	+
	P M 28
	P RM 15
	K SGN
	P M 15
	P GSB NEW_CARGO
STOP_SHIP:
	0
	M 0
	M 8
	M B
	P RM 25
	M A
; Вернулись ли на главную базу?
	RM 2
	P X!=0 WIN
	P GOTO BEGIN
SUB1:
	RM 0
	*
	RM A
	/
SUB2:
	+
	RM 9
	*
	RTN

; Вывод времени в формате ЧЧ : ММ : СС
SHOW_TIME:
	.NUM MESS9
	K M D
	P RM 17
	3600 /
	K D->MS
	M 5
	K INT	
	P GSB SHOW_DIVIDER
	RM 5
	K FRAC
	2 F 10^X *
	M 5
	K INT
	P GSB SHOW_DIVIDER
	RM 5
	K FRAC
	2 F 10^X *
	K M C
	RTN

; Вывод двоеточия с пробелами
SHOW_DIVIDER:
	K M C
	32
	PP M 9020
	<->
	58
	PP M 9020
	<->
	32
	PP M 9020
	<->
	RTN

; Нажатие клавиши
GET_KEY:
	K GRPH
GET_KEY1:
	PP RM 9029
	K NOT	
	P X!=0 GET_KEY1
	F ANS
	ENT
	ENT
	4 -
	P X>=0 KEY_OK
	6 -
	P X!=0 KEY_OK
	2 -
	P X!=0 KEY_OK
	1 -
	P X!=0 KEY_OK
	1 -
	P X!=0 KEY_OK
	18 -
	P X!=0 KEY_OK
	1 -
	P X=0 GET_KEY1
KEY_OK:
	<->
	RTN

; Новый груз или пассажир
NEW_CARGO:
	K RAN
	2 *
	K INT
	P X!=0 NO_CARGO
	K RAN
	P RM 32
	*
	10 /
	K INT
	10 *
	P M 24
	RTN
NO_CARGO:
	P RM 32
	P M 24
	RTN

; Запись в файл Luna
WRITE_FILE:
	0 M 5
	36 M 2 ; число использованных регистров
; В цикле переписываем все регистры в ЭОЗУ
REWRITE:
	1 
	PP M 9047
	PK RM 5
	PK M 5
	K RM 5
	PF L2 REWRITE
	P GSB FIND_FILE
	M 5
	1 -
	P X=0 SAVE_READY
	P GSB CREATE_FILE
	P GSB FIND_FILE
	M 5
SAVE_READY:
	RM 5
	PP M 9128
	PP M 9126
	RTN

; Поиск файла Luna
FIND_FILE:
	0 PP M 9030
	1 PP M 9120
	63 M 2
READ_DIR:
	3 PP M 9031
	RM 2
	PP M 9122
	PP RM 9034
	76 -
	P X=0 NEXT_ROW
	PP RM 9034
	117 -
	P X=0 NEXT_ROW
	PP RM 9034
	110 -
	P X=0 NEXT_ROW
	PP RM 9034
	97 -
	P X=0 NEXT_ROW
	PP M 9031
	PP RM 9033
	4 -
 	P X!=0 FILE_FOUND
NEXT_ROW:
	PF L2 READ_DIR
FILE_FOUND:	
	RM 2
	RTN

; Создание файла Luna
CREATE_FILE:
	3 PP M 9031
	76
	PP M 9034
	117
	PP M 9034
	110
	PP M 9034
	97
	PP M 9034
	16 M 2
FILL_NAME:
	32
	PP M 9034
	PF L2 FILL_NAME
	4
	PP M 9128
	PP M 9125
	RTN

; Расчет дистанции между точками
CALC_RANGE:
	P RM 16
	<->
	-
	ENT
	K ABS
	RM 7
	F PI
	*
	P GSB CORRECT_SIGN
	RTN

; Расчет угла между точками
CALC_ANGLE:
	RM 1
	<->
	-
	ENT
	K ABS
	180
	P GSB CORRECT_SIGN
	RTN

; Коррекция знака в расчетах
CORRECT_SIGN:
	-
	P X>=0 NO_CORR_DIST
	F ANS
	-
	<->
	K SGN
	*
	ENT
NO_CORR_DIST:
	F R
	RTN

; Расчет шкалы высот
SET_SCALE:
	64
	<->
	P RM 26
	K ABS
	/
	64 *
	-
	RTN

; Рисование шкалы высот
DRAW_SCALE:
	K M E
	F ANS
	P X!=0 NO_BOX
	1 +
	6
	PP M 9013
	K RM E
	63
	<->
	K M E
	5 +
	PP M 9012
NO_BOX:
	RTN

; Округление до сотых
ROUND:
	100 *
	K INT
	100 /
	K M C
	RTN

; Случайная высота рельефа
RAND_HEIGHT:
	K RAN
	F X^2
	F X^2
	P RM 26
	K ABS
	*
	RTN

; Вывод данных о планете
SHOW_PLANET:
	2 PP M 9010
	.NUM LUNA0
	K M D
	P RM 29
	K M D
	16 ENT 0
	K M E
	.NUM LUNA1
	K M D
	RM 7
	K M C
	.NUM MESS24
	K M D
	24 ENT 0
	K M E
	.NUM LUNA2
	K M D
	P RM 26
	K ABS
	K M C
	.NUM MESS20
	K M D
	32 ENT 0
	K M E
	.NUM LUNA3
	K M D
	P RM 27
	P GSB ROUND
	48 ENT 0
	K M E
	.NUM MASS
	K M D
	P RM 19
	K ABS
	K M C
	43
	PP M 9020
	P RM 24
	K M C
	P RM 32
	-
	P X=0 NO_MAN
	175
	PP M 9020
NO_MAN:
	56 ENT 0
	K M E
	.NUM SCORE
	K M D
	P RM 28
	K M C
	P GSB GET_KEY
	RTN

; Конец игры
DEATH1:
	P RM 26
	P X>=0 NO_CLEAR
	CX
	P M 28
NO_CLEAR:
	.NUM MESS1B
	P GOTO FINISH
DEATH2:
	.NUM MESS1C
	P GOTO FINISH
WIN:
	.NUM MESS1A
FINISH:
	ENT
	2
	PP M 9010
	+/-
	M A
	<->
	K M D
; Проверяем выполнение задания
	P RM 21
	P RM 22
	P RM 23
	+
	+
	P X!=0 NO_TASK
; На Луне надо посетить хотя бы одну базу (0 в регистре)
	P RM 19
	P X>=0 CLEAR_SCORE
	P RM 21
	P RM 22
	P RM 23
	*
	*
	P X!=0 NO_TASK
CLEAR_SCORE:
	CX
	P M 28
NO_TASK:
; Счет
	.NUM SCORE
	K M D
	P RM 28
	K M C
; Расстояние от старта/курс
	16 ENT 0
	K M E
	.NUM MESS10
	K M D
	P RM 16
	P GSB ROUND
	.NUM MESS24
	K M D
	32 ENT 0
	K M E
	.NUM MESS11
	K M D
	K RAN
	360 *
	180 -
	K INT
	K M C
	.NUM MESS21
	K M D
; Время полета
	48 ENT 0
	K M E
	P GSB SHOW_TIME
	P RM 28
	P X=0 LANDING
	P GSB FIND_FILE
	1 -
	P X!=0 GAME_OVER
	1 +
	PP M 9128
	PP M 9124
	R/S	
LANDING:
	P GSB WRITE_FILE
GAME_OVER:
	P GSB GET_KEY
	R/S

MESS0:
.TEXT "Ввод маневра\0"
MESS1A:
.TEXT "Полёт окончен. \0"
MESS1B:
.TEXT "Взрыв и гибель! \0"
MESS1C:
.TEXT "Спасённых нет. \0"
MESS1:
.TEXT "ALTD: \0"
MESS2:
.TEXT "VHOR: \0"
MESS3:
.TEXT "VORB: \0"
MESS4:
.TEXT "VERT: \0"
MESS5:
.TEXT "OVER: \0"
MESS6:
.TEXT "ANG\0"
MESS7:
.TEXT "FUEL: \0"
MESS8:
.TEXT "RNG\0"
MESS9:
.TEXT "Время \0"
MESS10:
.TEXT "От старта \0"
MESS11:
.TEXT "Курс \0"
MESS20:
.TEXT " м\0"
MESS21:
.TEXT " гр\0"
MESS22:
.TEXT " м/c\0"
MESS23:
.TEXT " кг\0"
MESS24:
.TEXT " км\0"
MESS25:
.TEXT " с!\0"
MESS30:
.TEXT "Без сознания \0"
MESS31:
.TEXT "Файл сохранён.\0"
TITLE3B:
.TEXT "Меркурий\0"
TITLE3C:
.TEXT "Ио\0"
TITLE3D:
.TEXT "Европа\0"
TITLE3E:
.TEXT "Ганимед\0"
TITLE3F:
.TEXT "Каллисто\0"
TITLE3G:
.TEXT "Плутон\0"
LUNA0:
.TEXT "Название: \0"
LUNA1:
.TEXT "Радиус: \0"
LUNA2:
.TEXT "Высота гор: \0"
LUNA3:
.TEXT "Ускорение: \0"
MASS:
.TEXT "Масса: \0"
SCORE:
.TEXT "Счет: \0"
TITLE0:
.TEXT "ЛУНОЛЁТ-XXI. Версия 2.5\0"
TITLE1:
.TEXT "0 - Луна\0"
TITLE2:
.TEXT "1 - Новая Селена\0"
TITLE3:
.TEXT "2 - Форпосты\0"
TITLE4:
.TEXT "3 - Спасатели\0"
TITLE5:
.TEXT "Скафандры с РД?\0"
SOS:
.TEXT "Принят сигнал SOS!\0"
SOSWIN:
.TEXT "Экипаж спасён! \0"

.END



Файлы программ доступны на странице "Игры"


НПП "СЕМИКО" (383) 271-01-25 (многоканальный)