	list	b=4

	list p=16F886

	include <p16f886.inc>

	cblock	0x20
	acc:	2
	work:	2

	temp
	endc

	org		0x0000
	goto	Start

	org		0x0004
	retfie

Start
	movlw	0xAA
	movwf	acc
	movlw	0x7F
	movwf	acc+1

	movlw	0x04
	movwf	work
	movlw	0x00
	movwf	work+1
	call	Add16


	movlw	0xAA
	movwf	acc
	movlw	0x7F
	movwf	acc+1

	movlw	0x04
	movwf	work
	movlw	0x00
	movwf	work+1
	call	Add16Sat


	movlw	0xAA
	movwf	acc
	movlw	0x7F
	movwf	acc+1

	movlw	0xAA
	movwf	work
	movlw	0x00
	movwf	work+1
	call	Add16


	movlw	0xAA
	movwf	acc
	movlw	0x7F
	movwf	acc+1

	movlw	0xAA
	movwf	work
	movlw	0x00
	movwf	work+1
	call	Add16Sat

; sub

	movlw	0xAA
	movwf	acc
	movlw	0x80
	movwf	acc+1

	movlw	0x04
	movwf	work
	movlw	0x00
	movwf	work+1
	call	Sub16


	movlw	0xAA
	movwf	acc
	movlw	0x80
	movwf	acc+1

	movlw	0x04
	movwf	work
	movlw	0x00
	movwf	work+1
	call	Sub16Sat


	movlw	0xAA
	movwf	acc
	movlw	0x80
	movwf	acc+1

	movlw	0xBB
	movwf	work
	movlw	0x00
	movwf	work+1
	call	Sub16


	movlw	0xAA
	movwf	acc
	movlw	0x80
	movwf	acc+1

	movlw	0xBB
	movwf	work
	movlw	0x00
	movwf	work+1
	call	Sub16Sat


	goto	Start


Add16
	movf	work,w
	addwf	acc,f
	btfsc	STATUS,C
	incf	acc+1,f
	movf	work+1,w
	addwf	acc+1,f
	return

Add16Sat
	movf	acc+1,w
	movwf	temp

	movf	work,w
	addwf	acc,f
	btfsc	STATUS,C
	incf	acc+1,f
	movf	work+1,w
	addwf	acc+1,f

	movf	temp,w
	xorwf	acc+1,w
	andlw	0x80
	btfss	STATUS,Z
	btfss	acc+1,7
	return

	movlw	0xFF
	movwf	acc
	movlw	0x7F
	movwf	acc+1
	return
		

Sub16
	movf	work,w
	subwf	acc,f
	btfss	STATUS,C
	decf	acc+1,f
	movf	work+1,w
	subwf	acc+1,f
	return

Sub16Sat
	movf	acc+1,w
	movwf	temp

	movf	work,w
	subwf	acc,f
	btfss	STATUS,C
	decf	acc+1,f
	movf	work+1,w
	subwf	acc+1,f
	movf	temp,w
	xorwf	acc+1,w
	andlw	0x80
	btfss	STATUS,Z
	btfsc	acc+1,7
	return

	clrf	acc
	movlw	0x80
	movwf	acc+1
	return

			end				
