	.text


	b	initc2p 	# offset 0: initialization routines
	b	doc2p_1X8	# offset 4: one pixel wide version, AGA
	b	doc2p_1X6	# offset 8: one pixel wide version, EHB
	b	doc2p_2X8	# offset 12: two pixel wide version, AGA
	b	doc2p_2X6	# offset 16: two pixel wide version, EHB
	.word	string		# offset 20: address of descr string

	.byte	"$VER: PowerPC 1.0 (16.07.98)",13,10,0
string:
	.byte	"A chunky to planar routine by Peter McGavin. "
	.byte	"Changes By Iain Barclay. "
	.byte	"Ported to PowerPC by Frank Wille. "
	.byte	"Supports 6/8 bitplane, single/double width pixels.",0



	.align	4
	.global	initc2p
initc2p:
# create 2 tables for Gloom

# r3=columns buffer to fill in (array of longs) for 1 wide pixs.
# r4=columns buffer for 2 wide pixs
# r5=how many columns (multiple of 32)
# r6=palette remapping array (do 256)

	li	r7,255
.init1:
	stbx	r7,r6,r7
	subic.	r7,r7,1
	bne	.init1

# column offsets for 1 wide pixels
# 0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15,
# 16,18,20,...

	subi	r3,r3,4
	srwi	r6,r5,4
	li	r0,8
	li	r8,0
.init2:
	li	r7,2
.init3:
	mtctr	r0
.init4:
	stwu	r8,4(r3)
	addi	r8,r8,2
	bdnz	.init4
	subi	r8,r8,15
	subic.	r7,r7,1
	bne	.init3
	addi	r7,r7,14
	subic.	r6,r6,1
	bne	.init2

# column offsets for 2 wide pixels
# 0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15,
# 16,20,24,28,17,...

	subi	r4,r4,4
	srwi	r6,r5,4
	li	r0,4
	li	r8,0
.init5:
	li	r7,4
.init6:
	mtctr	r0
.init7:
	stwu	r8,4(r4)
	addi	r8,r8,4
	bdnz	.init7
	subi	r8,r8,15
	subic.	r7,r7,1
	bne	.init6
	addi	r7,r7,12
	subic.	r6,r6,1
	bne	.init5

	blr

	.type	initc2p,@function
	.size	initc2p,$-initc2p



	.align	4
	.global	doc2p_1X8
doc2p_1X8:
# inputs:
# r3=src chunky buffer
# r4=dest chipmem bitmap
# r5=width (in pixels - multiple of 32) to convert
# r6=height (in pixels - even)
# r7=modulo from one bitplane to next (copmod-ish)
# r8=modulo from start of one line to start of next (linemod)

	stwu	r1,-48(r1)		# build stack frame, save registers
	stmw	r24,8(r1)

	slwi	r31,r7,3
	srwi	r30,r5,4		# r30 = num of 16 pix per row
	subi	r31,r31,2		# r31 = 8*bpmod-2
	add	r9,r30,r30
	sub	r5,r8,r9		# r5 = linemod-bytesperrow

	lis	r27,0xf0f0
	lis	r28,0xcccc
	lis	r29,0xaaaa
	ori	r27,r27,0xf0f0		# r27 = 4 bit mask
	ori	r28,r28,0xcccc		# r28 = 2 bit mask
	ori	r29,r29,0x5555		# r29 = 1 bit mask

	subi	r3,r3,4			# prepare source for pre-increment
	sub	r4,r4,r7		# prepare dest. for pre-increment

.lineloop1X8:
	mtctr	r30			# CTR = num 16 pix per row

.pixloop1X8:
	lwzu	r8,4(r3)		# get next 4 pixels 00
	lwzu	r9,4(r3)		# get next 4 pixels 01
	mr	r24,r8
	and	r8,r8,r27
	lwzu	r10,4(r3)		# get next 4 pixels 02
	xor	r24,r24,r8
	slwi	r24,r24,4
	and	r25,r10,r27
	xor	r10,r10,r25
	srwi	r25,r25,4
	lwzu	r11,4(r3)		# get next 4 pixels 03
	or	r10,r10,r24
	or	r8,r8,r25		# 00x02 -> 10 11

	mr	r24,r9
	and	r9,r9,r27
	xor	r24,r24,r9
	and	r25,r11,r27
	xor	r11,r11,r25
	srwi	r25,r25,4
	slwi	r24,r24,4
	or	r11,r11,r24
	or	r9,r9,r25		# 01x03 -> 12 13

	mr	r24,r10
	and	r10,r10,r28
	xor	r24,r24,r10
	and	r25,r11,r28
	xor	r11,r11,r25
	slwi	r24,r24,2
	or	r11,r11,r24		# 11x13b -> 23

	mr	r24,r11
	and	r11,r11,r29
	xor	r24,r24,r11
	rlwimi	r26,r24,15,1,15
	rlwimi	r26,r24,17,16,30
	or	r11,r11,r26		# 23x23 -> 33

	sthux	r11,r4,r7		# 33 -> plane 0

	srwi	r25,r25,2
	or	r10,10,r25		# 11x13a -> 22

	mr	r24,r10
	and	r10,r10,r29
	xor	r24,r24,r10

	rlwimi	r11,r11,16,16,31
	sthux	r11,r4,r7		# 33 -> plane 1

	rlwimi	r26,r24,15,1,15
	rlwimi	r26,r24,17,16,30
	or	r10,r10,r26		# 22x22 -> 32

	mr	r24,r8
	and	r8,r8,r28
	xor	r24,r24,r8

	sthux	r10,r4,r7		# 32 -> plane 2

	and	r25,r9,r28
	xor	r9,r9,r25
	slwi	r24,r24,2
	or	r9,r9,r24		# 10x12b -> 21

	rlwimi	r10,r10,16,16,31
	sthux	r10,r4,r7		# 32 -> plane 3

	mr	r24,r9
	and	r9,r9,r29
	xor	r24,r24,r9
	rlwimi	r26,r24,15,1,15
	rlwimi	r26,r24,17,16,30
	or	r9,r9,r26		# 21x21 -> 31

	sthux	r9,r4,r7		# 31 -> plane 4

	srwi	r25,r25,2
	or	r8,r8,r25		# 10x12a -> 20

	mr	r25,r8
	and	r8,r8,r29
	xor	r25,r25,r8

	rlwimi	r9,r9,16,16,31
	sthux	r9,r4,r7		# 31 -> plane 5

	rlwimi	r26,r25,15,1,15
	rlwimi	r26,r25,17,16,30
	or	r8,r8,r26		# 20x20 -> 30

	mr	r9,r8
	sthux	r8,r4,r7		# 30 -> plane 6
	rlwimi	r9,r9,16,16,31
	sthux	r9,r4,r7		# 30 -> plane 7

	sub	r4,r4,r31		# next 16 pix, destptr. to 1st plane
	bdnz	.pixloop1X8

	add	r4,r4,r5		# + linemod
	subic.	r6,r6,1
	bne	.lineloop1X8

	lmw	r24,8(r1)		# restore regs, delete stack frame
	addi	r1,r1,48
	blr

	.type	doc2p_1X8,@function
	.size	doc2p_1X8,$-doc2p_1X8



	.align	4
	.global	doc2p_1X6
doc2p_1X6:
# inputs:
# r3=src chunky buffer
# r4=dest chipmem bitmap
# r5=width (in pixels - multiple of 32) to convert
# r6=height (in pixels - even)
# r7=modulo from one bitplane to next (copmod-ish)
# r8=modulo from start of one line to start of next (linemod)

	stwu	r1,-48(r1)		# build stack frame, save registers
	stmw	r24,8(r1)

	mulli	r31,r7,6
	srwi	r30,r5,4		# r30 = num of 16 pix per row
	subi	r31,r31,2		# r31 = 6*bpmod-2
	add	r9,r30,r30
	sub	r5,r8,r9		# r5 = linemod-bytesperrow

	lis	r27,0xf0f0
	lis	r28,0xcccc
	lis	r29,0xaaaa
	ori	r27,r27,0xf0f0		# r27 = 4 bit mask
	ori	r28,r28,0xcccc		# r28 = 2 bit mask
	ori	r29,r29,0x5555		# r29 = 1 bit mask

	subi	r3,r3,4			# prepare source for pre-increment
	sub	r4,r4,r7		# prepare dest. for pre-increment

.lineloop1X6:
	mtctr	r30			# CTR = num 16 pix per row

