Графический рабочий стол для ZX Spectrum, целиком на ассемблере Z80

· Программы
Энтузиаст под ником mindbox77 уместил в 48 КБ оконный интерфейс с меню, файловым менеджером и настройками — и он работает на настоящей машине 1982 года.

cover.svg

На GitHub появился проект ZX Desk — полноценный графический рабочий стол для ZX Spectrum 48K, написанный на ассемблере Z80. Перекрывающиеся окна с порядком наложения и фокусом, выпадающие меню, куча памяти, очередь событий, слой хранения со сменными бэкендами, диалоги, блокнот, часы, календарь, двухпанельный файловый менеджер и панель настроек, которая действительно что-то меняет, — всё это умещается в 48 КБ и работает на реальной машине, а не только в эмуляторе. Перетаскивание окна укладывается в один кадр длиной 69 888 тактов.

Автор объясняет, откуда взялась идея: в восьмидесятые ему хотелось Atari ST с его системой GEM — ощущением, что компьютер это место, а не приглашение командной строки. Денег хватило только на Spectrum, и он годами гадал, сколько из этого можно воспроизвести. Начал, забросил — и теперь довёл до конца. Это не порт GEM, а то, во что идея превращается, когда упирается в процессор на 3,5 МГц, однобитный экран с конфликтом атрибутов и видеочип, отбирающий у процессора такты во время отрисовки.

Ценность в измерениях

Самое интересное в проекте — не сам рабочий стол, а тщательные замеры железа, которые автор щедро выкладывает для тех, кто тоже пишет под эту платформу. Несколько выводов ломают устоявшиеся мифы. Штраф за обращение к экранной памяти оказался не 50%, как гласит фольклор, а всего 14,7% — то есть все бюджеты, построенные на пессимистичной цифре, были завышены на треть. Половину стоимости отрисовки окна съедают три коротких строки текста, а не заливки, которые автор считал главным виновником.

Отдельная находка — поведение прерываний. Оказалось, что при закрытых прерываниях (DI) Spectrum не откладывает прерывание, а теряет его: сигнал держится всего 32 такта и снимается. Стандартный приём с повторным включением прерываний между строками не помогает, потому что прерывание уже не отложено, а исчезло. Решение автор нашёл изящное: заливка теперь работает с включёнными прерываниями, а два байта адреса возврата гарантированно попадают туда, что и так будет перезаписано.

Дисциплина разработки

Чтобы уложить перетаскивание в кадр, автор прошёл через четыре последовательные оптимизации: композиция окна во внеэкранный буфер, ускоренный вывод текста, отрисовка только освободившейся полосы и «погоня за лучом». Итог — стабильные 50 Гц вместо прежних 25.

Каждое улучшение проверялось замером против собственных часов машины, каждое утверждение о корректности — контрольной суммой экрана, каждый коммит нёс приёмочные цифры. Отдельный раздел посвящён багам, которые «того стоит записать»: куча, которая чинилась сама на глазах, регистр, несущий и аргумент, и ответ одновременно, и указатель, невидимый в верхней половине экрана на настоящем железе, но не в эмуляторе. Живых ошибок, по словам автора, не осталось. Версия для ZX Spectrum Next стала отдельной системой, а не портом, — на машине с тайловым интерфейсом компоновщику окон просто нечего делать.


Источник: Hacker News

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.