ITHACK 1.0
                          ИНСТРУКЦИЯ ПО РАБОТЕ
                       (c) Андрей Бобин, Май 1999


   1. Что такое утилита ITHack.
   2. Как этим пользоваться.
   3. Условия распространения.

------------------------------------------------------------------------

   1. Что такое утилита ITHack.

   В   модулях   для   музыкального   трэкера   IMPULSE   TRACKER   есть
недокументированная  область, так называемый "протокол работы с модулем"
(ПРМ).  Там  хранится  информация  о всех сеансах редактирования данного
модуля,   а  именно:  время  загрузок  модуля  и  длительность  сеансов.
Подробная  информация  о  структуре  этой  области  содержится  в  файле
ITUNDOC.TXT.  Утилита  ITHack предназначена для работы с этим самым ПРМ.
Она  может  копировать  его  в  текстовые  файлы,  может  удалять его из
модулей.

------------------------------------------------------------------------

   2. Как этим пользоваться.

   Параметры командной строки для запуска ITHACK:

   ITHACK.EXE <modulename> [/l <logname>] [/s] [/clear]
      /l = copy log from module <modulename> to textfile <logname>;
      /s = show total module edit time;
      /clear = clear the log in module.

   /l  -  создает текстовый файл с именем <logname> (не забудьте указать
        его  после  /l  через  пробел),  в  который в удобочитаемом виде
        копирует содержимое протокола из модуля <modulename>;

   /s - выводит на экран общее время редактирования модуля <modulename>;
        оно   определяется   как   сумма   времени   по   всем   сеансам
        редактирования.

   /clear  -  очищает  (забивает нулями) протокол в модуле <modulename>;
        защита  от  записи  (Read  Only) не является помехой.

   Параметры можно комбинировать, пример:
   ITHACK.EXE mymodule.it /clear /l mylog.txt /s /s /s /clear /s
   Сначала  будет  создан файл mylog.txt с ПРМ, затем выведется на экран
общее время редактирования, затем ПРМ будет обнулен.

   Q.: А что будет, если после очистки протокола модуль загрузить в IT и
попытаться пересохранить? Не приведет ли это к ошибке или порче модуля?
   A.:  Нет. IT "подумает", что модуль только что создан, и начнет вести
протокол   заново,   с  первой  строчки,  выкинув  при  этом  все  нули,
появившиеся  после  очистки.  Правда, забавно? На сохранности данных это
никак  не  отражается,  так  как  при  очистке с помощью ITHack протокол
просто забивается нулями. К тому же, ПРМ не является обязательной частью
модуля.

   Q.:  А  я вот пытался посмотреть ПРМ в одном моем старом it-модуле, а
ITHack сказала, что это старый формат, и не стала ничего показывать. Что
представляет из себя этот старый формат?
   A.:  Дело  в  том,  что ранние версии IT не вели ПРМ. Поэтому модули,
созданные  в  этих  версиях  трэкера,  его  не  содержат.  Об этом вам и
сообщила  ITHack.  О  том,  как она определяет отсутствие ПРМ в модулях,
можно почитать в файле ITUNDOC.TXT.

------------------------------------------------------------------------

   3. Условия распространения.

   Утилита   ITHack   распространяется   абсолютно  свободно,  при  этом
запрещается:
   -  внесение любых изменений в код программы и документацию;
   -  получение  коммерческой  выгоды  от  распространения  утилиты  или
документации к ней.

   Утилита  ITHack  распространяется  в  соответствии  с  общепринятым в
компьютерной  практике  принципом  AS  IS,  означающим, что за проблемы,
возникшие   в   процессе  эксплуатации  утилиты  ITHack,  автор  никакой
ответственности  не  несет.  Если  вас  лично  это  не  устраивает  - не
используйте ее.

   Автор утилиты: Andrew Bobin aka Virtex
   e-mail: anbo@newmail.ru
   2:5057/29.49@FidoNet



                   НЕКОТОРЫЕ НЕДОКУМЕНТИРОВАННЫЕ ПОЛЯ
                           ФАЙЛОВ ФОРМАТА .IT
                     (IMPULSE TRACKER MUSIC MODULE)
                       (c) Андрей Бобин, Май 1999

   Всякий,  кто  имеет  то  или  иное отношение к созданию музыки на PC,