.pixloop1X6:
	lwzu	r8,4(r3)		# get next 4 pixels 00
	lwzu	r9,4(r3)		# get next 4 pixels 01
	mr	r24,r8
	and	r8,r8,r27
	lwzu	r10,4(r3)		# get next 4 pixels 02
	xor	r24,r24,r8
	slwi	r24,r24,4
	and	r25,r10,r27
	xor	r10,r10,r25
	srwi	r25,r25,4
	lwzu	r11,4(r3)		# get next 4 pixels 03
	or	r10,r10,r24
	or	r8,r8,r25		# 00x02 -> 10 11

	mr	r24,r9
	and	r9,r9,r27
	xor	r24,r24,r9
	and	r25,r11,r27
	xor	r11,r11,r25
	srwi	r25,r25,4
	slwi	r24,r24,4
	or	r11,r11,r24
	or	r9,r9,r25		# 01x03 -> 12 13

	mr	r24,r10
	and	r10,r10,r28
	xor	r24,r24,r10
	and	r25,r11,r28
	xor	r11,r11,r25
	slwi	r24,r24,2
	or	r11,r11,r24		# 11x13b -> 23

	mr	r24,r11
	and	r11,r11,r29
	xor	r24,r24,r11
	rlwimi	r26,r24,15,1,15
	rlwimi	r26,r24,17,16,30
	or	r11,r11,r26		# 23x23 -> 33

	sthux	r11,r4,r7		# 33 -> plane 0

	srwi	r25,r25,2
	or	r10,10,r25		# 11x13a -> 22

	mr	r24,r10
	and	r10,r10,r29
	xor	r24,r24,r10

	rlwimi	r11,r11,16,16,31
	sthux	r11,r4,r7		# 33 -> plane 1

	rlwimi	r26,r24,15,1,15
	rlwimi	r26,r24,17,16,30
	or	r10,r10,r26		# 22x22 -> 32

	slwi	r8,r8,2
	and	r24,r9,r28
	and	r8,r8,r28
	xor	r9,r9,r24

	sthux	r10,r4,r7		# 32 -> plane 2

	or	r9,r9,r8		# 10x12b -> 21

	mr	r25,r9
	and	r9,r9,r29
	xor	r25,r25,r9

	rlwimi	r10,r10,16,16,31
	sthux	r10,r4,r7		# 32 -> plane 3

	rlwimi	r26,r25,15,1,15
	rlwimi	r26,r25,17,16,30
	or	r9,r9,r26		# 21x21 -> 31

	mr	r8,r9
	sthux	r8,r4,r7		# 31 -> plane 4
	rlwimi	r9,r9,16,16,31
	sthux	r9,r4,r7		# 31 -> plane 5

	sub	r4,r4,r31		# next 16 pix, destptr. to 1st plane
	bdnz	.pixloop1X6

	add	r4,r4,r5		# + linemod
	subic.	r6,r6,1
	bne	.lineloop1X6

	lmw	r24,8(r1)		# restore regs, delete stack frame
	addi	r1,r1,48
	blr

	.type	doc2p_1X6,@function
	.size	doc2p_1X6,$-doc2p_1X6



	.align	4
	.global	doc2p_2X8
doc2p_2X8:
# inputs:
# r3=src chunky buffer
# r4=dest chipmem bitmap
# r5=width (in pixels - multiple of 32) to convert
# r6=height (in pixels - even)
# r7=modulo from one bitplane to next (copmod-ish)
# r8=modulo from start of one line to start of next (linemod)

	stwu	r1,-48(r1)		# build stack frame, save registers
	stmw	r24,8(r1)

	slwi	r31,r7,3
	srwi	r30,r5,4		# r30 = num of 16 pix per row
	subi	r31,r31,4		# r31 = 8*bpmod-4
	slwi	r9,r30,2
	sub	r5,r8,r9		# r5 = linemod-bytesperrow

	lis	r27,0xf0f0
	lis	r28,0xcccc
	lis	r29,0xaaaa
	ori	r27,r27,0xf0f0		# r27 = 4 bit mask
	ori	r28,r28,0xcccc		# r28 = 2 bit mask
	ori	r29,r29,0xaaaa		# r29 = 1 bit mask

	subi	r3,r3,4			# prepare source for pre-increment
	sub	r4,r4,r7		# prepare dest. for pre-increment

