Добро пожаловать в шестую часть нашего цикла статей об эмуляции ZX Spectrum. Мы уже прошли путь от «большой тройки» десктопных эмуляторов до мобильных устройств и портативных консолей. Сегодня мы обращаем взгляд в сторону, казалось бы, самую очевидную, но оттого не менее удивительную.

Представьте: вы заходите на сайт, нажимаете одну кнопку — и через секунду играете в Manic Miner или Elite прямо в окне браузера. Без установки, без настроек, без танцев с бубном. Это не магия, это браузерная эмуляция — технология, которая превратила веб-архивы в живые музеи, а ретро-гейминг — в доступное удовольствие для всех.

В этой статье мы подробно разберем, как работают браузерные эмуляторы ZX Spectrum, познакомимся с флагманом этого направления — JSSpeccy 3, узнаем, какие сайты используют эти технологии, и обсудим плюсы и минусы «облачного» спектрумизма.


📜 1. История браузерной эмуляции: От Java-апплетов до WebAssembly​

Путь браузерной эмуляции ZX Spectrum — это история технологического прогресса, упакованная в два десятилетия.

🟡 Эпоха 1: Java-апплеты и Flash (конец 1990-х — 2000-е)​

На заре веба эмуляция в браузере была экзотикой. Первые попытки использовали Java-апплеты и Flash. Эти технологии были:
  • Медленными: Производительность оставляла желать лучшего.
  • Небезопасными: Java-апплеты стали печально известны дырами в безопасности.
  • Зависимыми от плагинов: Без установленного Java Runtime Environment или Flash Player ничего не работало.
Эмуляторы того времени (например, ранние версии JSSpeccy) были скорее технической демонстрацией, чем полноценным инструментом. Многие игры шли с тормозами, звук часто отсутствовал.

🟢 Эпоха 2: JavaScript и HTML5 (2010-е)​

С появлением HTML5, стандартизацией JavaScript и ростом производительности браузеров началась новая эра. JavaScript стал достаточно быстрым, чтобы эмулировать Z80 в реальном времени. Появились эмуляторы, которые работали полностью на нативном JS, без плагинов.

Однако чисто JavaScript-решения имели ограничения:
  • Проблемы с производительностью: Тяжелые участки кода (эмуляция Z80, обработка видео) могли вызывать фризы.
  • Однопоточность: JavaScript выполнялся в том же потоке, что и интерфейс, поэтому при высокой нагрузке страница могла «зависать».

🔴 Эпоха 3: WebAssembly и Web Workers (2020-е — настоящее время)​

Современный этап начался с внедрения WebAssembly (WASM) — низкоуровневого байт-кода, который выполняется в браузере почти с нативной скоростью.

JSSpeccy 3, выпущенный в 2021 году, стал революционным проектом . Он использует:
  • WebAssembly: Ядро эмулятора (Z80, видео, звук) скомпилировано в WASM и работает на максимальной скорости.
  • Web Workers: Эмуляция вынесена в отдельный поток, что освобождает UI-поток для отрисовки и обработки ввода. Никаких «фризов» интерфейса .
  • AssemblyScript: Ядро написано на TypeScript-подобном языке и компилируется в WASM, что упрощает разработку.
Сегодня браузерные эмуляторы по точности и производительности не уступают десктопным, а по доступности — превосходят их.


🏗️ 2. JSSpeccy 3: Флагман браузерной эмуляции​

JSSpeccy 3 — это проект, созданный разработчиком под ником Gasman (известным по демосцене) . Это не просто эмулятор, это полноценная платформа для встраивания ZX Spectrum в веб-страницы, которая используется на сотнях сайтов по всему миру.

📌 2.1. Техническая архитектура​

Чтобы понять, почему JSSpeccy 3 работает так хорошо, заглянем «под капот»:
КомпонентТехнологияНазначение
Ядро эмуляцииWebAssembly (собрано из AssemblyScript)Эмуляция Z80, ULA, AY, таймингов. Выполняется с околонативной скоростью .
Поток выполненияWeb WorkerЯдро работает в фоновом потоке, не блокируя интерфейс .
Отрисовка видеоCanvas 2D APIUI-поток получает готовый фреймбуфер от воркера и выводит его на экран .
АудиовыходWeb Audio APIВысококачественный звук с низкой задержкой.
Обработка вводаDOM EventsКлавиатурные события передаются в воркер, где обрабатываются эмулятором .

📌 2.2. Эмулируемое железо​

JSSpeccy 3 поддерживает три ключевые модели :
МодельИдентификаторОсобенности
ZX Spectrum 48K48Классическая «резиновая» модель. Полная эмуляция цветового конфликта.
ZX Spectrum 128K128Модель с AY-звуком и дополнительной памятью.
Pentagon 1285Российский клон. Критически важен для запуска TR-DOS софта и демо.

📌 2.3. Поддерживаемые форматы​

JSSpeccy 3 умеет загружать практически всё, что можно скормить Spectrum'у :
КатегорияФорматыОсобенности
Снэпшоты.szx, .z80, .snaПолные «сохранения» состояния эмулятора.
Ленты.tzx, .tapЧерез «ловушки» (traps) — эмулятор распознает, когда игра вызывает загрузчик, и мгновенно загружает данные .
Архивы.zipМожно загружать ZIP-архивы с образами внутри — эмулятор распакует их автоматически .

⚠️ Важное примечание: JSSpeccy 3 загружает TZX и TAP только через «ловушки» (traps) . Это означает, что он автоматически распознает вызов процедуры загрузки в ПЗУ и подставляет данные. Это работает для 99% игр, но для сложных «защищенных» загрузчиков, которые используют нестандартные методы чтения ленты, могут возникнуть проблемы.

🛠️ 3. Встраивание JSSpeccy 3: Как это работает​

Одна из главных «фишек» JSSpeccy 3 — он изначально спроектирован для встраивания (embedding) . Это значит, что любой веб-разработчик может добавить полноценный ZX Spectrum на свой сайт буквально несколькими строчками кода.

📌 3.1. Базовое встраивание​

HTML:
<!-- Подключаем скрипт эмулятора -->
<script src="/path/to/jsspeccy.js"></script>

<!-- В этом месте появится эмулятор -->
<div id="my-speccy"></div>

<script>
    // Запускаем эмулятор с настройками по умолчанию
    JSSpeccy(document.getElementById('my-speccy'));
</script>

📌 3.2. Настройка параметров​

JSSpeccy принимает объект конфигурации вторым аргументом :
ПараметрЗначенияОписание
autoStarttrue / falseАвтоматически запустить эмулятор при загрузке. По умолчанию false (нужно нажать Play).
autoLoadTapestrue / falseАвтоматически загружать ленту после открытия файла. По умолчанию true.
machine48, 128, 5Выбор модели. 5 = Pentagon 128.
zoom1, 2, 3Масштаб (1 = пиксель в пиксель).
openUrlURL (строка или массив)Загрузить файл(ы) по указанному URL при старте.
sandboxtrue / falseОтключить интерфейс загрузки файлов (режим «киоска»).
tapeTrapsEnabledtrue / falseВключить «ловушки» для быстрой загрузки лент. По умолчанию true.
tapeAutoLoadMode'default' / 'usr0'Режим автозагрузки. 'usr0' оставляет 128K paging активным — часто используется для демо .
keyboardEnabledtrue / falseВключить/отключить обработку клавиатуры.

Пример с настройками:
HTML:
<script>
    JSSpeccy(document.getElementById('my-speccy'), {
        machine: 5,              // Pentagon 128 для TR-DOS
        zoom: 2,                // Двойной размер
        autoStart: true,        // Запускаем сразу
        autoLoadTapes: true,    // Автозагрузка
        openUrl: 'https://example.com/game.tap'  // Загружаем игру
    });
</script>

📌 3.3. Управление через JavaScript API​

JSSpeccy возвращает объект с методами для программного управления :
JavaScript:
let emu = JSSpeccy(document.getElementById('my-speccy'));

// Открыть диалог выбора файла
emu.openFileDialog();

// Загрузить файл по URL
emu.openUrl('https://example.com/game.tap');

// Изменить масштаб
emu.setZoom(2);

// Переключиться в полноэкранный режим
emu.enterFullscreen();

// Выйти из полноэкранного режима
emu.exitFullscreen();

// Сменить модель (48, 128, 5)
emu.setMachine(128);

// Остановить эмулятор и удалить его со страницы
emu.exit();

📌 3.4. ZX Play: Мобильная адаптация​

На основе JSSpeccy 3 был создан форк ZX Play (автор stever), который специализируется на мобильных устройствах . Его ключевая особенность — настраиваемые сенсорные кнопки (soft keys), которые можно расположить прямо на экране.

Пример URL с настройками:
Код:
https://zxplay.org/?k=-W-P,ASDe,123456789M&m=48&u=https://example.com/snake.tap

Расшифровка параметров:

  • k=-W-P,ASDe,123456789M — три ряда виртуальных кнопок. - означает пустое место, e = Enter, c = Caps Shift, s = Symbol Shift, _ = Space.
  • m=48 — модель 48K.
  • u=... — URL загружаемой игры.

🌍 4. Где используется браузерная эмуляция?​

Браузерные эмуляторы стали неотъемлемой частью экосистемы ZX Spectrum. Вот основные направления их применения.

🏛️ 4.1. Онлайн-архивы и библиотеки​

РесурсОписаниеОсобенность
Internet Archive (archive.org)Крупнейший цифровой архив. Тысячи игр для ZX Spectrum доступны для игры прямо в браузере.Использует встроенный эмулятор (на базе JSSpeccy) для каждой страницы игры.
World of SpectrumКлассический архив спектрумовского софта.На страницах игр есть кнопка «Play in browser».
ZX-ArtБаза данных демо, музыки и графики.Некоторые демо можно посмотреть прямо в браузере.
Virtual TR-DOSАрхив TR-DOS софта.Интегрирован с USP на Android, но и в браузере доступен просмотр.

🎮 4.2. Сайты с ретро-играми​

Множество небольших сайтов используют JSSpeccy для создания «игровых залов» ZX Spectrum. Пользователь заходит, выбирает игру из списка — и сразу начинает играть, без регистрации и установки.

🧪 4.3. Демонстрация и обучение​

Разработчики используют встроенный эмулятор для демонстрации своих продуктов:
  • Показать работающую игру на странице портфолио.
  • Встроить эмулятор в туториал по программированию на Z80.
  • Создать интерактивный музей истории компьютеров.

🆚 5. Плюсы и минусы браузерной эмуляции​

✅ Плюсы​

ПлюсОписание
🚀 Доступность «в один клик»Не нужно ничего скачивать, устанавливать, настраивать. Открыл браузер — играешь.
💾 Не зависит от ОСРаботает на Windows, macOS, Linux, ChromeOS — везде, где есть современный браузер.
📱 КроссплатформенностьОтлично работает на планшетах и даже смартфонах (особенно в мобильных адаптациях вроде ZX Play) .
🔗 Легкость шарингаМожно отправить другу ссылку на игру, и он откроет её в том же состоянии, что и вы.
🛠️ Простота встраиванияЛюбой веб-разработчик может добавить эмулятор на свой сайт за 5 минут .
🎨 Современные возможностиИспользование WebAudio, Canvas, WebAssembly обеспечивает высокую производительность и качество звука.

❌ Минусы​

МинусОписание
🔇 Аудио-политика браузеровДля запуска звука требуется взаимодействие пользователя (клик). Эмулятор не может автоматически начать играть музыку .
🌐 Зависимость от интернетаБез соединения эмулятор не загрузится (если только он не установлен как PWA, но это редкость).
🔄 CORS-ограниченияЗагрузка файлов с других доменов требует правильной настройки CORS-заголовков на сервере .
⚠️ Ограниченная периферияБраузерные эмуляторы обычно не поддерживают экзотическую периферию (General Sound, сложные дисковые интерфейсы, принтеры).
🐛 TZX только через trapsJSSpeccy 3 не эмулирует «честную» загрузку с ленты — только через ловушки ПЗУ. Сложные загрузчики могут не работать .
⚙️ Нет отладчикаДля разработчиков браузерные эмуляторы не заменят Fuse или Spectaculator с их мощными отладчиками.

📊 6. Сравнение с десктопными эмуляторами​

КритерийБраузерная эмуляция (JSSpeccy 3)Десктопные эмуляторы (Fuse, Spectaculator)
Установка❌ Не требуется✅ Требуется
Точность эмуляции⚠️ Высокая, но с ограничениями (traps only)✅ Эталонная
Поддержка периферии❌ Базовая (только Kempston, клавиатура)✅ Полная (GS, дисководы, принтеры, сеть)
Работа с RZX❌ Нет✅ Полная
Отладчик❌ Нет✅ Мощный
Сложность запуска🟢 Минимальная🟡 Средняя
Кроссплатформенность✅ Любая ОС с браузером⚠️ Зависит от эмулятора
Работа без интернета❌ Нет✅ Да

🚀 7. Заключение и практические советы​

Браузерная эмуляция ZX Spectrum — это идеальный выбор для быстрого старта, ознакомления и демонстрации. Она превращает веб-архивы в живые, интерактивные музеи, где любая игра доступна в один клик.

Однако для хардкорного использования — прохождения сложных игр с нестандартной загрузкой, записи RZX, разработки собственного софта, использования General Sound или работы с TR-DOS — десктопные эмуляторы (Fuse, Spectaculator, UnrealSpeccy) остаются незаменимыми.

Практические советы:
  1. Для быстрой игры: Зайдите на Internet Archive или World of Spectrum, найдите игру и нажмите «Play». Вы получите полноценный ZX Spectrum в браузере за 10 секунд.
  2. Если игра не загружается: Убедитесь, что вы используете формат .tap или .tzx. JSSpeccy 3 не работает с .trd и .scl напрямую — для российского софта используйте UnrealSpeccy или Fuse.
  3. Для встраивания на свой сайт: Скачайте последний релиз JSSpeccy 3 с GitHub , скопируйте файлы на сервер и используйте код из примеров выше. Не забудьте настроить MIME-тип для .wasm файлов на сервере (application/wasm) .
  4. Для мобильных устройств: Используйте ZX Play (zxplay.org) — он предлагает удобную сенсорную клавиатуру и настройку под конкретную игру .

🌐 8. Полезные ссылки и ресурсы​

Официальные ресурсы JSSpeccy​

РесурсСсылкаОписание
GitHub (оригинал)github.com/gasman/jsspeccy3Исходный код, документация, примеры встраивания .
GitHub (speccytools)github.com/speccytools/jsspeccy3Актуальный форк с поддержкой .
NPM пакетnpmjs.com/package/jsspeccyУстановка через npm .
Демо-страницаjsspeccy.zxdemo.orgОнлайн-демонстрация возможностей .

Мобильные форки и адаптации​

РесурсСсылкаОписание
ZX Playgithub.com/stever/zxplayМобильная адаптация с сенсорными кнопками .
JSSpeccy 3 Mobile Modgithub.com/dcrespo3d/jsspeccy3-mobileЕще одна мобильная версия .
Palette modgithub.com/cronomantic/jsspeccy3Версия с улучшенной цветопередачей (цвета 128K моделей) .

Онлайн-архивы с браузерной эмуляцией​

РесурсСсылкаОписание
Internet Archivearchive.orgПоиск по «ZX Spectrum» — тысячи игр с эмуляцией.
World of Spectrumworldofspectrum.orgНа страницах игр есть кнопка «Play in browser».
ZX-Artzxart.eeДемо и музыка.

Технические ресурсы​

РесурсСсылкаОписание
AssemblyScriptassemblyscript.orgЯзык, на котором написан JSSpeccy 3.
WebAssemblywebassembly.orgТехнология, обеспечивающая производительность.
MDN: Web Workersdeveloper.mozilla.org/en-US/docs/Web/API/Web_Workers_APIДокументация по многопоточности в браузере.