понедельник, 28 августа 2023 г.

Про спрятанные планеты

 В адоптированных исходника


на языке Си вот такие коментарии docked. c


https://github.com/fesh0r/newkind/blob/master/docked.c#L317C3-L320C1


The next bit calculates the size of the circle used to represent a planet. The carry_flag is left over from the name generation. Yes this was how it was done... don't ask :-( Тут вычисляется размер планеты, но используется флаг переноса при генерации имени. Не спрашивайте по чему. В итоге похоже что те имена которые давали флаг переноса не выводились на экран. Надо будет это проверить сделав логи.


19139


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


В общем на данный момент я считаю что  это комбинация больших ресурсов, знание о возможности комбинированного Галактического гипер прыжка и достаточного вооружения против Таргоидов. Потому что все это дает возможность с любой станции попадать в любую. А статус беглеца-преступника очистить и бюджет пополнять за счет продажи капсул таргоидов.

Со списком скрытых планет было бы интересно поиграть. Но этот глюк-баг-фича Raxxla был не на всех версиях. На 48к самой первой Elite скорее всего был. 

Но вот как раз для неё у меня нет исходников. Хотя дизасемблировать при желании код не сложно. Но проще найти того кто это уже проделал и проанализировал. 

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



В версии ББС компьютера 

есть единственная не используемая переменная, которую можно прочитать как окончание названия искомой планеты. Предполагаю что при передаче кода дистрибютерам был убран механизм прыжка в любое место. Из за того что не была учтена ошибка сохранения капитана без инициализации начальних значений. Что заставило офис тратится на кучу значков и их пересылку, а так же оплачивать услуги почты по получению карточки человека, который заработал звание Елита.

С 812 строчки:

.XX14

 SKIP 1                 \ This byte appears to be unused Окончание название планеты

Следующая страница открыта с пропуском в 30 байт

Переменные заканчиваются на 179, а страница открыта с 209 байта

В коде так же пропущена шапка с объяснением для чего используется эта поляна

Затем идут такие переменные

Время T

И 16 видимых байт для координат

Далее переносятся 30 байт с байтом случайного семени, адресами видеопамяти, музыкальными семплами

Затем 255 байт для вычислений в стандартном для MOS Technology 6502
 стеке

Затем 6502 байта для данных командира и кораблей

Текущий корабль по Чертежам 

(если они будут не верные) может перезаписать адресс начала вершин и ребер
это некая оптимизация для того чтоб одной функцией делать взаимодействие и станцию и корабля и цистерны и некого дочернего корабля
По сути это некое подобие форка процесса
История с таргоидами подсказывает что дочерних кораблей может быть несколько и что изночально они с выключеным ИИ

Все это делается в неком стеке в 255 байт

После которого начинаются данные о статусе миссии, координате, галактике

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

Кстати дизайн кораблей был опубликован в виде исходников. Наборов структур данных.

Осталось понять как можно подменить себе дочерний корабль. Точнее чертеж дочернего корабля.

Если скажем мы нашли чертеж инопланетного корабля, то он может включать и нашу новую миссию.

На старых компьютерах была кнопка Копи которая копировала символ из под курсора в видеопамяти в оперативную память.
Для светового пера это вероятно были координаты развертки.
Когда выбирается планета на карте это практически такой же процесс.

