Commit ccc4e650 authored by Patrice Mandin's avatar Patrice Mandin

Preliminary work to support the Milan video bios, that will gives access to 24...

Preliminary work to support the Milan video bios, that will gives access to 24 or 32 bpp modes. I used the svga driver as model to dynamically build video modes list.

--HG--
branch : SDL-1.2
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/branches/SDL-1.2%403820
parent 1aeda60e
......@@ -94,6 +94,45 @@ static void XBIOS_GL_SwapBuffers(_THIS);
static unsigned short TT_palette[256];
static unsigned long F30_palette[256];
/* Default list of video modes */
static const xbiosmode_t stmodes[1]={
{ST_LOW>>8,320,200,4,SDL_FALSE}
};
static const xbiosmode_t ttmodes[2]={
{TT_LOW,320,480,8,SDL_FALSE},
{TT_LOW,320,240,8,SDL_TRUE} /* Software double-lined mode */
};
static const xbiosmode_t falconrgbmodes[16]={
{BPS16|COL80|OVERSCAN|VERTFLAG,768,480,16,SDL_FALSE},
{BPS16|COL80|OVERSCAN,768,240,16,SDL_FALSE},
{BPS16|COL80|VERTFLAG,640,400,16,SDL_FALSE},
{BPS16|COL80,640,200,16,SDL_FALSE},
{BPS16|OVERSCAN|VERTFLAG,384,480,16,SDL_FALSE},
{BPS16|OVERSCAN,384,240,16,SDL_FALSE},
{BPS16|VERTFLAG,320,400,16,SDL_FALSE},
{BPS16,320,200,16,SDL_FALSE},
{BPS8|COL80|OVERSCAN|VERTFLAG,768,480,8,SDL_FALSE},
{BPS8|COL80|OVERSCAN,768,240,8,SDL_FALSE},
{BPS8|COL80|VERTFLAG,640,400,8,SDL_FALSE},
{BPS8|COL80,640,200,8,SDL_FALSE},
{BPS8|OVERSCAN|VERTFLAG,384,480,8,SDL_FALSE},
{BPS8|OVERSCAN,384,240,8,SDL_FALSE},
{BPS8|VERTFLAG,320,400,8,SDL_FALSE},
{BPS8,320,200,8,SDL_FALSE}
};
static const xbiosmode_t falconvgamodes[6]={
{BPS16,320,480,16,SDL_FALSE},
{BPS16|VERTFLAG,320,240,16,SDL_FALSE},
{BPS8|COL80,640,480,8,SDL_FALSE},
{BPS8|COL80|VERTFLAG,640,240,8,SDL_FALSE},
{BPS8,320,480,8,SDL_FALSE},
{BPS8|VERTFLAG,320,240,8,SDL_FALSE}
};
/* Xbios driver bootstrap functions */
static int XBIOS_Available(void)
......@@ -216,55 +255,105 @@ VideoBootStrap XBIOS_bootstrap = {
XBIOS_Available, XBIOS_CreateDevice
};
void SDL_XBIOS_AddMode(_THIS, Uint16 modecode, Uint16 width, Uint16 height,
Uint16 depth, SDL_bool flags)
void SDL_XBIOS_AddMode(_THIS, int actually_add, const xbiosmode_t *modeinfo)
{
int i, curpos;
xbiosmode_t *current_mode;
int i = 0;
switch(modeinfo->depth) {
case 15:
case 16:
i = 1;
break;
case 24:
i = 2;
break;
case 32:
i = 3;
break;
}
/* Check if mode already exists */
if (XBIOS_modelist) {
current_mode = XBIOS_modelist;
for (i=0;i<XBIOS_nummodes; i++, current_mode++) {
if (current_mode->width != width)
continue;
if (current_mode->height != height)
continue;
if (current_mode->depth != depth)
continue;
if ( actually_add ) {
SDL_Rect saved_rect[2];
xbiosmode_t saved_mode[2];
int b, j;
/* Add the mode, sorted largest to smallest */
b = 0;
j = 0;
while ( (SDL_modelist[i][j]->w > modeinfo->width) ||
(SDL_modelist[i][j]->h > modeinfo->height) ) {
++j;
}
/* Skip modes that are already in our list */
if ( (SDL_modelist[i][j]->w == modeinfo->width) &&
(SDL_modelist[i][j]->h == modeinfo->height) ) {
return;
}
/* Insert the new mode */
saved_rect[b] = *SDL_modelist[i][j];
SDL_memcpy(&saved_mode[b], SDL_xbiosmode[i][j], sizeof(xbiosmode_t));
SDL_modelist[i][j]->w = modeinfo->width;
SDL_modelist[i][j]->h = modeinfo->height;
SDL_memcpy(SDL_xbiosmode[i][j], modeinfo, sizeof(xbiosmode_t));
/* Everybody scoot down! */
if ( saved_rect[b].w && saved_rect[b].h ) {
for ( ++j; SDL_modelist[i][j]->w; ++j ) {
saved_rect[!b] = *SDL_modelist[i][j];
memcpy(&saved_mode[!b], SDL_xbiosmode[i][j], sizeof(xbiosmode_t));
*SDL_modelist[i][j] = saved_rect[b];
SDL_memcpy(SDL_xbiosmode[i][j], &saved_mode[b], sizeof(xbiosmode_t));
b = !b;
}
*SDL_modelist[i][j] = saved_rect[b];
SDL_memcpy(SDL_xbiosmode[i][j], &saved_mode[b], sizeof(xbiosmode_t));
}
} else {
++SDL_nummodes[i];
}
}
++XBIOS_nummodes;
XBIOS_modelist = (xbiosmode_t *) SDL_realloc(XBIOS_modelist, XBIOS_nummodes * sizeof(xbiosmode_t));
static void XBIOS_ListSTModes(_THIS, int actually_add)
{
SDL_XBIOS_AddMode(this, actually_add, &stmodes[0]);
}
/* Keep the list sorted: bpp, width, height */
curpos=0;
static void XBIOS_ListTTModes(_THIS, int actually_add)
{
int i;
for(i=0; i<XBIOS_nummodes-1; i++) {
if (XBIOS_modelist[i].depth <= depth) {
if (XBIOS_modelist[i].width < width) {
break;
} else if (XBIOS_modelist[i].width == width) {
if (XBIOS_modelist[i].height <= height) {
break;
}
}
}
curpos++;
for (i=0; i<2; i++) {
SDL_XBIOS_AddMode(this, actually_add, &ttmodes[i]);
}
}
static void XBIOS_ListFalconRgbModes(_THIS, int actually_add)
{
int i;
for (i=0; i<16; i++) {
xbiosmode_t modeinfo;
SDL_memcpy(&modeinfo, &falconrgbmodes[i], sizeof(xbiosmode_t));
modeinfo.number &= ~(VGA|PAL);
modeinfo.number |= XBIOS_oldvmode & (VGA|PAL);
/* Push remaining modes further */
for(i=XBIOS_nummodes-1; i>curpos; i--) {
SDL_memcpy(&XBIOS_modelist[i], &XBIOS_modelist[i-1], sizeof(xbiosmode_t));
SDL_XBIOS_AddMode(this, actually_add, &modeinfo);
}
}
static void XBIOS_ListFalconVgaModes(_THIS, int actually_add)
{
int i;
XBIOS_modelist[curpos].number = modecode;
XBIOS_modelist[curpos].width = width;
XBIOS_modelist[curpos].height = height;
XBIOS_modelist[curpos].depth = depth;
XBIOS_modelist[curpos].doubleline = flags;
for (i=0; i<6; i++) {
xbiosmode_t modeinfo;
SDL_memcpy(&modeinfo, &falconvgamodes[i], sizeof(xbiosmode_t));
modeinfo.number &= ~(VGA|PAL);
modeinfo.number |= XBIOS_oldvmode & (VGA|PAL);
SDL_XBIOS_AddMode(this, actually_add, &modeinfo);
}
}
static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
......@@ -274,7 +363,11 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
unsigned long cookie_blow, cookie_scpn, cookie_cnts;
/* Initialize all variables that we clean on shutdown */
memset (SDL_modelist, 0, sizeof(SDL_modelist));
for ( i=0; i<NUM_MODELISTS; ++i ) {
SDL_nummodes[i] = 0;
SDL_modelist[i] = NULL;
SDL_xbiosmode[i] = NULL;
}
/* Cookie _VDO present ? if not, assume ST machine */
if (Getcookie(C__VDO, &XBIOS_cvdo) != C_FOUND) {
......@@ -290,17 +383,21 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
/* Initialize video mode list */
/* and save current screen status (palette, screen address, video mode) */
XBIOS_nummodes = 0;
XBIOS_modelist = NULL;
XBIOS_centscreen = SDL_FALSE;
/* Determine the current screen size */
this->info.current_w = 0;
this->info.current_h = 0;
/* Determine the screen depth (use default 8-bit depth) */
vformat->BitsPerPixel = 8;
/* First allocate room for needed video modes */
switch (XBIOS_cvdo >>16) {
case VDO_ST:
case VDO_STE:
{
short *oldpalette;
SDL_XBIOS_AddMode(this, ST_LOW>>8,320,200,4,SDL_FALSE);
XBIOS_oldvbase=Physbase();
XBIOS_oldvmode=Getrez();
......@@ -314,9 +411,6 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
case ST_HIGH:
XBIOS_oldnumcol=2;
break;
default:
XBIOS_oldnumcol=0;
break;
}
oldpalette= (short *) XBIOS_oldpalette;
......@@ -324,15 +418,10 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
*oldpalette++=Setcolor(i,-1);
}
vformat->BitsPerPixel = 8;
XBIOS_ListSTModes(this, 0);
}
break;
case VDO_TT:
SDL_XBIOS_AddMode(this, TT_LOW,320,480,8,SDL_FALSE);
/* Software double-lined mode */
SDL_XBIOS_AddMode(this, TT_LOW,320,240,8,SDL_TRUE);
XBIOS_oldvbase=Logbase();
XBIOS_oldvmode=EgetShift();
......@@ -351,50 +440,14 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
case TT_HIGH:
XBIOS_oldnumcol=2;
break;
default:
XBIOS_oldnumcol=0;
break;
}
if (XBIOS_oldnumcol) {
EgetPalette(0, XBIOS_oldnumcol, XBIOS_oldpalette);
}
vformat->BitsPerPixel = 8;
XBIOS_ListTTModes(this, 0);
break;
case VDO_F30:
switch (VgetMonitor())
{
case MONITOR_MONO:
/* Not usable */
break;
case MONITOR_RGB:
case MONITOR_TV:
SDL_XBIOS_AddMode(this, BPS16|COL80|OVERSCAN|VERTFLAG,768,480,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS16|COL80|OVERSCAN,768,240,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS16|COL80|VERTFLAG,640,400,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS16|COL80,640,200,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS16|OVERSCAN|VERTFLAG,384,480,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS16|OVERSCAN,384,240,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS16|VERTFLAG,320,400,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS16,320,200,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|COL80|OVERSCAN|VERTFLAG,768,480,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|COL80|OVERSCAN,768,240,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|COL80|VERTFLAG,640,400,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|COL80,640,200,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|OVERSCAN|VERTFLAG,384,480,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|OVERSCAN,384,240,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|VERTFLAG,320,400,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8,320,200,8,SDL_FALSE);
break;
case MONITOR_VGA:
SDL_XBIOS_AddMode(this, BPS16,320,480,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS16|VERTFLAG,320,240,16,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|COL80,640,480,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|COL80|VERTFLAG,640,240,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8,320,480,8,SDL_FALSE);
SDL_XBIOS_AddMode(this, BPS8|VERTFLAG,320,240,8,SDL_FALSE);
break;
}
XBIOS_oldvbase=Logbase();
XBIOS_oldvmode=VsetMode(-1);
......@@ -408,64 +461,98 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
vformat->BitsPerPixel = 16;
/* Keep vga/rvb, and pal/ntsc bits */
current_mode = XBIOS_modelist;
for (i=0;i<XBIOS_nummodes;i++) {
Uint16 newvmode;
newvmode = current_mode->number;
newvmode &= ~(VGA|PAL);
newvmode |= XBIOS_oldvmode & (VGA|PAL);
current_mode->number = newvmode;
current_mode++;
/* ScreenBlaster 3 ? */
if (Getcookie(C_SCPN, &cookie_scpn) == C_FOUND) {
SDL_XBIOS_ListSB3Modes(this, 0, (scpn_cookie_t *)cookie_scpn);
} else
/* Centscreen ? */
if (Getcookie(C_CNTS, &cookie_cnts) == C_FOUND) {
XBIOS_oldvmode = SDL_XBIOS_ListCentscreenModes(this, 0);
XBIOS_centscreen = SDL_TRUE;
} else
/* Standard, with or without Blowup */
{
switch (VgetMonitor())
{
case MONITOR_RGB:
case MONITOR_TV:
XBIOS_ListFalconRgbModes(this, 0);
break;
case MONITOR_VGA:
XBIOS_ListFalconVgaModes(this, 0);
break;
}
if (Getcookie(C_BLOW, &cookie_blow) == C_FOUND) {
SDL_XBIOS_ListBlowupModes(this, 0, (blow_cookie_t *)cookie_blow);
}
}
break;
}
/* Initialize BlowUp/SB3/Centscreen 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);
} else if (Getcookie(C_CNTS, &cookie_cnts) == C_FOUND) {
XBIOS_oldvmode = SDL_XBIOS_CentscreenInit(this);
XBIOS_centscreen = SDL_TRUE;
for ( i=0; i<NUM_MODELISTS; ++i ) {
int j;
SDL_xbiosmode[i] = (xbiosmode_t **)SDL_malloc(SDL_nummodes[i]*sizeof(xbiosmode_t));
if ( SDL_xbiosmode[i] == NULL ) {
SDL_OutOfMemory();
return(-1);
}
SDL_modelist[i] = (SDL_Rect **)
SDL_malloc((SDL_nummodes[i]+1)*sizeof(SDL_Rect *));
if ( SDL_modelist[i] == NULL ) {
SDL_OutOfMemory();
return(-1);
}
for ( j=0; j<SDL_nummodes[i]; ++j ) {
SDL_modelist[i][j]=(SDL_Rect *)SDL_malloc(sizeof(SDL_Rect));
if ( SDL_modelist[i][j] == NULL ) {
SDL_OutOfMemory();
return(-1);
}
SDL_memset(SDL_modelist[i][j], 0, sizeof(SDL_Rect));
}
SDL_modelist[i][j] = NULL;
}
/* Now fill the mode list */
switch (XBIOS_cvdo >>16) {
case VDO_ST:
case VDO_STE:
XBIOS_ListSTModes(this, 1);
break;
}
case VDO_TT:
XBIOS_ListTTModes(this, 1);
break;
case VDO_F30:
/* ScreenBlaster 3 ? */
if (Getcookie(C_SCPN, &cookie_scpn) == C_FOUND) {
SDL_XBIOS_ListSB3Modes(this, 1, (scpn_cookie_t *)cookie_scpn);
} else
/* Centscreen ? */
if (Getcookie(C_CNTS, &cookie_cnts) == C_FOUND) {
XBIOS_oldvmode = SDL_XBIOS_ListCentscreenModes(this, 1);
XBIOS_centscreen = SDL_TRUE;
} else
/* Standard, with or without Blowup */
{
switch (VgetMonitor())
{
case MONITOR_RGB:
case MONITOR_TV:
XBIOS_ListFalconRgbModes(this, 1);
break;
case MONITOR_VGA:
XBIOS_ListFalconVgaModes(this, 1);
break;
}
/* Determine the current screen size */
if ( XBIOS_nummodes > 0 ) {
/* FIXME: parse video mode list to search for current mode */
this->info.current_w = XBIOS_modelist[0].width;
this->info.current_h = XBIOS_modelist[0].height;
}
current_mode = XBIOS_modelist;
j8 = j16 = 0;
for (i=0; i<XBIOS_nummodes; i++, current_mode++) {
switch (current_mode->depth) {
case 4:
case 8:
SDL_modelist[0][j8] = SDL_malloc(sizeof(SDL_Rect));
SDL_modelist[0][j8]->x = SDL_modelist[0][j8]->y = 0;
SDL_modelist[0][j8]->w = current_mode->width;
SDL_modelist[0][j8]->h = current_mode->height;
XBIOS_videomodes[0][j8]=current_mode;
j8++;
break;
case 16:
SDL_modelist[1][j16] = SDL_malloc(sizeof(SDL_Rect));
SDL_modelist[1][j16]->x = SDL_modelist[1][j16]->y = 0;
SDL_modelist[1][j16]->w = current_mode->width;
SDL_modelist[1][j16]->h = current_mode->height;
XBIOS_videomodes[1][j16]=current_mode;
j16++;
break;
}
}
SDL_modelist[0][j8] = NULL;
SDL_modelist[1][j16] = NULL;
if (Getcookie(C_BLOW, &cookie_blow) == C_FOUND) {
SDL_XBIOS_ListBlowupModes(this, 1, (blow_cookie_t *)cookie_blow);
}
}
break;
}
XBIOS_screens[0]=NULL;
XBIOS_screens[1]=NULL;
......@@ -493,13 +580,7 @@ static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
static SDL_Rect **XBIOS_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
{
/* 8 bits -> list 0 */
/* 16 bits -> list 1 */
if ((format->BitsPerPixel != 8) && (format->BitsPerPixel !=16)) {
return NULL;
}
return(SDL_modelist[(format->BitsPerPixel)>>4]);
return(SDL_modelist[((format->BitsPerPixel+7)/8)-1]);
}
static void XBIOS_FreeBuffers(_THIS)
......@@ -531,17 +612,11 @@ static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current,
/* Free current buffers */
XBIOS_FreeBuffers(this);
/* Limit bpp */
if (bpp>16) {
bpp = 16;
}
bpp >>= 4;
/* Search if the mode exists (width, height, bpp) */
/* Try to set the requested linear video mode */
bpp = (bpp+7)/8-1;
for ( mode=0; SDL_modelist[bpp][mode]; ++mode ) {
if ( (SDL_modelist[bpp][mode]->w == width) &&
(SDL_modelist[bpp][mode]->h == height) ) {
break;
}
}
......@@ -549,11 +624,11 @@ static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current,
SDL_SetError("Couldn't find requested mode in list");
return(NULL);
}
new_video_mode = SDL_xbiosmode[bpp][mode];
modeflags = SDL_FULLSCREEN | SDL_PREALLOC;
/* Allocate needed buffers: simple/double buffer and shadow surface */
new_video_mode = XBIOS_videomodes[bpp][mode];
new_depth = new_video_mode->depth;
if (new_depth == 4) {
SDL_Atari_C2pConvert = SDL_Atari_C2pConvert4;
......@@ -655,28 +730,23 @@ static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current,
current->flags = modeflags;
/* Now set the video mode */
#ifndef DEBUG_VIDEO_XBIOS
/* Now set the video mode */
Setscreen(-1,XBIOS_screens[0],-1);
#endif
switch(XBIOS_cvdo >> 16) {
case VDO_ST:
#ifndef DEBUG_VIDEO_XBIOS
Setscreen(-1,-1,new_video_mode->number);
#endif
/* Reset palette */
for (i=0;i<16;i++) {
TT_palette[i]= ((i>>1)<<8) | (((i*8)/17)<<4) | (i>>1);
}
#ifndef DEBUG_VIDEO_XBIOS
Setpalette(TT_palette);
#endif
break;
case VDO_STE:
#ifndef DEBUG_VIDEO_XBIOS
Setscreen(-1,-1,new_video_mode->number);
#endif
/* Reset palette */
for (i=0;i<16;i++)
{
......@@ -685,23 +755,18 @@ static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current,
c=((i&1)<<3)|((i>>1)&7);
TT_palette[i]=(c<<8)|(c<<4)|c;
}
#ifndef DEBUG_VIDEO_XBIOS
Setpalette(TT_palette);
#endif
break;
case VDO_TT:
#ifndef DEBUG_VIDEO_XBIOS
EsetShift(new_video_mode->number);
#endif
break;
case VDO_F30:
#ifndef DEBUG_VIDEO_XBIOS
if (XBIOS_centscreen) {
SDL_XBIOS_CentscreenSetmode(this, width, height, new_depth);
} else {
VsetMode(new_video_mode->number);
}
#endif
/* Set hardware palette to black in True Colour */
if (new_depth == 16) {
SDL_memset(F30_palette, 0, sizeof(F30_palette));
......@@ -711,6 +776,7 @@ static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current,
}
Vsync();
#endif
this->UpdateRects = XBIOS_UpdateRects;
......@@ -780,8 +846,9 @@ static void XBIOS_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
#ifndef DEBUG_VIDEO_XBIOS
Setscreen(-1,XBIOS_screens[XBIOS_fbnum],-1);
#endif
Vsync();
#endif
if ((surface->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF) {
XBIOS_fbnum ^= 1;
......@@ -818,8 +885,9 @@ static int XBIOS_FlipHWSurface(_THIS, SDL_Surface *surface)
#ifndef DEBUG_VIDEO_XBIOS
Setscreen(-1,XBIOS_screens[XBIOS_fbnum],-1);
#endif
Vsync();
#endif
if ((surface->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF) {
XBIOS_fbnum ^= 1;
......@@ -833,6 +901,7 @@ static int XBIOS_FlipHWSurface(_THIS, SDL_Surface *surface)
static int XBIOS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
{
#ifndef DEBUG_VIDEO_XBIOS
int i;
int r,v,b;
......@@ -858,9 +927,7 @@ static int XBIOS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors
TT_palette[i]=((r>>4)<<8)|((v>>4)<<4)|(b>>4);
}
#ifndef DEBUG_VIDEO_XBIOS
EsetPalette(firstcolor,ncolors,TT_palette);
#endif
break;
case VDO_F30:
for(i = 0; i < ncolors; i++)
......@@ -871,11 +938,10 @@ static int XBIOS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors
F30_palette[i]=(r<<16)|(v<<8)|b;
}
#ifndef DEBUG_VIDEO_XBIOS
VsetRGB(firstcolor,ncolors,F30_palette);
#endif
break;
}
#endif
return(1);
}
......@@ -921,7 +987,6 @@ static void XBIOS_VideoQuit(_THIS)
Vsync();
#endif
#if SDL_VIDEO_OPENGL
if (gl_active) {
SDL_AtariGL_Quit(this, SDL_TRUE);
......@@ -935,19 +1000,19 @@ static void XBIOS_VideoQuit(_THIS)
XBIOS_FreeBuffers(this);
/* Free mode list */
for (j=0;j<NUM_MODELISTS;j++) {
for (i=0;i<SDL_NUMMODES;i++) {
if (SDL_modelist[j][i]!=NULL) {
SDL_free(SDL_modelist[j][i]);
SDL_modelist[j][i]=NULL;
}
for ( i=0; i<NUM_MODELISTS; ++i ) {
if ( SDL_modelist[i] != NULL ) {
for ( j=0; SDL_modelist[i][j]; ++j )
SDL_free(SDL_modelist[i][j]);
SDL_free(SDL_modelist[i]);
SDL_modelist[i] = NULL;
}
if ( SDL_xbiosmode[i] != NULL ) {
for ( j=0; SDL_xbiosmode[i][j]; ++j )
SDL_free(SDL_xbiosmode[i][j]);
SDL_free(SDL_xbiosmode[i]);
SDL_xbiosmode[i] = NULL;
}
}
if (XBIOS_modelist) {
SDL_free(XBIOS_modelist);
XBIOS_nummodes=0;
XBIOS_modelist=NULL;
}
this->screen->pixels = NULL;
......
......@@ -30,13 +30,6 @@
/* Hidden "this" pointer for the video functions */
#define _THIS SDL_VideoDevice *this
/* TT video modes: 2
Falcon RVB: 16 (could be *2 by adding PAL/NTSC modes)
Falcon VGA: 6
ST low: 1
*/
#define SDL_NUMMODES 16
typedef struct
{
Uint16 number; /* Video mode number */
......@@ -47,7 +40,7 @@ typedef struct
} xbiosmode_t;
/* Private display data */
#define NUM_MODELISTS 2 /* 8 and 16 bits-per-pixel */
#define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */
struct SDL_PrivateVideoData {
long cookie_vdo;
......@@ -55,8 +48,6 @@ struct SDL_PrivateVideoData {
void *old_video_base; /* Old pointer to screen buffer */
void *old_palette; /* Old palette */
Uint32 old_num_colors; /* Nb of colors in saved palette */
int num_modes; /* Number of xbios video modes */
xbiosmode_t *mode_list; /* List of xbios video modes */
void *screens[2]; /* Pointers to aligned screen buffer */
void *screensmem[2]; /* Pointers to screen buffer */
......@@ -68,8 +59,9 @@ struct SDL_PrivateVideoData {
SDL_bool centscreen; /* Centscreen extension present ? */
SDL_Rect *SDL_modelist[NUM_MODELISTS][SDL_NUMMODES+1];
xbiosmode_t *videomodes[NUM_MODELISTS][SDL_NUMMODES+1];
int SDL_nummodes[NUM_MODELISTS];
SDL_Rect **SDL_modelist[NUM_MODELISTS];
xbiosmode_t **SDL_xbiosmode[NUM_MODELISTS];
};
/* _VDO cookie values */
......@@ -102,19 +94,18 @@ enum {
#endif
/* Hidden structure -> variables names */
#define SDL_nummodes (this->hidden->SDL_nummodes)
#define SDL_modelist (this->hidden->SDL_modelist)
#define SDL_xbiosmode (this->hidden->SDL_xbiosmode)
#define XBIOS_mutex (this->hidden->mutex)
#define XBIOS_cvdo (this->hidden->cookie_vdo)
#define XBIOS_oldpalette (this->hidden->old_palette)
#define XBIOS_oldnumcol (this->hidden->old_num_colors)
#define XBIOS_oldvbase (this->hidden->old_video_base)
#define XBIOS_oldvmode (this->hidden->old_video_mode)
#define XBIOS_nummodes (this->hidden->num_modes)
#define XBIOS_modelist (this->hidden->mode_list)
#define XBIOS_screens (this->hidden->screens)
#define XBIOS_screensmem (this->hidden->screensmem)
#define XBIOS_shadowscreen (this->hidden->shadowscreen)
#define XBIOS_videomodes (this->hidden->videomodes)
#define XBIOS_doubleline (this->hidden->doubleline)
#define XBIOS_fbnum (this->hidden->frame_number)
#define XBIOS_pitch (this->hidden->pitch)
......@@ -124,7 +115,6 @@ enum {
/*--- Functions prototypes ---*/
void SDL_XBIOS_AddMode(_THIS, Uint16 modecode, Uint16 width, Uint16 height,
Uint16 depth, SDL_bool flags);
void SDL_XBIOS_AddMode(_THIS, int actually_add, const xbiosmode_t *modeinfo);
#endif /* _SDL_xbios_h */
......@@ -32,14 +32,21 @@
#include "SDL_xbios.h"
#include "SDL_xbios_blowup.h"
void SDL_XBIOS_BlowupInit(_THIS, blow_cookie_t *cookie_blow)
void SDL_XBIOS_ListBlowupModes(_THIS, int actually_add, blow_cookie_t *cookie_blow)
{
int i, num_mode, bank;
int i, j, num_mode, bank;
blow_mode_t *blow_mode;
xbiosmode_t modeinfo;
/* Add bit 15 for old modes */
for (i=0;i<XBIOS_nummodes;i++) {
XBIOS_modelist[i].number |= 1<<15;
if (actually_add) {
/* Set bit 15 for old modes */
for (i=0;i<NUM_MODELISTS;i++) {
if ( SDL_xbiosmode[i] != NULL ) {
for ( j=0; SDL_xbiosmode[i][j]; ++j ) {
SDL_xbiosmode[i][j]->number |= 1<<15;
}
}
}
}
/* Add Blowup modes for 8 and 16 bpp */
......@@ -57,13 +64,13 @@ void SDL_XBIOS_BlowupInit(_THIS, blow_cookie_t *cookie_blow)
&& (cookie_blow->montype == MONITOR_TV)))
{
/* we can use this extended mode */
SDL_XBIOS_AddMode(this,
num_mode == 3 ? BPS8 : BPS16,
blow_mode->width + 1,
blow_mode->height + 1,
num_mode == 3 ? 8 : 16,
SDL_FALSE
);
modeinfo.number = (num_mode == 3 ? BPS8 : BPS16);
modeinfo.width = blow_mode->width + 1;
modeinfo.height = blow_mode->height + 1;
modeinfo.depth = (num_mode == 3 ? 8 : 16);
modeinfo.doubleline = SDL_FALSE;
SDL_XBIOS_AddMode(this, actually_add, &modeinfo);
}
}
}
......
......@@ -81,6 +81,6 @@ typedef struct {
/*--- Functions prototypes ---*/
void SDL_XBIOS_BlowupInit(_THIS, blow_cookie_t *cookie_blow);
void SDL_XBIOS_ListBlowupModes(_THIS, int actually_add, blow_cookie_t *cookie_blow);
#endif /* _SDL_xbios_blowup_h */
......@@ -32,19 +32,12 @@
#include "SDL_xbios.h"
#include "SDL_xbios_centscreen.h"
int SDL_XBIOS_CentscreenInit(_THIS)
int SDL_XBIOS_ListCentscreenModes(_THIS, int actually_add)
{
centscreen_mode_t curmode, listedmode;
centscreen_mode_t curmode, listedmode;
unsigned long result;
int cur_handle; /* Current Centscreen mode handle */
/* Reset current mode list */
if (XBIOS_modelist) {
SDL_free(XBIOS_modelist);
XBIOS_nummodes = 0;
XBIOS_modelist = NULL;
}
/* Add Centscreen modes */
Vread(&curmode);
cur_handle = curmode.handle;
......@@ -58,9 +51,15 @@ int SDL_XBIOS_CentscreenInit(_THIS)
if ((listedmode.mode & CSCREEN_VIRTUAL)==0) {
/* Don't add modes with bpp<8 */
if (listedmode.plan>=8) {
SDL_XBIOS_AddMode(this, listedmode.mode, listedmode.physx,
listedmode.physy, listedmode.plan, SDL_FALSE
);
xbiosmode_t modeinfo;
modeinfo.number = listedmode.mode;
modeinfo.width = listedmode.physx;
modeinfo.height = listedmode.physy;
modeinfo.depth = listedmode.plan;
modeinfo.doubleline = SDL_FALSE;
SDL_XBIOS_AddMode(this, actually_add, &modeinfo);
}
}
SDL_memcpy(&curmode, &listedmode, sizeof(centscreen_mode_t));
......@@ -77,7 +76,7 @@ int SDL_XBIOS_CentscreenInit(_THIS)
void SDL_XBIOS_CentscreenSetmode(_THIS, int width, int height, int planes)
{
centscreen_mode_t newmode, curmode;
centscreen_mode_t newmode, curmode;
newmode.handle = newmode.mode = newmode.logx = newmode.logy = -1;
newmode.physx = width;
......@@ -95,7 +94,7 @@ void SDL_XBIOS_CentscreenSetmode(_THIS, int width, int height, int planes)
void SDL_XBIOS_CentscreenRestore(_THIS, int prev_handle)
{
centscreen_mode_t newmode, curmode;
centscreen_mode_t newmode, curmode;
/* Restore old video mode */
newmode.handle = prev_handle;
......
......@@ -111,7 +111,7 @@ typedef struct {
/*--- Functions prototypes ---*/
int SDL_XBIOS_CentscreenInit(_THIS);
int SDL_XBIOS_ListCentscreenModes(_THIS, int actually_add);
void SDL_XBIOS_CentscreenSetmode(_THIS, int width, int height, int planes);
void SDL_XBIOS_CentscreenRestore(_THIS, int prev_handle);
......
......@@ -63,24 +63,21 @@ int SDL_XBIOS_SB3Usable(scpn_cookie_t *cookie_scpn)
return 0;
}
void SDL_XBIOS_SB3Init(_THIS, scpn_cookie_t *cookie_scpn)
void SDL_XBIOS_ListSB3Modes(_THIS, int actually_add, scpn_cookie_t *cookie_scpn)
{
scpn_screeninfo_t *scrinfo;
xbiosmode_t modeinfo;
/* SB3 prevent changing video modes, we can only use current one */
if (XBIOS_modelist) {
SDL_free(XBIOS_modelist);
XBIOS_nummodes = 0;
XBIOS_modelist = NULL;
scrinfo = cookie_scpn->screen_info;
if (actually_add) {
scrinfo->h_pos = scrinfo->v_pos = 0;
}
scrinfo = cookie_scpn->screen_info;
scrinfo->h_pos = scrinfo->v_pos = 0;
SDL_XBIOS_AddMode(this,
-1,
scrinfo->virtual_width, scrinfo->virtual_height,
1<<(SDL_XBIOS_scpn_planes_device[scrinfo->device]),
SDL_FALSE
);
modeinfo.number = -1;
modeinfo.width = scrinfo->virtual_width;
modeinfo.height = scrinfo->virtual_height;
modeinfo.depth = 1<<(SDL_XBIOS_scpn_planes_device[scrinfo->device]);
modeinfo.doubleline = SDL_FALSE;
SDL_XBIOS_AddMode(this, actually_add, &modeinfo);
}
......@@ -77,6 +77,6 @@ typedef struct {
int SDL_XBIOS_SB3Usable(scpn_cookie_t *cookie_scpn);
void SDL_XBIOS_SB3Init(_THIS, scpn_cookie_t *cookie_scpn);
void SDL_XBIOS_ListSB3Modes(_THIS, int actually_add, 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