- Программная археология
- Мои программы сжатия для ZX Spectrum (Dex)
- UNIX наконец и для ZX Spectrum: Fuzix OS (BruXy)
- Бонус: эмуляция 6502
Программная археология
Мои программы сжатия для ZX Spectrum
Это была бы хорошая статья для моего блога, но раз дело касается ZX Spectrum, лучше опубликовать её в дискмагазине Restore — на блоге потом опубликую позже.
Программ сжатия для ZX Spectrum существует целый ряд, но тогда, около 1994 года, доступного было немного. Программы из России до нас ещё только должны были начать доходить (знаменитая вылазка группы K3L на Enlight в Санкт-Петербурге состоялась лишь в 1997-м), их использование ограничивалось исключительной ориентацией на Betadisk.
Лишь медленно распространялся Turbo Imploder 1992 года, который с 1993-го рекламировала фирма Perpetum, и лишь некоторые догадывались, что существуют Tompacker, Char press, PKLite (до сих пор их не найдёте ни на WOS, ни на Spectrum Computing). С 1993 года и Proxima предлагала свой комплект User 2, в состав которого входила программа Mr. Pack II — последняя ступень развития программ All packer, Pack maker, Mr. Pack и Mr. Pack I от Mixoft, характерной чертой которой был довольно эффектный, но в итоге тормозящий медленный распаковщик с «искрением» в бордере. Другим большим свершением Proxima была текстовая игра Heroes 92, при создании которой George K. использовал собственную программу для упаковки текстов под названием Tolkien (ZX Magazín 1993/1 стр. 8, 1993/4 стр. 9), но она не была общедоступна, и Proxima её не продавала. Без инструкции с ней никто не знал, что делать — см. упоминание в ZX Magazín 1999/3-4, стр. 13. До меня Tolkien добрался лишь около 1996-го, а пользоваться я научился только в апреле 1998 — см. инструкцию в ZX Magazín 2000/1-2, стр. 22.
Впрочем, как удалось вернуть на свет мой X-System-Pro для создания текстовых игр, так из тёмного прошлого вернулись и обе программы сжатия, которые я тогда создал. И мне даже не пришлось копать их с дискет, на которых они у меня сохранились: я нашёл их в интернете — ещё и с инструкциями! Сегодня, помимо цифровой археологии, они уже ни на что полезное не годятся — но хотя бы можно похвастаться, какими мы тогда, годы назад, были крутыми кулибиными (а теперь уже нет — бывало!).
Первая программа сжатия — 1995 года. Называлась Horatius, управлялась в некоем графическом интерфейсе стрелкой с клавиатуры, джойстика или A-мыши. Основана была на RLE-рутине от Busysoft, опубликованной в журнале Bit в серии где-то между номерами 1994/6 и 1994/11. Рутину мне принёс Matsoft на листе, отксерокопированном из журнала, а я вокруг этого построил уже только окружение — это упоминалось и в ZX Magazín 1999/2, стр. 7.
Упаковка не самая быстрая, потому что программа перебирает все 256 вариантов байта-метки (упоминание в ZX Magazín 1999/2, стр. 8). Пакует только файлы длиной до 16384 байт (хранит в памяти распакованный оригинал и упакованный блок), так что годится для упаковки коротких кодов — картинок или страниц ZX Spectrum 128.
В ZX Magazín хотя и пишут, что получившийся блок не был перемещаемым, а в инструкции — что был. Распаковка быстрая, и поскольку в то время мы восхищались «дождём» в бордере у Mr. Pack II и хотели подражать, искрит в бордере и Horatius — в чём можно убедиться при загрузке моих игр, в частности Fervor и оригинального издания «Mezi věžemi».
Программа работала с кассетой или с D40. Для дисковых операций я тогда использовал легально купленный D40 BIOS от Miroslava Beníčka, которым, видимо, не умел пользоваться как следует: при попытке вывести содержимое дискеты некоторые файлы отображались дважды — и этот негативный опыт был одним из трёх факторов, почему я не купил и охранную систему Leopold (два других — цена 15 000 крон и тот факт, что Tritolsoft уже тогда крекнул Leopold’а за три дня и ночи без сна).
С MB-02+ Horatius не работал — даже с эмуляцией магнитофона: вызывал загрузочную рутину с жёстко заданной длиной 16384 как максимально возможной, что на магнитофоне коротким файлам не мешает, а более длинные обрезает после указанной длины, но MB-02+ загружает файл только если его длина ровно 16348 байт. Скачать можно на https://cs.speccy.cz/?scn=3.
Вторая программа называется Caesar и датируется 1996 годом.
Поскольку примерно тогда же мне попал в руки и Tolkien от George K., которым без инструкции никто не умел пользоваться, я решил создать собственный похожий пакер, который позволил бы читать упакованные тексты без необходимости распаковывать их в память. Я исходил из рутины вывода сжатых текстов в первом томе книги «Assembler a ZX Spectrum» и, по сути, пытался создать противовес — компрессионную рутину, которая упакует текст так, чтобы рутина из книги могла его прочитать и вывести.
Описание того, как я действовал, есть в ZX Magazín 1999/2, стр. 9 и 10: чтобы освободить коды 128–255 для ссылок на порядковый номер вставленного слова в словаре, я перенёс символы «десктопного» кодирования чешского языка в коды 1–16, ENTER пришлось перенести на значение 31, ноль использовался как разделитель слов.
Недостаток в том, что Caesar не делает упакованный текст совершенно нечитаемым для пиратского глаза так, как это делает Tolkien. Caesar размещён в области экрана, так что в его распоряжении большая часть памяти; текст пакует на месте, так что вместились бы и очень длинные тексты. Тем, что он целиком умещается в экран (и даже место ещё остаётся), отпадает управление мышами и тому подобным.
Программа работает только с D40/80 — после запуска активирует страничание ROM D40 через USR 0, что на компьютерах без соответствующего контроллера вызывает сброс. Вместе с файлом сохранён и исходный текст распаковочной рутины для ассемблера Prometheus, который пользователь должен был вставить в свою программу — например, текстовую игру. Caesar тоже можно скачать на https://cs.speccy.cz/?scn=3.
Dex
UNIX наконец и для ZX Spectrum: Fuzix OS
Fuzix был представлен миру в конце октября 2014 года. Бесит SystemD? Kdbus — последняя капля? Linux-сообщество слишком большое и крикливое? Размышляете о старых временах, когда каждого контрибьютора знали по имени, а исходники умещались на одну дискету?
Именно такими словами Alan Cox начал продвижение новой операционной системы, изначально предназначенной для процессорной архитектуры Zilog Z80 (но уже доступны и порты на 68000, 6809, 8080, 8085, а из более новых — например, Raspberry Pi Pico с Arm Cortex-M0+ или ESP8266). Linux-пользователям — по крайней мере чуть более старшим — Alan Cox представлять не нужно: он сделал кучу работы над ядром Linux 2.2, сетевой подсистемой и до 2009 года вёл и слой TTY — то, что отвечает за вывод на экран терминала.
Fuzix — многопользовательская, многозадачная система, реализующая собственное управление памятью для максимально возможной изоляции запущенных процессов. Последняя стабильная версия — 0.3, но уже готовится и 0.4, которая должна повысить эффективность кода, убрав некоторые старые огрехи дизайна, — однако ABI (прикладной двоичный интерфейс) перестанет быть совместимым.
Fuzix опирается на операционную систему UNIX System V, разработка которой началась в 70-х в Bell Labs компании AT&T. Та начала лицензировать исходники, и так SysV стал популярен для ряда коммерческих UNIX’ов, а также в академической сфере.
Fuzix написан не совсем с нуля: это преемник UZI180 (Unix Z80 Implementation for the Z-180), возникшего в середине 90-х под свободной лицензией GPL, и за годы появилось несколько форков. Большая часть исходной системы была создана на языке C в системе CP/M 2.2. Alan собрал исходники воедино, улучшил и адаптировал под более современный ANSI C компилятор (sdcc) и поддержку некоторых классических Z80-микрокомпьютеров — позже и с помощью других контрибьюторов.
Сам я опробовал Fuzix на ZX Spectrum +128k со старым divIDE ревизии 57b. Ядро системы занимает около 40 КБ, и на ZXS+128k остаётся лишь около 32 КБ пользовательского пространства. Благодаря этому система загружается, запускается shell, но для некоторых приложений памяти уже мало, и попытка их запустить заканчивается сообщением об ошибке. Загрузка устроена так: сначала запускается esxDOS, на раздел которого заранее кладут утилиты FUZIX и FUZIX.BIN, а команда .fuzix загружает ОС (подобно тому, как loadlin умел запускать Linux из DOS). Fuzix затем работает в режиме MAPRAM. Система спрашивает, с какого раздела запускаться (я указал hda3, как узнаете далее), а из-за отсутствия RTC — ещё и точную дату и время. Через мгновение появляется текстовый логотип:
^ ^
n n
Fuzix 0.3rc1
@<
Welcome to Fuzix.
m m
login:
Достаточно залогиниться как root без пароля — и готово! Диском в моём случае служит CF-карта, которая за двумя разделами FAT32 содержит ещё 3-й и 4-й разделы. Третий — системный, размером 32 МБ, за ним — 4 МБ swap. Консоль традиционно белая на чёрном фоне (то есть для UNIX, а не для нас, пользователей Spectrum). Поскольку отклик системы медленный, при запуске и загрузке приложений в бордере мигает красно-синяя полоска — так что у пользователя есть ощущение, что что-то происходит, и нет страха, что система, скажем, зависла. Сигналы с клавиатуры, которые на PC отправляются комбинацией с Ctrl, на ZXS посылаются через Extended. Так, Ctrl-c/SIGINT вызывается как Extended-c. В остальном всё очень похоже на то, к чему мы привыкли в других совместимых с UNIX ОС.
Лично я жду, когда опробую Fuzix на современном клоне ZX — в моём случае это ZX Evolution с 4 МБ RAM и 14 MHz Z80 (совместимый с Pentagon и NemoIDE). Это уже могло бы быть заметно шустрее, да и возможная поддержка сети с ZXUSBNET в UNIX не лишняя (правда, поддержка TCP/IP пока на стадии разработки).
Назад к тому, как скомпилировать Fuzix. Как в старые времена, сначала нужно собрать компилятор языка C, а затем и саму систему. Для этого понадобится компьютер с Linux, *BSD и т. п. Всё необходимое есть на GitHub Alan’а: https://github.com/EtchedPixels. Компилятор sdcc280 — это доработанный sdcc с рядом патчей, нужных для Fuzix; важно, например, уплотнение бинарников под 16-килобайтное страничание. С таким компилятором клонируют репозиторий Fuzix и правят цель компиляции в главном Makefile — в моём случае TARGET=zxdiv.
Исходники Fuzix малы, но хороши. Содержат и ядро ОС, и исходники стандартной библиотеки. Кто когда-нибудь копался в исходниках других ядер или GNU, подтвердит: там человек способен очень быстро потеряться — переносимость и разные удобства вроде локализации, поддержки Unicode или ухищрений для препроцессора и компилятора исходники раздули и изрядно запутали. Этого, впрочем, не скажешь о Fuzix: тут на мелочи не смотрят, а идут прямо к делу.
Если Fuzix OS вас заинтересовал — домашняя страница: www.fuzix.org.
BruXy
Эмуляция 6502
В качестве приложения, в файле 6502.txt, вы найдёте исходник эмулятора 6502 от Dex’а вместе с сопроводительным текстом. RESTORE пока не в том состоянии, чтобы корректно и читаемо отобразить ассемблерный исходник длиной 24 килобайта, поэтому предлагаю его как приложение. В качестве бонуса можете поиграть в игру «угадай кодировку чешского».
Share your thoughts about the article