void Hardware::READADC_ALL(unsigned char which, unsigned char *DataArray1, unsigned char inverse, unsigned int zero, unsigned char averageval, unsigned char highspeed)
{
    asm("
                     PFX	%hi(0xFEFEFEFE)                   ; Set MASK
                     MOVI	%r10,%lo(0xFEFEFEFE)
                     PFX	%xhi(0xFEFEFEFE)
                     MOVHI	%r10,%xlo(0xFEFEFEFE)

           MOV		%l1, %r7               ; set address offset memory 2

            IFRZ    %i5                     ; highspeeed timebases?
            BR      lpr_slow                ; jump to slow tb configuration
            NOP                   									

            MOV		%l4, %i1               ; set address offset memory 2
            PFX     %hi(0x0001)
            ADDI    %l4, %lo(0x0001);
						
            MOV		%l5, %i1               ; set address offset memory 3
            PFX     %hi(0x0002)
            ADDI    %l5, %lo(0x0002);
						
            MOV		%l6, %i1               ; set address offset memory 4
            PFX     %hi(0x0003)
            ADDI    %l6, %lo(0x0003);

            BR      lpr_channel
            NOP

        lpr_slow:
            MOV		%l4, %i1               ; set address offset memory 2
            PFX     %hi(0x1000)
            ADDI    %l4, %lo(0x1000);
						
            MOV		%l5, %i1               ; set address offset memory 3
            PFX     %hi(0x2000)
            ADDI    %l5, %lo(0x2000);
						
            MOV		%l6, %i1               ; set address offset memory 4
            PFX     %hi(0x3000)
            ADDI    %l6, %lo(0x3000);

      lpr_channel:


            PFX     %hi(0x00917440)         ; load address channel
            MOVI	%l0,%lo(0x00917440)
            PFX		%xhi(0x00917440)
            MOVHI	%l0,%xlo(0x00917440)

	
        lpr1:
            LD		%l2, [%l0]
            NOT     %l2	
            ;AND		%l2,%r10
	
            ; start mem 1			
            MOV		%r0, %l2  							

            EXT8S	%r0, 0
						
            IFRZ      %i2                 ; inverting
            BR        lpr1s
            NOP						
						
            ; start inverting
						
            CMP       %r0, %i3            ; is Vnew > ZL
            IFS       cc_nc
            BR        lpr1i
            NOP						
						
            ; Vnew < ZeroLevel
						
            MOV       %r2, %i3            ; store ZeroLevel	
            SUB       %r2, %r0            ; ZL - Vnew = Vcalc0	
            ADD       %r2, %i3            ; Vcalc0 + ZL = Vcalc1
						
            PFX       %hi(255)
            CMPI      %r2, %lo(255)
            IFS       cc_nc
            PFX       %hi(255)
            MOVI      %r2, %lo(255)		
						
            MOV       %r0, %r2            ; store result
	
            BR        lpr1s
            NOP		

        lpr1i:

            MOV       %r2, %i3            ; store ZeroLevel		
            SUB       %r0, %r2            ; Vnew - ZL = Vcalc0		
            SUB       %r2, %r0            ; ZL - Vcalc0 = Vcalc1
            IFS       cc_v		
            PFX       %hi(0)
            MOVI      %r2, %lo(0)	
	
            MOV       %r0, %r2            ; store result

            ; end inverting		

						
        lpr1s:
      						
            IFRZ      %i4                 ; is average = 0
            BR        lpr1e
            NOP						
	
            ; start averaging

            LD        %l7, [%i1]          ; save old value
            EXT8D     %l7, %i1            ; extract byte

            CMP       %r0, %l7
            IFS       cc_nc
            BR        lpr1a						
            NOP
						
            ; Vnew < ZL

            MOV       %r2, %l7            ; store Vold	
            SUB       %r2, %r0            ; Vold - Vnew = Vcalc0
            LSR       %r2, %i4            ; Vcalc0 >> avg = Vcalc1
            SUB       %l7, %r2            ; Vold - Vcalc1 = Vcalc2

            MOV       %r0, %l7            ; store result in r0

            BR        lpr1e
            NOP	
						
        lpr1a:

            ; Vnew > ZL
						
            MOV       %r2, %r0            ; store Vnew	
            SUB       %r2, %l7            ; Vnew - Vold = Vcalc0
            LSR       %r2, %i4            ; Vcalc0 >> avg = Vcalc1	
            ADD       %l7, %r2            ; Vold + Vcalc1 = Vcalc2

            MOV       %r0, %l7            ; store result in r0
						
        lpr1e:							
            SUB     %r0, %r3	

            IFS     cc_n
            PFX     %hi(0)
            MOVI    %r0, %lo(0)	
						
            FILL8	%r0, %r0
            ST8D	[%i1], %r0
					
            ; start mem 2		
            MOV		%r0, %l2  

            EXT8S	%r0, 1
						
            IFRZ      %i2                 ; inverting
            BR        lpr2s
            NOP						
						
            ; start inverting
						
            CMP       %r0, %i3            ; is Vnew > ZL
            IFS       cc_nc
            BR        lpr2i
            NOP						
						
            ; Vnew < ZeroLevel
						
            MOV       %r2, %i3            ; store ZeroLevel		
            SUB       %r2, %r0            ; ZL - Vnew = Vcalc0		
            ADD       %r2, %i3            ; Vcalc0 + ZL = Vcalc1
						
            PFX       %hi(255)
            CMPI      %r2, %lo(255)
            IFS       cc_nc
            PFX       %hi(255)
            MOVI      %r2, %lo(255)		
						
            MOV       %r0, %r2            ; store result
	
            BR        lpr2s
            NOP			
						
        lpr2i:

            MOV       %r2, %i3            ; store ZeroLevel		
            SUB       %r0, %r2            ; Vnew - ZL = Vcalc0			
            SUB       %r2, %r0            ; ZL - Vcalc0 = Vcalc1
            IFS       cc_v		
            PFX       %hi(255)
            MOVI      %r2, %lo(255)		
						
            MOV       %r0, %r2            ; store result

            ; end inverting		
						
						
        lpr2s:
	
            IFRZ      %i4                 ; is average = 0
            BR        lpr2e
            NOP						
	
            ; start averaging

            LD        %l7, [%l4]          ; save old value
            EXT8D     %l7, %l4            ; extract byte

            CMP       %r0, %l7
            IFS       cc_nc
            BR        lpr2a						
            NOP
						
            ; Vnew < ZL

            MOV       %r2, %l7            ; store Vold	
            SUB       %r2, %r0            ; Vold - Vnew = Vcalc0
            LSR       %r2, %i4            ; Vcalc0 >> avg = Vcalc1
            SUB       %l7, %r2            ; Vold - Vcalc1 = Vcalc2

            MOV       %r0, %l7            ; store result in r0

            BR        lpr2e
            NOP	
						
        lpr2a:
                	
            ; Vnew > ZL
						
            MOV       %r2, %r0            ; store Vnew	
            SUB       %r2, %l7            ; Vnew - Vold = Vcalc0
            LSR       %r2, %i4            ; Vcalc0 >> avg = Vcalc1						
            ADD       %l7, %r2            ; Vold + Vcalc1 = Vcalc2

            MOV       %r0, %l7            ; store result in r0
						
        lpr2e:							
			SUB     %r0, %r4
			
            IFS     cc_n
            PFX     %hi(0)
            MOVI    %r0, %lo(0)			
            			
            FILL8	%r0, %r0
            ST8D	[%l4], %r0

            ; start mem 3								
            MOV     %r0, %l2  							

            EXT8S	%r0, 2
						
            IFRZ    %i2                 ; inverting
            BR      lpr3s
            NOP						
						
            ; start inverting
						
            CMP       %r0, %i3            ; is Vnew > ZL
            IFS       cc_nc
            BR        lpr3i
            NOP						
						
            ; Vnew < ZeroLevel
						
            MOV       %r2, %i3            ; store ZeroLevel							
            SUB       %r2, %r0            ; ZL - Vnew = Vcalc0						
            ADD       %r2, %i3            ; Vcalc0 + ZL = Vcalc1
						
            PFX       %hi(255)
            CMPI      %r2, %lo(255)
            IFS       cc_nc
            PFX       %hi(255)
            MOVI      %r2, %lo(255)		
						
            MOV       %r0, %r2            ; store result
                        						
            BR        lpr3s
            NOP								
						
        lpr3i:

            MOV       %r2, %i3            ; store ZeroLevel							
            SUB       %r0, %r2            ; Vnew - ZL = Vcalc0						
            SUB       %r2, %r0            ; ZL - Vcalc0 = Vcalc1
            IFS       cc_v						
            PFX       %hi(255)
            MOVI      %r2, %lo(255)								
						
            MOV       %r0, %r2            ; store result

            ; end inverting						
						
						
        lpr3s:
                    						
            IFRZ      %i4                 ; is average = 0
            BR        lpr3e
            NOP						
	
            ; start averaging

            LD        %l7, [%l5]          ; save old value
            EXT8D     %l7, %l5            ; extract byte

            CMP       %r0, %l7
            IFS       cc_nc
            BR        lpr3a						
            NOP
						
            ; Vnew < ZL

            MOV       %r2, %l7            ; store Vold	
            SUB       %r2, %r0            ; Vold - Vnew = Vcalc0
            LSR       %r2, %i4            ; Vcalc0 >> avg = Vcalc1
            SUB       %l7, %r2            ; Vold - Vcalc1 = Vcalc2

            MOV       %r0, %l7            ; store result in r0

            BR        lpr3e
            NOP	
						
        lpr3a:
                	
            ; Vnew > ZL
						
            MOV       %r2, %r0            ; store Vnew	
            SUB       %r2, %l7            ; Vnew - Vold = Vcalc0
            LSR       %r2, %i4            ; Vcalc0 >> avg = Vcalc1						
            ADD       %l7, %r2            ; Vold + Vcalc1 = Vcalc2

            MOV       %r0, %l7            ; store result in r0
						
        lpr3e:							
            SUB     %r0, %r5

            IFS     cc_n
            PFX     %hi(0)
            MOVI    %r0, %lo(0)	
						
            FILL8	%r0, %r0
            ST8D	[%l5], %r0
						
            ; start mem 4								
            MOV		%r0, %l2  							

            EXT8S	%r0, 3
						
            IFRZ      %i2                 ; inverting
            BR        lpr4s
            NOP						
						
            ; start inverting
						
            CMP       %r0, %i3            ; is Vnew > ZL
            IFS       cc_nc
            BR        lpr4i
            NOP						
						
            ; Vnew < ZeroLevel
						
            MOV       %r2, %i3            ; store ZeroLevel							
            SUB       %r2, %r0            ; ZL - Vnew = Vcalc0						
            ADD       %r2, %i3            ; Vcalc0 + ZL = Vcalc1
						
            PFX       %hi(255)
            CMPI      %r2, %lo(255)
            IFS       cc_nc
            PFX       %hi(255)
            MOVI      %r2, %lo(255)	; (0) ???	
						
            MOV       %r0, %r2            ; store result
                        						
            BR        lpr4s
            NOP								
						
        lpr4i:

            MOV       %r2, %i3            ; store ZeroLevel							
            SUB       %r0, %r2            ; Vnew - ZL = Vcalc0						
            SUB       %r2, %r0            ; ZL - Vcalc0 = Vcalc1
            IFS       cc_v						
            PFX       %hi(255)
            MOVI      %r2, %lo(255)								
						
            MOV       %r0, %r2            ; store result

            ; end inverting						
						
						
        lpr4s:
                    						
            IFRZ      %i4                 ; is average = 0
            BR        lpr4e
            NOP						
	
            ; start averaging

            LD        %l7, [%l6]          ; save old value
            EXT8D     %l7, %l6            ; extract byte

            CMP       %r0, %l7
            IFS       cc_nc
            BR        lpr4a						
            NOP
						
            ; Vnew < ZL

            MOV       %r2, %l7            ; store Vold	
            SUB       %r2, %r0            ; Vold - Vnew = Vcalc0
            LSR       %r2, %i4            ; Vcalc0 >> avg = Vcalc1
            SUB       %l7, %r2            ; Vold - Vcalc1 = Vcalc2

            MOV       %r0, %l7            ; store result in r0

            BR        lpr4e
            NOP	
						
        lpr4a:
                	
            ; Vnew > ZL
						
            MOV       %r2, %r0            ; store Vnew	
            SUB       %r2, %l7            ; Vnew - Vold = Vcalc0
            LSR       %r2, %i4            ; Vcalc0 >> avg = Vcalc1						
            ADD       %l7, %r2            ; Vold + Vcalc1 = Vcalc2

            MOV       %r0, %l7            ; store result in r0
						
        lpr4e:							
			SUB     %r0, %r6
			
            IFS     cc_n
            PFX     %hi(0)
            MOVI    %r0, %lo(0)			
            			
            FILL8	%r0, %r0
            ST8D	[%l6], %r0


            ADDI   %l0, 4                            ; Add Address Counter

            IFRZ    %i5                     ; highspeeed timebases?
            BR      lpr_slow_ac             ; jump to slow address calculaten
            NOP
						
            ; calc new adresses
            ADDI   %i1, 4                            ; Add Address Counter
            ADDI   %l4, 4                            ; Add Address Counter
            ADDI   %l5, 4                            ; Add Address Counter
            ADDI   %l6, 4                            ; Add Address Counter
                        	
            SUBI   %l1, 1                            ; Decrement Line Counter
            SKPS   cc_z
            BR     lpr1	
            NOP	

            BR     lprend
            NOP	


        lpr_slow_ac:
            ; calc new adresses
            ADDI   %i1, 1                            ; Add Address Counter
            ADDI   %l4, 1                            ; Add Address Counter
            ADDI   %l5, 1                            ; Add Address Counter
            ADDI   %l6, 1                            ; Add Address Counter
                        	
            SUBI   %l1, 1                            ; Decrement Line Counter
            SKPS   cc_z
            BR     lpr1	
            NOP

        lprend:					
							
    ");
}