**
**	PhotoworX - Ein Softwarepaket zur Bearbeitung
**                  von Kodak Photo-CDs
**
**	Copyright © 1993-1995 by Corporate Media GmbH
**	Geschrieben von Olaf Barthel
**

	section	text,code

MODIFY_RED6	EQU	$20
MODIFY_GREEN6	EQU	$30
MODIFY_BLUE6	EQU	$10
SHIFT_HAM6	EQU	4

MODIFY_RED8	EQU	$80
MODIFY_GREEN8	EQU	$C0
MODIFY_BLUE8	EQU	$40
SHIFT_HAM8	EQU	2

LastR		EQU	0
LastG		EQU	2
LastB		EQU	4

	;	VOID __asm CreateHAM6Line(	register __a0 UBYTE *R,
	;					register __a1 UBYTE *G,
	;					register __a2 UBYTE *B,
	;					register __a3 UBYTE *Line,
	;					register __d3 LONG PixelPlus,
	;					register __d4 WORD Width);

	xdef	_CreateHAM6Line

_CreateHAM6Line:

	movem.l	d2/d5/d6/d7/a5/a4/a6,-(sp)
	subq.l	#8,sp

	lea.l	Red(pc),a4
	lea.l	Green(pc),a5
	lea.l	Blue(pc),a6

	subq.w	#1,d4			; Abziehen für DBRA

	moveq	#0,d0			; D0 löschen
	move.l	d0,d1			; D1 löschen
	move.l	d1,d2			; D2 löschen
	move.l	d2,d5			; D5 löschen

	move.w	d0,LastR(sp)		; Anfangswerte löschen
	move.w	d1,LastG(sp)
	move.w	d2,LastB(sp)

1$	move.b	(a0),d0			; R holen
	lsr.w	#SHIFT_HAM6,d0
	move.b	(a1),d1			; G holen
	lsr.w	#SHIFT_HAM6,d1
	move.b	(a2),d2			; B holen
	lsr.w	#SHIFT_HAM6,d2

	move.b	0(a4,d0.w),d5
	add.b	0(a5,d1.w),d5
	add.b	0(a6,d2.w),d5

	move.w	d5,d7			; DeltaL = L
	sub.w	d0,d7			; DeltaL = L - R
	bpl.b	2$
	neg.w	d7

2$	move.w	d5,d6			; D6 = L
	sub.w	d1,d6			; D6 = L - G
	bpl.b	3$
	neg.w	d6

3$	add.w	d6,d7			; DeltaL = abs(L - R) + abs(L - G)
	move.w	d5,d6			; D6 = L
	sub.w	d2,d6			; D6 = L - B
	bpl.b	4$
	neg.w	d6

4$	add.w	d6,d7			; DeltaL = abs(L - R) + abs(L - G) + abs(L - B)

	sub.w	LastR(sp),d0		; R = abs(R - LastR)
	bpl.b	5$
	neg.w	d0

5$	sub.w	LastG(sp),d1		; G = abs(G - LastG)
	bpl.b	6$
	neg.w	d1

6$	sub.w	LastB(sp),d2		; B = abs(B - LastB)
	bpl.b	7$
	neg.w	d2

7$	move.w	d1,d6			; G + B = DeltaR
	add.w	d2,d6
	swap	d6

	move.w	d0,d6			; R + B = DeltaG
	add.w	d2,d6

	move.w	d0,d2			; R + G = DeltaB
	add.w	d1,d2			; B = DeltaB

	move.w	d6,d1			; G = DeltaG
	swap	d6
	move.w	d6,d0			; R = DeltaR

	cmp.w	d0,d7			; DeltaR >= DeltaL?
	bge.b	8$
	cmp.w	d1,d7			; DeltaG >= DeltaL?
	bge.b	8$
	cmp.w	d2,d7			; DeltaB >= DeltaL?
	bge.b	8$

	move.w	d5,LastR(sp)		; LastR = L
	move.w	d5,LastG(sp)		; LastG = L
	move.w	d5,LastB(sp)		; LastB = L

	move.b	d5,(a3)+		; Wert merken

	add.l	d3,a0			; Zum nächsten Pixel springen
	add.l	d3,a1
	add.l	d3,a2

	dbra	d4,1$

	addq.l	#8,sp
	movem.l	(sp)+,d2/d5/d6/d7/a4/a5/a6
	rts

