; EMERGENCY EXCUSE GENERATOR Version 1.00 2010-01-01
; http://avtanski.net/eeg

#include <p16F688.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _FCMEN_OFF)

#define CLIPPING_MIN (.85  >> 2)
#define CLIPPING_MAX (.960 >> 2)

	cblock  0x20
    DATA_HI
	DATA_LO
	TMP
	endc

	org 0x00
    goto    Start
    org 0x04
    goto    Start

Start
    ; Initialization
	banksel PORTC   ; Init ports
    clrf    PORTC
    banksel ANSEL
    movlw   b'00000001'
    movwf   ANSEL
	banksel	CMCON0
	clrf	CMCON0
    banksel TRISC
    movlw   b'00000001'
    movwf   TRISC
	banksel	0
	movlw	b'10010001'
	movwf	ADCON0
	clrf	SPBRGH
	movlw	.51
	movwf	SPBRG
	movlw	b'00000100';
	movwf	PORTC
	bcf		BAUDCTL,3
	movlw	b'00101010'
	movwf	TXSTA
	bsf		RCSTA,7
	; Start conversion
	bsf		ADCON0, 1
Loop
	; Wait for conversion to complete
	btfsc	ADCON0, 1
	goto	$-1
	banksel	ADRESH
	movf	ADRESH,W
	banksel	0
	movwf	DATA_HI
	banksel	ADRESL
	movf	ADRESL,W
	banksel	0
	movwf	DATA_LO
	banksel	ADCON0
	; Start conversion
	bsf		ADCON0, 1
	banksel 0
	; Set clipping LED
	movwf	TMP
	bcf		STATUS,C
	btfsc	DATA_HI,0
	bsf		STATUS,C
	rrf		TMP
	bcf		STATUS,C
	btfsc	DATA_HI,1
	bsf		STATUS,C
	rrf		TMP
	clrf	PORTC
	movf	TMP,w
	sublw	CLIPPING_MIN
	btfsc	STATUS,C
	bsf		PORTC,2
	movf	TMP,w
	sublw	CLIPPING_MAX
	btfss	STATUS,C
	bsf		PORTC,2
	; Wait for transmission to complete
	btfss	TXSTA,1
	goto	$-1
	; Transmit LO byte
	movf	DATA_LO,W
	movwf	TXREG
	; build CRC
	movlw	0x03
	andwf	DATA_HI,f
	movlw	0x04
	btfsc	DATA_LO,0
	xorwf	DATA_HI,f
	btfsc	DATA_LO,5
	xorwf	DATA_HI,f
	movlw	0x08
	btfsc	DATA_LO,1
	xorwf	DATA_HI,f
	btfsc	DATA_LO,6
	xorwf	DATA_HI,f
	movlw	0x10
	btfsc	DATA_LO,2
	xorwf	DATA_HI,f
	btfsc	DATA_LO,7
	xorwf	DATA_HI,f
	movlw	0x20
	btfsc	DATA_LO,3
	xorwf	DATA_HI,f
	btfsc	DATA_HI,0
	xorwf	DATA_HI,f
	movlw	0x40
	btfsc	DATA_LO,4
	xorwf	DATA_HI,f
	btfsc	DATA_HI,1
	xorwf	DATA_HI,f
	; Wait for transmission to complete
	btfss	TXSTA,1
	goto	$-1
	; Transmit HI byte
	movf	DATA_HI,W
	movwf	TXREG
	goto	Loop
	END