.lineloop2X8:
	mtctr	r30			# CTR = num 16 pix per row

.pixloop2X8:
	lwzu	r8,4(r3)		# get next 4 pixels 00
	lwzu	r9,4(r3)		# get next 4 pixels 01
	mr	r24,r8
	and	r8,r8,r27
	lwzu	r10,4(r3)		# get next 4 pixels 02
	xor	r24,r24,r8
	slwi	r24,r24,4
	and	r25,r10,r27
	xor	r10,r10,r25
	srwi	r25,r25,4
	lwzu	r11,4(r3)		# get next 4 pixels 03
	or	r10,r10,r24
	or	r8,r8,r25		# 00x02 -> 10 11

	mr	r24,r9
	and	r9,r9,r27
	xor	r24,r24,r9
	and	r25,r11,r27
	xor	r11,r11,r25
	srwi	r25,r25,4
	slwi	r24,r24,4
	or	r11,r11,r24
	or	r9,r9,r25		# 01x03 -> 12 13

	mr	r24,r8
	and	r8,r8,r28
	xor	r24,r24,r8
	slwi	r24,r24,2
	and	r25,r9,r28
	xor	r9,r9,r25
	srwi	r25,r25,2
	or	r9,r9,r24
	or	r8,r8,r25		# 10x12 -> 20 21

	mr	r24,r10
	and	r10,r10,r28
	xor	r24,r24,r10
	slwi	r24,r24,2
	and	r25,r11,r28
	xor	r11,r11,r25
	srwi	r25,r25,2
	or	r11,r11,r24
	or	r10,r10,r25		# 11x13 -> 22 23

	mr	r24,r11
	and	r11,r11,r29
	xor	r24,r24,r11
	add	r25,r24,r24
	or	r25,r25,r24		# 23x23b -> 37

	stwux	r25,r4,r7		# 37 -> plane 0

	mr	r24,r11
	srwi	r11,r11,1
	or	r24,r24,r11		# 23x23a -> 36

	mr	r25,r10
	and	r10,r10,r29
	xor	r25,r25,r10

	stwux	r24,r4,r7		# 36 -> plane 1

	mr	r11,r25
	add	r25,r25,r25
	or	r11,r11,r25		# 22x22b -> 35

	mr	r25,r10
	srwi	r10,r10,1
	or	r10,r10,r25		# 22x22a -> 34

	stwux	r11,r4,r7		# 35 -> plane 2

	mr	r24,r9
	and	r9,r9,r29
	xor	r24,r24,r9
	mr	r25,r8
	and	r8,r8,r29
	xor	r25,r25,r8

	stwux	r10,r4,r7		# 34 -> plane 3

	mr	r10,r24
	add	r24,r24,r24
	or	r10,r10,r24		# 21x21b -> 33

	mr	r26,r9
	srwi	r9,r9,1
	or	r26,r26,r9		# 21x21a -> 32

	stwux	r10,r4,r7		# 33 -> plane 4

	add	r25,r25,r25
	or	r25,r25,r11		# 20x20b -> 31

	stwux	r26,r4,r7		# 32 -> plane 5

	mr	r11,r8
	srwi	r8,r8,1
	or	r11,r11,r8		# 20x20a -> 30

	stwux	r25,r4,r7		# 31 -> plane 6
	stwux	r11,r4,r7		# 30 -> plane 7

	sub	r4,r4,r31		# next 16 pix, destptr. to 1st plane
	bdnz	.pixloop2X8

	add	r4,r4,r5		# + linemod
	subic.	r6,r6,1
	bne	.lineloop2X8

	lmw	r24,8(r1)		# restore regs, delete stack frame
	addi	r1,r1,48
	blr

	.type	doc2p_2X8,@function
	.size	doc2p_2X8,$-doc2p_2X8



	.align	4
	.global	doc2p_2X6
