Там нужно измерить всего две константы для самой длинной ветки, а потом подогнать и для других:
Код:
	MOV 0,Rcode
	MOV 0,Rnext
WAIT0:	BIT BNE WAIT0	; ждём низкий уровень
WAIT1:	BIT / BEQ WAIT1	; ждём его изменение на высокий
	ASL Rcnt		; тестируемый код
	MOV Tune,Rcnt
	ADC Rdata
	MOV Rdata,(Rbuf)
	MOV 1,Rdata	
	DEC Rlen	
	BNE WAIT2
WAIT2:	INC Rcode	;считаем сколько длится высокий уровень за вычетом кода
	BIT
	BNE WAIT2
WAIT3:	INC Rnext	;считаем сколько длится низкий уровень
	BIT
	BEQ WAIT3
В качестве порога потом использовать Rcode+Rnext/2. На всякий случай можно будет сделать такую же проверку и для другой полярности. Если Rcode или Rnext будут сильно расходиться, значит либо сильно смещён уровень и длительность полуволн неодинаковая, либо в сигнале есть какие-то выбросы. В теории сигнал должен будет приниматься если max(Rcode+, Rcode-) < Rcode+Rnext/2 < min(Rnext+, Rnext-). Вообще хорошо бы вывести в каждую строку экрана, что мы принимаем после того как дождёмся перепад заданной полярности. В идеале должны получиться вертикальные полосы с дрожанием +/-1 пиксель на границах. А особая подгонка дискретизации WAV не должна требоваться если она хотя бы 3-4 раза выше частоты сигнала.