.PATG

 SKIP 1                 \ Configuration setting to show the author names on the
                        \ start-up screen and enable manual hyperspace mis-jumps
                        \
                        \   * 0 = no author names or manual mis-jumps (default)
                        \
                        \   * &FF = show author names and allow manual mis-jumps
                        \
                        \ Toggled by pressing "X" when paused, see the DKS3
                        \ routine for details
                        \
                        \ This needs to be turned on for manual mis-jumps to be
                        \ possible. To do a manual mis-jump, first toggle the
                        \ author display by pausing the game (COPY) and pressing
                        \ "X", and during the next hyperspace, hold down CTRL to
                        \ force a mis-jump. See routine ee5 for the "AND PATG"
                        \ instruction that implements this logic

 AND PATG               \ If the game is configured to show the author's names
                        \ on the start-up screen, then PATG will contain &FF,
                        \ otherwise it will be 0

 BMI ptg                \ By now, A will be negative if we are holding down CTRL
                        \ and author names are configured, which is what we have
                        \ to do in order to trigger a manual mis-jump, so jump
                        \ to ptg to do a mis-jump (ptg not only mis-jumps, but
                        \ updates the competition flags, so Acornsoft could tell
                        \ from the competition code whether this feature had
                        \ been used)

 AND PATG               \ If PATG = &FF (author names are shown on start-up)
 LSR A                  \ and bit 0 of QQ11 is 1 (the current view is type 1),
 BCS P%+5               \ then skip the following instruction

 JSR DELAY-5            \ Delay for 8 vertical syncs (8/50 = 0.16 seconds), to
                        \ slow the main loop down a bit

 JSR TT17               \ Scan the keyboard for the cursor keys or joystick,
                        \ returning the cursor's delta values in X and Y and
                        \ the key pressed in A



Программа постоянно анализирует скорость нажатие пилотом различных вращений и в зависимости от результата подстраивает сценарий

Может быть удасться 

найти оригинальную версию игры с правильными клавишами и рабочим полностью кодом



А помоему в элите по тому же самому алгоритму Space Travel расчитывается притяжение планет. Когда разница в массе между планетой и спутником большая , то точка равновесия может быть вообще под землёй спутника. В элите аналогичные глюки. Так что повлияла и ещё как! А по поводу так элита еще не доросла Spacewar! для запуска и управления крыльями. Хотя в первой версии была такая возможность. Записаться под своим именем, показать сильную дельту в поворотах и на ускорении (да первая элита постоянно следит за исполнением, и даже есть хак что для имени создателя игры там общий цикл замедляется), за тем во время полета нажать Ctrl-X и открыть доступ к вводу кода специальной миссии, которая компания сообщала. Дальше на основе этого кода происходил выбор корабля по блюпринтам и определение координат и вообще всего окружения капитана. Так же форкаются дополнительные корабли внутри. То есть получается что то вроде Таргоида с набором Таргонов. Но человеческие. И человек попадал на миссию. Похоже их издатели торопили и официально они делали радар. Но мы знаем что радар для показа скрытых кораблей. И вероятно скрытых планет. И платформы там тоже есть. А еще была такая кнопка COPY на всех старых клавиатурах. Включая спайс кадет. Она копировала знак из области видеопамяти в область программы. Так что в теории даже можно было во время просмотра информационных экранов ввести команды. Даже без подключения кнопок. Так что механизм миссий убрали уже издатели Фаирберд, но 30 байтов там до сих пор пустуют. Как раз для блюпринта либо скрытой планеты Раксла, либо для блюпринта диковинного корабля. Я исходники на асемблере глянул. Мне не в падлу 40 000 линий кода и коментариев прочитать.

это беглый взгляд, предстоит еще кропотливая работа по детальному выяснению механизмов. Там явных хак стандартный с перезаписью стека. Так например если в окно поиска планеты ввести нужный код асемблерный который соответсвует новому кораблю то будет миссия новая. Для этого на старых компьютерах была кнопка COPY. Кроме того они там заморочались якобы для энономии места сделали кодировщик букв но на самом деле для удобства ввода кодов машины прямо в стек из хипа. (Поэтому все кто не в теме это проглядели, а кто в теме себя не выдавали по понятным причинам)

MOS Technology 6502

На компьютерах ББС микро и Аком електрон стояли следующие процессоры

MOS Technology 6502/Система команд

В них были некоторые недокументированные возможности, которые могли быть использованы Английской разведкой.
Например, сбор карточек с адресами клиентов. это конечно чистый маркетинг, однака общая база для фанатов была.
Так же судя по коду создатели игры имели возможность присылать обновление для пользователя игры, и даже выводить сообщения.
Скажем на магнитной ленте. Так же можно было сгенерировать некую миссию введя названия функций прямо в консоли.
Или скопировав их кнопкой Копи, которая была на клавиатуре. По карайней мере, можно было использовать в качестве шифровальной машинки.
В основном тесным взаимодействием не только со спецслужбами но и с тайными орденами, объясняется отказ ББС от услуг компании Синклера в пользу  Acorn Computers

Для изучения кода 

мы не будем использовать симулятор, ПЗУ и старые бинарные диски.
Потому что внесение изменений в такую конфигурацию достаточно трудоемкий процесс.
Мы будем использовать кроссасемблер для Линукса


Автор этого кода написал заметку о своей творческой карьере


Красота исходников програмы поражают воображение больше чем сцена в элита:данжерос. Потому что этот код содежит на порядок больше чем современный сценарий игры. И на два порядка больше култьруры програмирования чем все современные высокомодные стили, фреймворки и 3Д студии, вместе взятые. И занимает, как и положено всю оперативную память - все 128 килобайт. Или 48 килобайт для лайт версии. То есть всего около 40 000 линий кода вместе с коментариями.



Есть у нас быстрая страница

На легендарном 6502 есть у нас некая фича позволяющая спрятать все что угодно


LDA ($FF),Y
Извлекут младший байт из адреса 00FFH, а младший из 0000H.

JMP (92FF)
Получит младший байт из адреса 12FFH, а старший из 1200H.

Смотртим внимательо эти адреса и обертона

Начало

ORG &0000 \ The start of the zero page workspace

.ZP .RAND - инициализатор псевдорандомного генератора

Завершение

171 .XX4
172 .XX20 - счётчик планет в системе, номер граней у корабля, номер вершин корабля, размер хипа для корабля
173 .XX14
174 .RAT
175 .RAT2
176 .K2(4)

Далее идет 30 пропущенных байт

ORG &00D1
.T
.K3 .XX2 (14)
.K4 (2)

ORG &0100

.XX3

====== Начало WP workspace 
 Shared with the descending 6502 stack, which works down from &01FF.

ORG &0300 ( Address: &0300 to &035F)

.T%

Продолжение на диаграмме ниже



Сформировать можем адреса на обертонах, дальше сделать сдвиг и вуаля у нас планета спрятана


Обертона

122 .XX19 
128 .LSP - Линия разделения хипа и стека планет, копируется значение XX20
_

.QQ15
.K5 .XX18 .QQ17 - Вот тут некие старшие биты, якобы для печати, но в другом контексте делают из планеты станцию или невидимую планету
.QQ19

И еще есть такой вот интересный байт .XX14

Вот он единственный не для чего не используется, а читается он как RRLA

RLA - Недокументированная команда

ROL M, A and M -> A

Циклический сдвиг влево по значению из памяти. В итоге все попадает в общий регистр

С кодом 23 всякий, раз когда мы промахиваемся мимо текстовых преобразований

IND, XRLA (Oper,X)23



                        \   +-----------------------------------+   &0F34
                        \   |                                   |
                        \   | WP workspace                      |
                        \   |                                   |
                        \   +-----------------------------------+   &0D40 = WP
                        \   |                                   |
                        \   | Current ship line heap            |
                        \   |                                   |
                        \   +-----------------------------------+   SLSP
                        \   |                                   |
                        \   | Proposed heap for new ship        |
                        \   |                                   |
                        \   +-----------------------------------+   INWK(34 33)
                        \   |                                   |
                        \   .                                   .
                        \   .                                   .
                        \   .                                   .
                        \   .                                   .
                        \   .                                   .
                        \   |                                   |
                        \   +-----------------------------------+   INF + NI%
                        \   |                                   |
                        \   | Proposed data block for new ship  |
                        \   |                                   |
                        \   +-----------------------------------+   INF
                        \   |                                   |
                        \   | Existing ship data blocks         |
                        \   |                                   |
                        \   +-----------------------------------+   &0900 = K%

То есть что у нас происходит

Где то вверху в середине первой странице у нас образовалась точная копия основного стека программы.
И одной единственной, недокументированной командой в цикле, которая совпадает со всем тем что мы пишем в буфер по коду 23 (Знак диез, который по совместительству выбран знаком перевода строки в буферах) и знак 27 (апостров, который обрабатывается по особенному).

MACRO CHAR x

 IF x = '`'
   EQUB 39 EOR RE
 ELSE
   EQUB x EOR RE
 ENDIF

А слишком длинный ввод данных в буфер, всегда оказывается на границе хипа и стека в итоге. Причем граница их раздела определяется в байте .XX20 за которым сразу же идет .XX14 (.XXlA)

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

Уязвимости буфера записи на магнитную ленту, на этой версии кода уже нет. Все опасные места закоментированы. Найти их можно по ключевому слову FLKB

Вообщем прямым вводом данных в окно имени пилота или поиска планеты мы попадаем на стек. И второй путь это использовать клавишу , которая заботлива была по совместительству паузой в игре. Для прямого копирования символов из видеопамяти в стек.

Так же не забываем что при переполнении адреса в первой странице, в индексном режиме, мы легко можем перезаписать Сиид (семечко) псевдорандомного генератора.
Там последовательность блочных операций на 4 байтах. И у нас получатся другие названия и качества планетарной системы.


Unused duplicate of MULTU

.MUL6
Есть функция которая сдвигает регистры циклически вправо. Причем делает это в цикле по 4 байта, то есть весь стек можно сдвинуть перед возвращением. То есть с первого взгляда все инструменты для манипуляции есть.

Распечатка кода 

это делается через специальную функцию, по сути это доменный язык для сборки текста. То есть имеется микрокомпилятор.

.TT27

это название функции, в которой не разбираются дополнительные установленные флаги в .QQ17

.TT42

Заботится только о том чтоб специальные символы не были распечатаны. Потому что они могут привести к сбою програмы.



WRCHV
OSWRCH = &FFEE         \ The address for the OSWRCH routine

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

.TT26 -  Копирует в экранную память, предварительно установив координаты, Затем записывает в .K3

В изначально у нас сохранены состояния, соответственно если адресс в стеки перезаписать на буфер который мы только что ввели. То по возвращению из функции попытается запуститься заставка изначальная в цикле, которая прогоняет цикл отрисовки корабля один раз, а затем возвращает управление на цикл. Так вот в этом месте и происходит вызов собранного игрой через встроенный компилятор буфера.

Кстати надо посмотреть что за двухбуквенные обозначения там, возможно они даже имеют некую словарную логику и могут использоваться как скриптовый доменный встроенный интерпритируемый язык. Который выглядит как комбинации клавишь которые мы вводим. Естественно это включается при определенных условиях. Когда например мы нашли где то блюпринт нового корабля, который и пересобрали с новым окружением и вот в нем как раз такая опция появляется.

\LDX #LO(K3)            \ These instructions are commented out in the original
\INX                    \ source, but they call OSWORD 10, which reads the
\STX P+1                \ character bitmap for the character number in K3 and
\DEX                    \ stores it in the block at K3+1, while also setting
\LDY #HI(K3)            \ P+1 to point to the character definition. This is
\STY P+2                \ exactly what the following uncommented code does,
\LDA #10                \ just without calling OSWORD. Presumably the code
\JSR OSWORD             \ below is faster than using the system call, as this
                        \ version takes up 15 bytes, while the version below
                        \ (which ends with STA P+1 and SYX P+2) is 17 bytes.
                        \ Every efficiency saving helps, especially as this
                        \ routine is run each time the game prints a character
                        

Далее происходят настройки корабля 

после разбора токенов

.TTX66
.mes9
.OUCH

В первом приближении примерно такой механизм сокрытия планеты. Надо найти корабль. Либо ввести нужный код. Затем создасться корабль и отвезет к нужной планете. Возможно все это как бы еще одна игра в игре для настоящей 31173.


Функция выполнения кода

.ex
EOR #RE                \ Tokens are stored in memory having been EOR'd with the
                        \ value of RE - which is 35 for all versions of Elite
                        \ except for NES, where RE is 62 - so we repeat the
                        \ EOR to get the actual character to print

#RE - как отмечалось выще это код недокументированной команды в шестнадцетиричном 23

\LDA XX1+32
\AND #&7F 

Закоментированный сброс старшего бита.


Создание новых планет

.SOS1

 JSR msblob             \ Reset the dashboard's missile indicators so none of
                        \ them are targeted

 LDA #127               \ Set the pitch and roll counters to 127 (no damping
 STA INWK+29            \ so the planet's rotation doesn't slow down)
 STA INWK+30

 LDA tek                \ Set A = 128 or 130 depending on bit 1 of the system's
 AND #%00000010         \ tech level in tek
 ORA #%10000000

 JMP NWSHP              \ Add a new planet to our local bubble of universe,
                        \ with the planet type defined by A (128 is a planet
                        \ with an equator and meridian, 130 is a planet with
                        \ a crater)

По токену 128 и 130 может быть создана либо планета с меридианами, либо с кратерами

Создание солнца

.SOLAR
Токен 129  - код звезды

Функция копирования стека

В файле elite-loader.asm присутствует функция копирования стека. Поэтому возможность допрограмировать на лету игру или загрузить новые модели и код, повидимому имелись.

.BEGIN%

Copy a space coordinate

from the K% block into K3
.SPS3

То есть у нас есть даже специальная функция для нахождения неких координат в галактике и превращения их в эксплоид.

Выбор корабля по номеру слота

.GINF
Номер слота должен быть в регистре X. Затем на нужный корабль будет указывать наш указатель для кораблей INF.

Создание новой космической 

В текущей солнечной системе

.NWSPS

Добавлние нового корабля

.NWSHP

Вывод нужного корабля на экран

.PROJ
.SHPPT

Рисование планет

.PLANET

Если второй байт у не нулевой то планета считается не влезающая на экран и не рисуется

.PL9

Если радиус меньше 6 то то же не рисуется

K3(1 0), K4(1 0) - Координаты кратера, вероятный будущий вход в пещеру

Все это украшается элипсами, которые являются кратерами или мередианами

.CHKON

Функция для проверки влезает ли планета на экран

Самомодификация кода

.doPROT1


Вот коды которые я искал

Я нашел все читы и коды старой элиты. Действительно оказалась что настоящая элита это хакеры. И сама программа это просто игра для хакеров во Взломай меня. В моем блоге есть информация на страничке Elite.
Не я первый это все нашел. Как я и говорил, можно редактировать код, можно делать супербольшие прыжки. Можно создавать галактику. Но там нет самого главного кода - создание Ракслы и перехода к подземной миссии.
Его я открою только настоящей элите (тем кто на голову выше старых хакеров)

Elite

Produced by:RainBird Software
Distributed by:RainBird Software

DESCRIPTION

Elite combines the elements of strategy and shoot-'em-up arcade action in a sensational test of skills. Your goal is to reach supreme status of Elite. This challenging program is a test of combat all the way. How you acquire the needed skills is up to you.

CHEATS

On the copy protection screen type "SARA" and press 'RETURN' for the first attempt. (if you have a newer copy, type "SUZANNE"). Next enter the correct code from the manual and again press 'RETURN'. Now when in the game press the '+' and/or '*' on the numeric keypad or press 'HELP' to alter the quanity of the arms and cargo.

By typing in a byte number and entering a new value you can change things in the game.

