**************************   MiscAsm.a   *************************
* Assembled with devpac2.0 (tab size 2)

	XDEF	_Put24BitValue,_PCHG_FastDecomp


;void __asm Put24BitValue(	register __a0 UBYTE *buffer,
;										register __d0 UWORD bufferwidth,
;										register __d1 UWORD x,
;										register __d2 UBYTE r,
;										register __d3 UBYTE g,
;										register __d4 UBYTE b);
_Put24BitValue
		movem.l	a2/d2-d7,-(sp)
		move.w	d1,d5					;Copy 'x'
		and.w		#7,d5					;'and' out upper bits
		eor.w		#7,d5					;d5.w = bitnumber to set

		lsr.w		#3,d1					;shift x down to byte offset
		lea			(a0,d1.w),a0	;a0 = rbuffer

		move.w	d0,d6					;copy bufferwidth
		lsl.w		#3,d6					;multiply by 8
		lea			(a0,d6.w),a1	;a1 = gbuffer
		lea			(a1,d6.w),a2	;a2 = bbuffer

		move.w	#8-1,d6
.Loop
		lsr.b		#1,d2					;shift out upper red bit
		bcc			.RedNotSet
		bset.b	d5,(a0)
		bra			.DoGreen
.RedNotSet
		bclr.b		d5,(a0)
.DoGreen
		lsr.b		#1,d3					;shift out upper green bit
		bcc			.GreenNotSet
		bset.b	d5,(a1)
		bra			.DoBlue
.GreenNotSet
		bclr.b		d5,(a1)
.DoBlue
		lsr.b		#1,d4					;shift out upper blue bit
		bcc			.BlueNotSet
		bset.b	d5,(a2)
		bra			.DoneBlue
.BlueNotSet
		bclr.b			d5,(a2)
.DoneBlue
		lea			(a0,d0.w),a0
		lea			(a1,d0.w),a1
		lea			(a2,d0.w),a2
		dbra		d6,.Loop

.exit
		movem.l	(sp)+,a2/d2-d7
		rts

;  void __asm PCHG_FastDecomp(	register __a0 void *Source,
;				register __a1 void *Dest,
;				register __a2 WORD *TreeCode,
;				register __d0 ULONG OriginalSize);
;
;
; d1: bits in longword
; d2: longword
; d3: value fetched
; a3: pointer in the tree

_PCHG_FastDecomp	movem.l	d2/d3/a3,-(a7)

		moveq	#0,d1
		move.l	a2,a3
		bra.s	Loop

OffsetPointer	add.w	d3,a3

Loop		dbra	d1,StillBits
		move.l	(a0)+,d2
		moveq	#31,d1

StillBits	add.l	d2,d2
		bcc.s	Case0

		move.w	(a3),d3
		bmi.s	OffsetPointer

StoreValue	move.b	d3,(a1)+
		move.l	a2,a3
		subq.l	#1,d0
		bne.s	Loop
		movem.l	(a7)+,d2/d3/a3
		rts

Case0		move.w	-(a3),d3
		bmi.s	Loop
		btst	#8,d3
		bne.s	StoreValue
		bra.s	Loop
