Нативный код / Интерактивный разбор / Чтение: 22 мин
TH04: как 16 пуль узнают, где вы находитесь?
Исследуйте кольца пуль TH04 с REA. Проследите байтовые углы, наведение и поворот, затем проверьте небольшую реализацию на интерактивной схеме.
На этой странице
01. Попробуйте перед разбором
Перетащите ромб вокруг центра, затем выпустите кольцо. Светлый луч отмечает первую пулю. Измените количество с 16 на 12: целочисленные шаги угла перестанут делить круг равномерно. Если предпочитаете клавиатуру, используйте ползунки.
16 направлений с интервалом в 16 единиц угла.
Схема углов, а не запись игры. Наведение мышью использует приближённое преобразование atan2; в оригинале применяется iatan2.
Интерактивную схему углов и небольшой расчёт кольца с явными проверками округления и циклического перехода.
Перед исследованиемСхема доступна сразу. Чтобы повторить анализ бинарного файла, используйте собственный соответствующий TH04 MAIN.EXE и настроенный провайдер Ghidra. Также понадобится зафиксированный код воссоздания по ссылке ниже. Настроить REA →
02. Разберитесь с системой адресов исполняемого файла
TH04 — программа DOS для PC-98. Перед переходом к адресу функции установите, как загрузчик отображает файл в память. Сохраните хеш исполняемого файла, сегмент загрузки, режим кода и соответствие адресов смещениям файла. Адрес без профиля загрузки может привести к неверным байтам.
Официальный отчёт предоставляет известную вспомогательную функцию и зафиксированную реализацию для ориентации в исследовании. Использование этой опоры — упражнение по готовым подсказкам, а не доказательство того, что агент самостоятельно разобрал всю программу.
Открой с REA мой TH04 MAIN.EXE через Ghidra. Сверь профиль загрузки DOS MZ и идентичность артефакта с отчётом об исследовании TH04 по ссылке. Если они совпадают, изучи указанную функцию bullet_velocity_and_angle_set и сопоставь её адрес с байтами файла. Если артефакт или профиль загрузки отличается, прекрати использовать исторические адреса и объясни, как найти эквивалентную функцию.03. Восстановите одно направление перед отрисовкой кольца
Ключевой вопрос — порядок операций. Разберите отдельно индекс, количество, наведение и поворот. Для этой ветви кольца читаемая модель — floor(index × 256 / count), плюс наведение и поворот, с приведением к одному байту. На экране углы увеличиваются по часовой стрелке.
Попробуйте двенадцать пуль. Умножение перед делением даёт смещения 0, 21, 42, 64… Умножение индекса на floor(256 / count) дало бы 0, 21, 42, 63… Сначала результаты совпадают, затем расходятся. Внешне правдоподобный круг может скрыть ошибку.
- 16 пуль без наведения: 0, 16, 32, …, 240.
- 12 пуль: индекс 3 должен давать 64, а не 63.
- Наведение 250 плюс смещение 16 циклически переходят в 10.
- Вправо — 0, вниз — 64, влево — 128, вверх — 192.
04. Отделите правило кольца от функции наведения
Проследите, где координаты игрока и начала попадают в функцию направления. Затем найдите добавление поворота шаблона и сохранение итогового байта. Разделите эти выводы, чтобы проверять каждый этап.
Для наведения мышью наша схема использует JavaScript atan2 с округлением до ближайшего байтового угла. В оригинале используется iatan2. Для точного совпадения на всех координатах игрока пришлось бы восстановить и проверить и эту функцию; схема показывает арифметику кольца без заявления о такой эквивалентности.
Восстанови только ветвь направленного кольца. Покажи последовательность инструкций с умножением перед делением, вызов для вычисления наведения, добавление поворота шаблона и сохранение итогового байта. Независимо реализуй арифметику кольца. Используй на схеме явно обозначенную приближённую функцию наведения, пока исходное поведение iatan2 не установлено отдельно. Проверь 12 и 16 пуль, отрицательный поворот и циклический переход.05. Проверьте углы, прежде чем оценивать картинку
Экспортируйте численные углы для нескольких намеренно неудобных входов. На снимке экрана ошибка в одну единицу может выглядеть правильно. Проверьте неудобные количества, наведение около 255 и поворот через ноль. Проверяйте итоговый диапазон байта, а не только интервалы.
Если первый луч немного не попадает в указатель, изучите квантование угла перед изменением расчёта кольца. Если схема отражена по вертикали, проверьте систему координат. Если граф вызовов нативного кода противоречив, проверьте отображение сегментов реального режима и сами инструкции.
06. Сравните известные результаты
Используйте их как явные контрольные точки. Совпадение подтверждает это небольшое правило, но не совместимость всего приложения.
| Входные данные | Ожидаемые углы | Что выявляет |
|---|---|---|
| количество 16; наведение 0; поворот 0 | 0, 16, 32, …, 240 | Равные интервалы |
| количество 12; наведение 0; поворот 0 | 0, 21, 42, 64, …, 234 | Умножение перед делением |
| количество 16; наведение 250; поворот 0 | 250, 10, 26, …, 234 | Циклический переход байта |
| количество 4; наведение 0; поворот −1 | 255, 63, 127, 191 | Нормализация отрицательного поворота |
Сохраните оба файла в одной папке. Запустите проверки с Node.js; устанавливать пакеты не требуется.
node check-case-labs.mjs07. Что действительно проверено?
Этот сайт проверяет извлечённую арифметику кольца и рисует новую схему. Он не запускает исходную программу DOS, не воспроизводит её функцию iatan2 и не повторяет исторические проверки компилятора. Шестнадцать — выбранное учебное количество, а не обещание для всех уровней сложности или состояний стрельбы игры.
Записанные результаты численных тестов этого сайта →
Источники: Отчёт REA об исследовании TH04 · Макрос кольца в зафиксированной реализации. Руководство, иллюстрации и браузерные эксперименты созданы независимо.
Впервые используете инструмент? Что такое REA? · Как мы проверяем руководства