Commit 9681f989 authored by Patrice Mandin's avatar Patrice Mandin

Preliminary support for Blowup and Screen Blaster 3 extensions on Atari Falcon 030

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401041
parent 8556c7d3
...@@ -7,4 +7,8 @@ libvideo_xbios_la_SOURCES = $(XBIOS_SRCS) ...@@ -7,4 +7,8 @@ libvideo_xbios_la_SOURCES = $(XBIOS_SRCS)
# The SDL XBIOS video driver sources # The SDL XBIOS video driver sources
XBIOS_SRCS = \ XBIOS_SRCS = \
SDL_xbios.c \ 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
...@@ -55,6 +55,8 @@ static char rcsid = ...@@ -55,6 +55,8 @@ static char rcsid =
#include "SDL_atarimxalloc_c.h" #include "SDL_atarimxalloc_c.h"
#include "SDL_atarigl_c.h" #include "SDL_atarigl_c.h"
#include "SDL_xbios.h" #include "SDL_xbios.h"
#include "SDL_xbios_blowup.h"
#include "SDL_xbios_sb3.h"
#define XBIOS_VID_DRIVER_NAME "xbios" #define XBIOS_VID_DRIVER_NAME "xbios"
...@@ -138,7 +140,7 @@ static unsigned long F30_palette[256]; ...@@ -138,7 +140,7 @@ static unsigned long F30_palette[256];
static int XBIOS_Available(void) 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 */ /* Milan/Hades Atari clones do not have an Atari video chip */
if ( (Getcookie(C__MIL, &cookie_mil) == C_FOUND) || if ( (Getcookie(C__MIL, &cookie_mil) == C_FOUND) ||
...@@ -165,6 +167,11 @@ static int XBIOS_Available(void) ...@@ -165,6 +167,11 @@ static int XBIOS_Available(void)
case VDO_F30: case VDO_F30:
if ( Montype() == MONITOR_MONO) if ( Montype() == MONITOR_MONO)
return 0; return 0;
if (Getcookie(C_SCPN, &cookie_scpn) == C_FOUND) {
if (!SDL_XBIOS_SB3Usable((scpn_cookie_t *)cookie_scpn)) {
return 0;
}
}
break; break;
default: default:
return 0; return 0;
...@@ -242,6 +249,7 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat) ...@@ -242,6 +249,7 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
{ {
int i,j8,j16; int i,j8,j16;
xbiosmode_t *current_mode; xbiosmode_t *current_mode;
unsigned long cookie_blow, cookie_scpn;
/* Initialize all variables that we clean on shutdown */ /* Initialize all variables that we clean on shutdown */
memset (SDL_modelist, 0, sizeof(SDL_modelist)); memset (SDL_modelist, 0, sizeof(SDL_modelist));
...@@ -369,6 +377,13 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat) ...@@ -369,6 +377,13 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
current_mode++; 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; break;
} }
......
/*
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++;
}
}
/*
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 */
/*
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;
}
/*
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_ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment