[sdiy] IIR Shift Filter problem - help with bug spotting in PIC ASM

Steve Lenham steve at bendentech.co.uk
Fri Mar 10 12:14:11 CET 2017

As I posted at around the same time, I reckon that you CAN mess with the
STATUS reg. However, it would be worth putting it to the test. How about
trying the following? It rotates the borrow bit in without inverting it,
then inverts the top four bits of the result instead:

	; Subtract FILTER from new INPUT
	movf	FILTER_LO, w
	movf	FILTER_HI, w
	subwfb	INPUT_HI, f

	; Borrow is zero if result required borrow (negative result)
	; Do the downshifts (x 1/16th effectively)
	rrf	INPUT_HI, f	; Rotate the borrow flag in unchanged
	rrf	INPUT_LO, f
	asrf	INPUT_HI, f	; Propagate it down to lower bits
	rrf	INPUT_LO, f
	asrf	INPUT_HI, f
	rrf	INPUT_LO, f
	asrf	INPUT_HI, f
	rrf	INPUT_LO, f	; 4 shifts total

  	movlw	0xF0
	xorwf	INPUT_HI, f	; Invert the four copies of borrow

	; Add it to FILTER
	movf	INPUT_LO, w
	addwf	FILTER_LO, f
	movf	INPUT_HI, w
	addwfc	FILTER_HI, f
	; We now have a smoothed copy of our INPUT in FILTER

This should at least narrow down where the problem lies. Do let us know
what happens - I should be working but am becoming obsessed with this :-)

Steve L.

On 10/03/2017 10:32, Tom Wiltshire wrote:
> Aha! Thanks! I'll give it a try.
> I didn't know you can't mess with the STATUS register. Why not? Why
> make the STATUS register available if I can't muck about with it?
> Tom
> On 10 Mar 2017, at 09:59, Roman Sowa <modular at go2.pl> wrote:
>> It struck me this morning when I looked at it again.
>> You cannot xorwf the carry/borrow bit, that will never work. Only
>> clrc or setc can do that.
>> I'm talking about this part:
>> ======================================================
>> ; Borrow is zero if result required borrow (negative result) ; Flip
>> the state of the borrow flag movlw	0x01 xorwf	STATUS, f		; Borrow
>> set if negative
>> =======================================================

More information about the Synth-diy mailing list