changeset 1040:c6ed27c7d47d

Preliminary support for Blowup and Screen Blaster 3 extensions on Atari Falcon 030
author Patrice Mandin <patmandin@gmail.com>
date Tue, 22 Feb 2005 17:57:40 +0000
parents 68f2b997758e
children af92ee34b3e2
files src/video/xbios/Makefile.am src/video/xbios/SDL_xbios.c src/video/xbios/SDL_xbios_blowup.c src/video/xbios/SDL_xbios_blowup.h src/video/xbios/SDL_xbios_sb3.c src/video/xbios/SDL_xbios_sb3.h
diffstat 6 files changed, 360 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/video/xbios/Makefile.am	Tue Feb 15 11:50:33 2005 +0000
+++ b/src/video/xbios/Makefile.am	Tue Feb 22 17:57:40 2005 +0000
@@ -7,4 +7,8 @@
 # The SDL XBIOS video driver sources
 XBIOS_SRCS = 	\
 	SDL_xbios.c	\
-	SDL_xbios.h
+	SDL_xbios.h	\
+	SDL_xbios_blowup.c	\
+	SDL_xbios_blowup.h	\
+	SDL_xbios_sb3.c	\
+	SDL_xbios_sb3.h
--- a/src/video/xbios/SDL_xbios.c	Tue Feb 15 11:50:33 2005 +0000
+++ b/src/video/xbios/SDL_xbios.c	Tue Feb 22 17:57:40 2005 +0000
@@ -55,6 +55,8 @@
 #include "SDL_atarimxalloc_c.h"
 #include "SDL_atarigl_c.h"
 #include "SDL_xbios.h"
+#include "SDL_xbios_blowup.h"
+#include "SDL_xbios_sb3.h"
 
 #define XBIOS_VID_DRIVER_NAME "xbios"
 
