.tap

Материал из Emuverse
Версия от 18:15, 19 декабря 2007; Panther (обсуждение | вклад) (Новая: {{ДИ|Автор=(с) Г. А. Лунтер (G.A.Lunter), Нидерланды, 1994; (с) Перевод с английского и техническое редактирование...)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: (с) Г. А. Лунтер (G.A.Lunter), Нидерланды, 1994; (с) Перевод с английского и техническое редактирование «Инфорком-Пресс», Москва, 1995.

Эти файлы содержат блоки данных, сохраненных как бы на ленту. Все блоки начинаются с двух байтов, в которых указано сколько байтов за ними следует (не считая этих двух байтов). Затем идут сами данные, включающие флаговый байт и байт контрольной суммы. Байт контрольной суммы получается в результате последовательной операции XOR для всех байтов, включая флаговый байт. Например, если вы захотите выгрузить пару байтов из ПЗУ командой: SAVE "ROM" CODE 0,2, то получите в результате:

      |-----Данные, генерируемые Спектрумом--|	|---------|
13 00 00 03 52 4f 4d 7x20 02 00 00 00 00 80 f1 04 00 ff f3 af a3
^^^^^...... длина первого блока (19б.=17б.хэдер+флаг+контр.сумма) 
      ^^... флаговый байт (00 для хэдера, ff для блока данных)
         ^^ первый байт хэдера, указывающий на тип данных
имя файла ..^^^^^^^^^^^^^
информация в хэдере.......^^^^^^^^^^^^^^^^^
к.с. хэдера.................................^^
длина второго блока............................^^^^^
флаговый байт 2-го блока..............................^^
первые два байта ПЗУ....................................^^^^^
контрольная сумма первых двух байтов и флагового байта........^^ 

Эмулятор всегда считывает байты с начала блока. Если загружается меньше байтов, чем есть в наличии, то лишние байты пропускаются и последний загруженный байт рассматривается как контрольная сумма. Если запрашивается на загрузку больше байтов, чем есть в наличии, то загружающая процедура прерывается с включением флага, свидетельствующего об ошибке ввода с ленты. Обработку ошибки производит вызываемая Z80 процедура.

Обратите внимание на то, что можно объединять .ТАР-файлы простым "пристегиванием" их друг к другу, например так:

COPY /B FILE1.TAP + FILE2.TAP ALL.TAP

Для полноты картины я включу сюда же и структуру хэдера. Он всегда состоит из 17 байтов:

Байт    Длина   Описание
0	1	Тип файла (0,1,2 или 3)
1	10	Имя файла (если меньше 10 символов, вставляются пробелы)
11	2	Длина блока данных
13	2	Параметр 1
15	2	Параметр 2

Тип файла 0,1,2,3 соответствует: программе, числовому массиву, символьному массиву, блоку кодов. Экранные файлы SCREEN$ рассматриваются как файлы кодов, начинающиеся в 16384 и имеющие длину 6912 байтов. Если файл является программой, то параметр-1 содержит номер строки автостарта или число, большее, чем 32768, если номер строки автостарта не указан. параметр-2 содержит смещение адреса программных переменных относительно адреса начала программы. Для блока кодов параметр-1 содержит адрес, из которого этот блок выгружался, а параметр 2 содержит число 32768. Для файлов данных (массивов) байт, расположенный в позиции 14 содержит имя переменной.