;------------------------------------------------------------------------------
;	FYEO
;       Frank Lyonnet 1994
;       Module YUV to RGB
;       Author : Frank Lyonnet
;------------------------------------------------------------------------------

                GET     h.ASMRegs
                GET     h.SWInames

                AREA |C$$code|, CODE, READONLY

		IMPORT	|RangeLimitTable|

Y		RN	0
U		RN	1
V		RN	2
Out		RN	3
Length		RN	4
RRBuffer	RN	5
BBBuffer	RN	6
RGBuffer	RN	7
BGBuffer	RN	8
DataY		RN	9
Data1		RN	10
Data2		RN	11
DataOut		RN	12
RangeLimit	RN	13
Cpt		RN	14

SCALEBITS       EQU     16

;------------------------------------------------------------------------------
;       yuv_to_16bpp_convert
;------------------------------------------------------------------------------
;       char * Y, char * U, char * V, char * Out, long int Length,
; 	int * RRBuffer, int * BBBuffer ,int * RGBuffer ,int * BGBuffer
;------------------------------------------------------------------------------

                EXPORT  |yuv_to_16bpp_convert|

|yuv_to_16bpp_convert|

                ;Sauve tout les regs , r13 preserve par le code
                STMFD   sp!, {r4-r12,r14}	      	;10 regs

                ;Recup des parms sur la pile
                LDR     Length,[sp,#((10)*4+0*4)]       ;Longueur ligne
                LDR     RRBuffer,[sp,#((10)*4+1*4)]     ;Pointeur table
                LDR     BBBuffer,[sp,#((10)*4+2*4)]     ;Pointeur buffer
                LDR     RGBuffer,[sp,#((10)*4+3*4)]     ;Pointeur buffer
                LDR     BGBuffer,[sp,#((10)*4+4*4)]     ;Pointeur buffer

		;Sauve la pile
                LDR     Data1,=sp_save
                STR     sp,[Data1]

		;Range
		LDR	RangeLimit,=|RangeLimitTable|
		LDR	RangeLimit,[RangeLimit]

		;Compteur a zero
		MOV	Cpt,#0

loop_16

		;Do the Red
                LDRB    DataY,[Y,Cpt]                  	;y = GETJSAMPLE(Y[Cpt])
                LDRB    Data2,[V,Cpt]             	;Data2 = cr = GETJSAMPLE(V[Cpt])
                LDR     Data1,[RRBuffer,Data2,ASL#2]    ;Data1 = RRBuffer[cr]
                ADD     Data1,Data1,DataY               ;Data1 = y + RRBuffer[cr]

		ADD	Data1,Data1,#2_100		;Arrondi
                LDRB    Data1,[RangeLimit,Data1]     	;Range limit
		MOV	Data1,Data1,LSR#3		;5 bits par comp
                MOV     DataOut,Data1             	;Red comp

		;Do the green
                LDR     Data2,[RGBuffer,Data2,ASL#2]    ;Data2 = RGBuffer[cr]
                LDRB    Data1,[U,Cpt]             	;Data1 = cb = GETJSAMPLE(U[Cpt])
                LDR     Data1,[BGBuffer,Data1,ASL#2]    ;Data1 = BGBuffer[cb]
                ADD     Data1,Data1,Data2            	;Data1 = RRBuffer[cr] + BGBuffer[cb]
                ADD     Data1,DataY,Data1,ASR#SCALEBITS ;Data1 = y + RIGHT( RRBuffer[cr] + BGBuffer[cb] )

		ADD	Data1,Data1,#2_100		;Arrondi
                LDRB    Data1,[RangeLimit,Data1]     	;Range limit
		MOV	Data1,Data1,LSR#3		;5 bits par comp
                ORR     DataOut,DataOut,Data1,LSL#5     ;Green comp

		;Do the blue
                LDRB    Data1,[U,Cpt]             	;Data1 = cb = GETJSAMPLE(U[Cpt])
                LDR     Data1,[BBBuffer,Data1,ASL#2]    ;Data1 = BBBuffer[cb]
                ADD     Data1,Data1,DataY               ;Data1 = y + BBBuffer[cb]

		ADD	Data1,Data1,#2_100		;Arrondi
                LDRB    Data1,[RangeLimit,Data1]     	;Range limit
		MOV	Data1,Data1,LSR#3		;5 bits par comp
                ORR     DataOut,DataOut,Data1,LSL#10    ;Blue comp

		;Store 16 bits result
		ADD	Data1,Out,Cpt,ASL#1		;Compute adr
		STRB	DataOut,[Data1]			;Store Low bits
		MOV	DataOut,DataOut,LSR#8		;High bits
		ADD	Data1,Data1,#1			;Compute adr
		STRB	DataOut,[Data1]			;Store High bits

		;Loop
                ADD     Cpt,Cpt,#1
                CMPS    Cpt,Length
                BLO     loop_16

		;Get back the stack
                LDR     Data1,=sp_save
                LDR     sp,[Data1]

		;Restauration contexte, retour
                LDMFD   sp!,{r4-r12,r15} ; RICK 2004/01/29 removed '^'

;------------------------------------------------------------------------------
;       yuv_to_32bpp_convert
;------------------------------------------------------------------------------
;       char * Red, char * Green, char * Blue, char * Out, long int Length,
; 	int * RRBuffer, int * BBBuffer ,int * RGBuffer ,int * BGBuffer,
;	char * RangeLimitTable
;------------------------------------------------------------------------------

                EXPORT  |yuv_to_32bpp_convert|

|yuv_to_32bpp_convert|

                ;Sauve tout les regs , r13 preserve par le code
                STMFD   sp!, {r4-r12,r14}	      	;10 regs

                ;Recup des parms sur la pile
                LDR     Length,[sp,#((10)*4+0*4)]       ;Longueur ligne
                LDR     RRBuffer,[sp,#((10)*4+1*4)]     ;Pointeur table
                LDR     BBBuffer,[sp,#((10)*4+2*4)]     ;Pointeur buffer
                LDR     RGBuffer,[sp,#((10)*4+3*4)]     ;Pointeur buffer
                LDR     BGBuffer,[sp,#((10)*4+4*4)]     ;Pointeur buffer

		;Sauve la pile
                LDR     Data1,=sp_save
                STR     sp,[Data1]

		;Range
		LDR	RangeLimit,=|RangeLimitTable|
		LDR	RangeLimit,[RangeLimit]

		;Compteur a zero
		MOV	Cpt,#0

loop_32

		;Do the Red
                LDRB    DataY,[Y,Cpt]                  	;y = GETJSAMPLE(Y[Cpt])
                LDRB    Data2,[V,Cpt]             	;Data2 = cr = GETJSAMPLE(V[Cpt])
                LDR     Data1,[RRBuffer,Data2,ASL#2]    ;Data1 = RRBuffer[cr]
                ADD     Data1,Data1,DataY               ;Data1 = y + RRBuffer[cr]

                LDRB    Data1,[RangeLimit,Data1]     	;range limit
                MOV     DataOut,Data1            	;Red comp

		;Do the green
                LDR     Data2,[RGBuffer,Data2,ASL#2]    ;Data2 = RGBuffer[cr]
                LDRB    Data1,[U,Cpt]             	;Data1 = cb = GETJSAMPLE(U[Cpt])
                LDR     Data1,[BGBuffer,Data1,ASL#2]    ;Data1 = BGBuffer[cb]
                ADD     Data1,Data1,Data2            	;Data1 = RRBuffer[cr] + BGBuffer[cb]
                ADD     Data1,DataY,Data1,ASR#SCALEBITS ;Data1 = y + RIGHT( RRBuffer[cr] + BGBuffer[cb] )

                LDRB    Data1,[RangeLimit,Data1]     	;range limit
                ORR     DataOut,DataOut,Data1,LSL#8     ;Green comp

		;Do the blue
                LDRB    Data1,[U,Cpt]             	;Data1 = cb = GETJSAMPLE(U[Cpt])
                LDR     Data1,[BBBuffer,Data1,ASL#2]    ;Data1 = BBBuffer[cb]
                ADD     Data1,Data1,DataY               ;Data1 = y + BBBuffer[cb]

                LDRB    Data1,[RangeLimit,Data1]     	;range limit
                ORR     DataOut,DataOut,Data1,LSL#16    ;Blue comp

		;Store 32 bits result

		STR	DataOut,[Out,Cpt,ASL#2]

		;Loop
                ADD     Cpt,Cpt,#1
                CMPS    Cpt,Length
                BLO     loop_32

		;Get back the stack
                LDR     Data1,=sp_save
                LDR     sp,[Data1]

		;Restauration contexte, retour
                LDMFD   sp!,{r4-r12,r15} ; RICK 2004/01/29 removed '^'

sp_save
                DCD     0

		END



