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

                GET     h.ASMRegs
                GET     h.SWInames

                AREA |C$$code|, CODE, READONLY

;------------------------------------------------------------------------------
;       rgb_to_gcol_convert_floyd
;------------------------------------------------------------------------------
;       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
;       parametre no 7 : pointeur vers le buffer
;------------------------------------------------------------------------------

AROND   EQU     0
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
EPT     RN      13
TMP     RN      14

                EXPORT  |rgb_to_gcol_convert_floyd|
|rgb_to_gcol_convert_floyd|
                STMFD   sp!, {r4-r12,r14}

                LDR LON,[sp,#((10)*4)]        ;Longueur ligne
                LDR TBL,[sp,#((10)*4+4)]      ;Pointeur table
                LDR EBL,[sp,#((10)*4+4+4)]    ;Pointeur buffer
FLOYD
                LDR ERD,=STORETBL
                STR TBL,[ERD]

                LDR ERD,=STOREBUF
                STR EBL,[ERD]

                LDR ERD,=RET14
                STR r14,[ERD]

                LDR ERD,=RET13
                STR r13,[ERD]

                MOV EPT,EBL

                LDRB ERD,[EPT]
                LDRB TMP,[EPT,#3]
                ADD ERD,ERD,TMP
                LDRB EGR,[EPT,#1]
                LDRB TMP,[EPT,#4]
                ADD EGR,EGR,TMP
                LDRB EBL,[EPT,#2]
                LDRB TMP,[EPT,#5]
                ADD EBL,EBL,TMP

                MOV ERD,ERD,LSL#24
                MOV ERD,ERD,ASR#24
                MOV EGR,EGR,LSL#24
                MOV EGR,EGR,ASR#24
                MOV EBL,EBL,LSL#24
                MOV EBL,EBL,ASR#24

                MOV TMP,#0
                STRB TMP,[EPT]
                STRB TMP,[EPT,#1]
                STRB TMP,[EPT,#2]
                STRB TMP,[EPT,#3]
                STRB TMP,[EPT,#4]
                STRB TMP,[EPT,#5]

                LDR RD,=STORETBL
                LDR TBL,[RD]


AFFF            LDRB RD,[ARD],#PAS
                ADDS RD,RD,ERD
                MOVMI RD,#0
                CMP RD,#255
                MOVGT RD,#255
                ADD ERD,RD,#AROND
                CMP ERD,#255
                MOVGT ERD,#255

                LDRB GR,[AGR],#PAS
                ADDS GR,GR,EGR
                MOVMI GR,#0
                CMP GR,#255
                MOVGT GR,#255
                ADD EGR,GR,#AROND
                CMP EGR,#255
                MOVGT EGR,#255

                LDRB BL,[ABL],#PAS
                ADDS BL,BL,EBL
                MOVMI BL,#0
                CMP BL,#255
                MOVGT BL,#255
                ADD EBL,BL,#AROND
                CMP EBL,#255
                MOVGT EBL,#255

                MOV EGR,EGR,LSR#3
                MOV ERD,ERD,LSR#3
                ADD ERD,EGR,ERD,LSL#5
                ADD ERD,TBL,ERD,LSL#5
                LDRB COL,[ERD,EBL,LSR#3]

                STRB COL,[DST],#1

                AND EBL,COL,#3
                ADD EBL,EBL,EBL,LSL#4
                SUB ERD,RD,EBL
                SUB EGR,GR,EBL
                SUB EBL,BL,EBL

                TST COL,#128
                SUBNE EBL,EBL,#8*(1+16)
                TST COL,#64
                SUBNE EGR,EGR,#8*(1+16)
                TST COL,#32
                SUBNE EGR,EGR,#4*(1+16)
                TST COL,#16
                SUBNE ERD,ERD,#8*(1+16)
                TST COL,#8
                SUBNE EBL,EBL,#4*(1+16)
                TST COL,#4
                SUBNE ERD,ERD,#4*(1+16)

                ;ROUGE

                ADD COL,ERD,ERD,LSL#1  ; 3*
                SUB TMP,ERD,COL,ASR#4
                LDRB RD,[EPT]
                ADD RD,RD,COL,ASR#4
                STRB RD,[EPT]

                ADD COL,ERD,ERD,LSL#2  ; 5*
                SUB TMP,TMP,COL,ASR#4
                LDRB RD,[EPT,#3]
                ADD RD,RD,COL,ASR#4
                STRB RD,[EPT,#3]

                RSB ERD,ERD,ERD,LSL#3
                SUB TMP,TMP,ERD,ASR#4
                LDRB COL,[EPT,#6]
                MOV COL,COL,LSL#24
                MOV COL,COL,ASR#24
                ADD ERD,COL,ERD,ASR#4
                STRB TMP,[EPT,#6]

                ;GREEN

                ADD COL,EGR,EGR,LSL#1  ; 3*
                SUB TMP,EGR,COL,ASR#4
                LDRB RD,[EPT,#1]
                ADD RD,RD,COL,ASR#4
                STRB RD,[EPT,#1]

                ADD COL,EGR,EGR,LSL#2  ; 5*
                SUB TMP,TMP,COL,ASR#4
                LDRB RD,[EPT,#4]
                ADD RD,RD,COL,ASR#4
                STRB RD,[EPT,#4]

                RSB EGR,EGR,EGR,LSL#3
                SUB TMP,TMP,EGR,ASR#4
                LDRB COL,[EPT,#7]
                MOV COL,COL,LSL#24
                MOV COL,COL,ASR#24
                ADD EGR,COL,EGR,ASR#4
                STRB TMP,[EPT,#7]

                ;BLEU

                ADD COL,EBL,EBL,LSL#1  ; 3*
                SUB TMP,EBL,COL,ASR#4
                LDRB RD,[EPT,#2]
                ADD RD,RD,COL,ASR#4
                STRB RD,[EPT,#2]

                ADD COL,EBL,EBL,LSL#2  ; 5*
                SUB TMP,TMP,COL,ASR#4
                LDRB RD,[EPT,#5]
                ADD RD,RD,COL,ASR#4
                STRB RD,[EPT,#5]

                RSB EBL,EBL,EBL,LSL#3
                SUB TMP,TMP,EBL,ASR#4
                LDRB COL,[EPT,#8]
                MOV COL,COL,LSL#24
                MOV COL,COL,ASR#24
                ADD EBL,COL,ERD,ASR#4
                STRB TMP,[EPT,#8]

                ADD EPT,EPT,#3
                SUBS LON,LON,#1
                BNE AFFF

                LDR DST,=RET14
                LDR r14,[DST]
                LDR DST,=RET13
                LDR r13,[DST]

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

                EXPORT  |init_rgb_to_gcol_convert|

|init_rgb_to_gcol_convert|

                STMFD   sp!, {r0-r12,r14}

                MOV DST,r0
                MOV LON,r1
                MOV RD,#0

NUL             STRB RD,[DST],#1
                STRB RD,[DST],#1
                STRB RD,[DST],#1
                SUBS LON,LON,#1
                BNE NUL

                LDMFD   sp!, {r0-r12,r15} ; RICK 2004/01/29 removed '^'


                AREA |C$$data|

RET13           DCD 0
RET14           DCD 0
STORETBL        DCD 0
STOREBUF        DCD 0

                END
