В поддержку нового проекта от Sergey Bulba (автора AY Emul) универсального плэйера PT2+PT3 мелодий, я написал универсальный детектор, который ищет по сигнатуре мелодии обоих версий протракеров. Поиск осуществляется по общим для двух форматов критериям:
1) Temp=1..#3f
2) Длина в позициях != 0
3) Длина в позициях > номер позиции для зацикливания
4) (Список патернов)-1 = #FF (то есть конец таблицы позиций)
5) (Таблица позиций)+(длина в позициях) = (список патернов)
6) Описатели сэмплов (#40 байт) и описатели орнаментов (#20 байт)
должны "нарастать" или быть равны нулю.
При удовлетворении найденного модуля всем этим критериям определяем к какой версии PT нужно отнести модуль.
Получилась достаточно короткая процедура - 119 байт и достаточно быстрая. На выходе выдает адрес начала мелодии, длину в позициях, тип мелодии (PT2, PT3). Предлагаю всем заинтересованным в ее дальнейшем использовании предложить пути ускорения/оптимизации/улучшения процедуры. Исходный текст:
Код:
----------------------------------------------------------------
;PT2 and PT3 universal searcher by Spectre
;IN: HL-Start address, BC-Length.
;OUT: HL-Song start address, BC-Length (positions), A: 0-PT2, 1-PT3.
LD HL,#6000
LD BC,#A000
FINDPT LD A,B
OR C
RET Z; Not found
LD A,(HL) ;Temp
OR A
JR Z,FPTEND3
CP #40
JR NC,FPTEND3
PUSH HL
INC HL
LD A,(HL) ;Len
OR A
JR Z,FPTEND2
INC HL
CP (HL) ;Loop
JR C,FPTEND2
PUSH BC
INC HL
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD (FPT3+1),DE ;Patterns PT3 or first sample PT2
LD C,A
LD B,#30-1
FPT2 PUSH DE
LD E,(HL) ;Samples
INC HL
LD D,(HL)
INC HL
EX (SP),HL
LD A,D
OR E
JR Z,$+5
SBC HL,DE
CCF
POP HL
JR C,FPTEND
DJNZ FPT2
LD E,(HL) ;#63 ;Patterns PT2 or positions PT3
INC HL
LD D,(HL) ;#64
INC HL
PUSH HL
LD HL,-#83
ADD HL,DE
SBC HL,BC
POP HL ; #65
JR NZ,FPT3
PUSH HL
ADD HL,DE
LD DE,-#65-1
ADD HL,DE
LD A,(HL)
POP HL
INC A
JR Z,FPT5 ;It PT2
FPT3 LD DE,0
PUSH HL
LD HL,-#C9
ADD HL,DE
SBC HL,BC
POP HL
JR NZ,FPTEND
PUSH HL
ADD HL,DE
LD DE,-#C9-1
ADD HL,DE
LD A,(HL)
POP HL
INC A
JR Z,FPT4 ;It PT3
FPTEND POP BC
FPTEND2 POP HL
FPTEND3 INC HL
DEC BC
JR FINDPT
FPT4 LD DE,#65-#C9 ;found PT3
ADD HL,DE
INC A
FPT5 POP DE,DE
LD DE,-#65 ;found PT2
ADD HL,DE
RET