Програмная часть: разные мелочиВ этом разделе описаны мелкие модули, которые не удостоились отдельных разделов. Модуль encode.asm.incЭтот модуль содержит две процедуры табличной конвертации символов: из кодировки CP-866 и UTF в КОИ-8. Эти процедуры используются при работе с файловой системой FAT для декодирования имен файлов, представленных в различных форматах. Модуль flash.asm.incМодуль оперирует с энергонезависимой помятью. На входе он получает адреса EEPROM и SRAM, а также размер передаваемого блока и направление передачи. Имеется две точки входа, отличающиеся методом передачи параметров: через регистры (f_Read, f_Write) или память программ (f_IO). Преимущественно, в коде плейера используется второй способ. Он выглядит примерно так:
При сохранении данных в энергонезависимой памяти модуль предварительно проверяет значение, хранящееся в очередном байте и если оно совпадает со вновь записываемым, операция записи для данного байта не выполняется. Я надеюсь, что это способствует сбережению рессурса памяти. В плейере много участков, которые сохраняя параметры, фактически не изменют их или изменяют не полностью. Модуль math.asm.incМодуль содержит ряд математических процедур (многоразрядное умножение и деление, преобразование 8-и и 16-и-битных чисел в десятичное строковое представление), частично взятых из примеров кода от Atmel. Модуль selfprog.asm.incЭтот модуль располагается в защищаемой от перезаписи области памяти программ и вызывается при аппаратном сбросе процессора. Его задача - обновление памяти программ по внешнему запросу. Модуль общается с внешним миром по интерфейсу rs232, скорость обмена - 38400 бод/с, 8 бит в слове, без бит чётности. Алгоритм действия таков: при возникновении аппаратного сброса процессора, управление передается на начало модуля. Он инициализирует последовательный интерфейс и затем задерживает свою работу на время около 0,03 секунды. Если за это время в приёмном регистре последовательного интерфейса появляется символ "R", модуль выполняет синхронизацию с внешней программой и уходит в бесконечный рабочий цикл, иначе передает управление на адрес 0 - входную точку основного управляющего кода. Синхронизация с внешней программой состоит в отправке символа "S" и последующего ожидания символа "N". Когда символ "N" будет получен, происходит переход в рабочий цикл модуля. Рабочий цикл модуля состоит из получения адреса, данных и контрольной суммы заменяемого блока памяти программ и последующей его записи в энергонезависимую память (в случае успешной проверки контрольной суммы). Со стороны сопровождающего компьютера с плейером общается программа sprog. Модуль sleep.asm.incЭтот модуль содержит ряд процедур, обеспечивающих задержки исполнения программ на различное время. Эти процедуры специально собраны в один модуль для облегчения корректировки исходного текста в случае выбора новой тактовой частоты процессора. Текущая версия модуля расчитана на частоту 8 МГц. Модуль spi.asm.incПомимо того, что этот модуль инициализирует контроллер SPI в ATmega32, а также содержит несколько базовых низкоуровневых процедур обмена по шине, он управляет линиями выбора устройств, подключенных к SPI. Для этого используется процедура spi_CSCLK_Select. В качестве её единственного параметра внешний код должен задать одну из констант spi_CSCLK_*. После использования шины SPI внешний код должен освободить её, задав в качестве параметра константу spi_CSCLK_release. В противном случае возможны сбои в работе IDE-шины. Программа FAT SorterЭта программа была написана по той причине, что плейер использует только один список воспроизведения: тот, что образован имеющейся на носителе файловой системой. Порядок файлов при этом определяется различными случайными факторами, а FAT Sorter старается всё же уменьшить долю вероятности и отсортировать записи файловой системы по алфавиту. FAT Sorter работает не на плейере, а на сопровождающем компьютере; код написан, в основном, на языке Pascal, может быть без проблем скомпилирован под Linux или *BSD, хотя, думаю, несложная доработка позволит собрать его и для Windows (от операционной системы требуется только дать посекторный RW-доступ к разделу). Программа не интерактивна, единственный аргумент - имя файла-устройства. Sorter последовательно читает все каталоги, удаляет из них информацию об удалённых файлах, а оставшиеся записи сортирует по алфавиту и записывает назад. Каких либо операций с содержимым файлов не выполняется, загрузочная запись и таблица FAT не модифицируются. Sorter понимает как короткие так и длинные имена файлов. Когда-то аналогичная функциональность была ещё в ДОС-овской версии симантековского дефрагментатора дисков (без понимания длинных имён). В нынешнем штатном дефрагментаторе Windows её нет. |