;------------------------------------------------------------------------------
;       FYEO
;       Frank Lyonnet 1993
;       Fonctions de conversion de couleur
;       Author : Frederic Elisei
;------------------------------------------------------------------------------

                GET     h.ASMRegs
                GET     h.SWInames

                AREA |C$$code|, CODE, READONLY

;------------------------------------------------------------------------------
;       yuv_to_gcol_convert_simple
;------------------------------------------------------------------------------
;       parametre no 1 : pointeur vers le rouge
;       parametre no 2 : pointeur vers le vert
;       parametre no 3 : pointeur vers le bleu
;       parametre no 4 : pointeur vers le resultat
;       parametre no 5 : longueur d'une ligne
;       parametre no 6 : pointeur vers la table de dithering
;------------------------------------------------------------------------------

PAS     EQU     1

ARD     RN      0
AGR     RN      1
ABL     RN      2
DST     RN      3
LON     RN      4
RD      RN      5
GR      RN      6
BL      RN      7
COL     RN      8
ERD     RN      9
EGR     RN      10
EBL     RN      11
TBL     RN      12

                EXPORT  |yuv_to_gcol_convert_simple|
|yuv_to_gcol_convert_simple|

                STMFD   sp!, {r4-r12}

                ;Recup des parms sur la pile
                LDR     LON,[sp,#((9)*4)]            ;Longueur ligne
                LDR     TBL,[sp,#((9)*4+4)]          ;Pointeur table

                MOV     ERD,#0
                MOV     EGR,#0
                MOV     EBL,#0

AFFF            LDRB    RD,[ARD],#PAS                   ;RD = Red[i++]
                ADDS    RD,RD,ERD                       ;RD = Red[i] + CurErrRed
                MOVMI   RD,#0
                CMP     RD,#255
                MOVGT   RD,#255                         ;range_limiting(0,255)

                LDRB    GR,[AGR],#PAS                   ;GR = Green[i++]
                ADDS    GR,GR,EGR                       ;GR = Green[i] + CurErrGreen
                MOVMI   GR,#0
                CMP     GR,#255
                MOVGT   GR,#255                         ;range_limiting(0,255)

                LDRB    BL,[ABL],#PAS                   ;BL = Blue[i++]
                ADDS    BL,BL,EBL                       ;BL = Blue[i] + CurErrBlue
                MOVMI   BL,#0
                CMP     BL,#255
                MOVGT   BL,#255                         ;range_limiting(0,255)

                ADD     ERD,RD,#8
                CMP     ERD,#255
                MOVGT   ERD,#255                        ;Arrondi au 4e bit
                ADD     EGR,GR,#8
                CMP     EGR,#255
                MOVGT   EGR,#255                        ;Arrondi au 4e bit
                ADD     EBL,BL,#8
                CMP     EBL,#255
                MOVGT   EBL,#255                        ;Arrondi au 4e bit

                AND     ERD,ERD,#&F0                    ;Calcul index table
                MOV     EBL,EBL,LSR#4                   ;4 bit Red, 4 bit Green, 4 bit Blue
                ADD     ERD,ERD,EGR,LSR#4               ;0-3 = blue, 4-7 = green, 8-11 = red
                ADD     ERD,TBL,ERD,LSL#6               ;En 2 temps
                LDR     COL,[ERD,EBL,LSL#2]             ;Tableau de mot de 32 bits, 0-7 = couleur

                STRB    COL,[DST],#1                    ;Out[i++] = GCOL

                SUB     ERD,RD,COL,LSR#24               ;Le mot contient les vrai couleurs
                MOV     COL,COL,LSL#8                   ;Calcul des nouvelles erreurs
                SUB     EGR,GR,COL,LSR#24               ;Red,Green,Blue
                MOV     COL,COL,LSL#8
                SUB     EBL,BL,COL,LSR#24

                SUBS    LON,LON,#PAS
                BNE     AFFF

                LDMFD   sp!, {r4-r12}
                MOV     pc,lr ; RICK 2004/01/29 changed 'MOVS' to 'MOV'

                END
