
                XDEF    _ScaleChunky
                XDEF    _FindBest
                XDEF    _MemSet
                XDEF    _MemCpy
                XDEF    _ClearBack
                XDEF    _WaitMouse
                XDEF    _PutText
                XDEF    _PutBulb

                XREF    _fbcLastRGB
                XREF    _fbcLastFit
                XREF    _MULUTab

FINDBEST_PRECISION	=	120

; d0.l	src width
; d1.l	src height
; d2.l	dest width
; d3.l	dest height
; a0.l	src
; a1.l	dest

_ScaleChunky					; 64 bytes to rts
                movem.l d0-d7/a2-a4,-(sp)
		swap	d1
		divu.l	d3,d1
		swap	d1
		move.l	d1,a3

		move.l	d0,d1

		swap	d0
		divu.l	d2,d0
		swap	d0
		move.l	d0,a2

		subq.w	#1,d2
		subq.w	#1,d3

; d1.l	src width
; d2.l	dest width -1
; d3.l	dest height -1
; a0.l	src
; a1.l	dest
; a2.l	swap((src width<<16)/dest width)
; a3.l	swap((src height<<16)/dest height)
_Scale					; 38 bytes to rts
		moveq	#0,d0
		moveq	#0,d5

_loop1
		move.w	d5,d6
		mulu.w	d1,d6
		lea	(a0,d6.l),a4

		moveq	#0,d4
		move.w	d2,d7
_loop0
		move.b	(a4,d4.w),(a1)+
		add.l	a2,d4
		addx.w	d0,d4
		dbra	d7,_loop0

		add.l	a3,d5
		addx.w	d0,d5

		dbra	d3,_loop1

                movem.l (sp)+,d0-d7/a2-a4
        	rts

_FindBest
;d0 r
;d1 g
;d2 b
;a0 PALETTE
                
                movem.l d0-d7/a1-a6,-(sp)
                move.l  d0,d7
                swap    d7
                or.w    d1,d7
                lsl.w   #8,d7
                or.w    d2,d7           ;fbcCacheLine
                cmp.l   _fbcLastRGB,d7
                bne.b   Szukamy
                movem.l (sp)+,d0-d7/a1-a6
                move.l  _fbcLastFit,d0
                rts
Szukamy
                lea     _MULUTab+256*4,a1
                move.l  #255*255*3+1,d3         ;delta
                move.l  #0,bestfit                   ;bestfit
                move.l  #255,d6
fbcLoop
                move.l  (a0)+,d5
                sub.l   d0,d5                   ;dr
                move.l  (a1,d5.l*4),d4

                move.l  (a0)+,d5
                sub.l   d1,d5                   ;dg
                add.l   (a1,d5.l*4),d4

                move.l  (a0)+,d5
                sub.l   d2,d5                   ;db
                add.l   (a1,d5.l*4),d4

                cmp.l   d3,d4
                bpl.b   nope
                move.l  d4,d3
                move.l  #255,d4
                sub.l   d6,d4
                move.l  d4,bestfit
                cmp.l   #FINDBEST_PRECISION,d3
                ble.b   break
nope
                dbra    d6,fbcLoop
break
                move.l  d7,_fbcLastRGB
                move.l  bestfit(pc),_fbcLastFit
                movem.l (sp)+,d0-d7/a1-a6
                move.l  bestfit(pc),d0
                rts

bestfit         dc.l    0

_MemSet
        	MOVEM.L	D0-D7/A0-A6,-(SP)
	        SUBQ.L	#1,D1
msloop
        	MOVE.B	D0,(A0)+
	        DBRA	D1,msloop
        	MOVEM.L	(SP)+,D0-D7/A0-A6
	        RTS
_MemCpy
                subq    #1,d0
mcloop
                move.b  (a0)+,(a1)+
                dbra    d0,mcloop
                rts
_ClearBack
	MOVE.L	D7,-(SP)
	MOVE.L	#$7CF,D7
clloop
	MOVE.L	(A1)+,(A0)+
	MOVE.L	(A1)+,(A0)+
	MOVE.L	(A1)+,(A0)+
	MOVE.L	(A1)+,(A0)+
	MOVE.L	(A1)+,(A0)+
	MOVE.L	(A1)+,(A0)+
	MOVE.L	(A1)+,(A0)+
	MOVE.L	(A1)+,(A0)+
	DBRA	D7,clloop
	MOVE.L	(SP)+,D7
	RTS

_WaitMouse
	BTST	#6,$BFE001
	BNE.S	nomouse
	MOVEQ	#-$1,D0
	RTS

nomouse
	MOVEQ	#0,D0
	RTS

_PutBulb
;d0 - posx
;d1 - posy        
;a0 - bulb
;a1 - screen
        movem.l d2,-(sp)
        mulu.l  #320,d1
        add.l   d0,d1
        adda.l  d1,a1
        moveq   #10,d0
yy
        moveq   #10,d1
xx
        move.b  (a0)+,d2
        beq.b   blskip
        move.b  d2,(a1)
blskip
        adda.w  #1,a1
        dbra    d1,xx
        lea     320-11(a1),a1
        dbra    d0,yy
        movem.l (sp)+,d2
        rts
        

_PutText
;a0.l   text
;a1.l   chunky
;d0.l   posy
;d1.l   sizey
		movem.l	d0/d1/a0/a1,-(sp)
                mulu.l  #320,d0
		adda.l	d0,a1
                mulu.l  #320,d1
		subq	#1,d1
ptxl
                move.b  (a0)+,d0
                beq.b   ptskip
                move.b  d0,(a1)+
                bra.b   ptnope
ptskip
                adda.w  #1,a1
ptnope
                dbra    d1,ptxl
		movem.l	(sp)+,d0/d1/a0/a1
                Rts
