Безумные умения фанатов графических калькуляторов

в 7:26, , рубрики: texas instruments, TI-83, ti-83 series, TI-84, графические калькуляторы, джейлбрейкинг, Игры и игровые приставки, калькуляторы, ненормальное программирование, разработка игр, хакинг
Безумные умения фанатов графических калькуляторов - 1

В середине-конце 2000-х в любой школе США всегда был какой-нибудь ребёнок, записывавший на графический калькулятор игры. Возможно, вас не удивит, что некоторые такие люди не находились в полном вакууме. На самом деле, существовала процветающая сцена хакеров, подчинявших эти калькуляторы своей воле; они писали игры, математическое ПО и в целом хакали платформу просто ради самого этого процесса.

В этой статье я расскажу о хакинге калькуляторов Texas Instruments, которым занимались в течение последних двух с половиной десятков лет, а также объясню, почему эти проекты настолько впечатляют с технической точки зрения.

Безумные умения фанатов графических калькуляторов - 2

Это xkcd №768. 768 байт — это ещё и буфер ОЗУ, использовавшийся для хранения битовых изображений дисплея TI. Это не совпадение, потому что у xkcd никогда не бывает совпадений.

Платформа

В 90-х и 2000-х TI выпустила ряд графических калькуляторов на основе процессора Z80. Возможно, вы слышали о Z80 — это улучшенная версия Intel 8080, разработанная Zilog. Да, этот процессор настолько стар. [Существует разновидность популярных хобби-проектов — создание собственного компьютера на Z80, именно потому, что он настолько прост, что вы можете понять основы системы. Лично мне больше всего нравится красивый минималистичный Z80 Джима Макартура в вырезанном лазером корпусе и с кнопкой для пошагового выполнения команд!]

Когда эти процессоры выпустили (45 лет назад! ), они были довольно неплохи. Все калькуляторы TI обычно имели схожие маломощные характеристики:

  • Процессор Z80, обычно имеющий частоту 8 или 10 МГц; к тому же стоит учесть, что Z80 способен завершать одну команду только каждые 4 такта.
  • Чёрно-белый ЖК-дисплей с разрешением 96x64 (некоторые модели имели экран побольше, но это был самым распространённым. Поздние модели наконец-то обзавелись цветными экранами большего разрешения.)
  • Линк-порт (порт связи), в котором использовался 2,5-миллиметровый разъём от наушников
  • Обычно 32 КБ ОЗУ, а начиная с 83+ и далее от 100 КБ до 2 МБ флеш-памяти («архива»)
  • Операционная система TI по прозвищу TI-OS (официально её название EOS, но никто кроме компании её так не называл). TI-OS имела:
    • Движок арифметических вычислений и построения графиков
    • Скриптовый язык TI-BASIC
    • В моделях с флеш-памятью — поддержка запуска больших «приложений», хранившихся целиком на флеше

Всё это даёт понять, что среда была очень ограниченной по возможностям.

Разумеется, самым популярным графическим калькулятором был TI-83/84 Plus, который, вероятно, видел каждый американский студент, учившийся за последние двадцать пять лет. В этой статье я буду использовать TI-84 Plus, потому что эта модель вам скорее всего знакома; однако её часто называют TI-83 Plus, потому что по сути они были одинаковыми. 84 Plus имел USB и изменённый дизайн корпуса, но система оставалась той же.

Модель программирования

Среда программирования на ассемблере Z80 была довольно спартанской: не имелось ни супервизора. ни защиты памяти, поэтому при возникновении бага он с большой вероятностью приводил к зависанию калькулятора (зловещее сообщение «RAM Cleared»). [Как правило, Z80 сильно усложнял жизнь людей, пытавшихся создать для него хороший компилятор C. Наверно, у меня есть единственная оставшаяся копия HITECH-C для DOS, который был довольно приличным компилятором C. Подробнее я расскажу об этом в ещё одной статье.] Z80 — это 8-битная машина с 16-битными указателями, поэтому хотя архив, строго говоря, был отображён на память, его невозможно было уместить целиком и он был разбит на страницы по 16 КБ:

Безумные умения фанатов графических калькуляторов - 3

