
		AREA	|ARM$$code|,CODE,READONLY

		IMPORT	Pico

		EXPORT	TileNorm16
		EXPORT	TileFlip16
		EXPORT	TileNorm32
		EXPORT	TileFlip32

		; horizontal doubling

		EXPORT	TileNorm16_2
		EXPORT	TileFlip16_2
		EXPORT	TileNorm32_2
		EXPORT	TileFlip32_2


Pico_vram	*	&10000

;-----------------------------------------------------
;
; Unity scaling routines
;
;-----------------------------------------------------

TileFlip16	LDR	ip,=Pico
		ADD	ip,ip,#Pico_vram
		LDR	a4,[ip,a2,LSL #1]

		TEQ	a4,#0
		MOVEQ	pc,lr

		ANDS	a2,a4,#&000F0000
		AND	ip,a4,#&00F00000
		LDRNE	a2,[a3,a2,LSR #14]
		LDR	ip,[a3,ip,LSR #18]
		STRNEB	a2,[a1,#0]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#1]
		TST	a4,#&00F00000
		STRNEB	ip,[a1,#2]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#3]

		ANDS	a2,a4,#&0F000000
		AND	ip,a4,#&F0000000
		LDRNE	a2,[a3,a2,LSR #22]
		LDR	ip,[a3,ip,LSR #26]
		STRNEB	a2,[a1,#4]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#5]
		TST	a4,#&F0000000
		STRNEB	ip,[a1,#6]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#7]

		ANDS	a2,a4,#&0000000F
		AND	ip,a4,#&000000F0
		LDRNE	a2,[a3,a2,LSL #2]
		LDR	ip,[a3,ip,LSR #2]
		STRNEB	a2,[a1,#8]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#9]
		TST	a4,#&000000F0
		STRNEB	ip,[a1,#10]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#11]

		ANDS	a2,a4,#&00000F00
		AND	ip,a4,#&0000F000
		LDRNE	a2,[a3,a2,LSR #6]
		LDR	ip,[a3,ip,LSR #10]
		STRNEB	a2,[a1,#12]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#13]
		TST	a4,#&0000F000
		STRNEB	ip,[a1,#14]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#15]

		MOV	a1,#0
		MOV	pc,lr


TileNorm16	LDR	ip,=Pico
		ADD	ip,ip,#Pico_vram
		LDR	a4,[ip,a2,LSL #1]

		TEQ	a4,#0
		MOVEQ	pc,lr

		ANDS	a2,a4,#&F000
		AND	ip,a4,#&0F00
		LDRNE	a2,[a3,a2,LSR #10]
		LDR	ip,[a3,ip,LSR #6]
		STRNEB	a2,[a1,#0]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#1]
		TST	a4,#&0F00
		STRNEB	ip,[a1,#2]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#3]

		ANDS	a2,a4,#&00F0
		AND	ip,a4,#&000F
		LDRNE	a2,[a3,a2,LSR #2]
		LDR	ip,[a3,ip,LSL #2]
		STRNEB	a2,[a1,#4]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#5]
		TST	a4,#&000F
		STRNEB	ip,[a1,#6]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#7]

		ANDS	a2,a4,#&F0000000
		AND	ip,a4,#&0F000000
		LDRNE	a2,[a3,a2,LSR #26]
		LDR	ip,[a3,ip,LSR #22]
		STRNEB	a2,[a1,#8]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#9]
		TST	a4,#&0F000000
		STRNEB	ip,[a1,#10]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#11]

		ANDS	a2,a4,#&00F00000
		AND	ip,a4,#&000F0000
		LDRNE	a2,[a3,a2,LSR #18]
		LDR	ip,[a3,ip,LSR #14]
		STRNEB	a2,[a1,#12]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#13]
		TST	a4,#&000F0000
		STRNEB	ip,[a1,#14]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#15]

		MOV	a1,#0
		MOV	pc,lr


TileFlip32	LDR	ip,=Pico
		ADD	ip,ip,#Pico_vram
		LDR	a4,[ip,a2,LSL #1]

		TEQ	a4,#0
		MOVEQ	pc,lr

		ANDS	a2,a4,#&000F0000
		AND	ip,a4,#&00F00000
		LDRNE	a2,[a3,a2,LSR #14]
		LDR	ip,[a3,ip,LSR #18]
		STRNE	a2,[a1,#0]
		TST	a4,#&00F00000
		STRNE	ip,[a1,#4]

		ANDS	a2,a4,#&0F000000
		AND	ip,a4,#&F0000000
		LDRNE	a2,[a3,a2,LSR #22]
		LDR	ip,[a3,ip,LSR #26]
		STRNE	a2,[a1,#8]
		TST	a4,#&F0000000
		STRNE	ip,[a1,#12]

		ANDS	a2,a4,#&0000000F
		AND	ip,a4,#&000000F0
		LDRNE	a2,[a3,a2,LSL #2]
		LDR	ip,[a3,ip,LSR #2]
		STRNE	a2,[a1,#16]
		TST	a4,#&000000F0
		STRNE	ip,[a1,#20]

		ANDS	a2,a4,#&00000F00
		AND	ip,a4,#&0000F000
		LDRNE	a2,[a3,a2,LSR #6]
		LDR	ip,[a3,ip,LSR #10]
		STRNE	a2,[a1,#24]
		TST	a4,#&0000F000
		STRNE	ip,[a1,#28]

		MOV	a1,#0
		MOV	pc,lr


TileNorm32	LDR	ip,=Pico
		ADD	ip,ip,#Pico_vram
		LDR	a4,[ip,a2,LSL #1]

		TEQ	a4,#0
		MOVEQ	pc,lr

		ANDS	a2,a4,#&F000
		AND	ip,a4,#&0F00
		LDRNE	a2,[a3,a2,LSR #10]
		LDR	ip,[a3,ip,LSR #6]
		STRNE	a2,[a1,#0]
		TST	a4,#&0F00
		STRNE	ip,[a1,#4]

		ANDS	a2,a4,#&00F0
		AND	ip,a4,#&000F
		LDRNE	a2,[a3,a2,LSR #2]
		LDR	ip,[a3,ip,LSL #2]
		STRNE	a2,[a1,#8]
		TST	a4,#&000F
		STRNE	ip,[a1,#12]

		ANDS	a2,a4,#&F0000000
		AND	ip,a4,#&0F000000
		LDRNE	a2,[a3,a2,LSR #26]
		LDR	ip,[a3,ip,LSR #22]
		STRNE	a2,[a1,#16]
		TST	a4,#&0F000000
		STRNE	ip,[a1,#20]

		ANDS	a2,a4,#&00F00000
		AND	ip,a4,#&000F0000
		LDRNE	a2,[a3,a2,LSR #18]
		LDR	ip,[a3,ip,LSR #14]
		STRNE	a2,[a1,#24]
		TST	a4,#&000F0000
		STRNE	ip,[a1,#28]

		MOV	a1,#0
		MOV	pc,lr


;-----------------------------------------------------
;
; Horizontal pixel doubling routines
;
;-----------------------------------------------------

TileFlip16_2	LDR	ip,=Pico
		ADD	ip,ip,#Pico_vram
		LDR	a4,[ip,a2,LSL #1]

		TEQ	a4,#0
		MOVEQ	pc,lr

		ANDS	a2,a4,#&000F0000
		AND	ip,a4,#&00F00000
		LDRNE	a2,[a3,a2,LSR #14]
		LDR	ip,[a3,ip,LSR #18]
		STRNEB	a2,[a1,#0]
		STRNEB	a2,[a1,#2]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#1]
		STRNEB	a2,[a1,#3]
		TST	a4,#&00F00000
		STRNEB	ip,[a1,#4]
		STRNEB	ip,[a1,#6]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#5]
		STRNEB	ip,[a1,#7]

		ANDS	a2,a4,#&0F000000
		AND	ip,a4,#&F0000000
		LDRNE	a2,[a3,a2,LSR #22]
		LDR	ip,[a3,ip,LSR #26]
		STRNEB	a2,[a1,#8]
		STRNEB	a2,[a1,#10]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#9]
		STRNEB	a2,[a1,#11]
		TST	a4,#&F0000000
		STRNEB	ip,[a1,#12]
		STRNEB	ip,[a1,#14]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#13]
		STRNEB	ip,[a1,#15]

		ANDS	a2,a4,#&0000000F
		AND	ip,a4,#&000000F0
		LDRNE	a2,[a3,a2,LSL #2]
		LDR	ip,[a3,ip,LSR #2]
		STRNEB	a2,[a1,#16]
		STRNEB	a2,[a1,#18]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#17]
		STRNEB	a2,[a1,#19]
		TST	a4,#&000000F0
		STRNEB	ip,[a1,#20]
		STRNEB	ip,[a1,#22]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#21]
		STRNEB	ip,[a1,#23]

		ANDS	a2,a4,#&00000F00
		AND	ip,a4,#&0000F000
		LDRNE	a2,[a3,a2,LSR #6]
		LDR	ip,[a3,ip,LSR #10]
		STRNEB	a2,[a1,#24]
		STRNEB	a2,[a1,#26]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#25]
		STRNEB	a2,[a1,#27]
		TST	a4,#&0000F000
		STRNEB	ip,[a1,#28]
		STRNEB	ip,[a1,#30]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#29]
		STRNEB	ip,[a1,#31]

		MOV	a1,#0
		MOV	pc,lr


TileNorm16_2	LDR	ip,=Pico
		ADD	ip,ip,#Pico_vram
		LDR	a4,[ip,a2,LSL #1]

		TEQ	a4,#0
		MOVEQ	pc,lr

		ANDS	a2,a4,#&F000
		AND	ip,a4,#&0F00
		LDRNE	a2,[a3,a2,LSR #10]
		LDR	ip,[a3,ip,LSR #6]
		STRNEB	a2,[a1,#0]
		STRNEB	a2,[a1,#2]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#1]
		STRNEB	a2,[a1,#3]
		TST	a4,#&0F00
		STRNEB	ip,[a1,#4]
		STRNEB	ip,[a1,#6]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#5]
		STRNEB	ip,[a1,#7]

		ANDS	a2,a4,#&00F0
		AND	ip,a4,#&000F
		LDRNE	a2,[a3,a2,LSR #2]
		LDR	ip,[a3,ip,LSL #2]
		STRNEB	a2,[a1,#8]
		STRNEB	a2,[a1,#10]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#9]
		STRNEB	a2,[a1,#11]
		TST	a4,#&000F
		STRNEB	ip,[a1,#12]
		STRNEB	ip,[a1,#14]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#13]
		STRNEB	ip,[a1,#15]

		ANDS	a2,a4,#&F0000000
		AND	ip,a4,#&0F000000
		LDRNE	a2,[a3,a2,LSR #26]
		LDR	ip,[a3,ip,LSR #22]
		STRNEB	a2,[a1,#16]
		STRNEB	a2,[a1,#18]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#17]
		STRNEB	a2,[a1,#19]
		TST	a4,#&0F000000
		STRNEB	ip,[a1,#20]
		STRNEB	ip,[a1,#22]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#21]
		STRNEB	ip,[a1,#23]

		ANDS	a2,a4,#&00F00000
		AND	ip,a4,#&000F0000
		LDRNE	a2,[a3,a2,LSR #18]
		LDR	ip,[a3,ip,LSR #14]
		STRNEB	a2,[a1,#24]
		STRNEB	a2,[a1,#26]
		MOVNE	a2,a2,LSR #8
		STRNEB	a2,[a1,#25]
		STRNEB	a2,[a1,#27]
		TST	a4,#&000F0000
		STRNEB	ip,[a1,#28]
		STRNEB	ip,[a1,#30]
		MOVNE	ip,ip,LSR #8
		STRNEB	ip,[a1,#29]
		STRNEB	ip,[a1,#31]

		MOV	a1,#0
		MOV	pc,lr


TileFlip32_2	LDR	ip,=Pico
		ADD	ip,ip,#Pico_vram
		LDR	a4,[ip,a2,LSL #1]

		TEQ	a4,#0
		MOVEQ	pc,lr

		ANDS	a2,a4,#&000F0000
		AND	ip,a4,#&00F00000
		LDRNE	a2,[a3,a2,LSR #14]
		LDR	ip,[a3,ip,LSR #18]
		STRNE	a2,[a1,#0]
		STRNE	a2,[a1,#4]
		TST	a4,#&00F00000
		STRNE	ip,[a1,#8]
		STRNE	ip,[a1,#12]

		ANDS	a2,a4,#&0F000000
		AND	ip,a4,#&F0000000
		LDRNE	a2,[a3,a2,LSR #22]
		LDR	ip,[a3,ip,LSR #26]
		STRNE	a2,[a1,#16]
		STRNE	a2,[a1,#20]
		TST	a4,#&F0000000
		STRNE	ip,[a1,#24]
		STRNE	ip,[a1,#28]

		ANDS	a2,a4,#&0000000F
		AND	ip,a4,#&000000F0
		LDRNE	a2,[a3,a2,LSL #2]
		LDR	ip,[a3,ip,LSR #2]
		STRNE	a2,[a1,#32]
		STRNE	a2,[a1,#36]
		TST	a4,#&000000F0
		STRNE	ip,[a1,#40]
		STRNE	ip,[a1,#44]

		ANDS	a2,a4,#&00000F00
		AND	ip,a4,#&0000F000
		LDRNE	a2,[a3,a2,LSR #6]
		LDR	ip,[a3,ip,LSR #10]
		STRNE	a2,[a1,#48]
		STRNE	a2,[a1,#52]
		TST	a4,#&0000F000
		STRNE	ip,[a1,#56]
		STRNE	ip,[a1,#60]

		MOV	a1,#0
		MOV	pc,lr


TileNorm32_2	LDR	ip,=Pico
		ADD	ip,ip,#Pico_vram
		LDR	a4,[ip,a2,LSL #1]

		TEQ	a4,#0
		MOVEQ	pc,lr

		ANDS	a2,a4,#&F000
		AND	ip,a4,#&0F00
		LDRNE	a2,[a3,a2,LSR #10]
		LDR	ip,[a3,ip,LSR #6]
		STRNE	a2,[a1,#0]
		STRNE	a2,[a1,#4]
		TST	a4,#&0F00
		STRNE	ip,[a1,#8]
		STRNE	ip,[a1,#12]

		ANDS	a2,a4,#&00F0
		AND	ip,a4,#&000F
		LDRNE	a2,[a3,a2,LSR #2]
		LDR	ip,[a3,ip,LSL #2]
		STRNE	a2,[a1,#16]
		STRNE	a2,[a1,#20]
		TST	a4,#&000F
		STRNE	ip,[a1,#24]
		STRNE	ip,[a1,#28]

		ANDS	a2,a4,#&F0000000
		AND	ip,a4,#&0F000000
		LDRNE	a2,[a3,a2,LSR #26]
		LDR	ip,[a3,ip,LSR #22]
		STRNE	a2,[a1,#32]
		STRNE	a2,[a1,#36]
		TST	a4,#&0F000000
		STRNE	ip,[a1,#40]
		STRNE	ip,[a1,#44]

		ANDS	a2,a4,#&00F00000
		AND	ip,a4,#&000F0000
		LDRNE	a2,[a3,a2,LSR #18]
		LDR	ip,[a3,ip,LSR #14]
		STRNE	a2,[a1,#48]
		STRNE	a2,[a1,#52]
		TST	a4,#&000F0000
		STRNE	ip,[a1,#56]
		STRNE	ip,[a1,#60]

		MOV	a1,#0
		MOV	pc,lr


		END
