_spg/ZIFI/zifi.spg was still the pre-fix build. Rebuilt from current sources (zc_sd_driver.asm/zc_sd_driver_body.asm's stale-IX and page-wrap fixes) and confirmed on real hardware.
#ZiFi - Internet client for ZX Evolution with TS Conf
About project (ru): ZiFi homepage , ZiFi или интернет для Z80 , ZiFi v. 0.61 released!
Work with sites: vtrdos, zxart, prods.tslabs, hype, pouet, irclogs;
Download: games, system progs, demopack disk's, diskmag's;
See: zx spectrum screens;
Listen: Ay8910 chip music
Work with cable socket driver by PSB and Wifi module ESP8266, driver by DDp / Hacker VBI
For Z80 CPU
Доработки в этой сборке (2026)
Оригинальный проект давно не поддерживается автором, поэтому часть функций я переделал под текущее состояние сети и сервисов.
Убрал проверку обновлений по HTTP. Раньше при загрузке клиент ходил на zifi_ver.php, проверял версию, при необходимости скачивал новый клиент и сверял CRC16. Сервер обновлений больше не обновляется — всю эту ветку (autoupdate, CRC16, скачивание .spg) я убрал из zifi.asm.
Перевёл синхронизацию времени на стандартные AT-команды SNTP. Использую штатный протокол ESP-AT — он есть в том числе в обычной прошивке для ESP-01/ESP8266:
AT+CIPSNTPCFG=1,0,"pool.ntp.org" — включить SNTP, UTC, публичный сервер
AT+CIPSNTPTIME? — получить текущее время
Ответ (+CIPSNTPTIME:Www Mmm dd hh:mm:ss yyyy) я разбираю прямо на Z80 — с учётом того, что синхронизация происходит в фоне и первые секунды может отдавать заглушку 1970 года (в этом случае клиент подождёт и переспросит, с ограничением по числу попыток, чтобы не подвесить загрузку насовсем).
Часовой пояс по-прежнему берётся из zifi.ini (time: +N / time: -N / time: none) и применяется на стороне Z80 поверх времени UTC от SNTP.
Заодно добавил запись секунд и дня недели (0 = воскресенье) в RTC (DS1685) — раньше эти два поля не заполнялись вообще.
Добавил поддержку HTTPS. Часть сайтов в списках загрузок (prods.tslabs.info, bbb.retroscene.org) перестала пускать по обычному http и принудительно перенаправляет на https. Клиент теперь сам определяет схему ссылки и выбирает AT+CIPSTART="TCP",...,80 или AT+CIPSTART="SSL",...,443 — это касается и ссылок из меню, и ссылок, которые сервер присылает внутри списков файлов.
Добавил сообщение о готовности. После завершения всех этапов загрузки (подключение к Wi-Fi, синхронизация времени, папка загрузок) на экране появляется "ZiFi is ready." — раньше было не всегда понятно, можно ли уже пользоваться меню.
Убрал мигание вертикальных полос при воспроизведении музыки. Индикатор громкости AY-каналов (music_analizator) раньше рисовался прямо внутри прерывания, которое отвечает за точное по строкам переключение видеорежима текст/графика — и делал это вместе с DMA-очисткой экрана и переключением страниц памяти. На динамичных треках (больше эффектов — дольше выполняется код) это сбивало тайминг прерывания и давало заметные мигающие полосы на экране. Я вынес отрисовку индикатора из прерывания в обычный код главного цикла (раз в кадр, синхронно с wait_frame, но уже не в раст-критичной цепочке) — сам плеер и его тайминг (темп, высота нот) не тронул.
Поправил позицию нижней панели управления. Она была смещена на пару пикселей вниз относительно верхней панели с самого начала (не моя регрессия) — поправил смещение GYOFFSL в int_text_off.
Добавил таймаут загрузки с автоматическими повторами. Раньше при зависшем/неотвечающем сайте клиент мог ждать данные бесконечно — выйти можно было только вручную нажав крестик отмены. Теперь если от сервера ~10 секунд вообще нет никаких данных (интервал считается по кадрам экрана, 50Гц, не зависит от частоты процессора/турборежима), запрос повторяется — до 3 раз. Если и это не помогло — для музыки клиент переходит к следующему треку в списке (со своим лимитом на подряд неудачные треки, чтобы не крутиться по всему плейлисту вечно, если сети вообще нет), для остального — обычная отмена, как раньше по крестику.
Мелкие исправления:
- перевёл обращение к порту
#EFF7(общий системный регистр — управляет не только доступом к часам, но и видеорежимом/turbo/кэшем) на read-modify-write вместо прямой перезаписи всего байта, чтобы не сбивать остальные настройки; - исправил баг в разборе двузначного GMT-смещения из
zifi.ini(например+10) — были перепутаны местами разряды; - теперь DMA-очистка под индикатор громкости дожидается завершения перед тем, как CPU начинает рисовать поверх той же области (была гонка записи);
- исправил переполнение буфера имени файла (
create_filename): при скачивании имя файла из ссылки копировалось в 48-байтный буфер без проверки длины, и если оно было длиннее — переполнение затирало соседние переменные (zifi.ini, имена служебных папок) прямо в памяти. Теперь копирование корректно обрезается на 48 символах. Проверено на железе: создание папки и файла с длинными именами (в т.ч. ровно 48 символов) и последующее чтение содержимого — всё работает штатно, никакой драйверной обрезки до 8 символов нет.
Заменил драйвер SD-карты. Штатный _sd/WDFCVBI2.COD (закрытый бинарник без исходников, автор — "Hacker VBI") был заменён на собственный, открытый SD/FAT32-драйвер (_sd/zc_sd_driver.asm + _sd/zc_sd_driver_body.asm) — реализует те же ~15 функций CORE-таблицы, которые реально использует ZiFi. Заодно исправлена и порча имён папок на FAT32 (короткие имена 8.3 иногда совпадали с уже существующей записью в каталоге). Подробнее — _sd/README.md.
Известная нерешённая мелочь: курсор мыши (аппаратный спрайт TSU) обрывается по фиксированной строке экрана прямо над нижней панелью управления — похоже на границу, завязанную на тайминг переключения видеорежима или на аппаратный бордюр, а не на что-то, что двигается вместе с содержимым панели. Я не нашёл способ поправить это без риска сломать что-то ещё, оставил как есть.

