Звук завантаження: як касета ставала програмою
Скрегіт і писк із побутового магнітофона, кольорові смуги на рамці екрана й фінальне «R Tape loading error» — так виглядало й звучало завантаження гри на ZX Spectrum. Розбираємо, як звук на касеті ставав програмою в пам'яті.
Касетне завантаження Spectrum — це не метафора, а буквальне аудіокодування: дані записані як послідовність імпульсів різної довжини, і той самий чип ULA, що малює екран, перетворює цей звук на біти, показуючи свою роботу смугами на рамці.
Кольорові смуги на рамці під час завантаження — не заставка й не «прикраса», а пряма візуалізація сигналу, який ULA зчитує з касети. Якщо смуг немає, а гра все одно вантажиться, — це майже завжди ознака турбозавантажувача, який працює інакше за стандартну підпрограму ПЗП.
Ритуал, який починався зі звуку
Перед тим як почати гру на ZX Spectrum, її треба було почути. Касету з програмою вставляли у звичайний побутовий магнітофон — той самий, на якому вдома слухали музику, — з’єднували його аудіовиходом зі входом комп’ютера, набирали команду завантаження й натискали «Play». Далі з динаміка йшов характерний різкий писк, рамка екрана вкривалася кольоровими смугами, і за хвилину-другу (а іноді значно довше) картина або оживала грою, або обривалася сухим рядком R Tape loading error.
Головна теза цього матеріалу проста, але її легко проґавити: касетне завантаження Spectrum — не метафора й не «оцифрування». Дані на стрічці буквально записані як звук, а перетворює цей звук на біти той самий чип ULA, що малює зображення на екрані. Кольорові смуги на рамці — не заставка, а видима робота цього чипа. Щоб зрозуміти ритуал, спершу розберімося з технологією.
Як звук кодує дані
Магнітофонна стрічка вміє зберігати одне — коливання рівня сигналу в часі. Щоб записати на неї нулі та одиниці, Spectrum використовує довжину імпульсів. Одиницю виміру тут задає не секунда, а такт процесора (T-state): при частоті 3,5 МГц один такт триває близько 0,3 мікросекунди.
За описом формату, «0» кодується двома імпульсами по 855 тактів кожен, а «1» — двома імпульсами по 1710 тактів, тобто вдвічі довшими. Підпрограма завантаження не «слухає» абсолютний рівень сигналу — вона міряє час між переходами й вирішує, короткий це імпульс чи довгий. Саме тому завантаження таке чутливе до якості запису: якщо магнітофон трохи «плаває» за швидкістю, довжини імпульсів спотворюються, і машина починає читати одиниці замість нулів.
Через таке кодування швидкість передачі не є сталою: потік із самих одиниць іде повільніше, ніж потік із нулів, бо одиниці «довші». Ефективна швидкість стандартного завантажувача коливається приблизно в діапазоні від тисячі до двох тисяч бод залежно від даних; орієнтовна нормінальна цифра, яку зазвичай наводять для Spectrum, — близько півтори тисячі бод. Це повільно: велика гра могла вантажитися кілька хвилин.
Тон-лідер, синхронізація і блоки
Просто ввімкнути дані посеред стрічки не можна — магнітофон стартує не миттєво, а машині треба «зловити» ритм сигналу. Тому кожен запис починається з тон-лідера (pilot tone): рівного тону з імпульсів по 2168 тактів. Він триває помітний проміжок — стандартна підпрограма чекає лідер щонайменше кількасот мілісекунд, перш ніж рухатися далі. Для заголовка лідер довший (близько 8063 імпульсів), для блоку даних — коротший (близько 3223).
Після лідера йдуть два синхроімпульси (667 і 735 тактів) — вони коротші за імпульси лідера й позначають: далі власне дані. Кожен блок на стрічці починається з байта-маркера (0x00 для заголовка, 0xFF для даних) і завершується контрольним байтом. Цей «контрольний суматор» насправді не сума, а побітове XOR усіх байтів блоку: якщо наприкінці порахований машиною XOR не збігається із записаним на стрічці — блок вважається пошкодженим.
Записувалися дані парами блоків: спершу короткий заголовок (ім’я програми, тип, довжина, адреса), потім довгий блок даних. Саме заголовок дозволяв Spectrum написати на екрані знайоме Program: NAME й почати вантажити тіло. Докладніше про те, як ці дані потім лягали в пам’ять машини, ми писали в матеріалі «Що всередині: Z80, ULA і магія 48 кілобайт».
Смуги на рамці: сигнал, що став видимим
Найвпізнаваніша частина ритуалу — кольорові смуги на рамці екрана. Вони виникають не тому, що хтось намалював «індикатор завантаження». Усе прозаїчніше: ULA, читаючи сигнал із касети, одночасно виставляє колір рамки відповідно до того, який рівень зараз на вході. Оскільки рамка (border) — це зона, за яку відповідає саме ULA, зміни сигналу миттєво відображаються як зміна кольору.
Через це смуги мають упізнавану структуру. Під час тон-лідера рамка блимає червоно-блакитним — рівний тон дає рівний, спокійний візерунок. Коли починається потік даних, кольори змінюються на синьо-жовтий, а візерунок стає нерівним, «рваним» — бо тепер довжини імпульсів різні. Досвідчений користувач за виглядом і звуком смуг умів на око визначити, чи йде завантаження нормально, чи сигнал «шумить».
Спадковість схеми. Оскільки за читання касети відповідала ULA, клони, що відтворювали її функції дискретною логікою замість фірмового чипа, могли мати трохи інші пороги й таймінги входу. На практиці це означало, що касета, записана на одній машині, не завжди рівно читалася на іншій, — окрема причина, чому в спільнотах так цінувалися «чисті» майстер-копії.
«R Tape loading error»: чому обривалося
Рядок R Tape loading error став культовим саме тому, що з’являвся часто й майже завжди — прикро. Це стандартне повідомлення про те, що підпрограма завантаження не змогла коректно зчитати блок. Загальний механізм зрозумілий: машина або дочекалася тайм-ауту, не отримавши наступного очікуваного імпульсу, або дочитала блок до кінця, але порахований XOR не збігся з контрольним байтом. У будь-якому разі результат один — блок відкидається, і завантаження зупиняється.
Причини на побутовому рівні були різні: не той рівень гучності, збита установка тембру, забруднена магнітна головка, розтягнута чи перезаписана стрічка, «плавання» швидкості дешевого магнітофона. Звідси й народний ритуал — крутити регулятори гучності й тембру, шукаючи «те саме» положення, за якого смуги на рамці ставали чіткими, а гра нарешті вантажилася.
Що перевіряємо. Точні умови, за яких ПЗП видає саме літеру
R, а не інший код, у різних джерелах описані з нюансами, тож ми свідомо подаємо механізм узагальнено (тайм-аут або розбіжність контрольного байта). Якщо ви маєте документовану розкладку кодів помилок завантажувача або власні спогади про типові збої на конкретних магнітофонах — напишіть музею: ми уточнимо цей розділ.
Турбозавантажувачі: швидше й «під замком»
Стандартний завантажувач із ПЗП був надійним, але повільним і однаковим для всіх — а отже, легко копійованим. Тому видавці почали замінювати його власними турбозавантажувачами (custom / turbo loaders): підпрограмами, які використовували коротші імпульси й щільніше кодування, аби зчитувати ту саму гру помітно швидше. Ціною була ще вища чутливість до якості стрічки.
Найвідоміший приклад — система Speedlock. За наявними даними, її написали Девід Обрі-Джонс і Девід Лукер ще 1983 року, а першим комерційним застосуванням стала гра Daley Thompson’s Decathlon від Ocean наприкінці 1984-го. Швидкі версії Speedlock вантажили гру приблизно в півтора раза швидше за стандарт і водночас служили захистом від копіювання: система спиралася на особливості Z80 (як-от регістр оновлення пам’яті), а її пізні версії впізнавали за тим, що екран завантаження з’являвся раптово, без кольорових смуг на рамці, часто з таймером зворотного відліку. Зникнення смуг тут не випадкове: турбозавантажувач не мусив, як ПЗП, «підсвічувати» кожен імпульс — він розпоряджався рамкою на власний розсуд.
Саме турбозавантажувачі та захисні схеми зробили копіювання касет окремим ремеслом, а їх «зламування» — цілою субкультурою. Але це вже тема ігрової бібліотеки та піратських компіляцій, до якої ми повернемось окремо; програми, що вантажилися з таких касет, поступово описуємо в каталозі софту.
Що лишилося від звуку
Сьогодні касетне завантаження здається незручним пережитком — і воно таким і було. Але за цією незручністю ховалася елегантна інженерна ідея: обійтися без спеціального накопичувача взагалі, поклавшись на техніку, яка вже стояла в кожній оселі. Магнітофон, аудіокабель, кілька підпрограм у ПЗП — і побутова стрічка ставала носієм програм.
Для музею цей звук — окремий експонат. Він фіксує цілий шар побутової культури: очікування, підкручування гучності, тривогу перед фінальним рядком помилки. Тому поряд із машиною ми плануємо показувати й сам ланцюг завантаження — магнітофон і касету, — а згодом додати на сайт короткий аудіофрагмент, щоб відвідувач міг почути, як саме звучала програма, перш ніж стати грою.
Не плутати. Наявність кольорових смуг на рамці — ознака стандартного завантажувача з ПЗП. Їхня відсутність за працюючого завантаження не означає поломки: це майже завжди турбозавантажувач, який керує рамкою інакше.
Джерела
- Spectrum tape interface — Sinclair Wiki (zxnet.co.uk) — sinclair.wiki.zxnet.co.uk
- TZX format — World of Spectrum (опис формату стрічкових блоків) — worldofspectrum.net
- Speedlock — Wikipedia (англ.), система захисту й швидкого завантаження — en.wikipedia.org
- Spectrum loading (серія Cilla) — Shredzone — shred.zone
- Old school tape loading — atomic14 — atomic14.com