8$	cmp.w	d1,d0			; r < g?
	blt.b	9$

	cmp.w	d1,d2			; b < g?
	blt.b	10$

	move.b	(a1),d1			; G holen
	lsr.w	#SHIFT_HAM6,d1		; Verschieben
	move.w	d1,LastG(sp)		; Merken
	ori.w	#MODIFY_GREEN6,d1	; Modifier eintragen
	move.b	d1,(a3)+		; Wert merken

	add.l	d3,a0			; Zum nächsten Pixel springen
	add.l	d3,a1
	add.l	d3,a2

	dbra	d4,1$

	addq.l	#8,sp
	movem.l	(sp)+,d2/d5/d6/d7/a4/a5/a6
	rts

10$	move.b	(a2),d2			; B holen
	lsr.w	#SHIFT_HAM6,d2		; Verschieben
	move.w	d2,LastB(sp)		; Merken
	ori.w	#MODIFY_BLUE6,d2	; Modifier eintragen
	move.b	d2,(a3)+		; Wert merken

	add.l	d3,a0			; Zum nächsten Pixel springen
	add.l	d3,a1
	add.l	d3,a2

	dbra	d4,1$

	addq.l	#8,sp
	movem.l	(sp)+,d2/d5/d6/d7/a4/a5/a6
	rts

9$	cmp.w	d0,d2			; b < r?
	blt.b	10$

	move.b	(a0),d0			; R holen
	lsr.w	#SHIFT_HAM6,d0		; Verschieben
	move.w	d0,LastR(sp)		; Merken
	ori.w	#MODIFY_RED6,d0		; Modifier eintragen
	move.b	d0,(a3)+		; Wert merken

	add.l	d3,a0			; Zum nächsten Pixel springen
	add.l	d3,a1
	add.l	d3,a2

	dbra	d4,1$

	addq.l	#8,sp
	movem.l	(sp)+,d2/d5/d6/d7/a4/a5/a6
	rts

********************************************************************************

Red:	dc.b	$00,$00,$00,$00,$01,$01,$01,$02,$02,$02,$02,$03,$03,$03,$04,$04
	dc.b	$04,$05,$05,$05,$05,$06,$06,$06,$07,$07,$07,$08,$08,$08,$08,$09
	dc.b	$09,$09,$0A,$0A,$0A,$0B,$0B,$0B,$0B,$0C,$0C,$0C,$0D,$0D,$0D,$0E
	dc.b	$0E,$0E,$0E,$0F,$0F,$0F,$10,$10,$10,$11,$11,$11,$11,$12,$12,$12

Green:	dc.b	$00,$01,$02,$03,$03,$04,$05,$05,$06,$06,$07,$07,$08,$09,$09,$0A
	dc.b	$0B,$0B,$0B,$0C,$0D,$0D,$0E,$0F,$0F,$10,$11,$10,$11,$12,$13,$13
	dc.b	$14,$15,$15,$16,$16,$16,$17,$18,$19,$19,$1A,$1B,$1A,$1B,$1C,$1C
	dc.b	$1D,$1E,$1F,$1F,$20,$20,$20,$21,$22,$22,$23,$24,$25,$25,$25,$26

Blue:	dc.b	$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01,$01,$01
	dc.b	$01,$01,$02,$02,$02,$02,$02,$02,$02,$02,$02,$03,$03,$03,$03,$03
	dc.b	$03,$03,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04,$05,$05,$05,$05
	dc.b	$05,$05,$05,$05,$05,$06,$06,$06,$06,$06,$06,$06,$06,$06,$07,$07

********************************************************************************

	;	VOID __asm CreateHAM8Line(	register __a0 UBYTE *R,
	;					register __a1 UBYTE *G,
	;					register __a2 UBYTE *B,
	;					register __a3 UBYTE *Line,
	;					register __d3 LONG PixelPlus,
	;					register __d4 WORD Width);

	xdef	_CreateHAM8Line

_CreateHAM8Line:

	movem.l	d2/d5/d6/d7/a4/a5/a6,-(sp)
	subq.l	#8,sp

	lea.l	Red(pc),a4
	lea.l	Green(pc),a5
	lea.l	Blue(pc),a6

	subq.w	#1,d4			; Abziehen für DBRA

	moveq	#0,d0			; D0 löschen
	move.l	d0,d1			; D1 löschen
	move.l	d1,d2			; D2 löschen
	move.l	d2,d5			; D5 löschen

	move.w	d0,LastR(sp)		; Anfangswerte löschen
	move.w	d1,LastG(sp)
	move.w	d2,LastB(sp)