Схема сильно упрощена, но недостаток мощи всё равно очевиден.

Существовало множество руководств по изучению ассемблера, но лучший был написан Шоном Маклафлином («eeems») — Learn TI-83 Plus Assembly in 28 Days. TI предоставляла очень хорошую документацию по SDK о подпроцедурах, имеющихся в TI-OS (и об официальной поддержке программ Asm()); благодаря всему этому вы получали полную власть над системой.

Программные проекты

Те, кто следил за новостями хакинга калькуляторов, наверняка узнает упоминаемых здесь людей или по их имени, или, что вероятнее, по нику. Лично я почти всегда просто читал информацию, в основном из-за влияния своих родителей, которые не очень приветствовали общение с людьми онлайн. (Не забывайте, я был в старшей школе.) Однако я был достаточно хорошим программистом-самоучкой калькуляторов (подробнее об этом в ещё одной статье).

Примечание: довольно многие ссылки начинают «протухать», потому что разработка велась двадцать лет назад. Большое спасибо Web Archive за сохранение всего этого!

Phoenix

Самой популярной игрой для графических калькуляторов была Phoenix разработчика Патрика Дэвидсона. Это был космический шутер с видом сверху, похожий на аркадную игру Galaxian. Она была популярной не из-за увлекательности (хоть она и увлекательна) и не из-за качества реализации (хоть она и качественно сделана). Скорее, она знаменита, потому что была одной из первых, а Патрик и другие люди портировали её почти на каждый калькулятор с Z80.

Оттенки серого на TI-84 Plus

Помню, что первой поразившей меня игрой стала RPG Патрика Прендергаста (tr1p1ea) под названием Desolate, которая могла похвастаться четырьмя уровнями серого. К тому же игра не просто была технологическим демо; она имела полноценный сценарий и достаточно неплохую спрайтовую графику. [Игра оказалась настолько хорошей, что получила несколько фанатских портов для ZX Spectrum и некоторых старых советских компьютеров.]

Безумные умения фанатов графических калькуляторов - 4

Большинство эмуляторов способно понять, что приложение реализует оттенки серого, и обеспечивать их чёткий рендеринг

Как это было возможно на устройстве с чёрно-белым экраном? Дело в том, что если включать и отключать пиксели достаточно быстро, то они будут казаться серыми. Наивные попытки реализации приводили к ужасному мерцанию и не могли дать больше, чем три цвета (чёрный, белый и серый). Библиотека оттенков серого Дарка Кингма, которая использовалась в Desolate, позволяла получать красивую графику в четырёх уровнях серого благодаря точно подобранным таймингам и дизерингу мерцающих пикселей для того, чтобы не все они включались и отключались одновременно. Графика потребляла основную часть бюджета вычислительных ресурсов игры, но такова судьба большинства видеоигр!

Эмулятор Game Boy для TI-84 Plus

TI — не единственная компания, использовавшая процессоры Z80. Они были установлены и в первом Game Boy! Возникает естественный вопрос: вероятно, есть возможность запустить игру для Game Boy на калькуляторе в неком гипервизоре?

Брендан Флетчер (calc84maniac) применил кучу инженерных решений для создания TI-Boy SE, который выполняет как раз эту задачу! Картридж Game Boy достаточно велик — ROM Pokémon Red занимает 1 МБ — поэтому TI-Boy решает эту проблему, запаковывая ROM в приложение-«оболочку» во флеш-памяти. Это приложение создаётся при помощи программы для PC. Разумеется, для этого нужен ROM вашего собственного картриджа Game Boy.

Ещё одна проблема заключается в том, что многие картриджи Game Boy имеют больше ОЗУ (до 128 КиБ), чем TI-84 Plus (32 КиБ). (В Game Boy было встроено всего 8 КиБ, но картриджи могли добавлять память.) Кажется, что это тупик: как возможно эмулировать дополнительную ОЗУ?

Ксавье Андреани заметил, что калькуляторы TI на самом деле имели дополнительную ОЗУ, потому что содержащая Z80 специализированная интегральная схема содержала больше ОЗУ, чем по умолчанию видно. TI-Boy выполнил реверс-инжиниринг специальных команд оборудованию для переключения этой памяти в адресное пространство по принципу банков.

Результат впечатляет:

Безумные умения фанатов графических калькуляторов - 5

TI-Boy с запущенной Legend of Zelda

Оболочки

На калькуляторах, выпущенных до TI-83 Plus, не существовало официального способа запуска программ на языке ассемблера. Эти калькуляторы приходилось хакать при помощи различных техник. Решением для конечных пользователей была оболочка — программа-лончер, занимавшаяся всей трудоёмкой работой по перехвату управления от ОС. Многие оболочки также предоставляли дополнительные процедуры, которые могла вызывать программа.

На TI-82 оболочка Ash выполняла эту задачу отправкой специально созданной резервной копии памяти в калькулятор. При следующей обработке нажатия клавиши калькулятором образ памяти перенаправлял ЦП к коду настройки. В каком-то смысле эта техника является одним из старейших эксплойтов калькуляторов TI.

Безумные умения фанатов графических калькуляторов - 6

Оболочка, которая вам скорее всего запомнилась — это MirageOS для 84+. MirageOS была популярным компаньоном игр, передаваемых между пользователями по линк-кабелю, потому что игры нужно было как-то запускать. Кроме того, это приложение, хранившееся во флеш-памяти, поэтому оно сохранялось при очистке ОЗУ. Помню, что когда я его видел, мне было не совсем понятен смысл сложности экрана заставки, но теперь я ценю эту графику!

Со временем оболочки становились сложнее, и кульминацией этого стала Doors CS Кристофера Митчелла (KermMartian), в которой имелись значки для ассемблерных программ, UI с курсором и множество процедур, которые могли использовать программы.

USB-драйвер для использования TI-84+ в качестве накопителя

84+ имел очень странный USB-порт: это был порт On-the-Go, на момент выпуска которого информации о нём почти не было. Строго говоря, это означало, что 84+ мог работать в качестве USB-хоста. Usb8x Дэна Энглендера предоставляла отсутствующий код драйвера, позволяя использовать мышь (функция сомнительной полезности), клавиатуру и, что более важно, флеш-накопитель.

Загрузочный код калькулятора предоставлял низкоуровневые процедуры USB для отправки/получения, но самое удивительное заключалось в верхнем стеке USB — драйвер запоминающего устройства и FAT16 (msd8x). И всё это, разумеется, было написано на ассемблере Z80!

Среди прочего, Usb8x позволял запускать забавное демо: Майкл Винсент, вероятно, был одним из немногих людей, впервые посмотревших «Матрицу» на калькуляторе.

KnightOS

Дрю Деволт (SirCmpwn) работал над многообещающим проектом по полной замене TI-OS на совершенно новую многозадачную систему в стиле Unix под названием KnightOS. Интересно в этой системе то, что она многое позаимствовала из парадигм многозадачности, которые на компьютере с Mac или Linux кажутся чем-то само собой разумеющимся, но реализовано всё это было почти без помощи оборудования. Программы можно было перемещать, имелась приоритетная многозадачность и загружаемые библиотеки, которые работали точно так же, как разделяемые объекты в Unix. Также присутствовали «реальная» файловая система с папками, выравнивание износа флеш-памяти и протокол для подключения к компьютеру. (У него даже был собственный USB PIDCA1C.)
Разумеется, всё это было аккуратно написано на ассемблере Z80, а процедуры ядра и библиотек документировали содержимое каждого регистра.

Это не vaporware — существуют автоматически сгенерированные сборки, которые можно скачать и установить на калькулятор, а исходники выложены на GitHub. К сожалению, широкий спектр возможностей не позволил ОС достичь стабильного релиза, но скелет уже существовал, и он был прекрасен.

Я сам сделал вклад в этот проект: помню, что только что узнал о примитивах синхронизации (мьютексах и условных переменных) и уже знал достаточно много о Z80 для того, чтобы реализовать их для KnightOS.

Проект Axe Parser

Как вы можете понять, при написании ассемблерных программ существует две проблемы. Во-первых, чтобы качественно писать код, обычно требовался PC, а большинство моих «коллег»-программистов большую часть дня находилось в школе. Во-вторых, ассемблер Z80 кажется довольно загадочным, если вы до этого работали с BASIC.