doc2p_2X6:
# inputs:
# r3=src chunky buffer
# r4=dest chipmem bitmap
# r5=width (in pixels - multiple of 32) to convert
# r6=height (in pixels - even)
# r7=modulo from one bitplane to next (copmod-ish)
# r8=modulo from start of one line to start of next (linemod)

	stwu	r1,-48(r1)		# build stack frame, save registers
	stmw	r24,8(r1)

	mulli	r31,r7,6
	srwi	r30,r5,4		# r30 = num of 16 pix per row
	subi	r31,r31,4		# r31 = 6*bpmod-4
	slwi	r9,r30,2
	sub	r5,r8,r9		# r5 = linemod-bytesperrow

	lis	r27,0xf0f0
	lis	r28,0xcccc
	lis	r29,0xaaaa
	ori	r27,r27,0xf0f0		# r27 = 4 bit mask
	ori	r28,r28,0xcccc		# r28 = 2 bit mask
	ori	r29,r29,0xaaaa		# r29 = 1 bit mask

	subi	r3,r3,4			# prepare source for pre-increment
	sub	r4,r4,r7		# prepare dest. for pre-increment

.lineloop2X6:
	mtctr	r30			# CTR = num 16 pix per row

.pixloop2X6:
	lwzu	r8,4(r3)		# get next 4 pixels 00
	lwzu	r9,4(r3)		# get next 4 pixels 01
	mr	r24,r8
	and	r8,r8,r27
	lwzu	r10,4(r3)		# get next 4 pixels 02
	xor	r24,r24,r8
	slwi	r24,r24,4
	and	r25,r10,r27
	xor	r10,r10,r25
	srwi	r25,r25,4
	lwzu	r11,4(r3)		# get next 4 pixels 03
	or	r10,r10,r24
	or	r8,r8,r25		# 00x02 -> 10 11

	mr	r24,r9
	and	r9,r9,r27
	xor	r24,r24,r9
	and	r25,r11,r27
	xor	r11,r11,r25
	srwi	r25,r25,4
	slwi	r24,r24,4
	or	r11,r11,r24
	or	r9,r9,r25		# 01x03 -> 12 13

	mr	r24,r8
	and	r8,r8,r28
	xor	r24,r24,r8
	slwi	r24,r24,2
	and	r25,r9,r28
	xor	r9,r9,r25
	srwi	r25,r25,2
	or	r9,r9,r24
	or	r8,r8,r25		# 10x12 -> 20 21

	mr	r24,r10
	and	r10,r10,r28
	xor	r24,r24,r10
	slwi	r24,r24,2
	and	r25,r11,r28
	xor	r11,r11,r25
	srwi	r25,r25,2
	or	r11,r11,r24
	or	r10,r10,r25		# 11x13 -> 22 23

	mr	r24,r11
	and	r11,r11,r29
	xor	r24,r24,r11
	add	r25,r24,r24
	or	r25,r25,r24		# 23x23b -> 37

	stwux	r25,r4,r7		# 37 -> plane 0

	mr	r24,r11
	srwi	r11,r11,1
	or	r24,r24,r11		# 23x23a -> 36

	mr	r25,r10
	and	r10,r10,r29
	xor	r25,r25,r10

	stwux	r24,r4,r7		# 36 -> plane 1

	mr	r11,r25
	add	r25,r25,r25
	or	r11,r11,r25		# 22x22b -> 35

	mr	r25,r10
	srwi	r10,r10,1
	or	r10,r10,r25		# 22x22a -> 34

	stwux	r11,r4,r7		# 35 -> plane 2

	mr	r24,r9
	and	r9,r9,r29
	xor	r24,r24,r9
	mr	r25,r8
	and	r8,r8,r29
	xor	r25,r25,r8

	stwux	r10,r4,r7		# 34 -> plane 3

	mr	r10,r24
	add	r24,r24,r24
	or	r10,r10,r24		# 21x21b -> 33

	stwux	r10,r4,r7		# 33 -> plane 4

	mr	r26,r9
	srwi	r9,r9,1
	or	r26,r26,r9		# 21x21a -> 32

	stwux	r26,r4,r7		# 32 -> plane 5

	sub	r4,r4,r31		# next 16 pix, destptr. to 1st plane
	bdnz	.pixloop2X6

	add	r4,r4,r5		# + linemod
	subic.	r6,r6,1
	bne	.lineloop2X6

	lmw	r24,8(r1)		# restore regs, delete stack frame
	addi	r1,r1,48
	blr

	.type	doc2p_2X6,@function
	.size	doc2p_2X6,$-doc2p_2X6