1$	move.b	(a0),d0			; R holen
	lsr.w	#SHIFT_HAM8,d0
	move.b	(a1),d1			; G holen
	lsr.w	#SHIFT_HAM8,d1
	move.b	(a2),d2			; B holen
	lsr.w	#SHIFT_HAM8,d2

	move.b	0(a4,d0.w),d5
	add.b	0(a5,d1.w),d5
	add.b	0(a6,d2.w),d5

	move.w	d5,d7			; DeltaL = L
	sub.w	d0,d7			; DeltaL = L - R
	bpl.b	2$
	neg.w	d7

2$	move.w	d5,d6			; D6 = L
	sub.w	d1,d6			; D6 = L - G
	bpl.b	3$
	neg.w	d6

3$	add.w	d6,d7			; DeltaL = abs(L - R) + abs(L - G)
	move.w	d5,d6			; D6 = L
	sub.w	d2,d6			; D6 = L - B
	bpl.b	4$
	neg.w	d6

4$	add.w	d6,d7			; DeltaL = abs(L - R) + abs(L - G) + abs(L - B)

	sub.w	LastR(sp),d0		; R = abs(R - LastR)
	bpl.b	5$
	neg.w	d0

5$	sub.w	LastG(sp),d1		; G = abs(G - LastG)
	bpl.b	6$
	neg.w	d1

6$	sub.w	LastB(sp),d2		; B = abs(B - LastB)
	bpl.b	7$
	neg.w	d2

7$	move.w	d1,d6			; G + B = DeltaR
	add.w	d2,d6
	swap	d6

	move.w	d0,d6			; R + B = DeltaG
	add.w	d2,d6

	move.w	d0,d2			; R + G = DeltaB
	add.w	d1,d2			; B = DeltaB

	move.w	d6,d1			; G = DeltaG
	swap	d6
	move.w	d6,d0			; R = DeltaR

	cmp.w	d0,d7			; DeltaR >= DeltaL?
	bge.b	8$
	cmp.w	d1,d7			; DeltaG >= DeltaL?
	bge.b	8$
	cmp.w	d2,d7			; DeltaB >= DeltaL?
	bge.b	8$

	move.w	d5,LastR(sp)		; LastR = L
	move.w	d5,LastG(sp)		; LastG = L
	move.w	d5,LastB(sp)		; LastB = L

	move.b	d5,(a3)+		; Wert merken

	add.l	d3,a0			; Zum nächsten Pixel springen
	add.l	d3,a1
	add.l	d3,a2

	dbra	d4,1$

	addq.l	#8,sp
	movem.l	(sp)+,d2/d5/d6/d7/a4/a5/a6
	rts

8$	cmp.w	d1,d0			; r < g?
	blt.b	9$

	cmp.w	d1,d2			; b < g?
	blt.b	10$

	move.b	(a1),d1			; G holen
	lsr.w	#SHIFT_HAM8,d1		; Verschieben
	move.w	d1,LastG(sp)		; Merken
	ori.w	#MODIFY_GREEN8,d1	; Modifier eintragen
	move.b	d1,(a3)+		; Wert merken

	add.l	d3,a0			; Zum nächsten Pixel springen
	add.l	d3,a1
	add.l	d3,a2

	dbra	d4,1$

	addq.l	#8,sp
	movem.l	(sp)+,d2/d5/d6/d7/a4/a5/a6
	rts

10$	move.b	(a2),d2			; B holen
	lsr.w	#SHIFT_HAM8,d2		; Verschieben
	move.w	d2,LastB(sp)		; Merken
	ori.w	#MODIFY_BLUE8,d2	; Modifier eintragen
	move.b	d2,(a3)+		; Wert merken

	add.l	d3,a0			; Zum nächsten Pixel springen
	add.l	d3,a1
	add.l	d3,a2

	dbra	d4,1$

	addq.l	#8,sp
	movem.l	(sp)+,d2/d5/d6/d7/a4/a5/a6
	rts

9$	cmp.w	d0,d2			; b < r?
	blt.b	10$

	move.b	(a0),d0			; R holen
	lsr.w	#SHIFT_HAM8,d0		; Verschieben
	move.w	d0,LastR(sp)		; Merken
	ori.w	#MODIFY_RED8,d0		; Modifier eintragen
	move.b	d0,(a3)+		; Wert merken

	add.l	d3,a0			; Zum nächsten Pixel springen
	add.l	d3,a1
	add.l	d3,a2

	dbra	d4,1$

	addq.l	#8,sp
	movem.l	(sp)+,d2/d5/d6/d7/a4/a5/a6
	rts

	end