Безумные умения фанатов графических калькуляторов - 7

При помощи Axe Parser Кевин Хоровитц попытался решить эти проблемы — он создал новый язык программирования, компилировавшийся в нативный код на самом калькуляторе. Axe — это приложение, считывающее «программу TI-BASIC», написанную с помощью встроенного редактора, однако Axe переопределял грамматику и семантику так, чтобы новый язык очень хорошо подходил для написания игр.

Это довольно изящное решение: благодаря использованию встроенного редактора приложению Axe не нужно было предоставлять редактор для своего языка. Axe больше похож на компилятор — он использует все свои возможности для улучшения ассемблерного кода, а про его оптимизацию уже существует множество страниц на форумах. Более того, Axe расширяем при помощи новых примитивов, создаваемых в виде «аксиом» — плагинов, ещё больше видоизменяющих грамматику языка.

Вот как выглядит программа «hello world» на Axe.

Токен Str1 преобразован в 16-битную переменную-указатель — внутри калькулятора это компилируется в ассемблерную программу под названием HELLO!

:.HELLO
:"Hello World"→Str1
:Disp Str1

Unity: нативный код на TI-81

TI-81 был совершенно слабым калькулятором. У него не было не только памяти архива, но и линк-порта, и команды Asm(), а это значит, что пользователю оставался только TI-BASIC.

Оставался, но до тех пор, пока Бен Муди (floppusmaximus) не выпустил Unityзагрузчик, эксплойтивший переполнение буфера в примитивной TI-OS, а затем устанавливавший себя, чтобы помогать в загрузке других ассемблерных программ.

Если линк-порта не было, то как Unity или другие ассемблерные программы попадали в калькулятор?

Их вводили вручную!

Инструкции по установке напоминали перепечатывание программ на BASIC из журнала BYTE:

Безумные умения фанатов графических калькуляторов - 8

Подозреваю, что Рэнди Комптон, первым обнаруживший баг ОС, смог это сделать при помощи дампа ROM с физическим дизассемблированием. Ассемблер Z80 очень легко реверс-инжинирить, потому что он написан вручную.

Хаки операционной системы

Большинство проектов выполняется в TI-OS, но некоторые выполняются параллельно с TI-OS, чтобы проделывать с оборудованием вещи, которые компания TI предпочла бы запретить.

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

Ключи подписи

Главное, к чему стремились все — возможность запуска собственного кода на своём оборудовании. У TI была грубая, но эффективная проверка криптографической подписи для приложений и операционных систем, которая использовала криптосистему Рабина. Компания выпустила ключ подписи приложений для TI-83 Plus в рамках SDK. Однако другие ключи, позволявшие подписывать образы ОС для 83+, 84+, а также приложения и операционные системы для TI-89, по-прежнему оставались тайной.

Использовать математику против фанатов калькуляторов — да на что вообще рассчитывала TI?! Бен Муди осознал, что технологий 2009 года было достаточно для прямого взлома 512-битных ключей, созданных десять лет назад. В его посте (загадочно названном “Fun Number Theory Facts”) рассказывалось, что он нашёл простые множители публичного ключа для операционной системы 83+.

Поражённое сообщество собрало кластер BOINC, который за несколько недель без проблем взломал все оставшиеся ключи.

Texas Instruments закатила истерику и начала угрожать юридическими карами, которые, если честно, на 100% были злоупотреблением DMCA. Electronic Frontier Foundation выступил от лица сообщества фанатов, объяснив TI, что в знании простых множителей конкретных целых чисел нет ничего незаконного. Всё это разбирательство даже получило собственную статью на Википедии.

Сегодня можно запросто найти эти ключи на любом фанатском сайте, в том числе и у меня.

arTIfice

Достаточно недавно (в конце 2020 года) TI решила, что всем нужен холодный душ и объявила, что отключает все эти ассемблерные дела с обновлениями ПО для TI-84+ CE (самого нового цветного калькулятора), сомнительно аргументировав решение тем, что это улучшит безопасность на экзаменах и т.д., и т.п. [Такое ощущение, что им дала совет команда Playstation Linux.]

Процитируем Лайонела Дебру:

Этот удар стал завершением золотого века более чем двух десятков лет официальной поддержки нативного кода как минимум на одном активно поддерживаемом графическом калькуляторе TI.

Как и все истинные фанаты калькуляторов, мы тяжело восприняли это решение. Сообщество всегда было мягким по отношению к TI — за двадцать с лишним лет не было выпущено ничего, реально вредящего бизнесу! Но сегодня, вероятно, моральный барьер был разрушен...

В качестве жеста примирения компания предложила Python-обвязки, но все сразу же возмутились тем, что Python чертовски медленнен во встроенных окружениях и совершенно не может повторить то, на что способен нативный код. [Насколько я могу судить, компания использовала MicroPython — реализация Python была бы огромной задачей, но мне не удалось найти никакого раскрытия информации о лицензии MIT.] Как вы уже наверно поняли, это был не первый раз, когда TI оказалась глуха к желаниям фанатов.

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

Круто здесь то, что это джейлбрейк, а не просто хак, использующий оборудование. Как и при джейлбрейке iPhone или Xbox, вы начинаете внутри «песочницы» и выбираетесь из неё, используя баги очень сложного геометрического приложения CabriJr (подписанного и благословлённого на запуск компанией TI) для возврата возможности исполнения произвольного кода, запуска оболочки или установки хуков в ОС. [Стоит заметить, что все эти хуки уже были возможны и по-прежнему поддерживаются самой ОС; именно благодаря им работают приложения наподобие Inequalz (строящего графики неравенств) — они позволяют привязывать экраны графиков и процедуры отрисовки при помощи официальных API.]

Эксплойт arTIfice занимает всего 927 байта и скрывает за шелл-кодом простой UI с загрузчиком. Благодаря своему размеру эксплойт проще всего использовать во многих взломах zero-day этого и другого программного обеспечения TI.

Так что да, теперь экзамены в полной безопасности.

Куда двигаться дальше?

На каждый упомянутый мной проект есть десяток других, которые не вошли в статью. Ширина и глубина поисков потрясают: я даже не коснулся сцены исследователей Nspire на основе ARM.

В вузах и старших школах у Texas Instruments всегда были конкуренты — в частности, несколько интересных устройств создала Casio. Фанатская сцена выпустила скромное количество релизов и для калькуляторов Casio.

Стартап Numworks создаёт калькуляторы на основе очень мощного микроконтроллера STM32F429. До недавнего времени у Numworks была операционная система в open-source, и у меня зародилась надежда, что это может привести к ренессансу портативных калькуляторов. Оборудование доступно и достаточно удобно, но разработчики закрыли лицензию на исходный код, поэтому не думаю, что их продукция завоюет любовь сцены любителей калькуляторов.

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

Дополнительное чтение

Читатели могут изучить новости ticalc.org (первые из которых появились ещё в 1997 году) или погрузиться в исследование огромных архивов. Или же нырнуть в кроличьи норы форумов сообществ на phpBB — некоторые из них уже мертвы, но другие вполне процветают!

  • ticalc.org: форум, источник новостей и огромный архив почти всего ПО, выпущенного для каждого из калькуляторов TI
  • Cemetech: довольно формальный, с умеренной активностью, но с достаточно хорошим соотношением «сигнал-шум» и очень подкованными пользователями. По-прежнему очень активный.
  • Omnimaga: менее формальный, множество проектов, с огромным разделом болтовни вне тем и изощрёнными форумными подписями.
  • Datamath: большой «онлайн-музей» с препарированием оборудования, реверс-инжинирингом и документацией на почти каждый выпущенный в мире калькулятор.
  • TI-Planet: французский форум, на который активно ссылались, с большим разделом скачиваемых файлов и активным сообществом; к сожалению, знаю о нём не очень много, потому что не говорю на французском.
  • calc.org (ссылка на Web Archive): также назывался Dimension-TI. Ныне неработающий форум и хост для скачиваемых файлов. К сожалению, он существовал до моего времени и я почти ничего о нём не знаю.

Автор:
PatientZero

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js