diff src/video/ataricommon/SDL_ataric2p060.c @ 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_ataric2p060.c	Sun Feb 17 19:54:28 2002 +0000
@@ -0,0 +1,203 @@
+/*
+    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
+ *  for 68060 CPU, without movep instruction
+ *	1 byte/pixel -> 4 or 8 bit planes
+ *
+ *	Patrice Mandin
+ */
+
+#include <string.h>
+
+#include <sys/cookie.h>
+
+#include "SDL_ataric2p_s.h"
+
+/*--- Variables ---*/
+
+/* CPU is 060 ? */
+int atari_cpu060_avail;
+
+/*--- Functions ---*/
+
+void atari_test_cpu060_present(void)
+{
+	unsigned long cookie_cpu;
+
+	atari_cpu060_avail=0;
+
+	/* Cookie _CPU present ? */
+	if (Getcookie(C__CPU, &cookie_cpu) == C_FOUND) {
+		atari_cpu060_avail = (cookie_cpu == 60);
+	}
+}
+
+void Atari_C2pConvert8_060(
+	Uint8 *src,			/* Source screen (one byte=one pixel) */
+	Uint8 *dest,		/* Destination (8 bits planes) */
+	Uint32 width,		/* Dimensions of screen to convert */
+	Uint32 height,
+	Uint32 dblligne,	/* Double the lines when converting ? */
+	Uint32 srcpitch,	/* Length of one source line in bytes */
+	Uint32 dstpitch		/* Length of one destination line in bytes */
+)
+{
+	int x,y,z;
+	Uint8 *src_line, *dst_line;
+
+	for (y=0; y<height; y++) {
+		src_line = src;
+		dst_line = dest;
+
+		for (x=0; x<(width>>4); x++) {
+			Uint32 somme1, somme2;
+			Uint32 *convtable;
+
+			/* bytes 0-7 */
+			somme1 = somme2 = 0;
+			for (z=0; z<8 ;z++) {
+				convtable = (Uint32 *) &Atari_table_c2p[(*src_line++)<<3];
+				somme1 <<= 1;
+				somme2 <<= 1;
+				somme1 |= *convtable++;
+				somme2 |= *convtable;
+			}
+
+			*(dst_line+14) = somme2;	/* 000000FF */
+			*(dst_line+6) = somme1;		/* 000000FF */
+			somme2 >>= 8;
+			somme1 >>= 8;
+			*(dst_line+12) = somme2;	/* 0000FF00 */
+			*(dst_line+4) = somme1;		/* 0000FF00 */
+			somme2 >>= 8;
+			somme1 >>= 8;
+			*(dst_line+10) = somme2;	/* 00FF0000 */
+			*(dst_line+2) = somme1;		/* 00FF0000 */
+			somme2 >>= 8;
+			somme1 >>= 8;
+			*(dst_line+8) = somme2;		/* FF000000 */
+			*dst_line++ = somme1;		/* FF000000 */
+
+			/* bytes 8-15 */
+			somme1 = somme2 = 0;
+			for (z=0; z<8 ;z++) {
+				convtable = (Uint32 *) &Atari_table_c2p[(*src_line++)<<3];
+				somme1 <<= 1;
+				somme2 <<= 1;
+				somme1 |= *convtable++;
+				somme2 |= *convtable;
+			}
+
+			*(dst_line+14) = somme2;	/* 000000FF */
+			*(dst_line+6) = somme1;		/* 000000FF */
+			somme2 >>= 8;
+			somme1 >>= 8;
+			*(dst_line+12) = somme2;	/* 0000FF00 */
+			*(dst_line+4) = somme1;		/* 0000FF00 */
+			somme2 >>= 8;
+			somme1 >>= 8;
+			*(dst_line+10) = somme2;	/* 00FF0000 */
+			*(dst_line+2) = somme1;		/* 00FF0000 */
+			somme2 >>= 8;
+			somme1 >>= 8;
+			*(dst_line+8) = somme2;		/* FF000000 */
+			*dst_line = somme1;			/* FF000000 */
+
+			dst_line += 15;
+		}
+
+		if (dblligne) {
+			memcpy(dest+dstpitch, dest, width);
+			dest += dstpitch;
+		}
+
+		src += srcpitch;
+		dest += dstpitch;
+	}
+}
+
+void Atari_C2pConvert4_060(
+	Uint8 *src,			/* Source screen (one byte=one pixel) */
+	Uint8 *dest,		/* Destination (4 bits planes) */
+	Uint32 width,		/* Dimensions of screen to convert */
+	Uint32 height,
+	Uint32 dblligne,	/* Double the lines when converting ? */
+	Uint32 srcpitch,	/* Length of one source line in bytes */
+	Uint32 dstpitch		/* Length of one destination line in bytes */
+)
+{
+	int x,y,z;
+	Uint8 *src_line, *dst_line;
+
+	for (y=0;y<height;y++) {
+		src_line = src;
+		dst_line = dest;
+
+		for (x=0; x<(width>>4);x++) {
+			Uint32 somme;
+			Uint32 *convtable;
+
+			/* bytes 0-7 */
+			somme=0;
+			for (z=0; z<8 ; z++) {
+				convtable = (Uint32 *) &Atari_table_c2p[(*src_line++)<<2];
+				somme <<= 1;
+				somme |= *convtable;
+			}
+
+			*(dst_line+6) = somme; somme >>= 8;	/* 000000FF */
+			*(dst_line+4) = somme; somme >>= 8;	/* 0000FF00 */
+			*(dst_line+2) = somme; somme >>= 8;	/* 00FF0000 */
+			*dst_line++ = somme;				/* FF000000 */
+
+			/* bytes 8-15 */
+			somme = 0;
+			for (z=0; z<8 ;z++) {
+				convtable = (Uint32 *) &Atari_table_c2p[(*src_line++)<<2];
+				somme <<= 1;
+				somme |= *convtable;
+			}
+
+			*(dst_line+6) = somme; somme >>= 8;	/* 000000FF */
+			*(dst_line+4) = somme; somme >>= 8;	/* 0000FF00 */
+			*(dst_line+2) = somme; somme >>= 8;	/* 00FF0000 */
+			*dst_line = somme;					/* FF000000 */
+
+			dst_line += 7;
+		}
+
+		if (dblligne) {
+			memcpy(dest+dstpitch, dest, width>>1);
+			dest += dstpitch;
+		}
+
+		src += srcpitch;
+		dest += dstpitch;
+	}
+}