наверняка  знаком  с  прекрасным музыкальным редактором-трэкером Impulse
Tracker  by  Jeffrey Lim. И наверняка предпочитает хранить свои модули в
родном формате этого трэкера (файлы *.it). Структура этих файлов описана
JL  в  документации  к  IT (файл ittech.doc). Но мало кто догадывается о
том,  что  файлы  эти  имеют  области, о которых нет совершенно никакого
упоминания  в  (официальной)  документации. Ниже пойдет речь об одной из
таких, той, что я назвал "протокол работы с модулем" (ПРМ).

   Итак, вот выдержка из файла ittech.doc:

                         IMPULSE HEADER LAYOUT

        0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
      ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
0000: │'I'│'M'│'P'│'M'│ SONG NAME, MAX 26 CHARACTERS, INCLUDES NULL   │
      ├───┴───┴───┴───┴───────────────────────────────────────┬───┬───┤
0010: │.......................................................│ X │ X │
      ├───────┬───────┬───────┬───────┬───────┬───────┬───────┼───┴───┤
0020: │ORDNUM │INSNUM │SMPNUM │PATNUM │ CWT/V │ CMWT  │ FLAGS │SPECIAL│
      ├───┬───┼───┬───┼───┬───┼───────┼───────┴───────┼───┬───┼───┬───┤
0030: │GV │MV │IS │IT │SEP│(0)│MSGLGTH│MESSAGE OFFSET │ X │ X │ X │ X │
      ├───┴───┴───┴───┴───┴───┴───────┴───────────────┴───┴───┴───┴───┤
0040: │ CHNL PAN (64 BYTES)...........................................│
      ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤

      ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
0080: │ CHNL VOL (64 BYTES)...........................................│
      ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤

      ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
00C0: │ ORDERS, LENGTH = ORDNUM                                       │
      ├───────────────────────────────────────────────────────────────┤
XXXX: │ 'LONG' OFFSET OF INSTRUMENTS, LENGTH = INSNUM*4 (1)           │
      ├───────────────────────────────────────────────────────────────┤
XXXX: │ 'LONG' OFFSET OF SAMPLES HEADERS, LENGTH = SMPNUM*4 (2)       │
      ├───────────────────────────────────────────────────────────────┤
XXXX: │ 'LONG' OFFSET OF PATTERNS, LENGTH = PATNUM*4 (3)              │
      └───────────────────────────────────────────────────────────────┘
YYYY:

   По  сути,  в  файле  после  описания смещений инструментов, сэмплов и
паттернов   должны   начинаться  собственно  сами  инструменты,  сэмплы,
паттерны (со смещения, обозначенного YYYY). Но на самом деле это не так.
Начиная  со смещения YYYY, в файле расположен тот самый ПРМ, о котором и
идет  речь.  Таким  образом,  смещение  ПРМ в файле вычисляется косвенно
следующим образом:

           YYYY = C0h + ORDNUM + (INSNUM + SMPNUM + PATNUM)*4

   Как мне удалось установить, ПРМ имеет следующую структуру:

                       ПРОТОКОЛ РАБОТЫ С МОДУЛЕМ

        0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
      ┌───────┬───────────────────────────────┬───────────────────────┐
0000: │RECNUM │ RECORD N1 ------------------> │ RECORD N2 -------------
      ├───────┼───────────────────────────────┼───────────────────────┤
0010: ------> │ RECORD N3 ------------------> │ RECORD N4 -------------
      ├───────┼───────────────────────────────┼───────────────────────┘
0020: ------> │ RECORD N5 ------------------> │.......................
      └───────┴───────────────────────────────┘

   Т.е.  в  начале  указано  количество  записей RECNUM размером 2 байта
(WORD),  далее  идут  сами  записи.  Длина  каждой записи 8 байт. Биты в
каждой записи имеют следующее назначение:

                      НАЗНАЧЕНИЕ БИТОВ ЗАПИСИ ПРМ

    ДЛИТЕЛЬНОСТЬ СЕАНСА РАБОТЫ       НАЧАЛО СЕАНСА РАБОТЫ
    BYTE 7  BYTE 6  BYTE 5  BYTE 4   BYTE 3  BYTE 2   BYTE 1  BYTE 0
   ┌──────┐┌──────┐┌──────┐┌──────┐ ┌──────┐┌──────┐ ┌──────┐┌──────┐
   76543210765432107654321076543210 7654321076543210 7654321076543210
   ├┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘ └┴┴┴┤└┴┴┴┴┤└┴┴┴┤ └┴┴┴┴┴┤└┴┴┤└┴┴┴┤
   ╘════─ TIMER_TICS │ HOUR (0..23) ─═══╛     │    │       │   │    │
         (0..2^32-1) │ MINUTE (0..59) ─═══════╛    │       │   │    │
                     │ SEC/2 (0..29) ─═════════════╛       │   │    │
                     │ YEAR-1980 (0..127) ─════════════════╛   │    │
                     │ MONTH (1..12) ─═════════════════════════╛    │
                     │ DAY (1..31) ─════════════════════════════════╛

   Думаю,   назначение  полей  байтов  0-3  не  вызывает  вопросов.  Это
классическая  схема  упаковки  даты-времени,  используемая, к примеру, в
MS-DOS для хранения даты и времени модификации файлов. Каждый раз, когда
модуль  загружается  в  IT,  запоминается  время  его  загрузки,  и  при
сохранении  модуля  оно  записывается  в  байты  0-3  очередной  записи.
Обратите  внимание:  сохраняется  именно  время  загрузки,  а  не  время
сохранения.

   Насчет   байтов   4-7.   IT   перехватывает  прерывание  от  таймера,
устанавливая свой обработчик на Int08h или Int1Ch. Обработчик каждый раз
при   вызове  увеличивает  на  единицу  значение  некоторого  32-битного
счетчика.   Когда  в  IT  загружается  очередной  модуль,  этот  счетчик
обнуляется.   Когда  же  осуществляется  сохранение  модуля,  содержимое
счетчика  копируется  в  байты 4-7 очередной записи. А теперь о том, как
перевести  это  в привычные нам секунды. Таймер 'тикает' с интервалом 55
мс. Таким образом:

                      SECONDS = TIMER_TICS * 0.055

   Ну  а дальше, деля на 60 или 3600, из этого можно получить минуты или
часы.

   И  еще.  Ранние  версии  IT не вели ПРМ, поэтому старые модули (~95-й
год)  его  не  имеют.  Как определить, есть в файле ПРМ или нет? В своей
утилите   ITHack,   предназначенной  для  работы  с  ПРМ  (копирование в
текстовый  файл,  очистка и др. функции), я использовал следующий метод.
Начиная  со  смещения  C0h  +  ORDNUM,  в  файле  перечисляются смещения
инструментов,  сэмплов  и паттернов. Обозначим именем FIRSTOFFS значение
первого  из  перечисляемых  смещений.  Оно  занимает  4  байта  (LONG) и
находится   прямо   по  смещению  C0h  +  ORDNUM.  Еще.  Если  в  модуле
присутствует  MESSAGE  (сообщение, которое можно добавить, нажав SHIFT +
F9),  то  оно  располагается  в файле (по смещению MESSAGE_OFFSET) сразу
после перечисления всех этих смещений. Так вот:

          ЕСЛИ (YYYY = FIRSTOFFS) OR (YYYY = MESSAGE_OFFSET),
          ТО В ФАЙЛЕ _НЕТ_ ПРМ.

   Вот,  вроде  бы,  и  все,  что мне удалось узнать о ПРМ в модулях IT.
Надеюсь, и вы теперь будете знать об этом не меньше...