[an error occurred while processing this directive]
|
Приходят 32-битные слова где в четных битах один канал, в нечетных другой. Надо из них собрать 16-битные слова (то есть из входных 32 бит получить два 16-битных), затем вызвать подпрограмму-обработчик два раза для каждого канала, на выходе она дает байт на канал, и собрать обратно из двух байт такой-же поток через бит 16-битных слов. У меня это вот так смотрится (12 татков без учета вызова подпрограмм):
; AR0 pointer to input data
; AR1 pointer to output data
.ref process_data
mov dbl(*ar0+),pair(LO(AC0)) ; read register pair from memory
bfxtr #05555h,AC0,AC2 ; extract low byte CH #1 from odd bits
bfxtr #0AAAAh,AC0,AC0 ; extract low byte CH #2 from even bits
bfxtr #05555h,AC1,AC3 ; extract high byte CH #1 from odd bits
bfxtr #0AAAAh,AC1,AC1 ; extract high byte CH #2 from even bits
or AC3 << #8, AC2 ; combine low & high CH#1
or AC1 << #8, AC0 ; combine low & high CH#2
call process_data ; AC0 input & output. CH#2
swap ac0,ac2 ; swap AC0 & AC2
call process_data ; AC0 input & output. CH#1
bfxpa #05555h,AC0,AC0 ; pack CH1 byte to odd bits
bfxpa #0AAAAh,AC2,AC2 ; pack CH1 byte to even bits
or AC2,AC0 ; combine odd & even bits
mov AC0,*ar1+ ; write to output buffer
E-mail: info@telesys.ru