В школе у многих стоял ArtMoney. Находишь в памяти игры число патронов, меняешь, и у тебя их 9999. Недавно этот навык пригодился мне совсем не в игре. У меня появился настольный установщик SMD-компонентов Zhengbang ZB3245TS. Проекты он хранит в закрытом бинарном файле .H8, и описания этого формата я не нашёл нигде. Пришлось вскрывать его тем же способом, каким мы когда-то накручивали золото. Идём под кат…
Что за зверь
ZB3245TS — настольный pick-and-place китайской Zhengbang. Детали он берёт из тридцати ленточных фидеров и из ячеек в «поле», двумя соплами переносит на плату, а по реперным меткам камера находит, где плата лежит. Управляет всем встроенный компьютер на Windows 7 с программой FlyerSMT. В ней и живут проекты: какая деталь в каком фидере, координаты, углы, метки.
Зачем вообще лезть в файл
Координаты деталей у меня есть в KiCad, а станку нужен свой проект. Штатно он набивается руками в FlyerSMT. На плату с полусотней деталей уходит вечер, а одна опечатка в номинале отправит голову не в тот фидер.
Хотелось, чтобы проект собирался сам из того, что уже лежит в KiCad. Для этого надо уметь писать файл станка, а для этого сначала понять, что у него внутри.
Как работал ArtMoney
Для тех, кто не застал. Где-то в памяти игры лежит число, скажем 150 золотых. Ищешь 150 и получаешь тысячи адресов, потому что такое число в памяти встречается на каждом шагу. Тратишь в игре 20 монет и среди найденного ищешь 130. Остаётся сотня адресов. Ещё одна покупка, ещё отсев, и в списке два-три кандидата. Один из них и есть твоё золото.
Если значение на экране цифрой не показано, как полоска здоровья, есть поиск неизвестного: «уменьшилось», «не изменилось». И отдельная головная боль с типами. Число может лежать целым в двух или четырёх байтах, а может как float, и тогда 150 в памяти совсем не похоже на 150.
То же самое, только с файлом
С установщиком принцип тот же. Ищем только в файле проекта, а значение меняем в FlyerSMT.
Порядок такой. Сохраняем проект как базовый. Меняем в программе станка одно поле на заметное значение и сохраняем под новым именем. Сравниваем два файла побайтно. Если изменилось несколько байт в одном месте, поле лежит там.
Главное слово тут «одно». Поменял два поля сразу, и уже не поймёшь, какие байты чьи. В ArtMoney было то же самое: успел между отсевами и купить, и продать, и адрес потерян.
Ещё полезно для начала пересохранить файл вообще без правок. Если программа при сохранении что-то меняет сама, например время или какой-нибудь счётчик, это шум. Его лучше знать заранее, иначе он будет вылезать в каждом сравнении. Мне повезло, шума не оказалось.
И значение лучше выбирать такое, которое редко встречается. Нулей и единиц в файле полно, а число вроде 123.456 найдётся сразу и заодно покажет, как оно хранится: целым, float или строкой.
Где аналогия заканчивается
В ArtMoney нашёл адрес, поменял и забыл. Здесь я файл пишу, и любое неправильно понятое поле превращается в движение головы станка. Поэтому каждую догадку проверял ещё одним сохранением, и не одна из них на этом развалилась.
Мусор лучше не трогать
Мусора в файле много: хвосты строк после нулевого символа, недоинициализированные куски, значения от старых проектов. Велико искушение написать красивый генератор, который соберёт файл с нуля и забьёт всё лишнее нулями. Я так делать не стал, потому что неизвестно, что из этого мусора программа станка всё-таки читает.
Новый проект собирается поверх файла, который станок когда-то сохранил сам. Меняются только понятые поля, остальное переезжает байт в байт. В ArtMoney ведь тоже меняешь одно значение и не переписываешь всю память игры.
Как понять, что разобрался
Сначала берём штатный проект станка, читаем своим кодом и записываем обратно. Если файл совпал байт в байт, значит, чтение и запись друг другу не врут.
Вторая проверка строже: собрать файл своей программой, открыть в FlyerSMT и сохранить. Если станок ничего в нём не поправил, ничего чужого мы туда не положили. Наш файл эту проверку прошёл, и теперь проекты для станка собираются из KiCad без ручного набивания.
Кто всё это делал
Руками на станке правил я. Сравнивал файлы, вёл список гипотез и писал код агент из моего флота. Моя часть была такая: поменять одно поле, сохранить, отправить файл. Очень похоже на ArtMoney вдвоём: один играет, другой отсеивает адреса.
