Skip to content

Commit

Permalink
Preliminary support for Blowup and Screen Blaster 3 extensions on Ata…
Browse files Browse the repository at this point in the history
…ri Falcon 030
  • Loading branch information
pmandin committed Feb 22, 2005
1 parent 661e6e8 commit 6da5730
Show file tree
Hide file tree
Showing 6 changed files with 360 additions and 2 deletions.
6 changes: 5 additions & 1 deletion src/video/xbios/Makefile.am
Expand Up @@ -7,4 +7,8 @@ libvideo_xbios_la_SOURCES = $(XBIOS_SRCS)
# 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
17 changes: 16 additions & 1 deletion src/video/xbios/SDL_xbios.c
Expand Up @@ -55,6 +55,8 @@ static char rcsid =
#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"

Expand Down Expand Up @@ -138,7 +140,7 @@ static unsigned long F30_palette[256];

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) ||
Expand All @@ -165,6 +167,11 @@ static int XBIOS_Available(void)
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;
Expand Down Expand Up @@ -242,6 +249,7 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
{
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));
Expand Down Expand Up @@ -369,6 +377,13 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
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;
}

Expand Down
93 changes: 93 additions & 0 deletions src/video/xbios/SDL_xbios_blowup.c
@@ -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++;
}
}
85 changes: 85 additions & 0 deletions src/video/xbios/SDL_xbios_blowup.h
@@ -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 */
80 changes: 80 additions & 0 deletions src/video/xbios/SDL_xbios_sb3.c
@@ -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;
}

0 comments on commit 6da5730

Please sign in to comment.