§ Устройство TAP
Наверняка многие из тех, у кого был Спектрум, видели полоски при загрузке или сохранении программ. Сегодня я расскажу, как хранятся данные на магнитной ленте и как устроен формат tap-файла, который хранит эту информацию.TAP-файл устроен до крайности просто и он предназначен для эмуляторов. Информация в нем хранится в виде блоков. Существуют два типа блоков - это заголовки, которые отвечают за имя файла, его длину, тип, и сами блоки данных. Любой tap-файл состоит из серии таких блоков.
Каждый блок задается двухбайтным числом, который может принимать значение от 3 до 65535. Далее идет сам блок заданного размера. Этот блок содержит в себе данные, которые использует сам спектрум при загрузке, либо сохранении.
Если блок имеет тип "заголовок", то его первый байт отмечается как 0, если же этот блок имеет тип "данные", то первый байт этого блока отмечается как 255, то есть, и только так, хотя на самом деле тут можно указывать и другие числа, к примеру, все что меньше 128 относится к заголовочному типу блока, а то, что более, к блоку с данными, так как имеет значение только старший бит типа блока.
Заголовок всегда содержит в себе 19 байт и его структура такова: первый байт это нуль, второй байт обозначает разновидность блока с данными, которые непременно идут за блоком заголовка. Таких разновидностей не так много, тип 0 - программа для бейсика, тип 1 - массив чисел, тип 2 - массив строк, тип 3 - блок с кодом. Самые частые типы это бейсик-программа и блок с кодом.
Далее идут 10 байт, в которых записано имя файла. Другими словами, имя файла не может быть более десяти байт. После имени файла идут два байта длины блока с данными. Далее следуют два параметра по два байта каждый.
- Если выбранный тип блока это 3, что обозначает блок кода, то тогда в первом параметре записан стартовый адрес, куда выгружать блок, а во втором параметре записано число 32768 (8000h), причем это число там всегда.
- Если тип блока это 0, то параметр 1 содержит номер строки для автостарта, если же параметр >= 32768, то автостарта нет. Параметр 2 содержат старт области с переменными относительно старта программы.
После заголовка идет блок с данными. В тап-файле за блоком следует два байта с длиной следующего блока. В самом же блоке первый байт всегда 255, потом идут данные, тип и длина которых был ранее задан в заголовке. В конце находится байт контрольной суммы.
Байт | Длина | Описание |
---|---|---|
0 | 1 | Здесь 00 |
1 | 1 | Тип (0,1,2 или 3) |
2 | 10 | Имя файла |
12 | 2 | Длина блока данных |
14 | 2 | Параметр 1 |
16 | 2 | Параметр 2 |
18 | 2 | CRC |
§ Запись на ленту
Теперь же разберем то, каким образом записываются данные на ленту. На самом деле это довольно просто. Перед записью (или чтением) блока всегда записывается так называемый лидирующий сигнал (пилот). Он представляет из себя тон заданной частоты и предназначен для синхронизации - для того, чтобы при чтении с ленты компьютер знал, где надо начинать считывать непосредственно данные, настроившись на этот лидирующий сигнал. Сигнал перебрасывает цвет бордера с красного на бирюзовый, а также пишет либо 1, либо 0 на выход магнитофона (начиная с 1). Если бордер красный - пишется 0 (низкий сигнал), если бирюзовый - пишется 1 (высокий сигнал).Длина каждого сигнала отмеряется в тактах процессора. Каждый сигнал (пилотного тона) длится ровно 2168 тактов процессора. Учитывая что за одну секунду выполняется 3.5 млн тактов процессора, то тогда, если разделить 3.5 млн на 2168 и поделить еще на два, поскольку сигналов два (1 и 0), мы получим частоту 807 герц. Именно с такой частотой записывается лидирующий сигнал. Стоит отметить, что для блока с заголовкой сигнал длится ровно 5 секунд, а для блока данных он длится ровно 2 секунды.
После того, как был послан пилотный сигнал, посылаются уровни 1 (высокий) и 0 (низкий — активный уровень) разной длины - или синхросигнал. Сначала посылается 1 длиной 667 тактов, потом посылается 0 длиной 735 тактов. С точки зрения человеческого этот сигнал совершенно неотличим, однако спектрум его отличает.
Далее идет запись байтов. Данные записываются побитно, начиная со старшего бита к младшему. К примеру если записывать байт F0, то вначале будут записаны четыре бита единиц, и потом четыре бита нулей.
- При записи единицы используется длинный сигнал. Пишется 1 длиной 1710 тактов, потом пишется 0 длиной 1710 тактов - это при записи единицы.
- Если записывается нуль, то пишется 1 длиной 855 тактов, и 0 длиной 855 тактов.