view src/video/ataricommon/SDL_ataric2p.S @ 315:3333b6e68289

Date: Sat, 23 Mar 2002 13:53:37 +0200 From: "Mike Gorchak" <mike@malva.ua> Subject: Big QNX patch again. Added 8bit palette emulation code for window mode with bpp>=15. Added store/restore original palette for 8bit modes. Added more information about photon API call fails. Rewroten change palette code, slow but works. Fixed bug with set caption before window was inited. Fixed bugs with some initial state of variables. Fixed bug with storing old video mode settings. Fixed bug with switching to fullscreen mode and back. Fixed few double SEGFAULTS during parachute mode. Removed compilation warning with no PgWaitHWIdle prototype. Removed pack of dead unusable code. Cleanups SDL_PrivateVideoData structure, some headers. Some code formatting.
author Sam Lantinga <slouken@libsdl.org>
date Sat, 23 Mar 2002 20:19:44 +0000
parents f6ffac90895c
children 0310bb01091f
line wrap: on
line source

/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  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