
		AREA	|ARM$$code|,CODE,READONLY

		IMPORT	copymem

		EXPORT	convert_16_16
		EXPORT	convert_16_32


; Convert from 16bpp to 16bpp
;
; entry	a1 -> destination
;	a2 -> source

convert_16_16	MOV	a3,#320*2
		B	copymem


; Convert from 16bpp to 32bpp
;
; entry	a1 -> destination
;	a2 -> source

convert_16_32	PLD	[a2]
		STMFD	sp!,{v1-v6,lr}

		MOV	ip,#320
		ADR	lr,lut5to8

		LDR	a4,[a2],#4
conv16to32_lp	PLD	[a2,#60]

		AND	v1,a4,#&1F
		AND	v2,a4,#&1F<<5
		AND	v3,a4,#&1F<<10

		LDRB	v1,[lr,v1]
		LDRB	v2,[lr,v2,LSR #5]
		LDRB	v3,[lr,v3,LSR #10]

conv16to32b_lp	AND	v4,a4,#&1F<<16
		AND	v5,a4,#&1F<<21
		AND	v6,a4,#&1F<<26

		LDRB	v4,[lr,v4,LSR #16]
		LDRB	v5,[lr,v5,LSR #21]
		LDRB	v6,[lr,v6,LSR #26]

		STRB	v1,[a1],#1
		STRB	v2,[a1],#1
		STRH	v3,[a1],#2

		STRB	v4,[a1],#1
		STRB	v5,[a1],#1
		STRH	v6,[a1],#2

		SUBS	ip,ip,#2
		LDRGT	a4,[a2],#4
		BGT	conv16to32_lp

		LDMFD	sp!,{v1-v6,pc}

		ALIGN	32

lut5to8		DCB	0,&8,&10,&18,&21,&29,&31,&39,&42,&4A
		DCB	&52,&5A,&63,&6B,&73,&7B,&84,&8C,&94
		DCB	&9C,&A5,&AD,&B5,&BD,&C6,&CE,&D6,&DE
		DCB	&E7,&EF,&F7,&FF

		END