BYTE NUMBER --- NEW VALUE ---------- USAGE
-- 12 ---------- 00-FF --- Create a new galaxy
-- 13 ---------- 00-FF --- Create a new galaxy
-- 18 ---------- FF ------ Loads of credits
-- 1F ---------- 46 ------ 7 light years fuel
-- 20 ---------- 01 ------ Escape capsule
-- 23 ---------- 02 ------ Large cargo bay
-- 24 ---------- 01 ------ E-C-M- system ('L'=on/off)
-- 26 ---------- 01 ------ Pulse laser
-- 28 ---------- 01 ------ Galactic hyperdrive (may be Beam Laser)
-- 2C ---------- 01 ------ Escape pod
-- 2F ---------- 01 ------ Energy bomb
-- 31 ---------- 01 ------ ECM jammer
-- 31 ---------- 0C ------ Naval energy Unit
-- 32 ---------- 01 ------ Docking computer
-- 34 ---------- 03 ------ Galactic hyperdrive
-- 36 ---------- 01 ------ Mining laser
-- 38 ---------- 01 ------ Military laser
-- 3F ---------- 01 ------ Cloaking ('Y'=on/off)
-- 40 ---------- 01 ------ Loads of food
-- 47 ---------- 01 ------ Loads of textiles
-- 49 ---------- 01 ------ Loads of radioactives
-- 4C ---------- 01 ------ Loads of slaves
-- 50 ---------- 01 ------ Loads of wine
-- 54 ---------- 01 ------ Loads of narcotics
-- 5C ---------- 01 ------ Loads of computers
-- 63 ---------- 01 ------ Loads of machinery
-- 67 ---------- 01 ------ Loads of alloys
-- 69 ---------- 01 ------ Loads of firearms
-- 6C ---------- 01 ------ Loads of furs
-- 72 ---------- 01 ------ Loads of minerals
-- 75 ---------- 01 ------ Loads of gold
-- 79 ---------- 01 ------ Loads of platinum
-- 83 ---------- 01 ------ Loads of gem stones
-- 84 ---------- 01 ------ Loads of alien items
-- 88 ---------- 01 ------ Refugees from Super Nova
-- 8C ---------- 01 ------ Important thargoid doc
-- 91 ---------- 00 ------ Clean legal status (may be 97 - 01)
-- 97 ---------- 00-08 --- Harmless - Elite ranking
-- 98 ---------- FF ------ Loads of combat points
-- 3C ---------- 01 ------ E.C.M. system jammer ('L'=on/off)

-- A3 ---------- 01 ------ AND FOR DIFFERENT MISSIONS CHANGE:
-- 9D ---------- 01 ------ Seek & destroy
-- 9D ---------- 02 ------ Deliver Thargoid Docs
-- 9D ---------- 03 ------ Rescue Refugees
-- 9D ---------- 04 ------ Destroy Cougar
-- 9D ---------- 05 ------ Destroy Space Station

Pressing the 'ESC' key will return you to the game.

NOTE: if you happen to have a copy from the Space Legends compilation then unfortunately the above cheat will not work. The obvious reason being that it was removed from within the game.

TIPS

Here is a way to span 80 light years in about two jumps. First of all buy some fuel and launch from the station. Go to the local cluster chart by pressing 'F6', and choose a planet that lies within the fuel range as normal. Press 'H' to hyperspace and the cursor will disappear, but you can still control it even though you can't see it. Now move the cursor to a planet outside the range and press to get the local chart for that planet. But remember you've only ten seconds until the countdown finishes so you have to be quick. This should cause the jump to move to the selected planet, well outside the 7.2 light year range.

When the title screen with the rotating ships appear press 'A'. This will stop the ship from moving. To move or rotate the ship, press the arrow keys, and to get more rotations hold down 'A' while pressing an arrow key. To move the ship toward or away from you press 'O' or 'I'. Press 'D' when your finished. Press 'W' while flying to tell your score and the authors credits.

FUN

Do you enjoy the amazing rendition of the Blue Danube? If so, press 'H' to hyperspace, when the counter is 5 or lower, engage the docking computer, and the Blue Danube will now play till you reach the next station.


The 6502 Rotate Right Myth

В воспоминаниях есть эпизод, что нашли ошибку в чипе (это было еще в Мотороле), а главные мозги сказали что просто надо добавить провод...
А тот кто паниковал, удивился как тот в уме смог понять.


Дума что суть в том что они химичили с таймером в первых слоях, и этот человек внёс изменения в дизайн (Чей?)
И ему пришлось добавить вот такой длинный резистор. (подтянуть напряжение?)


HUEY - a 6502 assembly scientific calculator

Инструкция по отладке кода


Клавиатура не правильно адресовала последнюю колонку своих значений. Видимо это про перенос символов за пределы стандартных  ASCII кодов.


Комментариев нет: