Nokia 3310 — подготовка и проверка настоящей прошивки

Основа

Эмулятор: https://github.com/djr-747/nokia-dct3-emulator
Commit: 2b4c10ffd6b22a2d021c7f515f27ceb2fb6c78cd
Runtime: 0.17.0-fiq4-timer0-tick
Прошивка: Nokia 3310 NHM-5 v5.79, 11.11.2002, 2 MiB.
Языковой пакет: оригинальный PPM E (English/Russian/Bulgarian/Ukrainian).
Язык первого запуска: English. Русский выбирается в системе и сохраняется.
Сайт, подсказки, сообщения об ошибках и страница About — на английском.

Выпускной образ: dist/firmware/nokia-3310-v5.79.fls
SHA-256: 0b8065b427d4d108994c14cd1428ab6bacbdfab3c57164ca83312fdd23916304
MCU+PPM E SHA-256: 33f2ae6baf3b05a25965be1bd3811823df9be22ab47162a027bb10205a5c96ae

Происхождение и извлечение PPM E

Исходный полный дамп из Cosconor совпадает с эталоном MAME:
SHA-1: 649de05ed88205a080693b918cd1295ac691dff1.
Архивный установщик v5.79:
https://archive.org/download/Nokia_DCT3_firmwares/nhm5_579.exe
SHA-256: 779c826384642d62625ec50037b32e6e832374afacc69bc84df3f791ee3a3a36

Установщик не выполняется. Python извлекает gzip-потоки и WinTesla-блоки,
проверяет gzip CRC, транспортные контрольные суммы и все восемь PPM-чанков:

python3 tools/extract_stock_v579.py /path/to/nhm5_579.exe \
  --outdir /path/to/extracted-v579 \
  --baseline /path/to/nokia-3310-nhm5-v5.79-original.fls

MCU и PPM N из установщика совпадают с исходным MAME дампом побайтно.
Извлечённый NHM5NY05.79E.raw заменяет файловые offsets 0x140000..0x1CFFFF.
MCU 0..0x13FFFF не меняется. Ресурсы нового PPM E не редактируются.
Эталон nokia-3310-v5.79-stock-ppm-e-reference.bin содержит MCU+PPM E,
без EEPROM. Полный отчёт: qa/stock-russian-package.json.

Подготовка чистого EEPROM

Исходный дамп был сброшен через настоящее меню Settings -> Restore factory
settings (исходный код 62628). Выбран English; через настоящие формы заданы
время 12:00 и дата 01.01.2000. Net Monitor отключён: Menu, Up, Menu, 0, 0, Menu.
После сохранения PMM tools/sanitize_pmm.py удаляет пользовательские записи,
старый append-журнал и PMM-аудиоданные. Product serial заменяется на NOKIA0001
с корректировкой factory checksum. IMEI/FAID/security identity сохраняется.
Финальная очистка также сохраняет English и совместимые настройки PPM E.

python3 tools/sanitize_pmm.py /path/to/prepared-stock-e.fls /path/to/clean.fls

Отчёт последней очистки: qa/sanitization.json. Само изменение языка требует
только кнопок: Menu, 6, 2, 1, Down (Russian), Menu. C три раза возвращает idle.
Переключение не изменяет исполняемый код. На программной SIM отключён PIN;
synthetic PLMN 208-01 отображается прошивкой как Orange F.

Проверка выпускного образа

node tools/verify-emulator.cjs \
  --runtime dist/emulator/dct3.js \
  --data dist/emulator/dct3.data \
  --firmware dist/firmware/nokia-3310-v5.79.fls \
  --original /path/to/nokia-3310-nhm5-v5.79-original.fls \
  --reference /path/to/extracted-v579/nokia-3310-v5.79-stock-ppm-e-reference.bin \
  --out qa/firmware-proof

Проверка исполняет реальные ARM инструкции и raw keypad down/up:
- прямой cold boot на английском, SIM APDU и 84x48 LCD;
- русский через Menu, 6, 2, 1; возврат на английский и снова на русский;
- чтение сохранённого language ID из реального EEPROM-журнала;
- Snake II: New game, повороты 2/4, pause/Continue;
- Power удерживается четыре эмулированные секунды;
- сохранение PMM после firmware flush и повторная загрузка на русском;
- пять сравнений LIVE MCU+PPM E с извлечённым stock-эталоном;
- отсутствие неожиданных reset.

PNG содержат только framebuffer прошивки. Отчёт имеет 16 состояний,
5 проверок кода и 5 проверок выбранного языка. Результат after-test.fls
содержит игровую сессию и выбранный русский; это QA, а не стартовый образ сайта.

Production Worker проверяется отдельно:

npm start
QA_NAME=release QA_KEY_SETTLE=1200 node tools/smoke.mjs \
  menu 6 2 1 down menu clear clear clear power@4000 power menu clear pause@1000
QA_NAME=restored QA_STATE=qa/release/state.json node tools/smoke.mjs menu clear

Проверяются реальные WASM/ROM, input/release, сохранение EEPROM/SIM,
повторная загрузка сохранения и остановка вычислений в скрытой вкладке.
Браузерная проверка DOM/touch/WebAudio недоступна: local browser use отключён
в настройках Work. Node-проверки не подменяют эту проверку.

Ограничения ядра

Частота: приблизительно 13 MHz; 216,667 циклов/кадр. Cold boot: 1,200 кадров.
Raw tap: 6 кадров удержания, затем key-up. Snake: Menu, 8, Menu, ждать 5 секунд,
затем Menu. Следующий Menu открывает pause. Батарея: default ADC 0x220.
DSP и boot ROM моделируются HLE; известны ограничения часов/зарядки.
Вся эмуляция работает локально в WASM; сервер раздаёт статические файлы.
