***************
*** RGB2VHS ***
***************

; be: d0-R, d1-G, d2-B
; ki: d0-V, d1-H, d2-S

CLEAR   MACRO           ; ez a makró egy regiszter felső word-jét törli
        swap    \1
        clr.w   \1
        swap    \1
        ENDM

RGB2VHS:
        tst.w   d0
        bne.s   rb
        tst.w   d1
        bne.s   rb
        tst.w   d2
        bne.s   rb
        rts                             ; ha mind nulla, a VHS is nulla
; ide jön vissza, a konvertálás után
ret:    cmp.w   #360,d5                 ; túlcsorogtunk?
        blt.s   rxw                     ; ha nem, ugrunk
        sub.w   #360,d5                 ; ha igen, korrigálunk
rxw:    move.l  d3,d2   ; S             ; értékek a kívánt regiszterekbe
        move.l  d5,d1   ; H
        move.l  d4,d0   ; V
        movem.l (sp)+,d3-a2
        rts                             ; EXIT
; itt kezdődik a konvertálás
rb:     movem.l d3-a2,-(sp)
        lea     cmax(pc),a0             ; pointerek inicializálása
        lea     cmin(pc),a1
        lea     dist(pc),a2
        moveq   #9,d7                   ; ez a rotáláshoz kell
; V meghatarozása
        moveq   #0,d3                   ; max
        cmp.w   d0,d3
        bgt.s   R_W0
        move.w  d0,d3
R_W0:   cmp.w   d1,d3
        bgt.s   R_W1
        move.w  d1,d3
R_W1:   cmp.w   d2,d3
        bgt.s   R_W2
        move.w  d2,d3
; most a legnagyobb színösszetevő a d3-ban van
R_W2:   move.w  d3,(a0)                 ; eltároljuk a későbbi számításokhoz
        move.l  d3,d4
        muls    #100,d4
        lsr.l   #8,d4                   ; V a d4-ben
; S meghatározása
        move.l  d3,d5
        cmp.w   d0,d5
        blt.s   R_W3
        move.w  d0,d5
R_W3:   cmp.w   d1,d5
        blt.s   R_W4
        move.w  d1,d5
R_W4:   cmp.w   d2,d5
        blt.s   R_W5
        move.w  d2,d5
; most a legkisebb színösszetevő a  d5-ben van
R_W5:   move.w  d5,(a1)                 ; eltároljuk a későbbi számításokhoz
        sub.w   d5,d3                   ; max-min
        move.w  d3,(a2)                 ; ez is kell kesőbb
        muls    #100,d3
        divs    (a0),d3                 ; S a d3-ban
        CLEAR   d3
; H meghatározása
        pea     ret(pc)                 ; beállítjuk, hova menjünk vissza
; megnézzük, hogy szürke-e, mert akkor a H = 0.
        cmp.w   d0,d1
        bne.s   RW6
        cmp.w   d0,d2
        bne.s   RW6
        moveq   #0,d5
        rts
; megnézzük, hogy nulla e a zöld, és a kék, mert akkor a H = 0.
RW6:    tst.w   d1
        bne.s   RW7
        tst.w   d2
        bne.s   RW7
        moveq   #0,d5
        rts
RW7:    move.l  #60*512,d5
        move.l  #60*512,d6
; minden oké, lehet számolni.
        divs    (a2),d5
        CLEAR   d5
        divs    (a2),d6
        CLEAR   d6
; most jönnek a különböző esetek vizsgálatai.
        cmp.w   (a0),d0
        beq.s   rmax
        cmp.w   (a1),d0
        beq.s   rmin
        cmp.w   (a0),d1
        beq.s   gmaxbmin
; gmaxrmin
        sub.w   (a1),d0
        muls    d0,d5
        lsr.l   d7,d5
        add.w   #240,d5
        rts
gmaxbmin:
        sub.w   (a1),d0
        muls    d0,d6
        lsr.l   d7,d6
        move.w  #120,d5
        sub.w   d6,d5
        rts
rmin:   cmp.w   (a0),d1
        beq.s   rmingmax
        cmp.w   (a0),d2
        beq.s   rminbmax
        move.w  #180,d5
        rts
rminbmax:       
        sub.w   (a1),d1
        muls    d1,d6
        lsr.w   d7,d6
        move.w  #240,d5
        sub.w   d6,d5
        rts
rmingmax:
        sub.w   (a1),d2
        muls    d2,d5
        lsr.w   d7,d5
        add.w   #120,d5
        rts     
rmax:   cmp.w   (a1),d1
        beq.s   rmaxgmin
        cmp.w   (a1),d2
        beq.s   rmaxbmin
        moveq   #0,d5
        rts
rmaxbmin:
        sub.w   (a1),d1
        muls    d1,d5
        lsr.w   d7,d5
        rts
rmaxgmin:
        sub.w   (a1),d2
        muls    d2,d6
        lsr.w   d7,d6
        move.w  #360,d5
        sub.w   d6,d5
        rts
cmin:   dc.w    0
cmax:   dc.w    0
dist:   dc.w    0