@@ -138,7 +140,7 @@
 
 static int XBIOS_Available(void)
 {
-	unsigned long cookie_vdo, cookie_mil, cookie_hade;
+	unsigned long cookie_vdo, cookie_mil, cookie_hade, cookie_scpn;
 
 	/* Milan/Hades Atari clones do not have an Atari video chip */
 	if ( (Getcookie(C__MIL, &cookie_mil) == C_FOUND) ||
@@ -165,6 +167,11 @@
 		case VDO_F30:
 			if ( Montype() == MONITOR_MONO)
 				return 0;
+			if (Getcookie(C_SCPN, &cookie_scpn) == C_FOUND) {
+				if (!SDL_XBIOS_SB3Usable((scpn_cookie_t *)cookie_scpn)) {
+					return 0;
+				}
+			}
 			break;
 		default:
 			return 0;
@@ -242,6 +249,7 @@
 {
 	int i,j8,j16;
 	xbiosmode_t *current_mode;
+	unsigned long cookie_blow, cookie_scpn;
 
 	/* Initialize all variables that we clean on shutdown */
 	memset (SDL_modelist, 0, sizeof(SDL_modelist));
@@ -369,6 +377,13 @@
 				current_mode++;
 			}
 
+			/* Initialize BlowUp or SB3 stuff if present */
+			if (Getcookie(C_BLOW, &cookie_blow) == C_FOUND) {
+				SDL_XBIOS_BlowupInit(this, (blow_cookie_t *)cookie_blow);
+			} else if (Getcookie(C_SCPN, &cookie_scpn) == C_FOUND) {
+				SDL_XBIOS_SB3Init(this, (scpn_cookie_t *)cookie_scpn);
+			}
+
 			break;
 	}
 	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/xbios/SDL_xbios_blowup.c	Tue Feb 22 17:57:40 2005 +0000
@@ -0,0 +1,93 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2004 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
+*/
+
+/*
+	Blowup extension definitions
+
+	Patrice Mandin
+*/
+
+#include "SDL_xbios.h"
+#include "SDL_xbios_blowup.h"
+
+void SDL_XBIOS_BlowupInit(_THIS, blow_cookie_t *cookie_blow)
+{
+	int i, num_mode, bank, keep_old;
+	xbiosmode_t *current_mode;
+	blow_mode_t *blow_mode;
+
+	current_mode = XBIOS_modelist;
+	for (i=0;i<XBIOS_nummodes;i++) {
+		keep_old=1;	/* use default mode */
+		blow_mode = NULL;
+		switch (current_mode->depth) {
+			case 1:
+				num_mode=0;
+				break;
+			case 2:
+				num_mode=1;
+				break;
+			case 4:
+				num_mode=2;
+				break;
+			case 8:
+				num_mode=3;
+				break;
+			case 16:
+				num_mode=4;
+				break;
+			default:
+				num_mode=-1;
+				break;
+		}
+
+		/* Check which bank of modes to use */
+		if (num_mode>=0) {
+			bank = cookie_blow->num_mode[num_mode];
+			blow_mode = &(cookie_blow->blowup_modes[num_mode+(bank*5)]);
+	
+			/* Check extended mode enabled */
+			if (blow_mode->enabled == 0) {
+				/* Check monitor needed for this mode */
+				if ((blow_mode->monitor == cookie_blow->montype)
+					|| ((blow_mode->monitor == MONITOR_TV)
+						&& (cookie_blow->montype == MONITOR_RGB))
+					|| ((blow_mode->monitor == MONITOR_RGB)
+						&& (cookie_blow->montype == MONITOR_TV)))
+				{
+					keep_old = 0; /* we can use this extended mode */
+				}
+			}
+		}
+
+		if (keep_old) {
+			/* disable blowup for this mode */
+			current_mode->number |= (1<<15);	
+		} else {
+			/* Update mode size */
+			current_mode->width = blow_mode->width +1;
+			current_mode->height = blow_mode->height +1;
+		}
+
+		current_mode++;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/xbios/SDL_xbios_blowup.h	Tue Feb 22 17:57:40 2005 +0000
@@ -0,0 +1,85 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2004 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
+*/
+
+/*
+	Blowup extension definitions
+
+	Patrice Mandin
+*/
+
+#ifndef _SDL_xbios_blowup_h
+#define _SDL_xbios_blowup_h
+
+#include "SDL_xbios.h"
+
+/*--- Types ---*/
+
+typedef struct {
+	/* 64 bytes */
+	unsigned short	enabled;		/* Extended mode enabled ? 0=yes, <>0=no */
+	unsigned short	dummy10[6];
+	unsigned short	registers_0E;	/* value for register 0xffff820e */
+	unsigned short	registers_10;	/* value for register 0xffff8210 */
+	unsigned short	dummy11[23];
+
+	/* 64 bytes */
+	unsigned short	width;			/* width-1 */
+	unsigned short	height;			/* height-1 */
+	unsigned short	dummy20;
+	unsigned long	screensize;		/* screensize in bytes */
+	unsigned short	dummy21[8];
+	unsigned short	virtual;		/* Virtual screen ? */
+	unsigned short	virwidth;		/* Virtual screen width */
+	unsigned short	virheight;		/* Virtual screen height */
+
+	unsigned short dummy22;
+	unsigned short monitor;			/* Monitor defined for this mode */
+	unsigned short extension;		/* Extended mode defined ? 0=yes, 1=no */
+	unsigned short dummy23[13];
+
+	/* 64 bytes */
+	unsigned short	dummy30;
+	unsigned short	registers_82[6];	/* values for registers 0xffff8282-8c */
+	unsigned short	dummy31[9];
+
+	unsigned short	dummy32;
+	unsigned short	registers_A2[6];	/* values for registers 0xffff82a2-ac */
+	unsigned short	dummy33[9];
+
+	/* 64 bytes */
+	unsigned short	registers_C0;	/* value for register 0xffff82c0 */
+	unsigned short	registers_C2;	/* value for register 0xffff82c2 */
+	unsigned short	dummy40[30];
+} __attribute__((packed)) blow_mode_t;
+
+typedef struct {
+	blow_mode_t	blowup_modes[10];
+	unsigned char	num_mode[6];
+	unsigned long	dummy;
+	unsigned short	montype;
+} __attribute__((packed)) blow_cookie_t;
+
+/*--- Functions prototypes ---*/
+
+void SDL_XBIOS_BlowupInit(_THIS, blow_cookie_t *cookie_blow);
+
+#endif /* _SDL_xbios_blowup_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/xbios/SDL_xbios_sb3.c	Tue Feb 22 17:57:40 2005 +0000
@@ -0,0 +1,80 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2004 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
+*/
+
+/*
+	ScreenBlaster 3 functions
+
+	Patrice Mandin
+*/
+
+/*--- Includes ---*/
+
+#include "SDL_xbios.h"
+#include "SDL_xbios_sb3.h"
+
+/*--- Defines ---*/
+
+const int SDL_XBIOS_scpn_planes_device[]={
+	SCPN_DEV_1BPP,
+	SCPN_DEV_4BPP,
+	SCPN_DEV_8BPP,
+	SCPN_DEV_16BPP,
+	SCPN_DEV_2BPP,
+	SCPN_DEV_4BPP,
+	SCPN_DEV_1BPP
+};
+
+/*--- Functions ---*/
+
+int SDL_XBIOS_SB3Usable(scpn_cookie_t *cookie_scpn)
+{
+	scpn_screeninfo_t *scrinfo;
+	int bpp;
+
+	/* Check if current SB3 mode is usable, i.e. 8 or 16bpp */
+	scrinfo = cookie_scpn->screen_info;
+	bpp = 1<<(SDL_XBIOS_scpn_planes_device[scrinfo->device]);
+
+	if ((bpp==8) || (bpp==16)) {
+		return 1;
+	}
+
+	return 0;
+}
+
+void SDL_XBIOS_SB3Init(_THIS, scpn_cookie_t *cookie_scpn)
+{
+	xbiosmode_t *current_mode;
+	scpn_screeninfo_t *scrinfo;
+
+	/* SB3 prevent changing video modes, we can only use current one */
+
+	XBIOS_nummodes = 1;
+	current_mode = XBIOS_modelist;	
+	current_mode->number = -1;
+
+	scrinfo = cookie_scpn->screen_info;
+	current_mode->width = scrinfo->virtual_width;
+	current_mode->height = scrinfo->virtual_height;
+	current_mode->depth = 1<<(SDL_XBIOS_scpn_planes_device[scrinfo->device]);
+	scrinfo->h_pos = scrinfo->v_pos = 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/xbios/SDL_xbios_sb3.h	Tue Feb 22 17:57:40 2005 +0000
@@ -0,0 +1,81 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2004 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
+*/
+
+/*
+	ScreenBlaster 3 definitions
+
+	Patrice Mandin
+*/
+
+#ifndef _SDL_xbios_sb3_h_
+#define _SDL_xbios_sb3_h_
+
+/*--- Defines ---*/
+
+#ifndef C_SCPN
+#define C_SCPN 0x5343504EL
+#endif
+
+#define SCPN_DEV_1BPP	0
+#define SCPN_DEV_2BPP	1
+#define SCPN_DEV_4BPP	2
+#define SCPN_DEV_8BPP	3
+#define SCPN_DEV_16BPP	4
+
+extern const int SDL_XBIOS_scpn_planes_device[];
+
+/*--- Types ---*/
+
+typedef struct {
+	unsigned short	virtual_width;	/* Virtual screen width */
+	unsigned short	virtual_height;	/* Virtual screen height */
+	unsigned short	visible_width;	/* Visible width */
+	unsigned short	visible_height;	/* Visible height */
+	unsigned short	h_pos;	/* Horizontal position in virtual screen */
+	unsigned short	v_pos;	/* Vertical position in virtual screen */
+	unsigned short	dummy;
+	unsigned long	size;	/* Size of screen in bytes */
+	unsigned short	device;	/* Device number to find planes = getRez() */
+							/* = Index in scpn_planes_device[] */
+} __attribute__((packed)) scpn_screeninfo_t;
+
+typedef struct {
+	unsigned long	magic;	/* just a BRA assembler jump */
+	unsigned short	version;
+	void			*dummy1;
+	unsigned short	ptsout0_1;
+	unsigned short	ptsout0_2;
+	unsigned short	dummy3;
+	unsigned char	date[8];	/* Date of program build */
+	unsigned char	asm_string[30];	/* 10 times the 'ASM' string */
+	unsigned short	dummy4;
+	scpn_screeninfo_t	*screen_info;
+	unsigned short	dummy6;
+} __attribute__((packed)) scpn_cookie_t;
+
+/*--- Function prototypes ---*/
+
+int SDL_XBIOS_SB3Usable(scpn_cookie_t *cookie_scpn);
+
+void SDL_XBIOS_SB3Init(_THIS, scpn_cookie_t *cookie_scpn);
+
+#endif /* _SDL_xbios_sb3_h_ */