Из журнала ZX-Guide#4.5, Рязань, 08.2002 Автоопределение музыкальных форматов (c) Himik's ZxZ/PoS-WT Небольшой рассказ о том, как правильно определить принадлеж- ность файла к тому или иному музыкальному редактору. В принципе, особо сложного в этом нет. Если нам нужно опреде- лить мелодию по плееру, то всё гениально и просто. Создаем таб- лицу, сканируя которую можно определить, тот ли это редактор. Вот короткий пример этого метода: [find music in file with player scan] PSC_1XX DEFW PSC_1XX_YES DEFB #21,#FD,#C3,#FD,#C3,#FE,#19 DEFB #22,#FD,#EB,#21,#4C,#00,#19 DEFB #22,#FD,#22,#FD,#22,#FD,#2B DEFB #2B,#7E,#23,#66,#6F,#19,#22 DEFB #FF [......] На первый взгляд ничего не понятно... Попытаюсь объяснить. Итак, указываем сканеру адрес нужной нам таблицы, в данном слу- чае PSC_1XX, и начинаем сравнивать его значения с данными в па- мяти, но учитывая некоторые особенности. Для начала получим из нашей таблицы адрес перехода, куда мы должны обратится в случае,если все совпало. PSC_1XX DEFW PSC_1XX_YES ^^^^ - собственно и есть адрес перехода. Дальше по тексту все понятно, но нужно сообщить, что в табли- це живёт несколько управляющих кодов, без которых ваш поиск пре- вратится в более сложную систему. #FF - конец данной таблицы; #FE,#nn - пропустить в памяти #nn байт; #FD - пропустить в памяти два байта; Для чего нужны эти коды? Ну,собственно, #FF - для определения конца таблицы: дойдя до него, мы получим положительный ответ о том, что информация в памяти соответствует нашей таблице, и 99% того, что это именно то, что мы искали. #FE, #nn - необходим, если нам нужно пропустить приличное ко- личество байт в памяти. Например,проскипать текстовую инфу о ве- рсии плеера и т.д. #FD - нужен для пропуска двух байт. Как показала практика, таких комбинаций больше всего. Теперь расшифруем нашу таблицу (не считая адрес перехода): LD HL,..... JP ..... JP ..... [skip #19 bytes] LD (.....),HL EX DE,HL LD HL,#004C ADD HL,DE LD (.....),HL LD (.....),HL LD (.....),HL DEC HL DEC HL LD A,(HL) INC HL LD H,(HL) LD L,A ADD HL,DE LD (.....),HL Скажу сразу, что такой кусок кода присущ музыкальному редак- тору Pro Sound Creator, а значит, мы нашли в памяти минимум пле- ер, а там, возможно, и музон есть :) Главное было найти, мы наш- ли. Если кого интересует, вот код самого сканера: IX,#0000 ;Адрес в памяти, откуда начинаем сканировать HL,#0000 ;Адрес таблицы для сканера ; на выходе NZ - память совпала с таблицей ; Z - нет совпадения SEARCH_TABLE LD DE,EXIT_SER_TABLE PUSH DE LD E,(HL) INC HL LD D,(HL) INC HL PUSH DE ;Сохраним полученный адрес подпрограммы для ;выполнения после совпадения таблицы EX DE,HL PUSH DE PUSH IX POP HL LL7C3D LD A,(DE) CP #FF JR NZ,LL7C44 ;Если не конец таблицы, то... POP DE RET ;Вызов процедуры после поиска POPKA LD A,5 EXIT_SER_TABLE OR A RET LL7C44 CP #FE JR Z,LL7C56 ;Нужен ли пропуск nn байт? CP #FD JR Z,TWO_2 ;Нужен ли пропуск двух байт? CP (HL) JR NZ,LL7C4E ;Равны ли байт памяти и таблицы? INC DE ;Все совпало, идем по циклу... LL7C50 INC HL LL7C51 JR LL7C3D LL7C4E POP DE ;Выход из сканера, т.к. один из байтов POP AF ;таблицы не совпал с памятью. POP AF XOR A RET LL7C56 INC DE ;Пропуск #nn байт в памяти LD A,(DE) LD C,A LD B,#00 ADD HL,BC INC DE JR LL7C51 TWO_2 INC DE ;Пропуск двух байт в памяти INC HL INC HL JR LL7C51 Это все не совсем подробно, но хоть что-то. Конечно, я понимаю, что это самый простой способ определить принадлежность к редактору, но есть еще и второй способ,и он го- раздо сложнее первого. Второй способ более универсален, но гораздо медленнее работа- ет. Он построен на основе анализа самого модуля, не плеера, а именно модуля! Т.е. есть возможность определить принадлежность к редактору без плеера, а напрямую через код самого модуля. Есть, конечно, и самый простой вариант: в большинстве современных ре- дакторов, как в модуле, так и в плеере, есть свой текстовый опи- сатель версии и прочей инфы. Многие ориентируются именно по этим данным, но это ошибочный метод! Если убрать этот текст и забить его всякой беспорядочной инфой, то такой поиск ничего не даст, а поиск по данным модуля даст свой положительный результат. При- меры сканеров идут в комлекте. Вот на их основе и разбёретесь... Вся эта хрень взята из программы The Pusher. Во многих модулях используется переменная LL8E5B, в ней хра- нится длина загруженного блока в секторах!!!! Не обращайте внимания на некоторые метки, типа LL8223 и им подобным :) В действительности это не хак чего-то, а полное вос- становление с нуля всех исходников. Однажды безвозвратно убился диск со всем пушером, и вот результат, все исходники были снова дизасмены... ---------------------- himik#udm.net 2:5050/11.44 www.pos.izhnet.ru