На самом деле, формат файла .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 - байт контрольной суммы блока данных




Ответить с цитированием