Важная информация

User Tag List

Страница 1 из 4 1234 ПоследняяПоследняя
Показано с 1 по 10 из 34

Тема: Формат файла tap zx spectrum

  1. #1
    Activist Аватар для san010101
    Регистрация
    18.11.2015
    Адрес
    г. Красноярск
    Сообщений
    271
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Формат файла tap zx spectrum

    Всем добра!
    Прошу не ругать за повтор и т.д.
    Не нашел ответов на вопросы вот и решил создать тему.

    Format Description

    The .TAP files contain blocks of tape-saved data. All blocks start with two bytes specifying how many bytes will follow (not counting the two length bytes). Then raw tape data follows, including the flag and checksum bytes. The checksum is the bitwise XOR of all bytes including the flag byte. For example, when you execute the line SAVE "ROM" CODE 0,2 this will result:

    |------ Spectrum-generated data -------| |---------|

    13 00 00 03 52 4f 4d 7x20 02 00 00 00 00 80 f1 04 00 ff f3 af a3

    ^^^^^...... first block is 19 bytes (17 bytes+flag+checksum)
    ^^... flag byte (A reg, 00 for headers, ff for data blocks)
    ^^ first byte of header, indicating a code block

    file name ..^^^^^^^^^^^^^
    header info ..............^^^^^^^^^^^^^^^^^
    checksum of header .........................^^
    length of second block ........................^^^^^
    flag byte ...........................................^^
    first two bytes of rom .................................^^^^^
    checksum (checkbittoggle would be a better name!).............^^

    Note that it is possible to join .TAP files by simply stringing them together; for example, in DOS / Windows: COPY /B FILE1.TAP + FILE2.TAP ALL.TAP ; or in Unix/Linux: cp file1.tap all.tap && cat file2.tap >> all.tap

    For completeness, I'll include the structure of a tape header. A header always consists of 17 bytes:
    Byte Length Description
    0 1 Type (0,1,2 or 3)
    1 10 Filename (padded with blanks)
    11 2 Length of data block
    13 2 Parameter 1
    15 2 Parameter 2

    The type is 0,1,2 or 3 for a Program, Number array, Character array or Code file. A SCREEN$ file is regarded as a Code file with start address 16384 and length 6912 decimal. If the file is a Program file, parameter 1 holds the autostart line number (or a number >=32768 if no LINE parameter was given) and parameter 2 holds the start of the variable area relative to the start of the program. If it's a Code file, parameter 1 holds the start of the code block when saved, and parameter 2 holds 32768. For data files finally, the byte at position 14 decimal holds the variable name.

    Вопрос по блокам
    length of second block ........................^^^^^
    flag byte ...........................................^^
    first two bytes of rom .................................^^^^^
    checksum (checkbittoggle would be a better name!).............^^

    что это за блок и откуда берутся first two bytes of rom (в каждом файле они разные)
    Нужно ли этот блок считывать.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    На самом деле, формат файла .TAP очень простой. Формат предназначен для хранения данных, записанных на кассете магнитофона на стандартной скорости записи, без информации о паузах и т.п.

    Каждый блок данных предваряется двумя байтами его длины, и дальше идут собственно данные. Это всё.

    2 байта длины (младший вначале), затем данные блока последовательно, начиная с первого флагового байта, заканчивая последним байтом контрольной суммы.
    Собственно, формат о них ничего не знает, и первый и последний байт могут быть произвольными, но для корректной загрузки стандартными загрузчиками обычно первый байт - флаговый, последний - байт контрольной суммы (XOR всех предыдущих байтов блока).



    Формат стандартного заголовочного блока Бейсика такой:
    1 байт - флаговый, для блока заголовка всегда равен 0 (для блока данных за ним равен 255)
    1 байт - тип Бейсик блока, 0 - бейсик программа, 1 - числовой массив, 2 - символьный массив, 3 - кодовый блок
    10 байт - имя блока
    2 байта - длина блока данных, следующего за заголовком (без флагового байта и байта контрольной суммы)
    2 байта - Параметр 1, для Бейсик-программы - номер стартовой строки Бейсик-программы, заданный параметром LINE (или число >=32768, если стартовая строка не была задана. Для кодового блока - начальный адрес блока в памяти. Для массивов данных - 14й-байт хранит односимвольное имя массива
    2 байта - Параметр 2. Для Бейсик-программы - хранит размер собственно Бейсик-програмы, без инициализированных переменных, хранящихся в памяти на момент записи Бейсик-программы. Для остальных блоков содержимое этого параметра не значимо, и я почти уверен, что это не два байта ПЗУ. Скорее всего, они просто не инициализируются при записи.
    1 байт - контрольная сумма заголовочного блока.

    Считывать блок заголовка нужно, если программа не знает точных параметров блока данных за ним. Если знает, его можно пропустить.

    - - - Добавлено - - -

    Понял, откуда 2 байта ПЗУ. В примере описано содержимое файла .TAP, для сохраненного из Бейсика командой <SAVE "ROM" CODE 0,2>
    блока кодов ПЗУ длиной 2 байта. Это актуально только для данного примера:

    13 00 - длина TAP-блока заголовка (19 байт - #13 в шестнадцатеричной системе)
    00 - флаговый байт заголовка
    03 - байт типа данных (3 - кодовый блок)
    52 4f 4d - имя блока ("ROM")
    7x20 - ещё семь пробелов имени блока
    02 00 - длина блока кодов без флагового байта и байта контрольной суммы
    00 00 - начальный адрес блока кодов
    00 80 - параметр, не имеющий смысла для блока кодов
    f1 - контрольная сумма заголовка
    04 00 - длина TAP-блока данных за заголовком (2 байта данных, плюс флаговый байт и байт контрольной суммы)
    ff - флаговый байт блока данных (255)
    f3 af - два первых байта ПЗУ
    a3 - байт контрольной суммы блока данных
    Последний раз редактировалось Spectramine; 13.09.2017 в 13:42.

  4. #3
    Guru Аватар для creator
    Регистрация
    02.07.2006
    Адрес
    Новосибирск
    Сообщений
    2,193
    Спасибо Благодарностей отдано 
    422
    Спасибо Благодарностей получено 
    219
    Поблагодарили
    130 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ZART-TCH.DOC
    Код:
    
    
    
                                     ZART
           File Transfer Utility for ZX Spectrum / IBM PC Computers
                      (C) Rick Murray, 1994, Chelyabinsk
    
                            Структуры всяких штук.
    
    
    
    
    ┌───────────────────────────────────┐
    │  Стандартный заголовок файла,     │
    │  записанного на пленке.           │
    └───────────────────────────────────┘
    
    typedef struct {
            unsigned char type;             тип файла
            char name[10];                  имя файла
            unsigned int length;            длина файла
            unsigned int start;             стартовый адрес
            unsigned int blen;              длина бейсика
    } tHEADER;
    
    
    ┌───────────────────────────────────┐
    │  Стандартный элемент каталога     │
    │  TR-DOS                           │
    └───────────────────────────────────┘
    
    typedef struct {
            char name[8];                   имя файла
            char type;                      тип ('C','B', итд)
            unsigned int start;             стартовый адрес
            unsigned int length;            длина
            unsigned char sex;              количество секторов
            unsigned char sector;           стартовый сектор
            unsigned char track;            стартовая дорожка
    } trHEADER;
    
    Если это бейсиковский текст, то как правило start == length, а номер
    стартовой строки вычисляется следующим способом:
    
     - Берется буфер, куда считаны сектора, к-во которых берется из sex,
     - От вершины буфера отсчитывается start байт,
     - Следующими после этого должны идти 2 байта AA80h,
     - Сразу за этими байтами - число int, обозначающее стартовую строчку.
    
    
    ┌───────────────────────────────┐
    │  Заголовок файла, который     │
    │  понимает HOBETA.             │
    └───────────────────────────────┘
    
    typedef struct {
            char name[8];                   имя для TR-DOS
            char type;                      тип ('C','B',...)
            unsigned int start;             стартовый адрес
            unsigned int length;            длина
            unsigned char temp;             всегда 0
            unsigned char sex;              количество секторов
            unsigned int checksum;          контрольная сумма заголовка
    } dHEADER;
    
    Сразу вслед за этим заголовком следуют данные собственно файла, имеющие
    размер sex * 256 байт.
    
    Контрольная сумма рассчитывается следующим образом:
    
    int dhcheck()
    {
        unsigned int i,j,k;
    
        for(j=i=0; i<0x0F; ++i){
            k = *((char *)&Dhead+i); k &= 0xFF;
            j += (k * 0x0101 + i);
        }
        return j;
    }
    
    Здесь Dhead - переменная типа dHEADER содержащая сформированный
    заголовок.
    
    
    ┌──────────────────────────────┐
    │  Формат файла TAPE_ZX.SPC    │
    └──────────────────────────────┘
    
    Файл состоит из циклически повторяющихся блоков:
    
    Pазмер  Тип        Hазначение
    ─────────────────────────────────────────
    2  unsigned int    Pазмер блока данных
    1  unsigned char   Тип блока (0-заголовок, FF-данные)
    ??  ...            Блок данных
    1  unsigned char   Контрольная сумма блока данных
    
    Поле размера блока включает только размер самого блока данных.
    Контрольная сумма считается как xor всех байт блока данных.
    
    
    ┌──────────────────────────┐
    │  Формат TAP файла        │
    └──────────────────────────┘
    
    Аналогично файл состоит из повторяющихся кусков:
    
    Pазмер  Тип        Hазначение
    ─────────────────────────────────────────
    2  unsigned int    Pазмер всего, что надо считать относящегося к файлу.
                       (иными словами - размер блока данных + 2, т.е. плюс
                       байт типа и байт crc)
    1  unsigned char   Тип блока (аналогично SPC)
    ??  ...            Блок данных
    1  unsigned char   Контрольная сумма блока данных вместе с байтом типа.
    
    Поле размера включает размер блока данных + 2.
    Контрольная сумма считается как xor фсех байт блока данных и байта типа.
    
    TAP файл является точным отображением структуры записи на кассете за
    исключением первых двух байт, вместо которых на пленке записан
    лидер-сигнал и синхроимпульс.
    
    ┌────────────────────────────────────┐
    │  Стандартный элемент какталога     │
    │  MS-DOS                            │
    └────────────────────────────────────┘
    
    Стандартный элемент какталога MS-DOS располагается в области таблицы
    партиций и занимает по крайней мере первую половину диска MS-DOS. Для
    того чтобы прочитать этот элемент необходимо по меньшей мере 12 минут,
    для того чтобы направляющий ролик смог обнаружить межсекторное
    пространство, а для того чтобы гарантировать правильное чтение данного
    сектора, вы должны быть уверены, что сам какталог находится на диске, а
    не под ним.
    В правильно заданном вопросе содержится половина ответа

  5. Этот пользователь поблагодарил creator за это полезное сообщение:

    Михаил Каа (29.01.2021)

  6. #4
    Activist Аватар для san010101
    Регистрация
    18.11.2015
    Адрес
    г. Красноярск
    Сообщений
    271
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо за помощь.
    Начал вникать, т.е. в приведенном примере
    13 00 00 03 52 4f 4d 7x20 02 00 00 00 00 80 f1 04 00 ff f3 af a3

    байты f3 af - два первых байта ПЗУ
    и есть то что было записано командой
    SAVE "ROM" CODE 0,2
    в конце идет контр.сумма

    согласно примеру заполню структуру

    typedef struct {
    unsigned char type; тип файла тут ставим 0 (программа)
    char name[10]; имя файла ROM
    unsigned int length; длина файла 0x02
    unsigned int start; стартовый адрес 0x00
    unsigned int blen; длина бейсика ????? что тут???
    } tHEADER;
    Последний раз редактировалось san010101; 13.09.2017 в 14:03.

  7. #5
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Что угодно, для блока кодов это неважно. И тип файла для блока кодов должен быть 3, а не 0.

  8. #6
    Activist Аватар для san010101
    Регистрация
    18.11.2015
    Адрес
    г. Красноярск
    Сообщений
    271
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    unsigned int blen; длина бейсика
    если это бейсик или массив?

    - - - Добавлено - - -

    Контрольную сумму считает сам загрузчик и сравнивает ее потом с последним байтом, т.е. размер контрольной суммы это байт?

    сорри, смотрю в стандартном заголовке ленты вообще нет упоминание о контрольной сумме.

  9. #7
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Третий после имени файла параметр (blen в сишной структуре) имеет смысл только для блоков с Бейсик-программами, для кодовых и массивов данных он не имеет смысла, и может быть любым. Для Бейсик-программы, как я уже сказал, он хранит длину собственно Бейсик-программы, без хранящихся совместно с ней инициализированных переменных Бейсика. Если инициализации переменных ещё не было, длина Бейсик-программы равна длине блока в первом параметре (length).

    Контрольную сумму считает загрузчик, да, размер КС- байт. Формат заголовка ленты относится к более высокому уровню абстракции, поэтому контрольной суммы не содержит.

  10. #8
    Activist Аватар для san010101
    Регистрация
    18.11.2015
    Адрес
    г. Красноярск
    Сообщений
    271
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот теперь все встало на свои места, благодарю за развернутый ответ.

  11. #9
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,485
    Спасибо Благодарностей отдано 
    219
    Спасибо Благодарностей получено 
    149
    Поблагодарили
    115 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Тут дофига можно чего найти, клик на расширении файла - даёт более подробную инфу.

  12. #10
    Activist Аватар для san010101
    Регистрация
    18.11.2015
    Адрес
    г. Красноярск
    Сообщений
    271
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо за ресурс!

    Отправлено с моего A0001 через Tapatalk

Страница 1 из 4 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Тесты для ZX-Spectrum в tap формате
    от Ovvnex в разделе Софт
    Ответов: 30
    Последнее: 20.11.2017, 01:32
  2. THX - формат файла
    от breeze в разделе Amiga
    Ответов: 2
    Последнее: 04.06.2013, 20:06
  3. AY:воспроизведение WAV-файла
    от goblinish в разделе Программирование
    Ответов: 35
    Последнее: 10.10.2012, 20:32

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •