OK Adam, you asked for it... here it is... quickly thrown together for an 18F2420... (you can probably optimise it with a bit of thought, but it's a starter just to get going)...

The variables...
Code:
	ADCValue var WORD			' Final ADC Result
	CounterA var BYTE			' Just a BYTE Temporary working variable
	DataW var WORD				' Just a WORD Temporary working variable
	RawData var WORD [16]			' Array holding ADC Result
Some Initialisation Set-up's for the PIC....
Code:
	ADCON1=%00001110			' ADC Control 1
						' 	7=0 - 0 Unused
						' 	6=0 - 0 Unused
						' 	5=0 - VRef=Vss
						' 	4=0 - VRef=Vdd
						' 	3=1 )
						' 	2=1 ) RA0 set to Analogue
						' 	1=1 ) All others set to Digital
						'	0=0 )
	ADCON2=%10101001			' ADC Control 2
						' 	7=1 - Right Justified - Read 10-Bits
						' 	6=0 - 0 Unused
						' 	5=1 )
						' 	4=0 ) TAD
						' 	3=1 )
						' 	2=0 )
						' 	1=0 ) Fosc/8
						'	0=1 )
Now for the real program... First TAKE your SAMPLES...
Code:
		'
		'	Stuff 16 Element WORD Array full of ADC values
		'	----------------------------------------------
	For CounterA=0 to 15
		ADCON0=%00000001		' Select Channel, Turn-On A/D
						'	7=0 Unused
						'	6=0 Unused
						'	5=0 )
						'	4=0 )
						'	3=0 ) selects AN0
						'	2=0 )
						'	1=0 Go-done Bit
						'	0=1 switch-On ADC Module
		Pauseus 50			' Wait for channel to setup
	        ADCON0.1 = 1			' Start conversion
		While ADCON0.1=1:Wend		' Wait for conversion
		DataW.HighByte=ADRESH		' Read variable from ADC and save
		DataW.LowByte=ADRESL
		RawData(CounterA)=DataW
		Next CounterA
Then SORT your RESULTS...
Code:
		'
		'	Sort ADC Input
		'	--------------
	CounterA=0
GetADCSortLoop:
	If RawData(CounterA+1) < RawData(CounterA) then
		DataW=RawData(CounterA)
		RawData(CounterA)=RawData(CounterA+1)
		RawData(CounterA+1)=DataW
		If CounterA>0 then CounterA=CounterA-2
		endif
	CounterA=CounterA+1
	If CounterA<15 then goto GetADCSortLoop
Finally EXTRACT SOMETHING USEFUL from what you've got...
Code:
	'
	'	Quanticise discarding top and bottom FOUR elements
	'	----------------------------------------------------
	DataW=0
	For CounterA=4 to 11
		DataW=DataW+RawData(CounterA)
		Next CounterA
	ADCValue=DataW>>3			' Divide Result by EIGHT
Ain't so difficult when you break it down into little steps is it?