Представьте, что вы пытаетесь запустить современный тяжелый движок на смартфоне из начала нулевых — примерно такую же инженерную боль испытали разработчики AGI-64, когда решили подружить культовые квесты Sierra с 8-битным железом Commodore. Мир ретро-гейминга и эмуляции постоянно стирает границы между возможностями некогда конкурировавших платформ. Эпоха расцвета графических текстовых квестов в середине 1980-х годов ассоциируется с творениями компании Sierra On-Line и их знаменитым движком AGI (Adventure Game Interpreter). На нем создавались такие культовые хиты, как King's Quest, Space Quest, Police Quest и The Black Cauldron.

Однако исторически сложилось так, что эти шедевры обошли стороной один из самых массовых домашних компьютеров своего времени — Commodore 64 (C64). Из-за аппаратных лимитов архитектуры полноценный порт движка долгое время казался невозможной задачей. Ситуация изменилась с появлением проекта AGI-64 — специализированного интерпретатора, который позволяет запускать оригинальные игры Sierra непосредственно на «железе» C64. В этой статье мы разберем архитектурные особенности проекта, аппаратные барьеры 8-битной машины и методы оптимизации кода.

Анатомия движка Sierra AGI и вызовы для C64

Чтобы оценить масштаб достижений разработчиков AGI-64, важно понять архитектуру самого движка AGI. Созданный Джеффом Стивенсоном и Кеном Уильямсом, он представлял собой виртуальную машину со специфической байт-код архитектурой. Игры состояли из логических скриптов, векторных рисунков сцен, звуковых эффектов и словарей парсера.

Оригинальные релизы требовали от 128 КБ до 256 КБ RAM и дисковода, так как размер ассетов превышал объем стандартных 5.25-дюймовых дискет. Commodore 64 обладал куда более скромными характеристиками:

  • ЦП: MOS 6510 с тактовой частотой ~1.02 МГц (NTSC).
  • ОЗУ: 64 КБ RAM (часть из которой занята системой и Kernal).
  • Графика: VIC-II с жесткими ограничениями по разрешению и атрибутам цвета.
  • Звук: Легендарный SID (Sound Interface Device), требующий собственной логики трансляции звуковых команд.

Справиться с таким дефицитом ресурсов «в лоб» было невозможно — потребовалось погружение в самые темные уголки архитектуры MOS 6510 (примерно как пытаться запустить современную IDE на 4 ГБ ОЗУ, только без возможности просто докупить планку памяти).

Архитектурные решения AGI-64: как впихнуть невпихнумое

Главным вызовом для разработчиков стала нехватка оперативной памяти. 64 КБ — это критически мало для хранения интерпретатора, виртуальной машины, состояния игры (state) и графических буферов. Инженеры применили несколько классических и современных техник оптимизации:

1. Пейджинг памяти и банк-свитчинг

Архитектура C64 позволяет гибко управлять памятью через порт ввода-вывода процессора 6510 ($00-$01). Проект AGI-64 активно использует переключение банков памяти (bank switching), выгружая неиспользуемые подсистемы интерпретатора в скрытые области под ПЗУ (ROM) или используя внешнюю память на картриджах и дисководах с быстрой подкачкой.

;
; Пример логики переключения банков памяти в MOS 6510
;
lda #$35    ; Отключаем BASIC и Kernal ROM, освобождая RAM под нужды AGI
sta $01     ; Запись в порт конфигурации памяти процессора

2. Оптимизация векторной графики

Движок AGI рисовал сцены «на лету» с помощью векторных инструкций (команд заливки, линий и полигонов). Чип VIC-II не имеет аппаратной поддержки векторной графики, поэтому разработчикам пришлось написать высокопроизводительный растеризатор на ассемблере, который конвертирует векторные примитивы Sierra в растровые паттерны C64 на лету.

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

Работа с парсером и скриптами

Оригина