diff src/video/ataricommon/SDL_ataric2p.S @ 281:c5010ab8ba35

Added initial support for Atari (thanks Patrice!)
author Sam Lantinga <slouken@libsdl.org>
date Sun, 17 Feb 2002 19:54:28 +0000
parents
children f6ffac90895c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/ataricommon/SDL_ataric2p.S	Sun Feb 17 19:54:28 2002 +0000
@@ -0,0 +1,377 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id$";
+#endif
+
+/*
+ *	Chunky to planar conversion routine
+ *	1 byte/pixel -> 4 or 8 bit planes
+ *
+ *	Patrice Mandin
+ *	Xavier Joubert
+ */
+
+/* ------------	Function pointers ------------ */
+
+	.globl	_Atari_C2pInit
+	.globl	_Atari_C2pConvert
+
+	.data
+
+	.even
+	.comm	_Atari_C2pInit,4
+	.comm	_Atari_C2pConvert,4
+
+/* ------------	Conversion Table C2P ------------ */
+
+	.globl	_Atari_table_c2p
+
+	.data
+
+	.comm	_Atari_table_c2p,2048
+
+/* ------------	Init table C2P, 8 bits ------------ */
+
+	.globl	_Atari_C2pInit8
+
+	.text
+_Atari_C2pInit8:
+	movel	d2,sp@-
+
+	lea	_Atari_table_c2p,a0
+	movew	#255,d0
+c2p_initbcl:
+#if defined (__M68020__)
+	lea	a0@(0,d0:w:8),a1
+#else
+	movew	d0,d2
+	lslw	#3,d2
+	lea	a0@(0,d2:w),a1
+#endif
+	moveq	#7,d1
+c2p_initbyte:
+	btst	d1,d0
+	sne	d2
+	negw	d2
+	moveb	d2,a1@(0,d1:w)
+
+	dbra	d1,c2p_initbyte
+
+	dbra	d0,c2p_initbcl
+
+	movel	sp@+,d2
+	rts
+
+/* ------------	Conversion C2P, 8 bits ------------ */
+
+	.globl	_Atari_C2pConvert8
+
+	.text
+_Atari_C2pConvert8:
+	movel	sp@(4),c2p_source
+	movel	sp@(8),c2p_dest
+	movel	sp@(12),c2p_width
+	movel	sp@(16),c2p_height
+	movel	sp@(20),c2p_dblligne
+	movel	sp@(24),c2p_srcpitch
+	movel	sp@(28),c2p_dstpitch
+
+	moveml	d2-d7/a2-a6,sp@-
+
+	movel	c2p_source,a0
+	movel	c2p_dest,a1
+	lea	_Atari_table_c2p,a2
+	movel	#0x000f0001,d3
+#if defined(__M68020__)
+	moveq	#0,d0
+#endif
+	
+	movel	c2p_height,d7
+	subql	#1,d7
+c2p8_bcly:
+	movel	a0,a4	| Save start address of source
+	movel	a1,a5	| Save start address of dest
+
+	| Conversion
+                 
+	movel	c2p_width,d6
+	lsrw	#4,d6
+	subql	#1,d6
+c2p8_bclx:
+	| Octets 0-7
+	
+	moveq	#0,d1
+	moveq	#0,d2
+	moveq	#7,d5
+c2p8_bcl07:
+#if defined(__M68020__)
+	moveb	a0@+,d0
+	lea	a2@(0,d0:w:8),a3
+#else
+	moveq	#0,d0
+	moveb	a0@+,d0
+	lslw	#3,d0
+	lea	a2@(0,d0:w),a3
+#endif
+	lsll	#1,d1
+	lsll	#1,d2
+	orl	a3@+,d1
+	orl	a3@,d2
+	dbra	d5,c2p8_bcl07
+
+	movepl	d1,a1@(0)
+	movepl	d2,a1@(8)
+	addw	d3,a1
+	swap	d3
+	
+	| Octets 8-15
+
+	moveq	#0,d1
+	moveq	#0,d2
+	moveq	#7,d5
+c2p8_bcl815:
+#if defined(__M68020__)
+	moveb	a0@+,d0
+	lea	a2@(0,d0:w:8),a3
+#else
+	moveq	#0,d0
+	moveb	a0@+,d0
+	lslw	#3,d0
+	lea	a2@(0,d0:w),a3
+#endif
+	lsll	#1,d1
+	lsll	#1,d2
+	orl	a3@+,d1
+	orl	a3@,d2
+	dbra	d5,c2p8_bcl815
+
+	movepl	d1,a1@(0)
+	movepl	d2,a1@(8)
+	addw	d3,a1
+	swap	d3
+
+	dbra	d6,c2p8_bclx
+
+	| Double line ?
+
+	tstl	c2p_dblligne
+	beq	c2p8_nodblligne
+
+	movel	a5,a6			| src line
+	movel	a5,a1			| dest line
+	addl	c2p_dstpitch,a1
+
+	movel	c2p_width,d6
+	lsrw	#2,d6
+	subql	#1,d6
+c2p8_copydbl:
+	movel	a6@+,a1@+
+	dbra	d6,c2p8_copydbl
+
+	addl	c2p_dstpitch,a5
+c2p8_nodblligne:
+
+	| Next line
+
+	movel	a4,a0		
+	addl	c2p_srcpitch,a0
+	movel	a5,a1
+	addl	c2p_dstpitch,a1
+
+	dbra	d7,c2p8_bcly
+
+	moveml	sp@+,d2-d7/a2-a6
+	rts
+
+/* ------------	Init table C2P, 4 bits ------------ */
+
+	.globl	_Atari_C2pInit4
+
+	.text
+_Atari_C2pInit4:
+	/* Nothing to do */
+	/* work is done in convert_c2p_pal */
+	rts
+
+/* ------------	Conversion C2P, 4 bits ------------ */
+
+	.globl	_Atari_C2pConvert4
+
+	.text
+_Atari_C2pConvert4:
+	movel	sp@(4),c2p_source
+	movel	sp@(8),c2p_dest
+	movel	sp@(12),c2p_width
+	movel	sp@(16),c2p_height
+	movel	sp@(20),c2p_dblligne
+	movel	sp@(24),c2p_srcpitch
+	movel	sp@(28),c2p_dstpitch
+
+	moveml	d2-d7/a2-a6,sp@-
+
+	movel	c2p_source,a0
+	movel	c2p_dest,a1
+	lea	_Atari_table_c2p,a2
+	movel	#0x00070001,d3
+#if defined(__M68020__)
+	moveq	#0,d0
+#endif
+	
+	movel	c2p_height,d7
+	subql	#1,d7
+c2p4_bcly:
+	movel	a0,a4	| Save start address of source
+	movel	a1,a5	| Save start address of dest
+
+	| Conversion
+                 			
+	movel	c2p_width,d6
+	lsrw	#4,d6
+	subql	#1,d6
+c2p4_bclx:
+	| Octets 0-7
+	
+	moveq	#0,d1
+	moveq	#7,d5
+c2p4_bcl07:
+#if defined(__M68020__)
+	moveb	a0@+,d0
+	lea	a2@(0,d0:w:4),a3
+#else
+	moveq	#0,d0
+	moveb	a0@+,d0
+	lslw	#2,d0
+	lea	a2@(0,d0:w),a3
+#endif
+	lsll	#1,d1
+	orl	a3@,d1
+	dbra	d5,c2p4_bcl07
+
+	movepl	d1,a1@(0)
+	addw	d3,a1
+	swap	d3
+	
+	| Octets 8-15
+
+	moveq	#0,d1
+	moveq	#7,d5
+c2p4_bcl815:
+#if defined(__M68020__)
+	moveb	a0@+,d0
+	lea	a2@(0,d0:w:4),a3
+#else
+	moveq	#0,d0
+	moveb	a0@+,d0
+	lslw	#2,d0
+	lea	a2@(0,d0:w),a3
+#endif
+	lsll	#1,d1
+	orl	a3@,d1
+	dbra	d5,c2p4_bcl815
+
+	movepl	d1,a1@(0)
+	addw	d3,a1
+	swap	d3
+
+	dbra	d6,c2p4_bclx
+
+	| Double line ?
+
+	tstl	c2p_dblligne
+	beq	c2p4_nodblligne
+
+	movel	a5,a6			| src line
+	movel	a5,a1			| dest line
+	addl	c2p_dstpitch,a1
+
+	movel	c2p_width,d6
+	lsrw	#3,d6
+	subql	#1,d6
+c2p4_copydbl:
+	movel	a6@+,a1@+
+	dbra	d6,c2p4_copydbl
+
+	addl	c2p_dstpitch,a5
+c2p4_nodblligne:
+
+	| Next line
+
+	movel	a4,a0		
+	addl	c2p_srcpitch,a0
+	movel	a5,a1
+	addl	c2p_dstpitch,a1
+
+	dbra	d7,c2p4_bcly
+
+	moveml	sp@+,d2-d7/a2-a6
+	rts
+
+* ------------	Conversion of a light palette in 4 bits ------------ */
+
+	.globl	_Atari_C2pConvert4_pal
+
+	.text
+_Atari_C2pConvert4_pal:
+	/* a0 is a 256-word light palette */
+	movel	sp@(4),a0
+
+	moveml	d2-d3,sp@-
+
+	lea	_Atari_table_c2p,a1
+	movew	#255,d3
+c2p_pal_initbcl:
+	movew	a0@+,d0
+	lsrw	#4,d0
+	and	#15,d0
+
+	moveq	#3,d1
+c2p_pal_initbyte:
+	btst	d1,d0
+	sne	d2
+	negw	d2
+	moveb	d2,a1@(0,d1:w)
+
+	dbra	d1,c2p_pal_initbyte
+
+	addql	#4,a1
+	dbra	d3,c2p_pal_initbcl
+
+	moveml	sp@+,d2-d3
+
+	rts
+
+/* ------------	Buffers ------------ */
+
+	.data
+
+	.even
+	.comm	c2p_source,4
+	.comm	c2p_dest,4
+	.comm	c2p_width,4
+	.comm	c2p_height,4
+	.comm	c2p_dblligne,4
+	.comm	c2p_srcpitch,4
+	.comm	c2p_dstpitch,4
+