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

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Формат TZX

  1. #1
    Veteran Аватар для ZXMAK
    Регистрация
    30.01.2006
    Сообщений
    1,718
    Спасибо Благодарностей отдано 
    42
    Спасибо Благодарностей получено 
    76
    Поблагодарили
    51 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Формат TZX

    Делая утилиту для дампа TZX в компилируемый asm файл в формате zasm (чтобы можно было легко руками подпраивить содержимое и скомпилить обратно в TZX), я заметил одну странность в TZX блоке #19 (generalized data).

    Вот пример с дампом hollywood-poker.tzx из набора тестов для TZX v1.20:
    Код:
    #TZX GENERALIZED, BLOCK10_DATA, 0, *, flag=$21, pause=0
            .tzx-pilot-sym  0, 2168,0            ; symbol#0 for pilot
            .tzx-pilot-sym  0, 667,735           ; symbol#1 for pilot
            .tzx-pilot      0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,256, 1,1, 0,258, 1,1  ; pilot 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 256 x #0, 1 x #1, 258 x #0, 1 x #1
            .tzx-data-sym   0, 855,855           ; symbol#0 for data
            .tzx-data-sym   0, 1710,1710         ; symbol#1 for data
    А именно - в словаре импульсов для пилот-тона, последний импульс 0, что технически некорректно, т.к. такой импульс приведет к смене полярности. В эмуляторах нулевые импульсы в словаре пилот-тона просто игнорируются (стоит проверка на ноль и если она срабатывает, импульс игнорируется), поэтому все работает.

    Кстати, zasm не принимает этот ноль в словаре пилот-тона при компиляции, его нужно удалить, чтобы блок скомпилировался. И, что интересно, он сам добавляет 0 в конец словаря пилот-тона.

    В описании формата TZX v1.20 присутствует этот ноль в примере словаря пилот-тона (судя по данным, пример в документации TZX приведен именно из вышеуказанного блока hollywood-poker.tzx)
    Код:
    0x12 	SYMDEF[0]: ( 0, 2168, 0 ) 	Pilot/sync symbol definitions
     	 SYMDEF[1]: ( 0, 667, 735)
    Однако непонятно - в чем смысл был включать нулевой импульс в словарь пилот-тона? Это ошибка, которую все эмуляторы игнорируют, т.к. она описана в примере блока #19 в самом описании формата? Или я чтото не понимаю?

    В аттачменте сам tzx и два его дампа в архиве - компилируемый asm дамп с проигнорированным импульсом 0 в словаре и асм дамп с префиксом -raw, т.е. в том виде как он записан в tzx.
    Вложения Вложения
    Последний раз редактировалось ZXMAK; 10.12.2024 в 05:28.
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

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

  3. #2
    Member
    Регистрация
    28.08.2023
    Адрес
    г. Брест, Беларусь
    Сообщений
    94
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    "shorter waves are terminated by a zero-length pulse in the sequence." Если количество импульсов в SYMDEF меньше NPP/NPD, оно «добивается» нулями. Другими словами, все записи SYMDEF должны быть одинаковой длины, читать до нуля но не более NPP/NPD.

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

    ZXMAK (10.12.2024)

  5. #3
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,837
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    303
    Спасибо Благодарностей получено 
    276
    Поблагодарили
    217 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    (судя по данным, пример в документации TZX приведен именно из вышеуказанного блока hollywood-poker.tzx)
    для обычной пзушной процедуры этот пример

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

    жаль, конечно, что блок #19 появился поздно, а не с самого начала вместо других
    он же все остальные блоки данных (кроме csw) покрывает, и насколько упростился бы код
    Прихожу без разрешения, сею смерть и разрушение...

  6. #4
    Veteran Аватар для ZXMAK
    Регистрация
    30.01.2006
    Сообщений
    1,718
    Спасибо Благодарностей отдано 
    42
    Спасибо Благодарностей получено 
    76
    Поблагодарили
    51 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Chwe Посмотреть сообщение
    "shorter waves are terminated by a zero-length pulse in the sequence." Если количество импульсов в SYMDEF меньше NPP/NPD, оно «добивается» нулями. Другими словами, все записи SYMDEF должны быть одинаковой длины, читать до нуля но не более NPP/NPD.
    хм, точно! Сразу не заметил, что число импульсов задается заранее для всех символов, поэтому т.к. в первом символе используется только одна длительность, а во втором две, то NPP=2 и соответственно для обоих символов число записей будет 2, но по факту для 0 символа используется только одна запись, поэтому не используемая прописывается нулем.

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    для обычной пзушной процедуры этот пример
    вообщето этот пример с прерывистым пилот-тоном, прерываемым специальным импульсом...
    Последний раз редактировалось ZXMAK; 10.12.2024 в 14:42.
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  7. #5
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,837
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    303
    Спасибо Благодарностей получено 
    276
    Поблагодарили
    217 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    вообщето этот пример с прерывистым пилот-тоном, прерываемым специальным импульсом...
    еще раз:
    Цитата Сообщение от ZXMAK Посмотреть сообщение
    (судя по данным, пример в документации TZX
    Прихожу без разрешения, сею смерть и разрушение...

  8. #6
    Veteran Аватар для ZXMAK
    Регистрация
    30.01.2006
    Сообщений
    1,718
    Спасибо Благодарностей отдано 
    42
    Спасибо Благодарностей получено 
    76
    Поблагодарили
    51 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а какие есть подходы к распознаванию TZX/TAP из WAV?

    Нужно было перевести wav/flac в tap, утилит по linux не нашел. Пришлось набросать свой простенький вариант, получилось вот такая процедурка на C#. На входе длительности импульсов распознанные в аудиофайле:

    Код:
            static byte[][] DecodeZXTape(List<int> pulses)
            {
                const int pilot_t = 2168;           // Pilot-tone pulse length
                const int sync1_t = 667;            // Sync 1 pulse length
                const int sync2_t = 735;            // Sync 2 pulse length
                const int bit0_t = 855;             // Bit 0 pulse length
                const int bit1_t = 1710;            // Bit 1 pulse length
                const int pilotThreshold = 256;     // Minimum pilot-tone edges
                const int tolerancePilot = 3170-2168;
                const int toleranceSync = 400;
                const int toleranceBit = 450;
            
                var outputBlocks = new List<byte[]>();
                
                int index = 0;
                while (index < pulses.Count)
                {
                    // Search pilot-tone
                    int pilotCount = 0;
                    while (index < pulses.Count && Math.Abs(pulses[index] - pilot_t) <= tolerancePilot)
                    {
                        pilotCount++;
                        index++;
                    }
                    if (pilotCount < pilotThreshold)
                    {
                        // if pilot-tone is too short skip current pulse and continue search
                        index++;
                        continue;
                    }
                    if (index + 1 >= pulses.Count ||
                        Math.Abs(pulses[index] - sync1_t) > toleranceSync ||
                        Math.Abs(pulses[index + 1] - sync2_t) > toleranceSync)
                    {
                        // if sync pulse is incorrect, skip current pulse and start to search new pilot-tone
                        index++;
                        continue;
                    }
                    index += 2; // skip sync pulse
            
                    // Read byte stream
                    var byteStream = new List<byte>();
                    byte currentByte = 0;
                    byte currentMask = 0x80;
                    while (index + 1 < pulses.Count)
                    {
                        if (pulses[index] > (bit1_t + toleranceBit) ||
                            pulses[index+1] > (bit1_t + toleranceBit)) break;
                        
                        var period = pulses[index] + pulses[index+1];
                        var isZero = Math.Abs(period - bit0_t*2) <= toleranceBit*2;
                        var isOne  = Math.Abs(period - bit1_t*2) <= toleranceBit*2;
    
                        index += 2;
                        
                        // Check for end of bit stream
                        if (!isOne && !isZero) break;
                        
                        if (isOne) currentByte |= currentMask;
                        currentMask >>= 1;
                        if (currentMask == 0)
                        {
                            byteStream.Add(currentByte);
                            currentByte = 0;
                            currentMask = 0x80;
                        }
                    }
                    if (byteStream.Count > 0)
                    {
                        outputBlocks.Add(byteStream.ToArray());
                        byteStream.Clear();
                    }
                }
                return outputBlocks.ToArray();
            }
        }
    Для простых tap вроде неплохо работает. Но стало интересно, какие есть алгоритмы для распознавания более сложных записей с турбоблоками и т.п. для TZX?
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  9. #7
    Member
    Регистрация
    28.08.2023
    Адрес
    г. Брест, Беларусь
    Сообщений
    94
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Нужно было перевести wav/flac в tap, утилит по linux не нашел.
    Да ну, их минимум больше двух и это не считая ультрамодных «пописушек» на всяких питонах и рубях (которые, впрочем, практически бесполезны).

    Почтенный audio2tape и не менее уважаемый maketzx (1.x source, 2.x только скомпилированное, ЕМНИП, вряд ли уже запустится). Это то, что я навскидку помню, собственно оцифровкой никогда пока не занимался, но, опять же, ЕМНИП, было и ещё что-то.

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

    ZXMAK (13.12.2024)

  11. #8
    Veteran Аватар для ZXMAK
    Регистрация
    30.01.2006
    Сообщений
    1,718
    Спасибо Благодарностей отдано 
    42
    Спасибо Благодарностей получено 
    76
    Поблагодарили
    51 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    maketzx под aarch64 (ARM Cortex A72) собрался, правда он старый. А для второй версии нет исходника?
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  12. #9
    Member Аватар для morozov
    Регистрация
    19.04.2019
    Адрес
    г. Сан-Хосе, США
    Сообщений
    42
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    15
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Для второй версии исходников нет (как минимум официально). В мануале написано:

    9. Is the source code of MakeTZX available?
    We are not yet going to release the sources of version 2.xx, but the old v1.02.1 code is freely available for download at our site. Please read carefully the enclosed documentation.

  13. #10
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,837
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    303
    Спасибо Благодарностей получено 
    276
    Поблагодарили
    217 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    мутные моменты в рамсофтовском описании формата:

    1) сказано, что при неулевых паузах нужно делать как минимум 1мс противоположного уровня, только потом нулевой
    непонятно, эта 1мс входит в длительность паузы или нет? а если пауза всего 1мс, противоположный делать на всю?

    2)в блоке #19 при ASD>2 номер символа из битового потока little или big endian? проще-то, конечно, big делать
    да и вообще, существуют ли хотя бы искусственные примеры образов с кол-вом символов данных больше двух?
    вот с тремя пилотными символами попадались несколько раз, но пилотные кодируются иначе
    также непонятно, как обрабатывать номера символов данных больше ёмкости алфавита
    (может быть. если размер алфавита не стпень двойки)

    3) в том же #19 для полей ASP и ASD примечание, что нулевое значение кол-ва считается как 256
    а вот для NPP и NPD такого не сказано (хотя, конечно, нулевое кол-во импульсов - бессмысленно же)
    Прихожу без разрешения, сею смерть и разрушение...

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

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

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

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

Похожие темы

  1. Ответов: 5
    Последнее: 06.03.2023, 00:01
  2. Формат файла tzx
    от san010101 в разделе Разный софт
    Ответов: 3
    Последнее: 14.09.2018, 09:31
  3. tzx образ
    от kibertorm в разделе Эмуляторы
    Ответов: 1
    Последнее: 02.03.2013, 08:56
  4. Out-of-TZX v1.03
    от CityAceE в разделе Софт
    Ответов: 3
    Последнее: 26.05.2005, 13:05

Ваши права

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